dev command WIP

This commit is contained in:
Eric Allam
2024-08-07 14:31:34 +01:00
committed by Eric Allam
parent ab3a642d39
commit f0898714ae
40 changed files with 1525 additions and 328 deletions
+27 -25
View File
@@ -50,6 +50,7 @@
"@types/node": "20.14.14",
"@types/object-hash": "^3.0.6",
"@types/react": "^18.2.48",
"@types/resolve": "^1.20.6",
"@types/semver": "^7.3.13",
"@types/ws": "^8.5.3",
"cpy-cli": "^5.0.0",
@@ -58,12 +59,12 @@
"open": "^10.0.3",
"p-retry": "^6.1.0",
"rimraf": "^5.0.7",
"ts-essentials": "10.0.1",
"tshy": "^3.0.2",
"type-fest": "^3.6.0",
"typescript": "^5.5.4",
"vitest": "^1.6.0",
"xdg-app-paths": "^8.3.0",
"tshy": "^3.0.2",
"ts-essentials": "10.0.1"
"xdg-app-paths": "^8.3.0"
},
"scripts": {
"typecheck": "tsc",
@@ -91,57 +92,58 @@
"@opentelemetry/semantic-conventions": "1.25.1",
"@trigger.dev/core": "workspace:3.0.0-beta.52",
"@types/degit": "^2.8.3",
"async-sema": "^3.1.1",
"c12": "^1.11.1",
"chalk": "^5.2.0",
"chokidar": "^3.5.3",
"cli-table3": "^0.6.3",
"commander": "^9.4.1",
"defu": "^6.1.4",
"degit": "^2.8.4",
"dotenv": "^16.4.5",
"esbuild": "^0.23.0",
"evt": "^2.4.13",
"execa": "^9.1.0",
"find-up": "^7.0.0",
"glob": "^11.0.0",
"glob-to-regexp": "^0.4.1",
"gradient-string": "^2.0.2",
"hono": "^4.4.13",
"import-in-the-middle": "1.9.1",
"import-meta-resolve": "^4.1.0",
"ink": "^4.4.1",
"jsonc-parser": "3.2.1",
"liquidjs": "^10.9.2",
"magicast": "^0.3.4",
"minimatch": "^10.0.1",
"mlly": "^1.7.1",
"mock-fs": "^5.2.0",
"nanoid": "^4.0.2",
"node-fetch": "^3.3.0",
"object-hash": "^3.0.0",
"p-debounce": "^4.0.0",
"p-throttle": "^6.1.0",
"package-json-from-dist": "^1.0.0",
"partysocket": "^0.0.17",
"pkg-types": "^1.1.3",
"proxy-agent": "^6.3.0",
"react": "^18.2.0",
"react-error-boundary": "^4.0.12",
"react-error-boundary": "^3.1.4",
"resolve": "^1.22.8",
"semver": "^7.5.0",
"signal-exit": "^4.1.0",
"simple-git": "^3.19.0",
"source-map-support": "0.5.21",
"terminal-link": "^3.0.0",
"tiny-invariant": "^1.2.0",
"tsconfig-paths": "^4.2.0",
"typescript": "^5.4.0",
"unplugin": "^1.12.0",
"update-check": "^1.5.4",
"url": "^0.11.1",
"ws": "^8.12.0",
"zod-validation-error": "^1.5.0",
"async-sema": "^3.1.1",
"c12": "^1.11.1",
"defu": "^6.1.4",
"dotenv": "^16.4.5",
"esbuild": "^0.23.0",
"find-up": "^7.0.0",
"glob": "^11.0.0",
"glob-to-regexp": "^0.4.1",
"hono": "^4.4.13",
"import-in-the-middle": "1.9.1",
"import-meta-resolve": "^4.1.0",
"magicast": "^0.3.4",
"mlly": "^1.7.1",
"package-json-from-dist": "^1.0.0",
"pkg-types": "^1.1.3",
"resolve": "^1.22.8",
"signal-exit": "^4.1.0",
"source-map-support": "0.5.21",
"unplugin": "^1.12.0",
"zod": "3.23.8"
"zod": "3.23.8",
"zod-validation-error": "^1.5.0"
},
"engines": {
"node": ">=18.20.0"
+1 -7
View File
@@ -121,13 +121,7 @@ export class CliApiClient {
});
}
async getProjectEnv({
projectRef,
env,
}: {
projectRef: string;
env: "dev" | "prod" | "staging";
}) {
async getProjectEnv({ projectRef, env }: { projectRef: string; env: string }) {
if (!this.accessToken) {
throw new Error("getProjectDevEnv: No access token");
}
+213
View File
@@ -0,0 +1,213 @@
import { ResolvedConfig } from "@trigger.dev/core/v3/build";
import { BuildTarget, TaskFile } from "@trigger.dev/core/v3/schemas";
import * as esbuild from "esbuild";
import { join, resolve } from "node:path";
import { logger } from "../utilities/logger.js";
import { packageModules, shims } from "./packageModules.js";
import { buildPlugins } from "./plugins.js";
export interface BundleOptions {
target: BuildTarget;
destination: string;
cwd: string;
resolvedConfig: ResolvedConfig;
jsxFactory?: string;
jsxFragment?: string;
jsxAutomatic?: boolean;
watch?: boolean;
plugins?: esbuild.Plugin[];
}
export type BundleResult = {
files: TaskFile[];
configPath: string;
loaderPath: string | undefined;
workerProdPath: string | undefined;
workerDevPath: string | undefined;
stop: (() => Promise<void>) | undefined;
};
export async function bundleWorker(
options: BundleOptions
): Promise<BundleResult> {
const { resolvedConfig } = options;
// We need to add the package entry points here somehow
// Then we need to get them out of the build result into the build manifest
// taskhero/dist/esm/workers/dev.js
// taskhero/dist/esm/telemetry/loader.js
const entryPoints = await getEntryPoints(resolvedConfig);
const $buildPlugins = await buildPlugins(options.target, resolvedConfig);
let initialBuildResult: (result: esbuild.BuildResult) => void;
const initialBuildResultPromise = new Promise<esbuild.BuildResult>(
(resolve) => (initialBuildResult = resolve)
);
const buildResultPlugin: esbuild.Plugin = {
name: "Initial build result plugin",
setup(build) {
build.onEnd(initialBuildResult);
},
};
const buildOptions: esbuild.BuildOptions & { metafile: true } = {
entryPoints,
outdir: options.destination,
absWorkingDir: options.cwd,
bundle: true,
metafile: true,
write: true,
minify: false,
splitting: true,
charset: "utf8",
platform: "node",
sourcemap: true,
sourcesContent: options.target === "dev",
conditions: ["taskhero", "node"],
format: "esm",
target: ["node20", "es2022"],
loader: {
".js": "jsx",
".mjs": "jsx",
".cjs": "jsx",
".wasm": "copy",
},
outExtension: { ".js": ".mjs" },
inject: [...shims], // TODO: copy this into the working dir to work with Yarn PnP
jsx: options.jsxAutomatic ? "automatic" : undefined,
jsxDev: options.jsxAutomatic && options.target === "dev" ? true : undefined,
plugins: [...$buildPlugins, ...(options.plugins ?? []), buildResultPlugin],
...(options.jsxFactory && { jsxFactory: options.jsxFactory }),
...(options.jsxFragment && { jsxFragment: options.jsxFragment }),
logLevel: "silent",
logOverride: {
'empty-glob': 'silent',
},
};
let result: esbuild.BuildResult<typeof buildOptions>;
let stop: BundleResult["stop"];
logger.debug("Building worker with options", buildOptions);
if (options.watch) {
const ctx = await esbuild.context(buildOptions);
await ctx.watch();
result = await initialBuildResultPromise;
if (result.errors.length > 0) {
throw new Error("Failed to build");
}
stop = async function () {
await ctx.dispose();
};
} else {
result = await esbuild.build(buildOptions);
// Even when we're not watching, we still want some way of cleaning up the
// temporary directory when we don't need it anymore
stop = async function () {};
}
const bundleResult = getBundleResultFromBuild(options.cwd, result);
if (!bundleResult) {
throw new Error("Failed to get bundle result");
}
return { ...bundleResult, stop };
}
export function getBundleResultFromBuild(
workingDir: string,
result: esbuild.BuildResult<{ metafile: true }>
): Omit<BundleResult, "stop"> | undefined {
const files: Array<{ entry: string; out: string }> = [];
const imports = new Set<string>();
let configPath: string | undefined;
let loaderPath: string | undefined;
let workerDevPath: string | undefined;
let workerProdPath: string | undefined;
for (const [outputPath, outputMeta] of Object.entries(
result.metafile.outputs
)) {
if (outputPath.endsWith(".mjs")) {
const $outputPath = resolve(workingDir, outputPath);
if (outputMeta.entryPoint) {
if (outputMeta.entryPoint.startsWith("trigger.config.ts")) {
configPath = $outputPath;
} else if (
outputMeta.entryPoint.includes(
"dist/esm/telemetry/loader.js"
)
) {
loaderPath = $outputPath;
} else if (
outputMeta.entryPoint.includes("dist/esm/workers/dev.js")
) {
workerDevPath = $outputPath;
} else if (
outputMeta.entryPoint.includes("dist/esm/workers/prod.js")
) {
workerProdPath = $outputPath;
} else {
files.push({
entry: outputMeta.entryPoint,
out: $outputPath,
});
}
}
}
}
if (!configPath) {
return undefined;
}
return {
files,
configPath: configPath,
loaderPath,
workerDevPath,
workerProdPath,
};
}
async function getEntryPoints(config: ResolvedConfig) {
const projectEntryPoints = config.dirs.flatMap((dir) => dirToEntryPointGlob(dir));
if (config.configFile) {
projectEntryPoints.push(config.configFile);
}
projectEntryPoints.push(...packageModules);
return projectEntryPoints;
}
// Converts a directory to a glob that matches all the entry points in that
function dirToEntryPointGlob(dir: string): string[] {
return [join(dir, "**", "*.ts"), join(dir, "**", "*.tsx"), join(dir, "**", "*.js"), join(dir, "**", "*.jsx")];
}
export function logBuildWarnings(warnings: esbuild.Message[]) {
const logs = esbuild.formatMessagesSync(warnings, { kind: "warning", color: true });
for (const log of logs) {
console.warn(log);
}
}
/**
* Logs all errors/warnings associated with an esbuild BuildFailure in the same
* style esbuild would.
*/
export function logBuildFailure(errors: esbuild.Message[], warnings: esbuild.Message[]) {
const logs = esbuild.formatMessagesSync(errors, { kind: "error", color: true });
for (const log of logs) {
console.error(log);
}
logBuildWarnings(warnings);
}
+179
View File
@@ -0,0 +1,179 @@
import * as esbuild from "esbuild";
import { resolveModule } from "./resolveModule.js";
import { BuildContext, BuildExtension, BuildLayer, RegisteredPlugin, RegisterPluginOptions, ResolvedConfig } from "@trigger.dev/core/v3/build";
import { BuildManifest, BuildTarget } from "@trigger.dev/core/v3/schemas";
import { logger } from "../utilities/logger.js";
export function createExtensionForPlugin(
plugin: esbuild.Plugin,
options: RegisterPluginOptions = {}
): BuildExtension {
return {
name: plugin.name,
onBuildStart(context) {
context.registerPlugin(plugin, options);
},
};
}
export interface InternalBuildContext extends BuildContext {
getLayers(): BuildLayer[];
clearLayers(): void;
getPlugins(): RegisteredPlugin[];
appendExtension(extension: BuildExtension): void;
prependExtension(extension: BuildExtension): void;
getExtensions(): BuildExtension[];
}
export async function notifyExtensionOnBuildStart(
context: InternalBuildContext
) {
for (const extension of context.getExtensions()) {
if (extension.onBuildStart) {
await extension.onBuildStart(context);
}
}
}
export async function notifyExtensionOnBuildComplete(
context: InternalBuildContext,
manifest: BuildManifest
): Promise<BuildManifest> {
let $manifest = manifest;
for (const extension of context.getExtensions()) {
if (extension.onBuildComplete) {
await extension.onBuildComplete(context, $manifest);
logger.debug(`Applying extension ${extension.name} to manifest`, {
context,
manifest,
});
$manifest = applyContextLayersToManifest(context, $manifest);
}
}
return $manifest;
}
export function createBuildContext(
target: BuildTarget,
config: ResolvedConfig
): InternalBuildContext {
const layers: BuildLayer[] = [];
const registeredPlugins: RegisteredPlugin[] = [];
const extensions: BuildExtension[] = config.build.extensions ?? [];
return {
target,
config: config,
workingDir: config.workingDir,
addLayer(layer) {
layers.push(layer);
},
getLayers() {
return layers;
},
clearLayers() {
layers.splice(0);
},
registerPlugin(plugin, options) {
if (options?.target && options.target !== target) {
return;
}
registeredPlugins.push({ plugin, ...options });
},
getPlugins() {
return registeredPlugins;
},
resolvePath: async (path) => {
try {
return await resolveModule(path, config.workingDir);
} catch (error) {
return undefined;
}
},
getExtensions() {
return extensions;
},
appendExtension(extension) {
extensions.push(extension);
},
prependExtension(extension) {
extensions.unshift(extension);
},
};
}
function applyContextLayersToManifest(
context: InternalBuildContext,
manifest: BuildManifest
): BuildManifest {
for (const layer of context.getLayers()) {
manifest = applyLayerToManifest(layer, manifest);
}
context.clearLayers();
return manifest;
}
function applyLayerToManifest(
layer: BuildLayer,
manifest: BuildManifest
): BuildManifest {
let $manifest = { ...manifest };
if (layer.commands) {
manifest.build.commands ??= [];
manifest.build.commands = manifest.build.commands.concat(layer.commands);
}
if (layer.build?.env) {
manifest.build.env ??= {};
Object.assign(manifest.build.env, layer.build.env);
}
if (layer.deploy?.env) {
manifest.deploy.env ??= {};
Object.assign(manifest.deploy.env, layer.deploy.env);
}
if (layer.dependencies) {
const externals = manifest.externals ?? [];
for (const [name, version] of Object.entries(layer.dependencies)) {
externals.push({ name, version });
}
$manifest.externals = externals;
}
return $manifest;
}
export function resolvePluginsForContext(
context: InternalBuildContext
): esbuild.Plugin[] {
const registeredPlugins = context.getPlugins();
if (registeredPlugins.length === 0) {
return [];
}
const sortedPlugins = [...registeredPlugins].sort((a, b) => {
const order = { first: 0, undefined: 1, last: 2, $head: -1 };
const aOrder = order[a.placement as keyof typeof order] ?? 1;
const bOrder = order[b.placement as keyof typeof order] ?? 1;
// If the placement order is different, sort based on that
if (aOrder !== bOrder) {
return aOrder - bOrder;
}
// If the placement order is the same, maintain original order
return registeredPlugins.indexOf(a) - registeredPlugins.indexOf(b);
});
return sortedPlugins.map((plugin) => plugin.plugin);
}
+280
View File
@@ -0,0 +1,280 @@
import * as esbuild from "esbuild";
import { makeRe } from "minimatch";
import { mkdir, symlink } from "node:fs/promises";
import { dirname, join } from "node:path";
import { readPackageJSON, resolvePackageJSON } from "pkg-types";
import nodeResolve from "resolve";
import { getInstrumentedPackageNames } from "./instrumentation.js";
import { BuildTarget } from "@trigger.dev/core/v3/schemas";
import { BuildExtension, ResolvedConfig } from "@trigger.dev/core/v3/build";
import { logger } from "../utilities/logger.js";
const FORCED_EXTERNALS = ["import-in-the-middle"];
/**
* externals in dev might not be resolvable from the worker directory
* for example, if the external is not an immediate dependency of the project
* and the project is not hoisting the dependency (e.g. pnpm, npm with nested)
*
* This function will create a symbolic link from a place where the external is resolvable
* to the actual resolved external path
*/
async function linkUnresolvableExternals(
externals: Array<CollectedExternal>,
resolveDir: string
) {
for (const external of externals) {
if (!(await isExternalResolvable(external, resolveDir))) {
logger.debug("External is not resolvable", { external });
await linkExternal(external, resolveDir);
}
}
}
async function linkExternal(external: CollectedExternal, resolveDir: string) {
const destinationPath = join(resolveDir, "node_modules");
await mkdir(destinationPath, { recursive: true });
logger.debug("Make a symbolic link", {
fromPath: external.path,
destinationPath,
external,
});
await symlink(external.path, join(destinationPath, external.name), "dir");
}
async function isExternalResolvable(
external: CollectedExternal,
resolveDir: string
) {
try {
const resolvedPath = nodeResolve.sync(external.name, {
basedir: resolveDir,
});
logger.debug("Resolved external", {
external,
resolvedPath,
});
return true;
} catch (e) {
console.error("Could not resolve external", { external, resolveDir, e });
return false;
}
}
export type CollectedExternal = {
name: string;
path: string;
version: string;
};
export type ExternalsCollector = {
externals: Array<CollectedExternal>;
plugin: esbuild.Plugin;
};
function createExternalsCollector(
target: BuildTarget,
resolvedConfig: ResolvedConfig
): ExternalsCollector {
const externals: Array<CollectedExternal> = [];
const maybeExternals = discoverMaybeExternals(target, resolvedConfig);
logger.debug("Maybe externals", { maybeExternals });
return {
externals,
plugin: {
name: "externals",
setup: (build) => {
build.onStart(async () => {
externals.splice(0);
});
build.onEnd(async () => {
logger.debug("Collected externals", { externals });
});
maybeExternals.forEach((external) => {
build.onResolve(
{ filter: external.filter, namespace: "file" },
async (args) => {
const resolvedPath = nodeResolve.sync(args.path, {
basedir: args.resolveDir,
});
logger.debug("Resolved external", {
external,
resolvedPath,
args,
});
const packageJsonPath = await resolvePackageJSON(
dirname(resolvedPath)
);
if (!packageJsonPath) {
return undefined;
}
logger.debug("Found package.json", { packageJsonPath });
const packageJson = await readPackageJSON(packageJsonPath);
if (!packageJson || !packageJson.name) {
return undefined;
}
if (!external.filter.test(packageJson.name)) {
logger.debug("Package name does not match", {
external,
packageJson,
});
return undefined;
}
if (!packageJson.version) {
logger.debug("No version found in package.json", {
external,
packageJson,
});
return undefined;
}
externals.push({
name: packageJson.name,
path: dirname(packageJsonPath),
version: packageJson.version,
});
logger.debug("Resolved external", {
external,
resolvedPath,
args,
});
return {
external: true,
};
}
);
});
},
},
};
}
type MaybeExternal = { raw: string; filter: RegExp };
function discoverMaybeExternals(
target: BuildTarget,
config: ResolvedConfig
): Array<MaybeExternal> {
const external: Array<MaybeExternal> = [];
for (const externalName of FORCED_EXTERNALS) {
const externalRegex = makeRe(externalName);
if (!externalRegex) {
continue;
}
external.push({
raw: externalName,
filter: new RegExp(
`^${externalName}$|${externalRegex.source}`
),
});
}
if (config.build?.external) {
for (const externalName of config.build?.external) {
const externalRegex = makeRe(externalName);
if (!externalRegex) {
continue;
}
external.push({
raw: externalName,
filter: externalRegex,
});
}
}
for (const externalName of getInstrumentedPackageNames(config)) {
const externalRegex = makeRe(externalName);
if (!externalRegex) {
continue
}
external.push({
raw: externalName,
filter: new RegExp(
`^${externalName}$|${externalRegex.source}`
),
});
}
for (const buildExtension of config.build?.extensions ?? []) {
const moduleExternals = buildExtension.externalsForTarget?.(target);
for (const externalName of moduleExternals ?? []) {
const externalRegex = makeRe(externalName);
if (!externalRegex) {
continue;
}
external.push({
raw: externalName,
filter: new RegExp(
`^${externalName}$|${externalRegex.source}`
),
});
}
}
return external;
}
export function createExternalsBuildExtension(
target: BuildTarget,
config: ResolvedConfig
): BuildExtension {
const { externals, plugin } = createExternalsCollector(target, config);
return {
name: "externals",
onBuildStart(context) {
context.registerPlugin(plugin, {
target,
// @ts-expect-error
placement: "$head", // cheat to get to the front of the plugins
});
},
onBuildComplete: async (context, manifest) => {
if (context.target === "dev") {
await linkUnresolvableExternals(externals, manifest.outputPath);
}
context.addLayer({
id: "externals",
dependencies: externals.reduce(
(acc, external) => {
acc[external.name] = external.version;
return acc;
},
{} as Record<string, string>
),
});
},
};
}
@@ -0,0 +1,29 @@
import { InstrumentationModuleDefinition } from "@opentelemetry/instrumentation";
import { ResolvedConfig } from "@trigger.dev/core/v3/build";
import { builtinModules } from "node:module";
export function getInstrumentedPackageNames(
config: ResolvedConfig
): Array<string> {
const packageNames = [];
if (config.instrumentations) {
for (const instrumentation of config.instrumentations) {
const moduleDefinitions = (
instrumentation as any
).getModuleDefinitions?.() as Array<InstrumentationModuleDefinition>;
if (!Array.isArray(moduleDefinitions)) {
continue
}
for (const moduleDefinition of moduleDefinitions) {
if (!builtinModules.includes(moduleDefinition.name)) {
packageNames.push(moduleDefinition.name);
}
}
}
}
return packageNames;
}
+29
View File
@@ -0,0 +1,29 @@
import { BuildManifest } from "@trigger.dev/core/v3/schemas";
import { cp } from "node:fs/promises";
import { logger } from "../utilities/logger.js";
export async function copyManifestToDir(manifest: BuildManifest, source: string, destination: string): Promise<BuildManifest> {
// Copy the dir in destination to workerDir
await cp(source, destination, { recursive: true });
logger.debug("Copied manifest to dir", { source, destination });
// Then update the manifest to point to the new workerDir
const updatedManifest = { ...manifest };
updatedManifest.configPath = updatedManifest.configPath.replace(source, destination);
updatedManifest.loaderPath = updatedManifest.loaderPath?.replace(source, destination);
updatedManifest.workerEntryPath = updatedManifest.workerEntryPath?.replace(source, destination);
updatedManifest.workerForkPath = updatedManifest.workerForkPath?.replace(source, destination);
updatedManifest.files = updatedManifest.files.map((file) => {
return {
...file,
out: file.out.replace(source, destination),
};
});
updatedManifest.outputPath = destination;
return updatedManifest;
}
@@ -0,0 +1,18 @@
import { join } from "node:path";
import { sourceDir } from "../sourceDir.js";
export const devEntryPoint = join(sourceDir, "workers", "dev.js")
export const prodEntryPoint = join(sourceDir, "workers", "prod.js")
export const telemetryLoader = join(sourceDir, "telemetry", "loader.js")
export const packageModules = [
devEntryPoint,
prodEntryPoint,
telemetryLoader,
]
export const esmShimPath = join(sourceDir, "shims", "esm.js")
export const shims = [
esmShimPath
]
+41
View File
@@ -0,0 +1,41 @@
import * as esbuild from "esbuild";
import { BuildTarget } from "@trigger.dev/core/v3/schemas";
import { ResolvedConfig } from "@trigger.dev/core/v3/build";
import { configPlugin } from "../config.js";
import { logger } from "../utilities/logger.js";
export async function buildPlugins(
target: BuildTarget,
resolvedConfig: ResolvedConfig
): Promise<esbuild.Plugin[]> {
logger.debug("Building plugins for target", target);
const plugins: esbuild.Plugin[] = [];
const $configPlugin = configPlugin(resolvedConfig);
if ($configPlugin) {
plugins.push($configPlugin);
}
return plugins;
}
export function analyzeMetadataPlugin(): esbuild.Plugin {
return {
name: "analyze-metafile",
setup(build) {
build.onEnd(async (result) => {
if (!result.metafile) {
return;
}
console.log(
await esbuild.analyzeMetafile(result.metafile, {
verbose: true,
})
);
});
},
};
}
@@ -0,0 +1,4 @@
export function resolveModule(moduleName: string) {
// @ts-ignore
return require.resolve(moduleName);
}
@@ -0,0 +1,9 @@
// @ts-ignore
import { resolvePath } from "mlly";
export function resolveModule(moduleName: string, url?: string) {
return resolvePath(moduleName, {
// @ts-ignore
url: url ?? import.meta.url,
});
}
+105 -5
View File
@@ -5,7 +5,14 @@ import { CommonCommandOptions, commonOptions, wrapCommandAction } from "../cli/c
import { chalkError } from "../utilities/cliOutput.js";
import { logger } from "../utilities/logger.js";
import { runtimeCheck } from "../utilities/runtimeCheck.js";
import { isLoggedIn } from "../utilities/session.js";
import { getProjectClient, isLoggedIn, LoginResultOk } from "../utilities/session.js";
import { printDevBanner, printStandloneInitialBanner } from "../utilities/initialBanner.js";
import { updateTriggerPackages } from "./update.js";
import { watchConfig } from "../config.js";
import { ResolvedConfig } from "@trigger.dev/core/v3/build";
import Dev from "../dev/dev.js";
import { render } from "ink";
import React from "react";
let apiClient: CliApiClient | undefined;
@@ -17,7 +24,7 @@ const DevCommandOptions = CommonCommandOptions.extend({
skipUpdateCheck: z.boolean().default(false),
});
type DevCommandOptions = z.infer<typeof DevCommandOptions>;
export type DevCommandOptions = z.infer<typeof DevCommandOptions>;
export function configureDevCommand(program: Command) {
return commonOptions(
@@ -33,9 +40,9 @@ export function configureDevCommand(program: Command) {
.option("--debugger", "Enable the debugger")
.option("--debug-otel", "Enable OpenTelemetry debugging")
.option("--skip-update-check", "Skip checking for @trigger.dev package updates")
).action(async (path, options) => {
).action(async (_, options) => {
wrapCommandAction("dev", DevCommandOptions, options, async (opts) => {
await devCommand(path, opts);
await devCommand(opts);
});
});
}
@@ -43,7 +50,7 @@ export function configureDevCommand(program: Command) {
const MINIMUM_NODE_MAJOR = 18;
const MINIMUM_NODE_MINOR = 20;
export async function devCommand(dir: string, options: DevCommandOptions) {
export async function devCommand(options: DevCommandOptions) {
try {
runtimeCheck(MINIMUM_NODE_MAJOR, MINIMUM_NODE_MINOR);
} catch (e) {
@@ -71,4 +78,97 @@ export async function devCommand(dir: string, options: DevCommandOptions) {
process.exitCode = 1;
return;
}
let watcher;
try {
const devInstance = await startDev({ ...options, cwd: process.cwd(), login: authorization });
watcher = devInstance.watcher;
const { waitUntilExit } = devInstance.devReactElement;
await waitUntilExit();
} finally {
await watcher?.stop();
}
}
type StartDevOptions = DevCommandOptions & {
login: LoginResultOk;
cwd: string;
};
async function startDev(options: StartDevOptions) {
logger.debug("Starting dev CLI", { options });
let watcher: Awaited<ReturnType<typeof watchConfig>> | undefined;
let rerender: (node: React.ReactNode) => void | undefined;
try {
if (options.logLevel) {
logger.loggerLevel = options.logLevel;
}
await printStandloneInitialBanner(true);
let displayedUpdateMessage = false;
if (!options.skipUpdateCheck) {
displayedUpdateMessage = await updateTriggerPackages(options.cwd, { ...options }, true, true);
}
printDevBanner(displayedUpdateMessage);
watcher = await watchConfig({
cwd: options.cwd,
async onUpdate(config) {
logger.debug("Updated config, rerendering", { config });
rerender(await getDevReactElement(config));
},
overrides: {
project: options.projectRef,
},
configFile: options.config,
});
logger.debug("Initial config", watcher.config);
// eslint-disable-next-line no-inner-declarations
async function getDevReactElement(configParam: ResolvedConfig) {
const projectClient = await getProjectClient({
accessToken: options.login.auth.accessToken,
apiUrl: options.login.auth.apiUrl,
projectRef: configParam.project,
env: "dev",
profile: options.profile,
});
if (!projectClient) {
process.exit(1);
}
return (
<Dev
name={projectClient.name}
rawArgs={options}
rawConfig={configParam}
initialMode="local"
showInteractiveDevSession={true}
client={projectClient.client}
/>
);
}
const devReactElement = render(await getDevReactElement(watcher.config));
rerender = devReactElement.rerender;
return {
devReactElement,
watcher,
stop: async () => {
devReactElement.unmount();
await watcher?.stop();
},
};
} catch (error) {
await watcher?.stop();
throw error;
}
}
+17 -9
View File
@@ -7,9 +7,12 @@ import { readdir } from "node:fs/promises";
import { basename, dirname, isAbsolute, join, relative } from "node:path";
import { findWorkspaceDir, resolveLockfile, resolvePackageJSON, resolveTSConfig } from "pkg-types";
import { generateCode, loadFile } from "./imports/magicast.js";
import { logger } from "./utilities/logger.js";
export type ResolveConfigOptions = {
cwd?: string;
overrides?: Partial<TriggerConfig>;
configFile?: string;
};
export async function loadConfig({
@@ -40,19 +43,22 @@ export async function watchConfig({
onUpdate,
debounce = 100,
ignoreInitial = true,
overrides,
configFile,
}: ResolveWatchConfigOptions): Promise<ResolveWatchConfigResult> {
const result = await c12.watchConfig<TriggerConfig>({
name: "trigger",
configFile,
cwd,
debounce,
chokidarOptions: { ignoreInitial },
acceptHMR: async ({ oldConfig, newConfig, getDiff }) => {
const diff = getDiff();
console.log("watchConfig.acceptHMR", { diff, oldConfig, newConfig });
logger.debug("watchConfig.acceptHMR", { diff, oldConfig, newConfig });
if (diff.length === 0) {
console.log("No config changed detected!");
logger.debug("No config changed detected!");
return true; // No changes!
}
@@ -62,17 +68,17 @@ export async function watchConfig({
const diff = getDiff();
if (diff.length === 0) {
console.log("No config changed detected!");
logger.debug("No config changed detected!");
return;
}
const resolvedConfig = await resolveConfig(cwd, newConfig);
const resolvedConfig = await resolveConfig(cwd, newConfig, overrides);
onUpdate(resolvedConfig);
},
});
const config = await resolveConfig(cwd, result);
const config = await resolveConfig(cwd, result, overrides);
return {
config,
@@ -96,10 +102,10 @@ export function configPlugin(resolvedConfig: ResolvedConfig): esbuild.Plugin | u
// Convert the filename to a regex to filter against
const filter = new RegExp(`${filename.replace(/\./g, "\\.")}$`);
console.log("trigger-config-strip.filter", filter);
logger.debug("trigger-config-strip.filter", filter);
build.onLoad({ filter }, async (args) => {
console.log("trigger-config-strip.onLoad", args);
logger.debug("trigger-config-strip.onLoad", args);
const $mod = await loadFile(args.path);
@@ -113,7 +119,7 @@ export function configPlugin(resolvedConfig: ResolvedConfig): esbuild.Plugin | u
const contents = generateCode($mod);
console.log("trigger-config-strip.onLoad.contents", contents);
logger.debug("trigger-config-strip.onLoad.contents", contents);
return {
contents: contents.code,
@@ -127,7 +133,8 @@ export function configPlugin(resolvedConfig: ResolvedConfig): esbuild.Plugin | u
async function resolveConfig(
cwd: string,
result: c12.ResolvedConfig<TriggerConfig>
result: c12.ResolvedConfig<TriggerConfig>,
overrides?: Partial<TriggerConfig>
): Promise<ResolvedConfig> {
const packageJsonPath = await resolvePackageJSON(cwd);
const tsconfigPath = await resolveTSConfig(cwd);
@@ -149,6 +156,7 @@ async function resolveConfig(
lockfilePath,
workspaceDir,
},
overrides,
result.config,
{
dirs,
+83
View File
@@ -0,0 +1,83 @@
import { Text, useApp, useStdin } from "ink";
import React, { useEffect } from "react";
import { withErrorBoundary } from "react-error-boundary";
import { DevSessionOptions, startDevSession } from "./devSession.js";
export type DevProps = DevSessionOptions;
export function DevImplementation(props: DevProps): JSX.Element {
// only load the UI if we're running in a supported environment
const { isRawModeSupported } = useStdin();
const { exit } = useApp();
const onErr = (error: Error) => {
exit(error);
};
return props.showInteractiveDevSession ?? isRawModeSupported ? (
<InteractiveDevSession {...props} onErr={onErr} />
) : (
<DevSession {...props} onErr={onErr} />
);
}
type DevSessionProps = DevProps & {
onErr: (error: Error) => void;
};
function InteractiveDevSession(props: DevSessionProps) {
return (
<>
<DevSession {...props} />
</>
);
}
function DevSession(props: DevSessionProps) {
const dev = useDev(props);
return <></>;
}
function useDev(props: DevSessionProps) {
useEffect(() => {
let watcher: Awaited<ReturnType<typeof startDevSession>> | undefined;
async function run() {
watcher = await startDevSession(props);
}
run().catch((error) => {
// If esbuild fails on first run, we want to quit the process
// since we can't recover from here
// related: https://github.com/evanw/esbuild/issues/1037
props.onErr(error);
});
return () => {
watcher?.stop();
};
}, [
props.client,
props.initialMode,
props.name,
props.rawArgs,
props.rawConfig,
props.showInteractiveDevSession,
]);
}
function ErrorFallback(props: { error: Error }) {
const { exit } = useApp();
useEffect(() => exit(props.error));
return (
<>
<Text>Something went wrong:</Text>
<Text>{props.error.stack}</Text>
</>
);
}
export default withErrorBoundary(DevImplementation, {
FallbackComponent: ErrorFallback,
}) as React.ComponentType<DevProps>;
+159
View File
@@ -0,0 +1,159 @@
import { DEFAULT_RUNTIME, ResolvedConfig } from "@trigger.dev/core/v3/build";
import { BuildManifest } from "@trigger.dev/core/v3/schemas";
import * as esbuild from "esbuild";
import { CliApiClient } from "../apiClient.js";
import {
BundleResult,
bundleWorker,
getBundleResultFromBuild,
logBuildFailure,
logBuildWarnings,
} from "../build/bundle.js";
import {
createBuildContext,
notifyExtensionOnBuildComplete,
notifyExtensionOnBuildStart,
resolvePluginsForContext,
} from "../build/extensions.js";
import { createExternalsBuildExtension } from "../build/externals.js";
import { devEntryPoint, telemetryLoader } from "../build/packageModules.js";
import { type DevCommandOptions } from "../commands/dev.js";
import { logger } from "../utilities/logger.js";
import { EphemeralDirectory, getTmpDir } from "../utilities/tempDirectories.js";
import { copyManifestToDir } from "../build/manifests.js";
export type DevSessionOptions = {
name: string | undefined;
initialMode: "local";
showInteractiveDevSession: boolean | undefined;
rawConfig: ResolvedConfig;
rawArgs: DevCommandOptions;
client: CliApiClient;
};
export async function startDevSession({ rawConfig }: DevSessionOptions) {
const destination = getTmpDir(rawConfig.workingDir, "build");
logger.debug("Starting dev session", { destination: destination.path, rawConfig });
const externalsExtension = createExternalsBuildExtension("dev", rawConfig);
const buildContext = createBuildContext("dev", rawConfig);
buildContext.prependExtension(externalsExtension);
await notifyExtensionOnBuildStart(buildContext);
const pluginsFromExtensions = resolvePluginsForContext(buildContext);
async function updateBundle(bundle: BundleResult, workerDir?: EphemeralDirectory) {
try {
let buildManifest = await createBuildManifestFromBundle(
bundle,
destination.path,
rawConfig,
workerDir?.path
);
buildManifest = await notifyExtensionOnBuildComplete(buildContext, buildManifest);
logger.debug("Updated bundle", { bundle, buildManifest });
} catch (error) {
logger.error("Error updating bundle", { error });
}
}
async function updateBuild(build: esbuild.BuildResult, workerDir: EphemeralDirectory) {
const bundle = getBundleResultFromBuild(rawConfig.workingDir, build);
if (bundle) {
await updateBundle({ ...bundle, stop: undefined }, workerDir);
}
}
let bundled = false;
const onEnd = {
name: "on-end",
setup(b: esbuild.PluginBuild) {
b.onStart(() => {
logger.debug("on-end plugin started");
});
b.onEnd(async (result: esbuild.BuildResult) => {
const errors = result.errors;
const warnings = result.warnings;
if (errors.length > 0) {
logBuildFailure(errors, warnings);
return;
}
if (warnings.length > 0) {
logBuildWarnings(warnings);
}
if (!bundled) {
// First bundle, no need to update bundle
bundled = true;
} else {
const workerDir = getTmpDir(rawConfig.workingDir, "worker");
await updateBuild(result, workerDir);
}
});
},
};
async function runBundle() {
const bundleResult = await bundleWorker({
target: "dev",
cwd: rawConfig.workingDir,
destination: destination.path,
watch: true,
resolvedConfig: rawConfig,
plugins: [...pluginsFromExtensions, onEnd],
jsxFactory: rawConfig.build.jsx.factory,
jsxFragment: rawConfig.build.jsx.fragment,
jsxAutomatic: rawConfig.build.jsx.automatic,
});
await updateBundle(bundleResult);
return bundleResult.stop;
}
const stopBundling = await runBundle();
return {
stop: () => {
logger.debug("Stopping dev session");
destination.remove();
stopBundling?.().catch((error) => {});
},
};
}
async function createBuildManifestFromBundle(
bundle: BundleResult,
destination: string,
resolvedConfig: ResolvedConfig,
workerDir: string | undefined
): Promise<BuildManifest> {
const buildManifest: BuildManifest = {
runtime: resolvedConfig.runtime ?? DEFAULT_RUNTIME,
target: "dev",
files: bundle.files,
externals: [],
config: resolvedConfig,
outputPath: destination,
workerEntryPath: bundle.workerDevPath ?? devEntryPoint,
workerForkPath: bundle.workerDevPath ?? devEntryPoint,
loaderPath: bundle.loaderPath ?? telemetryLoader,
configPath: bundle.configPath,
deploy: {
env: {},
},
build: {},
};
if (!workerDir) {
return buildManifest;
}
return copyManifestToDir(buildManifest, destination, workerDir);
}
+9
View File
@@ -0,0 +1,9 @@
import { createRequire } from "node:module";
import path from "node:path";
import url from "node:url";
// @ts-ignore
globalThis.require = createRequire(import.meta.url);
// @ts-ignore
globalThis.__filename = url.fileURLToPath(import.meta.url);
globalThis.__dirname = path.dirname(__filename);
+3
View File
@@ -0,0 +1,3 @@
import { pathToFileURL } from "node:url";
//@ts-ignore - Have to ignore because TSC thinks this is ESM
export const sourceDir = pathToFileURL(__dirname).pathname;
+2
View File
@@ -0,0 +1,2 @@
//@ts-ignore
export const sourceDir = new URL(".", import.meta.url).pathname;
+23
View File
@@ -0,0 +1,23 @@
import { register } from "node:module";
type ImportHookData = {
include?: string[];
exclude?: string[];
};
const data: ImportHookData = {};
if (typeof process.env.OTEL_IMPORT_HOOK_INCLUDES === "string") {
data.include = process.env.OTEL_IMPORT_HOOK_INCLUDES.split(",");
}
if (typeof process.env.OTEL_IMPORT_HOOK_EXCLUDES === "string") {
data.exclude = process.env.OTEL_IMPORT_HOOK_EXCLUDES.split(",");
}
// @ts-ignore
register("import-in-the-middle/hook.mjs", import.meta.url, {
// @ts-ignore
parentURL: import.meta.url,
data,
});
+52 -11
View File
@@ -2,21 +2,24 @@ import { recordSpanException } from "@trigger.dev/core/v3/workers";
import { CliApiClient } from "../apiClient.js";
import { readAuthConfigProfile } from "./configFiles.js";
import { getTracer } from "../telemetry/tracing.js";
import { logger } from "./logger.js";
const tracer = getTracer();
export type LoginResultOk = {
ok: true;
profile: string;
userId: string;
email: string;
dashboardUrl: string;
auth: {
apiUrl: string;
accessToken: string;
};
};
export type LoginResult =
| {
ok: true;
profile: string;
userId: string;
email: string;
dashboardUrl: string;
auth: {
apiUrl: string;
accessToken: string;
};
}
| LoginResultOk
| {
ok: false;
error: string;
@@ -85,3 +88,41 @@ export async function isLoggedIn(profile: string = "default"): Promise<LoginResu
}
});
}
export type GetEnvOptions = {
accessToken: string;
apiUrl: string;
projectRef: string;
env: string;
profile: string;
};
export async function getProjectClient(options: GetEnvOptions) {
const apiClient = new CliApiClient(options.apiUrl, options.accessToken);
const projectEnv = await apiClient.getProjectEnv({
projectRef: options.projectRef,
env: options.env,
});
if (!projectEnv.success) {
if (projectEnv.error === "Project not found") {
logger.error(
`Project not found: ${options.projectRef}. Ensure you are using the correct project ref and CLI profile (use --profile). Currently using the "${options.profile}" profile, which points to ${options.apiUrl}`
);
} else {
logger.error(
`Failed to initialize dev environment: ${projectEnv.error}. Using project ref ${options.projectRef}`
);
}
return;
}
const client = new CliApiClient(projectEnv.data.apiUrl, projectEnv.data.apiKey);
return {
name: projectEnv.data.name,
client,
};
}
@@ -0,0 +1,43 @@
import fs from "node:fs";
import path from "node:path";
import { onExit } from "signal-exit";
/**
* A short-lived directory. Automatically removed when the process exits, but
* can be removed earlier by calling `remove()`.
*/
export interface EphemeralDirectory {
path: string;
remove(): void;
}
/**
* Gets a temporary directory in the project's `.wrangler` folder with the
* specified prefix. We create temporary directories in `.wrangler` as opposed
* to the OS's temporary directory to avoid issues with different drive letters
* on Windows. For example, when `esbuild` outputs a file to a different drive
* than the input sources, the generated source maps are incorrect.
*/
export function getTmpDir(
projectRoot: string | undefined,
prefix: string,
keep: boolean = false
): EphemeralDirectory {
projectRoot ??= process.cwd();
const tmpRoot = path.join(projectRoot, ".trigger", "tmp");
fs.mkdirSync(tmpRoot, { recursive: true });
const tmpPrefix = path.join(tmpRoot, `${prefix}-`);
const tmpDir = fs.realpathSync(fs.mkdtempSync(tmpPrefix));
let removeDir = keep ? () => {} : () => fs.rmSync(tmpDir, { recursive: true, force: true });
let removeExitListener = keep ? () => {} : onExit(removeDir);
return {
path: tmpDir,
remove() {
removeExitListener();
removeDir();
},
};
}
+1
View File
@@ -0,0 +1 @@
export {};
+1
View File
@@ -0,0 +1 @@
export {};
+2 -1
View File
@@ -3,7 +3,8 @@
"compilerOptions": {
"isolatedDeclarations": false,
"composite": true,
"sourceMap": true
"sourceMap": true,
"jsx": "react-jsx"
},
"include": ["./src/**/*.ts", "./src/**/*.tsx"]
}
+1 -1
View File
@@ -1,7 +1,7 @@
import { type Defu } from "defu";
import type { Prettify } from "ts-essentials";
import { TriggerConfig } from "../config.js";
import { BuildRuntime } from "../schemas/config.js";
import { BuildRuntime } from "../schemas/build.js";
export type ResolvedConfig = Prettify<
Defu<
+1 -1
View File
@@ -1,4 +1,4 @@
import { BuildRuntime } from "../schemas/config.js";
import { BuildRuntime } from "../schemas/build.js";
export const DEFAULT_RUNTIME: BuildRuntime = "node20";
+11 -7
View File
@@ -1,10 +1,14 @@
import { Instrumentation } from "@opentelemetry/instrumentation";
import { BuildRuntime } from "./schemas/config.js";
import { BuildExtension } from "./build/extensions.js";
import { MachinePresetName } from "./schemas/common.js";
import { LogLevel } from "./logger/taskLogger.js";
import { FailureFnParams, InitFnParams, StartFnParams, SuccessFnParams } from "./types/index.js";
import { RetryOptions } from "./index.js";
import type { Instrumentation } from "@opentelemetry/instrumentation";
import type { BuildExtension } from "./build/extensions.js";
import type { MachinePresetName } from "./schemas/common.js";
import type { LogLevel } from "./logger/taskLogger.js";
import type {
FailureFnParams,
InitFnParams,
StartFnParams,
SuccessFnParams,
} from "./types/index.js";
import type { BuildRuntime, RetryOptions } from "./index.js";
export type TriggerConfig = {
/**
-92
View File
@@ -62,38 +62,6 @@ export const TaskManifest = z.object({
export type TaskManifest = z.infer<typeof TaskManifest>;
export const ExecuteTaskMessage = z.object({
type: z.literal("execute-task"),
data: z.object({
task: TaskManifest,
payload: z.unknown(),
projectRef: z.string(),
configPath: z.string(),
}),
});
export type ExecuteTaskMessage = z.infer<typeof ExecuteTaskMessage>;
export const RunExecution = z.object({
task: TaskManifest,
payload: z.unknown(),
projectRef: z.string(),
configPath: z.string(),
entryPath: z.string(),
loaderPath: z.string().optional(),
env: z.record(z.string()),
cwd: z.string().optional(),
});
export type RunExecution = z.infer<typeof RunExecution>;
export const ParentToChildMessages = z.discriminatedUnion("type", [
IndexMessage,
ExecuteTaskMessage,
]);
export type ParentToChildMessages = z.infer<typeof ParentToChildMessages>;
export const WorkerManifest = z.object({
tasks: TaskManifest.array(),
});
@@ -108,63 +76,3 @@ export const WorkerManifestMessage = z.object({
});
export type WorkerManifestMessage = z.infer<typeof WorkerManifestMessage>;
export const FailedTaskCompletion = z.object({
ok: z.literal(false),
error: z.object({
message: z.string(),
stack: z.string().optional(),
name: z.string().optional(),
}),
});
export type FailedTaskCompletion = z.infer<typeof FailedTaskCompletion>;
export const SuccessfulTaskCompletion = z.object({
ok: z.literal(true),
output: z.unknown(),
});
export type SuccessfulTaskCompletion = z.infer<typeof SuccessfulTaskCompletion>;
export const TaskCompletion = z.discriminatedUnion("ok", [
FailedTaskCompletion,
SuccessfulTaskCompletion,
]);
export type TaskCompletion = z.infer<typeof TaskCompletion>;
export const CompletedTask = z.object({
id: z.string(),
completion: TaskCompletion,
spans: z.array(z.any()),
});
export type CompletedTask = z.infer<typeof CompletedTask>;
export const CompletedTaskMessage = z.object({
type: z.literal("completed-task"),
data: CompletedTask,
});
export type CompletedTaskMessage = z.infer<typeof CompletedTaskMessage>;
export const ChildToParentMessages = z.discriminatedUnion("type", [
WorkerManifestMessage,
CompletedTaskMessage,
]);
export type ChildToParentMessages = z.infer<typeof ChildToParentMessages>;
export const TriggerTaskResult = z.discriminatedUnion("ok", [
z.object({
ok: z.literal(true),
output: z.unknown(),
}),
z.object({
ok: z.literal(false),
error: z.string(),
}),
]);
export type TriggerTaskResult = z.infer<typeof TriggerTaskResult>;
+1 -5
View File
@@ -1,13 +1,9 @@
import { z } from "zod";
export const ConfigManifest = z.object({
projectRef: z.string(),
project: z.string(),
dirs: z.string().array(),
external: z.string().array().optional(),
});
export type ConfigManifest = z.infer<typeof ConfigManifest>;
export const BuildRuntime = z.enum(["node20", "bun"]);
export type BuildRuntime = z.infer<typeof BuildRuntime>;
+1
View File
@@ -9,3 +9,4 @@ export * from "./fetch.js";
export * from "./eventFilter.js";
export * from "./openTelemetry.js";
export * from "./config.js";
export * from "./build.js";
+5 -4
View File
@@ -43,13 +43,14 @@
"get-caller-file": "^2.0.5",
"git-remote-origin-url": "^4.0.0",
"git-repo-info": "^2.1.1",
"msw": "^2.2.1",
"package-json-from-dist": "^1.0.0",
"slug": "^6.0.0",
"terminal-link": "^3.0.0",
"ulid": "^2.3.0",
"uuid": "^9.0.0",
"ws": "^8.11.0",
"zod": "3.23.8",
"msw": "^2.2.1"
"zod": "3.23.8"
},
"devDependencies": {
"@types/debug": "^4.1.7",
@@ -60,9 +61,9 @@
"encoding": "^0.1.13",
"msw": "^2.2.1",
"rimraf": "^3.0.2",
"tshy": "^3.0.2",
"typed-emitter": "^2.1.0",
"typescript": "^5.5.4",
"tshy": "^3.0.2"
"typescript": "^5.5.4"
},
"engines": {
"node": ">=18.20.0"
+3
View File
@@ -0,0 +1,3 @@
import { findPackageJson, loadPackageJson } from "package-json-from-dist";
export const pkg = loadPackageJson(__filename);
export const pj = findPackageJson(__filename);
+5
View File
@@ -0,0 +1,5 @@
import { findPackageJson, loadPackageJson } from "package-json-from-dist";
//@ts-ignore
export const pkg = loadPackageJson(import.meta.url);
//@ts-ignore
export const pj = findPackageJson(import.meta.url);
+2 -2
View File
@@ -36,10 +36,10 @@ import {
taskCatalog,
taskContext,
} from "@trigger.dev/core/v3";
import { version } from "../../package.json";
import { tracer } from "./tracer.js";
import { PollOptions, RetrieveRunResult, runs } from "./runs.js";
import { IdempotencyKey, idempotencyKeys, isIdempotencyKey } from "./idempotencyKeys.js";
import { pkg } from "../pkg.js";
export type Context = TaskRunContext;
@@ -545,7 +545,7 @@ export function createTask<
taskCatalog.registerTaskMetadata({
id: params.id,
packageVersion: version,
packageVersion: pkg.version,
queue: params.queue,
retry: params.retry ? { ...defaultRetryOptions, ...params.retry } : undefined,
machine: params.machine,
+2 -2
View File
@@ -1,4 +1,4 @@
import { TriggerTracer } from "@trigger.dev/core/v3";
import { version } from "../../package.json";
import { pkg } from "../pkg.js";
export const tracer = new TriggerTracer({ name: "@trigger.dev/sdk", version: version });
export const tracer = new TriggerTracer({ name: "@trigger.dev/sdk", version: pkg.version });
+155 -117
View File
@@ -969,6 +969,9 @@ importers:
magicast:
specifier: ^0.3.4
version: 0.3.4
minimatch:
specifier: ^10.0.1
version: 10.0.1
mlly:
specifier: ^1.7.1
version: 1.7.1
@@ -1006,8 +1009,8 @@ importers:
specifier: ^18.2.0
version: 18.2.0
react-error-boundary:
specifier: ^4.0.12
version: 4.0.12(react@18.2.0)
specifier: ^3.1.4
version: 3.1.4(react@18.2.0)
resolve:
specifier: ^1.22.8
version: 1.22.8
@@ -1069,6 +1072,9 @@ importers:
'@types/react':
specifier: ^18.2.48
version: 18.2.48
'@types/resolve':
specifier: ^1.20.6
version: 1.20.6
'@types/semver':
specifier: ^7.3.13
version: 7.5.1
@@ -1334,6 +1340,9 @@ importers:
msw:
specifier: ^2.2.1
version: 2.2.1(typescript@5.5.4)
package-json-from-dist:
specifier: ^1.0.0
version: 1.0.0
slug:
specifier: ^6.0.0
version: 6.1.0
@@ -1411,8 +1420,8 @@ importers:
specifier: ^0.10.1
version: 0.10.1(typescript@5.5.4)(zod@3.23.8)
'@traceloop/instrumentation-openai':
specifier: ^0.3.9
version: 0.3.9(@opentelemetry/api@1.4.1)
specifier: ^0.10.0
version: 0.10.0(@opentelemetry/api@1.4.1)
'@trigger.dev/sdk':
specifier: workspace:*
version: link:../../packages/trigger-sdk
@@ -3523,7 +3532,6 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.1
dev: false
/@babel/template@7.22.15:
resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
@@ -3619,7 +3627,7 @@ packages:
/@changesets/apply-release-plan@6.1.4:
resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/config': 2.3.1
'@changesets/get-version-range-type': 0.3.2
'@changesets/git': 2.0.0
@@ -3637,7 +3645,7 @@ packages:
/@changesets/assemble-release-plan@5.2.4(patch_hash=3wuhjtl4hjck4itk3w32z4cd5u):
resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/errors': 0.1.4
'@changesets/get-dependents-graph': 1.3.6
'@changesets/types': 5.2.1
@@ -3731,7 +3739,7 @@ packages:
/@changesets/get-release-plan@3.0.17:
resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/assemble-release-plan': 5.2.4(patch_hash=3wuhjtl4hjck4itk3w32z4cd5u)
'@changesets/config': 2.3.1
'@changesets/pre': 1.0.14
@@ -3747,7 +3755,7 @@ packages:
/@changesets/git@2.0.0:
resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/errors': 0.1.4
'@changesets/types': 5.2.1
'@manypkg/get-packages': 1.1.3
@@ -3772,7 +3780,7 @@ packages:
/@changesets/pre@1.0.14:
resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/errors': 0.1.4
'@changesets/types': 5.2.1
'@manypkg/get-packages': 1.1.3
@@ -3782,7 +3790,7 @@ packages:
/@changesets/read@0.5.9:
resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/git': 2.0.0
'@changesets/logger': 0.0.5
'@changesets/parse': 0.3.16
@@ -3802,7 +3810,7 @@ packages:
/@changesets/write@0.2.3:
resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/types': 5.2.1
fs-extra: 7.0.1
human-id: 1.0.2
@@ -6808,7 +6816,7 @@ packages:
/@manypkg/find-root@1.1.0:
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/node': 12.20.55
find-up: 4.1.0
fs-extra: 8.1.0
@@ -6816,7 +6824,7 @@ packages:
/@manypkg/get-packages@1.1.3:
resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@changesets/types': 4.1.0
'@manypkg/find-root': 1.1.0
fs-extra: 8.1.0
@@ -7381,22 +7389,6 @@ packages:
- supports-color
dev: true
/@opentelemetry/instrumentation@0.48.0(@opentelemetry/api@1.4.1):
resolution: {integrity: sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.4.1
'@types/shimmer': 1.0.2
import-in-the-middle: 1.7.1
require-in-the-middle: 7.1.1
semver: 7.5.4
shimmer: 1.2.1
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.4.1):
resolution: {integrity: sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==}
engines: {node: '>=14'}
@@ -7465,6 +7457,23 @@ packages:
- supports-color
dev: true
/@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.4.1):
resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.4.1
'@opentelemetry/api-logs': 0.52.1
'@types/shimmer': 1.0.2
import-in-the-middle: 1.11.0
require-in-the-middle: 7.1.1
semver: 7.5.4
shimmer: 1.2.1
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0):
resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==}
engines: {node: '>=14'}
@@ -7958,25 +7967,25 @@ packages:
/@radix-ui/number@1.0.0:
resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: false
/@radix-ui/number@1.0.1:
resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: false
/@radix-ui/primitive@1.0.0:
resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: false
/@radix-ui/primitive@1.0.1:
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: false
/@radix-ui/react-alert-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0):
@@ -8011,7 +8020,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@@ -8072,7 +8081,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
'@radix-ui/react-context': 1.0.0(react@18.2.0)
'@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0)
@@ -8094,7 +8103,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@radix-ui/react-context': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0)
@@ -8118,7 +8127,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.2.0)
@@ -8134,7 +8143,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -8147,7 +8156,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.2.69
react: 18.2.0
dev: false
@@ -8161,7 +8170,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.3.1
react: 18.2.0
dev: false
@@ -8171,7 +8180,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -8184,7 +8193,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.2.69
react: 18.2.0
dev: false
@@ -8198,7 +8207,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.3.1
react: 18.2.0
dev: false
@@ -8243,7 +8252,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@radix-ui/react-context': 1.0.1(@types/react@18.2.69)(react@18.2.0)
@@ -8269,7 +8278,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -8282,7 +8291,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.2.69
react: 18.2.0
dev: false
@@ -8296,7 +8305,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.3.1
react: 18.2.0
dev: false
@@ -8307,7 +8316,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/primitive': 1.0.0
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
'@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0)
@@ -8330,7 +8339,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0)
@@ -8355,7 +8364,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.2.0)
@@ -8397,7 +8406,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -8410,7 +8419,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.2.69
react: 18.2.0
dev: false
@@ -8424,7 +8433,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.3.1
react: 18.2.0
dev: false
@@ -8435,7 +8444,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
'@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
@@ -8456,7 +8465,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.69)(react@18.2.0)
@@ -8494,7 +8503,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0)
react: 18.2.0
dev: false
@@ -8508,7 +8517,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@types/react': 18.2.69
react: 18.2.0
@@ -8523,7 +8532,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@types/react': 18.3.1
react: 18.2.0
@@ -8610,7 +8619,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@floating-ui/react-dom': 0.7.2(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-arrow': 1.0.2(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
@@ -8693,7 +8702,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@@ -8712,7 +8721,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0)
'@types/react': 18.2.69
'@types/react-dom': 18.2.7
@@ -8733,7 +8742,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.2.0)
'@types/react': 18.3.1
'@types/react-dom': 18.2.7
@@ -8768,7 +8777,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
'@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0)
react: 18.2.0
@@ -8788,7 +8797,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@types/react': 18.2.69
@@ -8810,7 +8819,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@types/react': 18.3.1
@@ -8825,7 +8834,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-slot': 1.0.1(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@@ -8844,7 +8853,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.69)(react@18.2.0)
'@types/react': 18.2.69
'@types/react-dom': 18.2.7
@@ -8865,7 +8874,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.2.0)
'@types/react': 18.3.1
'@types/react-dom': 18.2.7
@@ -8909,7 +8918,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/primitive': 1.0.0
'@radix-ui/react-collection': 1.0.2(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
@@ -8936,7 +8945,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0)
@@ -8965,7 +8974,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.2.0)
@@ -9051,7 +9060,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
react: 18.2.0
dev: false
@@ -9244,7 +9253,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -9257,7 +9266,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.2.69
react: 18.2.0
dev: false
@@ -9271,7 +9280,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.3.1
react: 18.2.0
dev: false
@@ -9281,7 +9290,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
react: 18.2.0
dev: false
@@ -9295,7 +9304,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@types/react': 18.2.69
react: 18.2.0
@@ -9310,7 +9319,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@types/react': 18.3.1
react: 18.2.0
@@ -9321,7 +9330,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0)
react: 18.2.0
dev: false
@@ -9335,7 +9344,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@types/react': 18.2.69
react: 18.2.0
@@ -9350,7 +9359,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@types/react': 18.3.1
react: 18.2.0
@@ -9361,7 +9370,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -9374,7 +9383,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.2.69
react: 18.2.0
dev: false
@@ -9388,7 +9397,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.3.1
react: 18.2.0
dev: false
@@ -9398,7 +9407,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -9411,7 +9420,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/react': 18.2.69
react: 18.2.0
dev: false
@@ -9421,7 +9430,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/rect': 1.0.0
react: 18.2.0
dev: false
@@ -9446,7 +9455,7 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0)
react: 18.2.0
dev: false
@@ -9460,7 +9469,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.69)(react@18.2.0)
'@types/react': 18.2.69
react: 18.2.0
@@ -9475,7 +9484,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.2.0)
'@types/react': 18.3.1
react: 18.2.0
@@ -9487,7 +9496,7 @@ packages:
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@@ -9517,7 +9526,7 @@ packages:
/@radix-ui/rect@1.0.0:
resolution: {integrity: sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: false
/@radix-ui/rect@1.0.1:
@@ -12413,7 +12422,7 @@ packages:
engines: {node: '>=12'}
dependencies:
'@babel/code-frame': 7.22.13
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
'@types/aria-query': 5.0.1
aria-query: 5.1.3
chalk: 4.1.2
@@ -12430,19 +12439,23 @@ packages:
resolution: {integrity: sha512-vqd7ZUDSrXFVT1n8b2kc3LnklncDQFPvR58yUS1kEP23/nHPAO9l1lMjUfnPrXYYk4Hj54rrLKMW5ipwk7k09A==}
dev: true
/@traceloop/ai-semantic-conventions@0.3.8:
resolution: {integrity: sha512-RGLFpq3JrRKBhGItq4AbNIoe2h4K5VY4ay4J55B8X7d23VA3fs9QNtv2qlSVkRiEGHinXsCk3RUULUE2GFEu7w==}
/@traceloop/ai-semantic-conventions@0.10.0:
resolution: {integrity: sha512-B7XuwDpSNXtyz1SUi6Xqd/t6xg0dS9V80pLaIxbQC0n5vsHfao5MPqz7jY8WgZroCANFFiDVDE0JMJsX1vfk7Q==}
engines: {node: '>=14'}
dependencies:
'@opentelemetry/api': 1.9.0
dev: false
/@traceloop/instrumentation-openai@0.3.9(@opentelemetry/api@1.4.1):
resolution: {integrity: sha512-Ru2QBK6crx0dtWXd4aMyFNRP9cA2WF+8Rjt2ctOgu/R7M7fmNvtcXveY0qXZ1doKYzzt0+icZqs0ahJEn8WYcQ==}
/@traceloop/instrumentation-openai@0.10.0(@opentelemetry/api@1.4.1):
resolution: {integrity: sha512-rp1J6FOJLNZ1M08xsz2B84STNV3AGKxCq+44w7mgadOCyI6GDw7a1lbLo+wTV0dxnt34HPBBdrvRXCFHd3JK9Q==}
engines: {node: '>=14'}
dependencies:
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.4.1)
'@opentelemetry/instrumentation': 0.48.0(@opentelemetry/api@1.4.1)
'@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.4.1)
'@opentelemetry/semantic-conventions': 1.25.1
'@traceloop/ai-semantic-conventions': 0.3.8
'@traceloop/ai-semantic-conventions': 0.10.0
js-tiktoken: 1.0.12
tslib: 2.6.2
transitivePeerDependencies:
- '@opentelemetry/api'
- supports-color
@@ -12979,6 +12992,10 @@ packages:
form-data: 2.5.1
dev: false
/@types/resolve@1.20.6:
resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==}
dev: true
/@types/responselike@1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
@@ -13621,6 +13638,13 @@ packages:
dependencies:
acorn: 8.10.0
/acorn-import-assertions@1.9.0(acorn@8.12.1):
resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
peerDependencies:
acorn: ^8
dependencies:
acorn: 8.12.1
/acorn-import-attributes@1.9.5(acorn@8.10.0):
resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
peerDependencies:
@@ -13635,6 +13659,14 @@ packages:
dependencies:
acorn: 8.10.0
/acorn-jsx@5.3.2(acorn@8.12.1):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
acorn: 8.12.1
dev: true
/acorn-node@1.8.2:
resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
dependencies:
@@ -16070,7 +16102,7 @@ packages:
/dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
csstype: 3.1.1
dev: false
@@ -20297,6 +20329,12 @@ packages:
resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==}
dev: true
/js-tiktoken@1.0.12:
resolution: {integrity: sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==}
dependencies:
base64-js: 1.5.1
dev: false
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -20962,7 +21000,7 @@ packages:
/media-query-parser@2.0.2:
resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: true
/media-typer@0.3.0:
@@ -21087,8 +21125,8 @@ packages:
/micromark-extension-mdxjs@1.0.0:
resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==}
dependencies:
acorn: 8.10.0
acorn-jsx: 5.3.2(acorn@8.10.0)
acorn: 8.12.1
acorn-jsx: 5.3.2(acorn@8.12.1)
micromark-extension-mdx-expression: 1.0.3
micromark-extension-mdx-jsx: 1.0.3
micromark-extension-mdx-md: 1.0.0
@@ -23907,12 +23945,13 @@ packages:
- webpack-cli
dev: false
/react-error-boundary@4.0.12(react@18.2.0):
resolution: {integrity: sha512-kJdxdEYlb7CPC1A0SeUY38cHpjuu6UkvzKiAmqmOFL21VRfMhOcWxTCBgLVCO0VEMh9JhFNcVaXlV4/BTpiwOA==}
/react-error-boundary@3.1.4(react@18.2.0):
resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==}
engines: {node: '>=10', npm: '>=6'}
peerDependencies:
react: '>=16.13.1'
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
react: 18.2.0
dev: false
@@ -24156,7 +24195,7 @@ packages:
react: '>=16.6.0'
react-dom: '>=16.6.0'
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
@@ -24354,12 +24393,11 @@ packages:
/regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
dev: false
/regenerator-transform@0.15.1:
resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: true
/regex-not@1.0.2:
@@ -24884,7 +24922,7 @@ packages:
/rtl-css-js@1.16.1:
resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==}
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime': 7.24.5
dev: false
/run-applescript@7.0.0:
@@ -26078,7 +26116,7 @@ packages:
fast-glob: 3.3.1
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.21.0
jiti: 1.21.6
lilconfig: 2.1.0
micromatch: 4.0.5
normalize-path: 3.0.0
@@ -26250,7 +26288,7 @@ packages:
hasBin: true
dependencies:
'@jridgewell/source-map': 0.3.3
acorn: 8.10.0
acorn: 8.12.1
commander: 2.20.3
source-map-support: 0.5.21
@@ -28166,8 +28204,8 @@ packages:
'@webassemblyjs/ast': 1.11.5
'@webassemblyjs/wasm-edit': 1.11.5
'@webassemblyjs/wasm-parser': 1.11.5
acorn: 8.10.0
acorn-import-assertions: 1.9.0(acorn@8.10.0)
acorn: 8.12.1
acorn-import-assertions: 1.9.0(acorn@8.12.1)
browserslist: 4.23.0
chrome-trace-event: 1.0.3
enhanced-resolve: 5.15.0
@@ -28206,8 +28244,8 @@ packages:
'@webassemblyjs/ast': 1.11.5
'@webassemblyjs/wasm-edit': 1.11.5
'@webassemblyjs/wasm-parser': 1.11.5
acorn: 8.10.0
acorn-import-assertions: 1.9.0(acorn@8.10.0)
acorn: 8.12.1
acorn-import-assertions: 1.9.0(acorn@8.12.1)
browserslist: 4.23.0
chrome-trace-event: 1.0.3
enhanced-resolve: 5.15.0
+1 -1
View File
@@ -23,7 +23,7 @@
"@react-email/render": "^0.0.7",
"@sindresorhus/slugify": "^2.2.1",
"@t3-oss/env-nextjs": "^0.10.1",
"@traceloop/instrumentation-openai": "^0.3.9",
"@traceloop/instrumentation-openai": "^0.10.0",
"@trigger.dev/sdk": "workspace:*",
"dotenv": "^16.4.5",
"execa": "^8.0.1",
+1 -1
View File
@@ -21,7 +21,7 @@ export const anyPayloadTask = task({
});
if (result.ok) {
logger.info("Result from fetch-post-task", { output: result.output });
logger.info("Result from fetch-post-task 211111s", { output: result.output });
} else {
logger.error("Error from fetch-post-task", { error: result.error });
}
+2 -36
View File
@@ -1,39 +1,10 @@
import { InfisicalClient } from "@infisical/sdk";
import { defineConfig } from "@trigger.dev/sdk/v3";
import { OpenAIInstrumentation } from "@traceloop/instrumentation-openai";
import { defineConfig, type ResolveEnvironmentVariablesFunction } from "@trigger.dev/sdk/v3";
export { handleError } from "./src/handleError";
export const resolveEnvVars: ResolveEnvironmentVariablesFunction = async ({
projectRef,
env,
environment,
}) => {
if (env.INFISICAL_CLIENT_ID === undefined || env.INFISICAL_CLIENT_SECRET === undefined) {
return;
}
const client = new InfisicalClient({
clientId: env.INFISICAL_CLIENT_ID,
clientSecret: env.INFISICAL_CLIENT_SECRET,
});
const secrets = await client.listSecrets({
environment,
projectId: env.INFISICAL_PROJECT_ID!,
});
return {
variables: secrets.map((secret) => ({
name: secret.secretKey,
value: secret.secretValue,
})),
};
};
export default defineConfig({
project: "yubjwjsfkxnylobaqvqz",
machine: "small-2x",
instrumentations: [new OpenAIInstrumentation()],
retries: {
enabledInDev: true,
default: {
@@ -45,12 +16,7 @@ export default defineConfig({
},
},
enableConsoleLogging: false,
additionalPackages: ["wrangler@3.35.0", "pg@8.11.5"],
additionalFiles: ["./wrangler/wrangler.toml"],
dependenciesToBundle: [/@sindresorhus/, "escape-string-regexp", /@t3-oss/],
instrumentations: [new OpenAIInstrumentation()],
logLevel: "info",
postInstall: "echo '========== config.postInstall'",
onStart: async (payload, { ctx }) => {
console.log(`Task ${ctx.task.id} started ${ctx.run.id}`);
},
+4 -1
View File
@@ -11,7 +11,10 @@
"jsx": "preserve",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["DOM", "DOM.Iterable"]
"lib": ["DOM", "DOM.Iterable"],
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["./src/**/*.ts", "trigger.config.ts", "src/trigger/email.tsx"]
}