diff --git a/package.json b/package.json index 66f2160c9..d407eaff2 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,8 @@ "turbo": "^1.10.3", "vite": "^4.1.1", "vite-tsconfig-paths": "^4.0.5", - "vitest": "^0.28.4" + "vitest": "^0.28.4", + "pkg-types": "1.1.3" }, "packageManager": "pnpm@8.15.5", "dependencies": { diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 838d65cb5..056870275 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -53,6 +53,7 @@ "@types/resolve": "^1.20.6", "@types/semver": "^7.3.13", "@types/ws": "^8.5.3", + "@types/source-map-support": "0.5.10", "cpy-cli": "^5.0.0", "nodemon": "^3.0.1", "npm-run-all": "^4.1.5", @@ -64,15 +65,17 @@ "type-fest": "^3.6.0", "typescript": "^5.5.4", "vitest": "^1.6.0", - "xdg-app-paths": "^8.3.0" + "xdg-app-paths": "^8.3.0", + "tsx": "4.17.0" }, "scripts": { "typecheck": "tsc", - "prepare": "tshy", + "prepare": "tshy && pnpm run update-version", "build": "tshy", "dev": "tshy --watch", "test": "vitest", - "test:e2e": "vitest --run -c e2e/vite.config.js" + "test:e2e": "vitest --run -c e2e/vite.config.js", + "update-version": "tsx ../../scripts/updateVersion.ts" }, "dependencies": { "@anatine/esbuild-decorators": "^0.2.19", @@ -123,7 +126,6 @@ "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", diff --git a/packages/cli-v3/src/build/extensions.ts b/packages/cli-v3/src/build/extensions.ts index eb89e4955..31da16e9f 100644 --- a/packages/cli-v3/src/build/extensions.ts +++ b/packages/cli-v3/src/build/extensions.ts @@ -1,20 +1,14 @@ -import * as esbuild from "esbuild"; -import { resolveModule } from "./resolveModule.js"; -import { BuildContext, BuildExtension, BuildLayer, RegisteredPlugin, RegisterPluginOptions, ResolvedConfig } from "@trigger.dev/core/v3/build"; +import { + BuildContext, + BuildExtension, + BuildLayer, + RegisteredPlugin, + ResolvedConfig, +} from "@trigger.dev/core/v3/build"; import { BuildManifest, BuildTarget } from "@trigger.dev/core/v3/schemas"; +import * as esbuild from "esbuild"; 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); - }, - }; -} +import { resolveModule } from "./resolveModule.js"; export interface InternalBuildContext extends BuildContext { getLayers(): BuildLayer[]; @@ -25,9 +19,7 @@ export interface InternalBuildContext extends BuildContext { getExtensions(): BuildExtension[]; } -export async function notifyExtensionOnBuildStart( - context: InternalBuildContext -) { +export async function notifyExtensionOnBuildStart(context: InternalBuildContext) { for (const extension of context.getExtensions()) { if (extension.onBuildStart) { await extension.onBuildStart(context); @@ -118,10 +110,7 @@ function applyContextLayersToManifest( return manifest; } -function applyLayerToManifest( - layer: BuildLayer, - manifest: BuildManifest -): BuildManifest { +function applyLayerToManifest(layer: BuildLayer, manifest: BuildManifest): BuildManifest { let $manifest = { ...manifest }; if (layer.commands) { @@ -152,9 +141,7 @@ function applyLayerToManifest( return $manifest; } -export function resolvePluginsForContext( - context: InternalBuildContext -): esbuild.Plugin[] { +export function resolvePluginsForContext(context: InternalBuildContext): esbuild.Plugin[] { const registeredPlugins = context.getPlugins(); if (registeredPlugins.length === 0) { diff --git a/packages/cli-v3/src/build/plugins.ts b/packages/cli-v3/src/build/plugins.ts index 12abb223c..ee08f28b2 100644 --- a/packages/cli-v3/src/build/plugins.ts +++ b/packages/cli-v3/src/build/plugins.ts @@ -18,6 +18,8 @@ export async function buildPlugins( plugins.push($configPlugin); } + plugins.push(mockServerOnlyPlugin()); + return plugins; } @@ -39,3 +41,33 @@ export function analyzeMetadataPlugin(): esbuild.Plugin { }, }; } + +export function mockServerOnlyPlugin(): esbuild.Plugin { + return { + name: "trigger-mock-server-only", + setup(build) { + build.onResolve({ filter: /^server-only$/ }, (args) => { + if (args.path !== "server-only") { + return undefined; + } + + logger.debug(`[trigger-mock-server-only] Bundling ${args.path}`, { + ...args, + }); + + return { + path: args.path, + external: false, + namespace: "server-only-mock", + }; + }); + + build.onLoad({ filter: /^server-only$/, namespace: "server-only-mock" }, (args) => { + return { + contents: `export default true;`, + loader: "js", + }; + }); + }, + }; +} diff --git a/packages/cli-v3/src/cli/index.ts b/packages/cli-v3/src/cli/index.ts index 1ad63073d..22e179c52 100644 --- a/packages/cli-v3/src/cli/index.ts +++ b/packages/cli-v3/src/cli/index.ts @@ -4,9 +4,10 @@ import { configureInitCommand } from "../commands/init.js"; import { configureLoginCommand } from "../commands/login.js"; import { configureLogoutCommand } from "../commands/logout.js"; import { configureWhoamiCommand } from "../commands/whoami.js"; -import { COMMAND_NAME, VERSION } from "../consts.js"; +import { COMMAND_NAME } from "../consts.js"; import { configureListProfilesCommand } from "../commands/list-profiles.js"; import { configureUpdateCommand } from "../commands/update.js"; +import { VERSION } from "../version.js"; export const program = new Command(); diff --git a/packages/cli-v3/src/commands/login.ts b/packages/cli-v3/src/commands/login.ts index 8efd4932f..fd843efbb 100644 --- a/packages/cli-v3/src/commands/login.ts +++ b/packages/cli-v3/src/commands/login.ts @@ -21,7 +21,7 @@ import { whoAmI } from "./whoami.js"; import { logger } from "../utilities/logger.js"; import { spinner } from "../utilities/windows.js"; import { isLinuxServer } from "../utilities/linux.js"; -import { VERSION } from "../consts.js"; +import { VERSION } from "../version.js"; export const LoginCommandOptions = CommonCommandOptions.extend({ apiUrl: z.string(), diff --git a/packages/cli-v3/src/commands/update.ts b/packages/cli-v3/src/commands/update.ts index 51b8e9512..83cb1a866 100644 --- a/packages/cli-v3/src/commands/update.ts +++ b/packages/cli-v3/src/commands/update.ts @@ -11,7 +11,7 @@ import { join, resolve } from "path"; import { JavascriptProject } from "../utilities/javascriptProject.js"; import { PackageManager } from "../utilities/getUserPackageManager.js"; import { chalkError, prettyError, prettyWarning } from "../utilities/cliOutput.js"; -import { VERSION } from "../consts.js"; +import { VERSION } from "../version.js"; export const UpdateCommandOptions = CommonCommandOptions.pick({ logLevel: true, diff --git a/packages/cli-v3/src/consts.ts b/packages/cli-v3/src/consts.ts index 6578aaa22..9df98d0d7 100644 --- a/packages/cli-v3/src/consts.ts +++ b/packages/cli-v3/src/consts.ts @@ -1,7 +1,4 @@ -import { pkg } from "./pkg.js"; - export const COMMAND_NAME = "trigger.dev"; export const CLOUD_WEB_URL = "https://cloud.trigger.dev"; export const CLOUD_API_URL = "https://api.trigger.dev"; export const CONFIG_FILES = ["trigger.config.ts", "trigger.config.js", "trigger.config.mjs"]; -export const VERSION = pkg.version; diff --git a/packages/cli-v3/src/dev/backgroundWorker.ts b/packages/cli-v3/src/dev/backgroundWorker.ts index 83fc41ecb..ad6652f12 100644 --- a/packages/cli-v3/src/dev/backgroundWorker.ts +++ b/packages/cli-v3/src/dev/backgroundWorker.ts @@ -314,14 +314,34 @@ export class BackgroundWorker { }); child.stdout?.on("data", (data) => { - logger.log(data.toString()); + logger.debug(data.toString()); }); child.stderr?.on("data", (data) => { - this.stderr.push(data.toString()); + logger.debug(data.toString()); + }); + + const sender = new ZodMessageSender({ + schema: workerToChildMessages, + sender: async (message) => { + if (child.connected && !resolved) { + child.send(message); + } + }, + }); + + sender.send("INDEX", { build: this.build }).catch((err) => { + if (err instanceof Error) { + clearTimeout(timeout); + resolved = true; + reject(err); + child.kill(); + } }); }); + logger.debug("Worker initialized", { manifest: this.manifest }); + this._initialized = true; } diff --git a/packages/cli-v3/src/dev/devSession.ts b/packages/cli-v3/src/dev/devSession.ts index 333cffba0..183b42578 100644 --- a/packages/cli-v3/src/dev/devSession.ts +++ b/packages/cli-v3/src/dev/devSession.ts @@ -70,6 +70,8 @@ export async function startDevSession({ buildManifest = await notifyExtensionOnBuildComplete(buildContext, buildManifest); logger.debug("Updated bundle", { bundle, buildManifest }); + + await runtime.initializeWorker(buildManifest); } catch (error) { logger.error("Error updating bundle", { error }); } @@ -156,7 +158,10 @@ async function createBuildManifestFromBundle( target: "dev", files: bundle.files, externals: [], - config: resolvedConfig, + config: { + project: resolvedConfig.project, + dirs: resolvedConfig.dirs, + }, outputPath: destination, workerEntryPoint: bundle.workerEntryPoint ?? devEntryPoint, loaderEntryPoint: bundle.loaderEntryPoint ?? telemetryEntryPoint, diff --git a/packages/cli-v3/src/entryPoints/dev.ts b/packages/cli-v3/src/entryPoints/dev.ts index cb0ff5c3b..ad9b6dbd6 100644 --- a/packages/cli-v3/src/entryPoints/dev.ts +++ b/packages/cli-v3/src/entryPoints/dev.ts @@ -1 +1,296 @@ -export {}; +import type { Tracer } from "@opentelemetry/api"; +import type { Logger } from "@opentelemetry/api-logs"; +import { + childToWorkerMessages, + clock, + type HandleErrorFunction, + logger, + LogLevel, + runtime, + taskCatalog, + TaskRunErrorCodes, + TaskRunExecution, + TriggerConfig, + TriggerTracer, + workerToChildMessages, +} from "@trigger.dev/core/v3"; +import { DevRuntimeManager } from "@trigger.dev/core/v3/dev"; +import { + ConsoleInterceptor, + DevUsageManager, + DurableClock, + getEnvVar, + logLevels, + OtelTaskLogger, + StandardTaskCatalog, + TaskExecutor, + TracingDiagnosticLogLevel, + TracingSDK, + usage, +} from "@trigger.dev/core/v3/workers"; +import { + ZodMessageHandler, + ZodMessageSender, + ZodSchemaParsedError, +} from "@trigger.dev/core/v3/zodMessageHandler"; +import sourceMapSupport from "source-map-support"; +import { VERSION } from "../version.js"; + +sourceMapSupport.install({ + handleUncaughtExceptions: false, + environment: "node", + hookRequire: false, +}); + +const sender = new ZodMessageSender({ + schema: childToWorkerMessages, + sender: async (message) => { + process.send?.(message); + }, +}); + +taskCatalog.setGlobalTaskCatalog(new StandardTaskCatalog()); +const durableClock = new DurableClock(); +clock.setGlobalClock(durableClock); +usage.setGlobalUsageManager(new DevUsageManager()); +const devRuntimeManager = new DevRuntimeManager(); +runtime.setGlobalRuntimeManager(devRuntimeManager); + +const triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL"); + +async function importConfig( + configPath: string +): Promise<{ config: TriggerConfig; handleError?: HandleErrorFunction }> { + const configModule = await import(configPath); + + const config = configModule?.default ?? configModule?.config; + + return { + config, + handleError: configModule?.handleError, + }; +} + +async function bootstrap(configPath: string) { + const { config, handleError } = await importConfig(configPath); + + const tracingSDK = new TracingSDK({ + url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://0.0.0.0:4318", + instrumentations: config.instrumentations ?? [], + diagLogLevel: (process.env.OTEL_LOG_LEVEL as TracingDiagnosticLogLevel) ?? "none", + forceFlushTimeoutMillis: 30_000, + }); + + const otelTracer: Tracer = tracingSDK.getTracer("trigger-dev-worker", VERSION); + const otelLogger: Logger = tracingSDK.getLogger("trigger-dev-worker", VERSION); + + const tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger }); + const consoleInterceptor = new ConsoleInterceptor( + otelLogger, + typeof config.enableConsoleLogging === "boolean" ? config.enableConsoleLogging : true + ); + + const configLogLevel = triggerLogLevel ?? config.logLevel ?? "info"; + + const otelTaskLogger = new OtelTaskLogger({ + logger: otelLogger, + tracer: tracer, + level: logLevels.includes(configLogLevel as any) ? (configLogLevel as LogLevel) : "info", + }); + + logger.setGlobalTaskLogger(otelTaskLogger); + + return { tracer, tracingSDK, consoleInterceptor, config, handleErrorFn: handleError }; +} + +async function registerTaskFileMetadata(files: Array<{ entry: string; out: string }>) { + for (const file of files) { + console.log("Detecting exported tasks in file", file.out); + + const module = await import(file.out); + + for (const exportName of Object.keys(module)) { + const task = module[exportName]; + + if (!task) { + continue; + } + + if (task[Symbol.for("trigger.dev/task")]) { + if (taskCatalog.taskExists(task.id)) { + taskCatalog.registerTaskFileMetadata(task.id, { + exportName, + filePath: file.out, + entryPoint: file.entry, + }); + } + } + } + } +} + +let _execution: TaskRunExecution | undefined; +let _isRunning = false; +let _tracingSDK: TracingSDK | undefined; + +const handler = new ZodMessageHandler({ + schema: workerToChildMessages, + messages: { + INDEX: async ({ build }) => { + await bootstrap(build.configPath); + await registerTaskFileMetadata(build.files); + + const tasks = taskCatalog.listTaskManifests(); + + await sender.send("INDEX_COMPLETE", { manifest: { tasks } }).catch((err) => { + if (err instanceof ZodSchemaParsedError) { + sender.send("TASKS_FAILED_TO_PARSE", { + zodIssues: err.error.issues, + tasks, + }); + } else { + console.error("Failed to send TASKS_READY message", err); + } + }); + }, + EXECUTE_TASK_RUN: async ({ execution, traceContext, metadata }) => { + if (_isRunning) { + console.error("Worker is already running a task"); + + await sender.send("TASK_RUN_COMPLETED", { + execution, + result: { + ok: false, + id: execution.run.id, + error: { + type: "INTERNAL_ERROR", + code: TaskRunErrorCodes.TASK_ALREADY_RUNNING, + }, + usage: { + durationMs: 0, + }, + }, + }); + + return; + } + + process.title = `trigger-dev-worker: ${execution.task.id} ${execution.run.id}`; + + const task = taskCatalog.getTask(execution.task.id); + + if (!task) { + console.error(`Could not find task ${execution.task.id}`); + + await sender.send("TASK_RUN_COMPLETED", { + execution, + result: { + ok: false, + id: execution.run.id, + error: { + type: "INTERNAL_ERROR", + code: TaskRunErrorCodes.COULD_NOT_FIND_EXECUTOR, + }, + usage: { + durationMs: 0, + }, + }, + }); + + return; + } + + const { tracer, tracingSDK, consoleInterceptor, config, handleErrorFn } = await bootstrap( + "./trigger.config.js" + ); + + const executor = new TaskExecutor(task, { + tracer, + tracingSDK, + consoleInterceptor, + config, + handleErrorFn, + }); + + try { + _execution = execution; + _isRunning = true; + + const measurement = usage.start(); + + const { result } = await executor.execute(execution, metadata, traceContext, measurement); + + const usageSample = usage.stop(measurement); + + return sender.send("TASK_RUN_COMPLETED", { + execution, + result: { + ...result, + usage: { + durationMs: usageSample.cpuTime, + }, + }, + }); + } finally { + _execution = undefined; + _isRunning = false; + } + }, + TASK_RUN_COMPLETED_NOTIFICATION: async (payload) => { + switch (payload.version) { + case "v1": { + devRuntimeManager.resumeTask(payload.completion, payload.execution.run.id); + break; + } + case "v2": { + devRuntimeManager.resumeTask(payload.completion, payload.completion.id); + break; + } + } + }, + CLEANUP: async ({ flush, kill }) => { + if (kill) { + await _tracingSDK?.flush(); + // Now we need to exit the process + await sender.send("READY_TO_DISPOSE", undefined); + } else { + if (flush) { + await _tracingSDK?.flush(); + } + } + }, + }, +}); + +process.on("message", async (msg: any) => { + await handler.handleMessage(msg); +}); + +process.title = "trigger-dev-worker"; + +async function asyncHeartbeat(initialDelayInSeconds: number = 30, intervalInSeconds: number = 30) { + async function _doHeartbeat() { + while (true) { + if (_isRunning && _execution) { + try { + await sender.send("TASK_HEARTBEAT", { id: _execution.attempt.id }); + } catch (err) { + console.error("Failed to send HEARTBEAT message", err); + } + } + + await new Promise((resolve) => setTimeout(resolve, 1000 * intervalInSeconds)); + } + } + + // Wait for the initial delay + await new Promise((resolve) => setTimeout(resolve, 1000 * initialDelayInSeconds)); + + // Wait for 5 seconds before the next execution + return _doHeartbeat(); +} + +// Start the async interval after 30 seconds +asyncHeartbeat().catch((err) => { + console.error("Failed to start asyncHeartbeat", err); +}); diff --git a/packages/cli-v3/src/pkg-cjs.cts b/packages/cli-v3/src/pkg-cjs.cts deleted file mode 100644 index ec0aaf66b..000000000 --- a/packages/cli-v3/src/pkg-cjs.cts +++ /dev/null @@ -1,3 +0,0 @@ -import { findPackageJson, loadPackageJson } from "package-json-from-dist"; -export const pkg = loadPackageJson(__filename); -export const pj = findPackageJson(__filename); diff --git a/packages/cli-v3/src/pkg.ts b/packages/cli-v3/src/pkg.ts deleted file mode 100644 index 53c3b414a..000000000 --- a/packages/cli-v3/src/pkg.ts +++ /dev/null @@ -1,5 +0,0 @@ -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); diff --git a/packages/cli-v3/src/telemetry/tracing.ts b/packages/cli-v3/src/telemetry/tracing.ts index 425bf5b4b..68d53eb58 100644 --- a/packages/cli-v3/src/telemetry/tracing.ts +++ b/packages/cli-v3/src/telemetry/tracing.ts @@ -9,7 +9,7 @@ import { SEMRESATTRS_SERVICE_VERSION, } from "@opentelemetry/semantic-conventions"; import { logger } from "../utilities/logger.js"; -import { VERSION } from "../consts.js"; +import { VERSION } from "../version.js"; function initializeTracing(): NodeTracerProvider | undefined { if ( diff --git a/packages/cli-v3/src/utilities/initialBanner.ts b/packages/cli-v3/src/utilities/initialBanner.ts index 9b1eee35e..3924fae99 100644 --- a/packages/cli-v3/src/utilities/initialBanner.ts +++ b/packages/cli-v3/src/utilities/initialBanner.ts @@ -4,11 +4,11 @@ import checkForUpdate from "update-check"; import { chalkGrey, chalkRun, chalkTask, chalkWorker, green, logo } from "./cliOutput.js"; import { logger } from "./logger.js"; import { spinner } from "./windows.js"; -import { readPackageJson } from "./packageJson.js"; +import { readPackageJSON } from "pkg-types"; +import { VERSION } from "../version.js"; export async function printInitialBanner(performUpdateCheck = true) { - const cliVersion = await getVersion(); - const text = `\n${logo()} ${chalkGrey(`(${cliVersion})`)}\n`; + const text = `\n${logo()} ${chalkGrey(`(${VERSION})`)}\n`; logger.info(text); @@ -21,7 +21,7 @@ export async function printInitialBanner(performUpdateCheck = true) { // Log a slightly more noticeable message if this is a major bump if (maybeNewVersion !== undefined) { loadingSpinner.stop(`Update available ${chalk.green(maybeNewVersion)}`); - const currentMajor = parseInt(cliVersion.split(".")[0]!); + const currentMajor = parseInt(VERSION.split(".")[0]!); const newMajor = parseInt(maybeNewVersion.split(".")[0]!); if (newMajor > currentMajor) { logger.warn( @@ -37,19 +37,17 @@ After installation, run Trigger.dev with \`npx trigger.dev\`.` } export async function printStandloneInitialBanner(performUpdateCheck = true) { - const cliVersion = await getVersion(); - if (performUpdateCheck) { const maybeNewVersion = await updateCheck(); // Log a slightly more noticeable message if this is a major bump if (maybeNewVersion !== undefined) { - logger.log(`\n${logo()} ${chalkGrey(`(${cliVersion} -> ${chalk.green(maybeNewVersion)})`)}`); + logger.log(`\n${logo()} ${chalkGrey(`(${VERSION} -> ${chalk.green(maybeNewVersion)})`)}`); } else { - logger.log(`\n${logo()} ${chalkGrey(`(${cliVersion})`)}`); + logger.log(`\n${logo()} ${chalkGrey(`(${VERSION})`)}`); } } else { - logger.log(`\n${logo()} ${chalkGrey(`(${cliVersion})`)}`); + logger.log(`\n${logo()} ${chalkGrey(`(${VERSION})`)}`); } logger.log(`${chalkGrey("-".repeat(54))}`); @@ -71,10 +69,10 @@ export function printDevBanner(printTopBorder = true) { async function doUpdateCheck(): Promise { let update: Result | null = null; try { - const pkg = await readPackageJson(); + const pkg = await readPackageJSON(); // default cache for update check is 1 day update = await checkForUpdate.default(pkg, { - distTag: pkg.version?.startsWith("3.0.0-beta") ? "beta" : "latest", + distTag: VERSION.startsWith("3.0.0-beta") ? "beta" : "latest", }); } catch (err) { // ignore error @@ -87,8 +85,3 @@ let updateCheckPromise: Promise; export function updateCheck(): Promise { return (updateCheckPromise ??= doUpdateCheck()); } - -async function getVersion() { - const packageJson = await readPackageJson(); - return packageJson.version ?? "unknown"; -} diff --git a/packages/cli-v3/src/utilities/packageJson.ts b/packages/cli-v3/src/utilities/packageJson.ts deleted file mode 100644 index 768663ccb..000000000 --- a/packages/cli-v3/src/utilities/packageJson.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { readPackageJSON } from "pkg-types"; -import { pj } from "../pkg.js"; - -export async function readPackageJson() { - return await readPackageJSON(pj); -} diff --git a/packages/cli-v3/src/version.ts b/packages/cli-v3/src/version.ts new file mode 100644 index 000000000..2e47a8868 --- /dev/null +++ b/packages/cli-v3/src/version.ts @@ -0,0 +1 @@ +export const VERSION = "0.0.0"; diff --git a/packages/core/package.json b/packages/core/package.json index bd0b26e2f..234e47636 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -29,6 +29,7 @@ "./versions": "./src/versions.ts", "./v3": "./src/v3/index.ts", "./v3/build": "./src/v3/build/index.ts", + "./v3/extensions": "./src/v3/extensions/index.ts", "./v3/apps": "./src/v3/apps/index.ts", "./v3/errors": "./src/v3/errors.ts", "./v3/logger-api": "./src/v3/logger-api.ts", @@ -58,7 +59,8 @@ "sideEffects": false, "scripts": { "clean": "rimraf dist", - "prepare": "tshy", + "prepare": "tshy && pnpm run update-version", + "update-version": "tsx ../../scripts/updateVersion.ts", "build": "tshy", "dev": "tshy --watch", "typecheck": "tsc --noEmit", @@ -79,7 +81,6 @@ "@opentelemetry/semantic-conventions": "1.25.1", "execa": "^8.0.1", "humanize-duration": "^3.27.3", - "package-json-from-dist": "^1.0.0", "socket.io-client": "4.7.5", "superjson": "^2.2.1", "zod": "3.23.8", @@ -97,7 +98,8 @@ "ts-essentials": "10.0.1", "tshy": "^3.0.2", "typescript": "^5.5.4", - "vitest": "^1.6.0" + "vitest": "^1.6.0", + "tsx": "4.17.0" }, "engines": { "node": ">=18.20.0" @@ -247,6 +249,17 @@ "default": "./dist/commonjs/v3/build/index.js" } }, + "./v3/extensions": { + "import": { + "triggerdotdev-source": "./src/v3/extensions/index.ts", + "types": "./dist/esm/v3/extensions/index.d.ts", + "default": "./dist/esm/v3/extensions/index.js" + }, + "require": { + "types": "./dist/commonjs/v3/extensions/index.d.ts", + "default": "./dist/commonjs/v3/extensions/index.js" + } + }, "./v3/apps": { "import": { "triggerdotdev-source": "./src/v3/apps/index.ts", diff --git a/packages/core/src/pkg-cjs.cts b/packages/core/src/pkg-cjs.cts deleted file mode 100644 index ec0aaf66b..000000000 --- a/packages/core/src/pkg-cjs.cts +++ /dev/null @@ -1,3 +0,0 @@ -import { findPackageJson, loadPackageJson } from "package-json-from-dist"; -export const pkg = loadPackageJson(__filename); -export const pj = findPackageJson(__filename); diff --git a/packages/core/src/pkg.ts b/packages/core/src/pkg.ts deleted file mode 100644 index aab7514d2..000000000 --- a/packages/core/src/pkg.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { findPackageJson, loadPackageJson } from "package-json-from-dist"; -//@ts-ignore -export const pkg = loadPackageJson(import.meta.url ?? __filename); // ?? __filename is a hack to get the webapp to build -//@ts-ignore -export const pj = findPackageJson(import.meta.url ?? __filename); // ?? __filename is a hack to get the webapp to build diff --git a/packages/core/src/v3/apiClient/index.ts b/packages/core/src/v3/apiClient/index.ts index f95a8079f..aafc5b7ed 100644 --- a/packages/core/src/v3/apiClient/index.ts +++ b/packages/core/src/v3/apiClient/index.ts @@ -43,7 +43,7 @@ import { ListRunsQueryParams, UpdateEnvironmentVariableParams, } from "./types.js"; -import { pkg } from "../../pkg.js"; +import { VERSION } from "../../version.js"; export type { CreateEnvironmentVariableParams, @@ -503,7 +503,7 @@ export class ApiClient { const headers: Record = { "Content-Type": "application/json", Authorization: `Bearer ${this.accessToken}`, - "trigger-version": pkg.version, + "trigger-version": VERSION, }; // Only inject the context if we are inside a task diff --git a/packages/core/src/v3/build/extensions.ts b/packages/core/src/v3/build/extensions.ts index be8e7ab0a..e377ac6c8 100644 --- a/packages/core/src/v3/build/extensions.ts +++ b/packages/core/src/v3/build/extensions.ts @@ -2,6 +2,18 @@ import { BuildManifest, BuildTarget } from "../schemas/build.js"; import type { Plugin } from "esbuild"; import { ResolvedConfig } from "./resolvedConfig.js"; +export function createExtensionForPlugin( + plugin: Plugin, + options: RegisterPluginOptions = {} +): BuildExtension { + return { + name: plugin.name, + onBuildStart(context) { + context.registerPlugin(plugin, options); + }, + }; +} + export interface BuildExtension { name: string; externalsForTarget?: (target: BuildTarget) => string[] | undefined; @@ -48,4 +60,4 @@ export type RegisterPluginOptions = { export type RegisteredPlugin = RegisterPluginOptions & { plugin: Plugin; -}; \ No newline at end of file +}; diff --git a/packages/core/src/v3/extensions/emitDecoratorMetadata.ts b/packages/core/src/v3/extensions/emitDecoratorMetadata.ts new file mode 100644 index 000000000..17e2339b2 --- /dev/null +++ b/packages/core/src/v3/extensions/emitDecoratorMetadata.ts @@ -0,0 +1,63 @@ +import * as esbuild from "esbuild"; +import { readFile } from "node:fs/promises"; +import { readTSConfig } from "pkg-types"; +import typescriptPkg, { ModuleKind } from "typescript"; +import { BuildExtension, createExtensionForPlugin } from "../build/extensions.js"; + +const { transpileModule } = typescriptPkg; + +const decoratorMatcher = new RegExp(/((? { + const ts = await readFile(args.path, "utf8"); + + if (!ts) return; + + // Find the decorator and if there isn't one, return out + if (!decoratorMatcher.test(ts)) { + return; + } + + const program = transpileModule(ts, { + fileName: args.path, + compilerOptions: { + ...tsconfig.compilerOptions, + module: ModuleKind.ES2022, + }, + }); + + return { contents: program.outputText }; + }); + }, + }; +} diff --git a/packages/core/src/v3/extensions/index.ts b/packages/core/src/v3/extensions/index.ts new file mode 100644 index 000000000..4996eec0b --- /dev/null +++ b/packages/core/src/v3/extensions/index.ts @@ -0,0 +1 @@ +export * from "./emitDecoratorMetadata.js"; diff --git a/packages/core/src/v3/otel/tracingSDK.ts b/packages/core/src/v3/otel/tracingSDK.ts index 793bbf0b0..929b0c801 100644 --- a/packages/core/src/v3/otel/tracingSDK.ts +++ b/packages/core/src/v3/otel/tracingSDK.ts @@ -24,6 +24,7 @@ import { SpanExporter, } from "@opentelemetry/sdk-trace-node"; import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions"; +import { VERSION } from "../../version.js"; import { OTEL_ATTRIBUTE_PER_EVENT_COUNT_LIMIT, OTEL_ATTRIBUTE_PER_LINK_COUNT_LIMIT, @@ -40,7 +41,6 @@ import { TaskContextSpanProcessor, } from "../taskContext/otelProcessors.js"; import { getEnvVar } from "../utils/getEnv.js"; -import { pkg } from "../../pkg.js"; class AsyncResourceDetector implements DetectorSync { private _promise: Promise; @@ -112,7 +112,7 @@ export class TracingSDK { new Resource({ [SemanticResourceAttributes.CLOUD_PROVIDER]: "trigger.dev", [SemanticInternalAttributes.TRIGGER]: true, - [SemanticInternalAttributes.CLI_VERSION]: pkg.version, + [SemanticInternalAttributes.CLI_VERSION]: VERSION, }) ) .merge(config.resource ?? new Resource({})) diff --git a/packages/core/src/v3/schemas/config.ts b/packages/core/src/v3/schemas/config.ts index d8081f391..f94098f28 100644 --- a/packages/core/src/v3/schemas/config.ts +++ b/packages/core/src/v3/schemas/config.ts @@ -3,7 +3,6 @@ import { z } from "zod"; export const ConfigManifest = z.object({ project: z.string(), dirs: z.string().array(), - external: z.string().array().optional(), }); export type ConfigManifest = z.infer; diff --git a/packages/core/src/v3/schemas/messages.ts b/packages/core/src/v3/schemas/messages.ts index 470a0d575..af0007b50 100644 --- a/packages/core/src/v3/schemas/messages.ts +++ b/packages/core/src/v3/schemas/messages.ts @@ -15,7 +15,7 @@ import { WaitReason, } from "./schemas.js"; import { TaskResource } from "./resources.js"; -import { WorkerManifest } from "./build.js"; +import { BuildManifest, WorkerManifest } from "./build.js"; export const BackgroundWorkerServerMessages = z.discriminatedUnion("type", [ z.object({ @@ -109,6 +109,9 @@ export const clientWebsocketMessages = { }; export const workerToChildMessages = { + INDEX: z.object({ + build: BuildManifest, + }), EXECUTE_TASK_RUN: z.object({ version: z.literal("v1").default("v1"), execution: TaskRunExecution, diff --git a/packages/core/src/v3/schemas/schemas.ts b/packages/core/src/v3/schemas/schemas.ts index 251f8929b..2da208b9d 100644 --- a/packages/core/src/v3/schemas/schemas.ts +++ b/packages/core/src/v3/schemas/schemas.ts @@ -168,7 +168,8 @@ export const TaskFile = z.object({ export type TaskFile = z.infer; const taskFileMetadata = { - file: TaskFile, + filePath: z.string(), + entryPoint: z.string(), exportName: z.string(), }; diff --git a/packages/core/src/v3/workers/taskExecutor.ts b/packages/core/src/v3/workers/taskExecutor.ts index fba3760f5..f485ec8e9 100644 --- a/packages/core/src/v3/workers/taskExecutor.ts +++ b/packages/core/src/v3/workers/taskExecutor.ts @@ -1,10 +1,12 @@ import { SpanKind } from "@opentelemetry/api"; +import { VERSION } from "../../version.js"; +import { ApiError, RateLimitError } from "../apiClient/errors.js"; import { ConsoleInterceptor } from "../consoleInterceptor.js"; import { parseError, sanitizeError } from "../errors.js"; -import { TracingSDK, recordSpanException } from "../otel/index.js"; +import { TriggerConfig } from "../index.js"; +import { recordSpanException, TracingSDK } from "../otel/index.js"; import { ServerBackgroundWorker, - Config, TaskRunContext, TaskRunErrorCodes, TaskRunExecution, @@ -15,6 +17,7 @@ import { SemanticInternalAttributes } from "../semanticInternalAttributes.js"; import { taskContext } from "../task-context-api.js"; import { TriggerTracer } from "../tracer.js"; import { HandleErrorFunction, TaskMetadataWithFunctions } from "../types/index.js"; +import { UsageMeasurement } from "../usage/types.js"; import { conditionallyExportPacket, conditionallyImportPacket, @@ -24,17 +27,12 @@ import { } from "../utils/ioSerialization.js"; import { calculateNextRetryDelay } from "../utils/retries.js"; import { accessoryAttributes } from "../utils/styleAttributes.js"; -import { UsageMeasurement } from "../usage/types.js"; -import { ApiError, RateLimitError } from "../apiClient/errors.js"; -import { TriggerConfig } from "../index.js"; -import { pkg } from "../../pkg.js"; export type TaskExecutorOptions = { tracingSDK: TracingSDK; tracer: TriggerTracer; consoleInterceptor: ConsoleInterceptor; - projectConfig: Config; - importedConfig: TriggerConfig | undefined; + config: TriggerConfig | undefined; handleErrorFn: HandleErrorFunction | undefined; }; @@ -42,7 +40,6 @@ export class TaskExecutor { private _tracingSDK: TracingSDK; private _tracer: TriggerTracer; private _consoleInterceptor: ConsoleInterceptor; - private _config: Config; private _importedConfig: TriggerConfig | undefined; private _handleErrorFn: HandleErrorFunction | undefined; @@ -53,8 +50,7 @@ export class TaskExecutor { this._tracingSDK = options.tracingSDK; this._tracer = options.tracer; this._consoleInterceptor = options.consoleInterceptor; - this._config = options.projectConfig; - this._importedConfig = options.importedConfig; + this._importedConfig = options.config; this._handleErrorFn = options.handleErrorFn; } @@ -79,7 +75,7 @@ export class TaskExecutor { this._tracingSDK.asyncResourceDetector.resolveWithAttributes({ ...taskContext.attributes, - [SemanticInternalAttributes.SDK_VERSION]: pkg.version, + [SemanticInternalAttributes.SDK_VERSION]: VERSION, [SemanticInternalAttributes.SDK_LANGUAGE]: "typescript", }); @@ -452,7 +448,7 @@ export class TaskExecutor { | { status: "skipped"; error?: unknown } // skipped is different than noop, it means that the task was skipped from retrying, instead of just not retrying | { status: "noop"; error?: unknown } > { - const retriesConfig = this._importedConfig?.retries ?? this._config.retries; + const retriesConfig = this._importedConfig?.retries; const retry = this.task.retry ?? retriesConfig?.default; diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts new file mode 100644 index 000000000..2e47a8868 --- /dev/null +++ b/packages/core/src/version.ts @@ -0,0 +1 @@ +export const VERSION = "0.0.0"; diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index a147b44cc..357027819 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -18,7 +18,8 @@ "exports": { "./package.json": "./package.json", ".": "./src/index.ts", - "./v3": "./src/v3/index.ts" + "./v3": "./src/v3/index.ts", + "./v3/extensions": "./src/v3/extensions.ts" }, "sourceDialects": [ "triggerdotdev-source" @@ -26,10 +27,11 @@ }, "scripts": { "clean": "rimraf dist", - "prepare": "tshy", + "prepare": "tshy && pnpm run update-version", "build": "tshy", "dev": "tshy --watch", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "update-version": "tsx ../../scripts/updateVersion.ts" }, "dependencies": { "@opentelemetry/api": "1.9.0", @@ -40,11 +42,7 @@ "cronstrue": "^2.21.0", "debug": "^4.3.4", "evt": "^2.4.13", - "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", @@ -63,7 +61,8 @@ "rimraf": "^3.0.2", "tshy": "^3.0.2", "typed-emitter": "^2.1.0", - "typescript": "^5.5.4" + "typescript": "^5.5.4", + "tsx": "4.17.0" }, "engines": { "node": ">=18.20.0" @@ -91,6 +90,17 @@ "types": "./dist/commonjs/v3/index.d.ts", "default": "./dist/commonjs/v3/index.js" } + }, + "./v3/extensions": { + "import": { + "triggerdotdev-source": "./src/v3/extensions.ts", + "types": "./dist/esm/v3/extensions.d.ts", + "default": "./dist/esm/v3/extensions.js" + }, + "require": { + "types": "./dist/commonjs/v3/extensions.d.ts", + "default": "./dist/commonjs/v3/extensions.js" + } } } } diff --git a/packages/trigger-sdk/src/pkg-cjs.cts b/packages/trigger-sdk/src/pkg-cjs.cts deleted file mode 100644 index ec0aaf66b..000000000 --- a/packages/trigger-sdk/src/pkg-cjs.cts +++ /dev/null @@ -1,3 +0,0 @@ -import { findPackageJson, loadPackageJson } from "package-json-from-dist"; -export const pkg = loadPackageJson(__filename); -export const pj = findPackageJson(__filename); diff --git a/packages/trigger-sdk/src/pkg.ts b/packages/trigger-sdk/src/pkg.ts deleted file mode 100644 index 53c3b414a..000000000 --- a/packages/trigger-sdk/src/pkg.ts +++ /dev/null @@ -1,5 +0,0 @@ -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); diff --git a/packages/trigger-sdk/src/v3/extensions.ts b/packages/trigger-sdk/src/v3/extensions.ts new file mode 100644 index 000000000..892612ef7 --- /dev/null +++ b/packages/trigger-sdk/src/v3/extensions.ts @@ -0,0 +1 @@ +export * from "@trigger.dev/core/v3/extensions"; diff --git a/packages/trigger-sdk/src/v3/shared.ts b/packages/trigger-sdk/src/v3/shared.ts index 193d7e579..62ca7e128 100644 --- a/packages/trigger-sdk/src/v3/shared.ts +++ b/packages/trigger-sdk/src/v3/shared.ts @@ -36,10 +36,9 @@ import { taskCatalog, taskContext, } from "@trigger.dev/core/v3"; -import { tracer } from "./tracer.js"; -import { PollOptions, RetrieveRunResult, runs } from "./runs.js"; import { IdempotencyKey, idempotencyKeys, isIdempotencyKey } from "./idempotencyKeys.js"; -import { pkg } from "../pkg.js"; +import { PollOptions, RetrieveRunResult, runs } from "./runs.js"; +import { tracer } from "./tracer.js"; export type Context = TaskRunContext; @@ -486,7 +485,7 @@ export function createTask< const task: Task = { id: params.id, trigger: async (payload, options) => { - const taskMetadata = taskCatalog.getTaskMetadata(params.id); + const taskMetadata = taskCatalog.getTaskManifest(params.id); return await trigger_internal( taskMetadata && taskMetadata.exportName @@ -501,7 +500,7 @@ export function createTask< ); }, batchTrigger: async (items) => { - const taskMetadata = taskCatalog.getTaskMetadata(params.id); + const taskMetadata = taskCatalog.getTaskManifest(params.id); return await batchTrigger_internal( taskMetadata && taskMetadata.exportName @@ -514,7 +513,7 @@ export function createTask< ); }, triggerAndWait: async (payload, options) => { - const taskMetadata = taskCatalog.getTaskMetadata(params.id); + const taskMetadata = taskCatalog.getTaskManifest(params.id); return await triggerAndWait_internal( taskMetadata && taskMetadata.exportName @@ -529,7 +528,7 @@ export function createTask< ); }, batchTriggerAndWait: async (items) => { - const taskMetadata = taskCatalog.getTaskMetadata(params.id); + const taskMetadata = taskCatalog.getTaskManifest(params.id); return await batchTriggerAndWait_internal( taskMetadata && taskMetadata.exportName @@ -545,7 +544,6 @@ export function createTask< taskCatalog.registerTaskMetadata({ id: params.id, - packageVersion: pkg.version, queue: params.queue, retry: params.retry ? { ...defaultRetryOptions, ...params.retry } : undefined, machine: params.machine, @@ -561,6 +559,9 @@ export function createTask< }, }); + // @ts-expect-error + task[Symbol.for("trigger.dev/task")] = true; + return task; } diff --git a/packages/trigger-sdk/src/v3/tracer.ts b/packages/trigger-sdk/src/v3/tracer.ts index 97cfb194b..13d71a298 100644 --- a/packages/trigger-sdk/src/v3/tracer.ts +++ b/packages/trigger-sdk/src/v3/tracer.ts @@ -1,4 +1,4 @@ import { TriggerTracer } from "@trigger.dev/core/v3"; -import { pkg } from "../pkg.js"; +import { VERSION } from "../version.js"; -export const tracer = new TriggerTracer({ name: "@trigger.dev/sdk", version: pkg.version }); +export const tracer = new TriggerTracer({ name: "@trigger.dev/sdk", version: VERSION }); diff --git a/packages/trigger-sdk/src/version.ts b/packages/trigger-sdk/src/version.ts new file mode 100644 index 000000000..2e47a8868 --- /dev/null +++ b/packages/trigger-sdk/src/version.ts @@ -0,0 +1 @@ +export const VERSION = "0.0.0"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 350f851ef..4867aa3e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: eslint-plugin-turbo: specifier: ^2.0.4 version: 2.0.5(eslint@8.45.0) + pkg-types: + specifier: 1.1.3 + version: 1.1.3 prettier: specifier: ^3.0.0 version: 3.0.0 @@ -993,9 +996,6 @@ importers: p-throttle: specifier: ^6.1.0 version: 6.1.0 - package-json-from-dist: - specifier: ^1.0.0 - version: 1.0.0 partysocket: specifier: ^0.0.17 version: 0.0.17 @@ -1078,6 +1078,9 @@ importers: '@types/semver': specifier: ^7.3.13 version: 7.5.1 + '@types/source-map-support': + specifier: 0.5.10 + version: 0.5.10 '@types/ws': specifier: ^8.5.3 version: 8.5.4 @@ -1105,6 +1108,9 @@ importers: tshy: specifier: ^3.0.2 version: 3.0.2 + tsx: + specifier: 4.17.0 + version: 4.17.0 type-fest: specifier: ^3.6.0 version: 3.13.0 @@ -1159,9 +1165,6 @@ importers: humanize-duration: specifier: ^3.27.3 version: 3.27.3 - package-json-from-dist: - specifier: ^1.0.0 - version: 1.0.0 socket.io-client: specifier: 4.7.5 version: 4.7.5 @@ -1205,6 +1208,9 @@ importers: tshy: specifier: ^3.0.2 version: 3.0.2 + tsx: + specifier: 4.17.0 + version: 4.17.0 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -1328,21 +1334,9 @@ importers: evt: specifier: ^2.4.13 version: 2.4.13 - get-caller-file: - specifier: ^2.0.5 - version: 2.0.5 - git-remote-origin-url: - specifier: ^4.0.0 - version: 4.0.0 - git-repo-info: - specifier: ^2.1.1 - version: 2.1.1 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 @@ -1386,6 +1380,9 @@ importers: tshy: specifier: ^3.0.2 version: 3.0.2 + tsx: + specifier: 4.17.0 + version: 4.17.0 typed-emitter: specifier: ^2.1.0 version: 2.1.0 @@ -4171,7 +4168,7 @@ packages: resolution: {integrity: sha512-lhc/XLith28QdW0HpHZvZKkorWgmCNT7sVelMHDj3HFdTfdqkwEKvT+aXVQtNAmCC39VJhunDkWhONWB7335mg==} dependencies: '@esbuild-kit/core-utils': 3.0.0 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.6 dev: true /@esbuild-kit/core-utils@3.0.0: @@ -4185,7 +4182,7 @@ packages: resolution: {integrity: sha512-afmtLf6uqxD5IgwCzomtqCYIgz/sjHzCWZFvfS5+FzeYxOURPUo4QcHtqJxbxWOMOogKriZanN/1bJQE/ZL93A==} dependencies: '@esbuild-kit/core-utils': 3.0.0 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.6 dev: true /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): @@ -13046,6 +13043,12 @@ packages: resolution: {integrity: sha512-yPX0bb1SvrpaGlHuSiz6EicgRI4VBE+LO7IANlZagQwtaoKjLLcZc8y6s13vKp41mYvMCSzjtObxvU7/0JRPaA==} dev: true + /@types/source-map-support@0.5.10: + resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==} + dependencies: + source-map: 0.6.1 + dev: true + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true @@ -13395,7 +13398,7 @@ packages: dependencies: '@vitest/utils': 0.28.5 p-limit: 4.0.0 - pathe: 1.1.1 + pathe: 1.1.2 dev: true /@vitest/runner@1.4.0: @@ -13403,7 +13406,7 @@ packages: dependencies: '@vitest/utils': 1.4.0 p-limit: 5.0.0 - pathe: 1.1.1 + pathe: 1.1.2 dev: true /@vitest/runner@1.6.0: @@ -13411,14 +13414,14 @@ packages: dependencies: '@vitest/utils': 1.6.0 p-limit: 5.0.0 - pathe: 1.1.1 + pathe: 1.1.2 dev: true /@vitest/snapshot@1.4.0: resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} dependencies: magic-string: 0.30.8 - pathe: 1.1.1 + pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -13426,7 +13429,7 @@ packages: resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: magic-string: 0.30.8 - pathe: 1.1.1 + pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -13631,13 +13634,6 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-assertions@1.9.0(acorn@8.10.0): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.10.0 - /acorn-import-assertions@1.9.0(acorn@8.12.1): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: @@ -13651,6 +13647,15 @@ packages: acorn: ^8 dependencies: acorn: 8.10.0 + dev: false + + /acorn-import-attributes@1.9.5(acorn@8.12.1): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.12.1 + dev: true /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -13658,6 +13663,7 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.10.0 + dev: true /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -13665,7 +13671,6 @@ packages: 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==} @@ -17503,8 +17508,8 @@ packages: resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 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) eslint-visitor-keys: 3.4.2 /esprima@4.0.1: @@ -18382,6 +18387,12 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /get-uri@6.0.1: resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} engines: {node: '>= 14'} @@ -18419,24 +18430,6 @@ packages: tar: 6.2.1 dev: false - /git-remote-origin-url@4.0.0: - resolution: {integrity: sha512-EAxDksNdjuWgmVW9pVvA9jQDi/dmTaiDONktIy7qiRRhBZUI4FQK1YvBvteuTSX24aNKg9lfgxNYJEeeSXe6DA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - gitconfiglocal: 2.1.0 - dev: false - - /git-repo-info@2.1.1: - resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==} - engines: {node: '>= 4.0'} - dev: false - - /gitconfiglocal@2.1.0: - resolution: {integrity: sha512-qoerOEliJn3z+Zyn1HW2F6eoYJqKwS6MgC9cztTLUB/xLWX8gD/6T60pKn4+t/d6tP7JlybI7Z3z+I572CR/Vg==} - dependencies: - ini: 1.3.8 - dev: false - /glob-parent@3.1.0: resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} dependencies: @@ -19053,16 +19046,16 @@ packages: /import-in-the-middle@1.7.1: resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} dependencies: - 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) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 /import-in-the-middle@1.7.4: resolution: {integrity: sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==} dependencies: - acorn: 8.10.0 - acorn-import-attributes: 1.9.5(acorn@8.10.0) + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 dev: true @@ -25899,7 +25892,7 @@ packages: /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: - acorn: 8.10.0 + acorn: 8.12.1 dev: true /strip-literal@2.1.0: @@ -26818,6 +26811,17 @@ packages: fsevents: 2.3.3 dev: true + /tsx@4.17.0: + resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.23.0 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /tsx@4.7.1: resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} engines: {node: '>=18.0.0'} @@ -27653,7 +27657,7 @@ packages: cac: 6.7.14 debug: 4.3.4 mlly: 1.7.1 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 @@ -27677,7 +27681,7 @@ packages: cac: 6.7.14 debug: 4.3.4 mlly: 1.7.1 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 @@ -27700,7 +27704,7 @@ packages: dependencies: cac: 6.7.14 debug: 4.3.4 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 vite: 5.2.7(@types/node@18.11.18) transitivePeerDependencies: @@ -27721,7 +27725,7 @@ packages: dependencies: cac: 6.7.14 debug: 4.3.4 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 vite: 5.2.7(@types/node@20.14.14) transitivePeerDependencies: diff --git a/references/v3-catalog/trigger.config.ts b/references/v3-catalog/trigger.config.ts index 8de304db9..a4b77f29e 100644 --- a/references/v3-catalog/trigger.config.ts +++ b/references/v3-catalog/trigger.config.ts @@ -1,4 +1,5 @@ import { defineConfig } from "@trigger.dev/sdk/v3"; +import { emitDecoratorMetadata } from "@trigger.dev/sdk/v3/extensions"; import { OpenAIInstrumentation } from "@traceloop/instrumentation-openai"; export default defineConfig({ @@ -23,4 +24,8 @@ export default defineConfig({ onFailure: async (payload, error, { ctx }) => { console.log(`Task ${ctx.task.id} failed ${ctx.run.id}`); }, + build: { + extensions: [emitDecoratorMetadata()], + external: ["@ffmpeg-installer/ffmpeg"], + }, }); diff --git a/scripts/updateVersion.ts b/scripts/updateVersion.ts new file mode 100644 index 000000000..2e040577e --- /dev/null +++ b/scripts/updateVersion.ts @@ -0,0 +1,39 @@ +import * as fs from "node:fs/promises"; +import * as path from "node:path"; +import { readPackageJSON } from "pkg-types"; + +// This script will update the VERSION constant in the build output, found at: +// {cwd}/dist/esm/version.js +// {cwd}/dist/commonjs/version.js +// +// It fetches the version by reading the package.json file in the root of the project. +async function updateVersion() { + const localPackageJson = await readPackageJSON(process.cwd()); + + if (!localPackageJson.version) { + throw new Error("Failed to read version from package.json"); + } + + const versionFileESM = path.join(process.cwd(), "dist", "esm", "version.js"); + await updatePlaceholderInFile(versionFileESM, localPackageJson.version); + + const versionFileCJS = path.join(process.cwd(), "dist", "commonjs", "version.js"); + await updatePlaceholderInFile(versionFileCJS, localPackageJson.version); + + console.log( + `Updated packages/${path.basename(process.cwd())} version.js to ${localPackageJson.version}` + ); +} + +async function updatePlaceholderInFile(filePath: string, version: string) { + try { + const fileContents = await fs.readFile(filePath, "utf-8"); + const updatedContents = fileContents.replace("0.0.0", version); + await fs.writeFile(filePath, updatedContents); + } catch (e) {} +} + +updateVersion().catch((e) => { + console.error(e); + process.exit(1); +});