From b68012f81c2ebf3e7ea463f036b6a40930e8135b Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 24 Apr 2024 10:09:36 +0100 Subject: [PATCH] v3: Various fixes for Next.js projects and projects that use v2 and v3 together (#1051) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes an issue that was treating v2 trigger directories as v3 * Make msw a normal dependency (for now) to fix Module Not Found error in Next.js. * Extract out all the zod* stuff from core so the SDK does not import it * Add a changeset * Fixing typecheck errors in the webapp * Export the Task and TaskOptions types * Extract additional exports from core/v3 that aren’t used in the SDK * Move to our global system from AsyncLocalStorage for the current task context storage * Update the esbuild core bundling plugin for the new core v3 exports * Fix v3 CLI telemetry * Add support for tasks located in subdirectories inside trigger dirs * Remove the env var check during deploy (too many false negatives) --- .changeset/eleven-paws-join.md | 5 + .changeset/funny-swans-destroy.md | 9 + .changeset/nasty-jars-pump.md | 5 + .changeset/slow-buses-own.md | 8 + .changeset/tricky-ladybugs-unite.md | 8 + .changeset/two-pumas-wait.md | 6 + apps/coordinator/package.json | 4 +- apps/coordinator/src/index.ts | 4 +- .../app/routes/api.v1.tasks.$taskId.batch.ts | 4 +- .../routes/api.v1.tasks.$taskId.trigger.ts | 4 +- .../authenticatedSocketConnection.server.ts | 8 +- apps/webapp/app/v3/handleSocketIo.server.ts | 7 +- .../app/v3/marqs/devQueueConsumer.server.ts | 2 +- .../v3/marqs/sharedQueueConsumer.server.ts | 3 +- .../v3/services/createCheckpoint.server.ts | 3 +- .../app/v3/services/resumeAttempt.server.ts | 2 +- apps/webapp/app/v3/sharedSocketConnection.ts | 9 +- apps/webapp/app/v3/utils/zodPubSub.server.ts | 2 +- apps/webapp/package.json | 2 +- config-packages/tsconfig/package.json | 2 +- package.json | 3 +- packages/cli-v3/src/cli/common.ts | 3 +- packages/cli-v3/src/commands/deploy.ts | 137 +-------- packages/cli-v3/src/commands/dev.tsx | 24 +- packages/cli-v3/src/commands/init.ts | 7 +- packages/cli-v3/src/commands/login.ts | 2 +- packages/cli-v3/src/telemetry/tracing.ts | 13 +- packages/cli-v3/src/utilities/build.ts | 17 +- packages/cli-v3/src/utilities/configFiles.ts | 16 +- packages/cli-v3/src/utilities/session.ts | 34 +-- packages/cli-v3/src/utilities/taskFiles.ts | 34 ++- .../src/workers/dev/backgroundWorker.ts | 3 +- .../cli-v3/src/workers/dev/worker-facade.ts | 36 ++- .../cli-v3/src/workers/dev/worker-setup.ts | 10 +- .../src/workers/prod/backgroundWorker.ts | 4 +- .../cli-v3/src/workers/prod/entry-point.ts | 2 +- .../cli-v3/src/workers/prod/worker-facade.ts | 32 ++- .../cli-v3/src/workers/prod/worker-setup.ts | 8 +- packages/cli/src/commands/init.ts | 6 +- packages/core-apps/package.json | 3 +- packages/core-apps/src/provider.ts | 4 +- packages/core/package.json | 74 ++++- packages/core/src/v3/apiClient/index.ts | 4 +- packages/core/src/v3/dev/index.ts | 1 + packages/core/src/v3/index.ts | 68 ++--- packages/core/src/v3/otel/tracingSDK.ts | 2 +- packages/core/src/v3/prod/index.ts | 1 + packages/core/src/v3/schemas/messages.ts | 8 - packages/core/src/v3/task-catalog/catalog.ts | 1 + packages/core/src/v3/task-catalog/index.ts | 4 + .../src/v3/task-catalog/noopTaskCatalog.ts | 4 + .../v3/task-catalog/standardTaskCatalog.ts | 4 + packages/core/src/v3/task-context-api.ts | 5 + packages/core/src/v3/taskContext/index.ts | 95 +++++++ .../core/src/v3/taskContext/otelProcessors.ts | 75 +++++ packages/core/src/v3/taskContext/types.ts | 6 + .../core/src/v3/tasks/taskContextManager.ts | 163 ----------- packages/core/src/v3/utils/globals.ts | 2 + .../core/src/v3/utils/structuredLogger.ts | 80 ++++++ packages/core/src/v3/workers/index.ts | 9 + packages/core/src/v3/workers/taskExecutor.ts | 246 ++++++++--------- packages/core/src/v3/zodMessageHandler.ts | 2 +- packages/core/src/v3/zodNamespace.ts | 86 +----- packages/core/src/v3/zodSocket.ts | 5 +- packages/core/tsconfig.build.json | 3 +- packages/core/tsup.config.ts | 14 +- packages/remix/package.json | 2 +- packages/trigger-sdk/package.json | 13 +- packages/trigger-sdk/src/v3/shared.ts | 26 +- packages/trigger-sdk/src/v3/tasks.ts | 2 + patches/engine.io-parser@5.2.2.patch | 12 + pnpm-lock.yaml | 261 +++++++++++++----- .../src/trigger/subdir/another/byeWorld.ts | 10 + .../src/trigger/subdir/helloWorld.ts | 10 + references/v3-catalog/src/trigger/subtasks.ts | 2 +- .../v3-catalog/src/trigger/utils/cache.ts | 4 + 76 files changed, 1007 insertions(+), 792 deletions(-) create mode 100644 .changeset/eleven-paws-join.md create mode 100644 .changeset/funny-swans-destroy.md create mode 100644 .changeset/nasty-jars-pump.md create mode 100644 .changeset/slow-buses-own.md create mode 100644 .changeset/tricky-ladybugs-unite.md create mode 100644 .changeset/two-pumas-wait.md create mode 100644 packages/core/src/v3/dev/index.ts create mode 100644 packages/core/src/v3/prod/index.ts create mode 100644 packages/core/src/v3/task-context-api.ts create mode 100644 packages/core/src/v3/taskContext/index.ts create mode 100644 packages/core/src/v3/taskContext/otelProcessors.ts create mode 100644 packages/core/src/v3/taskContext/types.ts delete mode 100644 packages/core/src/v3/tasks/taskContextManager.ts create mode 100644 packages/core/src/v3/utils/structuredLogger.ts create mode 100644 packages/core/src/v3/workers/index.ts create mode 100644 patches/engine.io-parser@5.2.2.patch create mode 100644 references/v3-catalog/src/trigger/subdir/another/byeWorld.ts create mode 100644 references/v3-catalog/src/trigger/subdir/helloWorld.ts diff --git a/.changeset/eleven-paws-join.md b/.changeset/eleven-paws-join.md new file mode 100644 index 000000000..441921364 --- /dev/null +++ b/.changeset/eleven-paws-join.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Remove the env var check during deploy (too many false negatives) diff --git a/.changeset/funny-swans-destroy.md b/.changeset/funny-swans-destroy.md new file mode 100644 index 000000000..b8f008b7b --- /dev/null +++ b/.changeset/funny-swans-destroy.md @@ -0,0 +1,9 @@ +--- +"@trigger.dev/sdk": patch +--- + +Make msw a normal dependency (for now) to fix Module Not Found error in Next.js. + +It turns out that webpack will "hoist" dynamically imported modules and attempt to resolve them at build time, even though it's an optional peer dep: + +https://x.com/maverickdotdev/status/1782465214308319404 diff --git a/.changeset/nasty-jars-pump.md b/.changeset/nasty-jars-pump.md new file mode 100644 index 000000000..6877c7e2e --- /dev/null +++ b/.changeset/nasty-jars-pump.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Fixes an issue that was treating v2 trigger directories as v3 diff --git a/.changeset/slow-buses-own.md b/.changeset/slow-buses-own.md new file mode 100644 index 000000000..a33e80f90 --- /dev/null +++ b/.changeset/slow-buses-own.md @@ -0,0 +1,8 @@ +--- +"@trigger.dev/sdk": patch +"trigger.dev": patch +"@trigger.dev/core": patch +"@trigger.dev/cli": patch +--- + +Move to our global system from AsyncLocalStorage for the current task context storage diff --git a/.changeset/tricky-ladybugs-unite.md b/.changeset/tricky-ladybugs-unite.md new file mode 100644 index 000000000..6d2b2113f --- /dev/null +++ b/.changeset/tricky-ladybugs-unite.md @@ -0,0 +1,8 @@ +--- +"@trigger.dev/sdk": patch +"@trigger.dev/core-apps": patch +"trigger.dev": patch +"@trigger.dev/core": patch +--- + +Extracting out all the non-SDK related features from the main @trigger.dev/core/v3 export diff --git a/.changeset/two-pumas-wait.md b/.changeset/two-pumas-wait.md new file mode 100644 index 000000000..857b62617 --- /dev/null +++ b/.changeset/two-pumas-wait.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": patch +"@trigger.dev/cli": patch +--- + +Add support for tasks located in subdirectories inside trigger dirs diff --git a/apps/coordinator/package.json b/apps/coordinator/package.json index e089175f2..4f7c56395 100644 --- a/apps/coordinator/package.json +++ b/apps/coordinator/package.json @@ -21,8 +21,8 @@ "execa": "^8.0.1", "nanoid": "^5.0.6", "prom-client": "^15.1.0", - "socket.io": "^4.7.4", - "socket.io-client": "^4.7.4" + "socket.io": "4.7.4", + "socket.io-client": "4.7.4" }, "devDependencies": { "@types/node": "^18", diff --git a/apps/coordinator/src/index.ts b/apps/coordinator/src/index.ts index 29e8f4fee..dff8c38b3 100644 --- a/apps/coordinator/src/index.ts +++ b/apps/coordinator/src/index.ts @@ -8,9 +8,9 @@ import { PlatformToCoordinatorMessages, ProdWorkerSocketData, ProdWorkerToCoordinatorMessages, - ZodNamespace, - ZodSocketConnection, } from "@trigger.dev/core/v3"; +import { ZodNamespace } from "@trigger.dev/core/v3/zodNamespace"; +import { ZodSocketConnection } from "@trigger.dev/core/v3/zodSocket"; import { HttpReply, getTextBody, SimpleLogger } from "@trigger.dev/core-apps"; import { collectDefaultMetrics, register, Gauge } from "prom-client"; diff --git a/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts b/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts index 4bcfb63ac..ce0b5ad83 100644 --- a/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts +++ b/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts @@ -1,6 +1,6 @@ import type { ActionFunctionArgs } from "@remix-run/server-runtime"; import { json } from "@remix-run/server-runtime"; -import { parseBatchTriggerTaskRequestBody } from "@trigger.dev/core/v3"; +import { BatchTriggerTaskRequestBody } from "@trigger.dev/core/v3"; import { z } from "zod"; import { MAX_BATCH_TRIGGER_ITEMS } from "~/consts"; import { authenticateApiRequest } from "~/services/apiAuth.server"; @@ -46,7 +46,7 @@ export async function action({ request, params }: ActionFunctionArgs) { // Now parse the request body const anyBody = await request.json(); - const body = parseBatchTriggerTaskRequestBody(anyBody); + const body = BatchTriggerTaskRequestBody.safeParse(anyBody); if (!body.success) { return json({ error: "Invalid request body" }, { status: 400 }); diff --git a/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts b/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts index d4af5b1c6..2301974a1 100644 --- a/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts +++ b/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts @@ -1,6 +1,6 @@ import type { ActionFunctionArgs } from "@remix-run/server-runtime"; import { json } from "@remix-run/server-runtime"; -import { parseTriggerTaskRequestBody } from "@trigger.dev/core/v3"; +import { TriggerTaskRequestBody } from "@trigger.dev/core/v3"; import { z } from "zod"; import { authenticateApiRequest } from "~/services/apiAuth.server"; import { logger } from "~/services/logger.server"; @@ -52,7 +52,7 @@ export async function action({ request, params }: ActionFunctionArgs) { // Now parse the request body const anyBody = await request.json(); - const body = parseTriggerTaskRequestBody(anyBody); + const body = TriggerTaskRequestBody.safeParse(anyBody); if (!body.success) { return json({ error: "Invalid request body" }, { status: 400 }); diff --git a/apps/webapp/app/v3/authenticatedSocketConnection.server.ts b/apps/webapp/app/v3/authenticatedSocketConnection.server.ts index e55166271..209954f34 100644 --- a/apps/webapp/app/v3/authenticatedSocketConnection.server.ts +++ b/apps/webapp/app/v3/authenticatedSocketConnection.server.ts @@ -1,9 +1,5 @@ -import { - ZodMessageHandler, - ZodMessageSender, - clientWebsocketMessages, - serverWebsocketMessages, -} from "@trigger.dev/core/v3"; +import { clientWebsocketMessages, serverWebsocketMessages } from "@trigger.dev/core/v3"; +import { ZodMessageHandler, ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler"; import { Evt } from "evt"; import { randomUUID } from "node:crypto"; import type { CloseEvent, ErrorEvent, MessageEvent, WebSocket } from "ws"; diff --git a/apps/webapp/app/v3/handleSocketIo.server.ts b/apps/webapp/app/v3/handleSocketIo.server.ts index 9032d6fd1..6c9bb3402 100644 --- a/apps/webapp/app/v3/handleSocketIo.server.ts +++ b/apps/webapp/app/v3/handleSocketIo.server.ts @@ -5,8 +5,8 @@ import { PlatformToProviderMessages, ProviderToPlatformMessages, SharedQueueToClientMessages, - ZodNamespace, } from "@trigger.dev/core/v3"; +import { ZodNamespace } from "@trigger.dev/core/v3/zodNamespace"; import { Server } from "socket.io"; import { env } from "~/env.server"; import { singleton } from "~/utils/singleton"; @@ -71,6 +71,7 @@ function initializeSocketIOServerInstance() { function createCoordinatorNamespace(io: Server) { const coordinator = new ZodNamespace({ + // @ts-ignore - for some reason the built ZodNamespace Server type is not compatible with the Server type here, but only when doing typechecking io, name: "coordinator", authToken: env.COORDINATOR_SECRET, @@ -147,6 +148,7 @@ function createCoordinatorNamespace(io: Server) { function createProviderNamespace(io: Server) { const provider = new ZodNamespace({ + // @ts-ignore - for some reason the built ZodNamespace Server type is not compatible with the Server type here, but only when doing typechecking io, name: "provider", authToken: env.PROVIDER_SECRET, @@ -181,6 +183,7 @@ function createProviderNamespace(io: Server) { function createSharedQueueConsumerNamespace(io: Server) { const sharedQueue = new ZodNamespace({ + // @ts-ignore - for some reason the built ZodNamespace Server type is not compatible with the Server type here, but only when doing typechecking io, name: "shared-queue", authToken: env.PROVIDER_SECRET, @@ -188,7 +191,9 @@ function createSharedQueueConsumerNamespace(io: Server) { serverMessages: SharedQueueToClientMessages, onConnection: async (socket, handler, sender, logger) => { const sharedSocketConnection = new SharedSocketConnection({ + // @ts-ignore - for some reason the built ZodNamespace Server type is not compatible with the Server type here, but only when doing typechecking namespace: sharedQueue.namespace, + // @ts-ignore - for some reason the built ZodNamespace Server type is not compatible with the Server type here, but only when doing typechecking socket, logger, poolSize: env.SHARED_QUEUE_CONSUMER_POOL_SIZE, diff --git a/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts b/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts index 1b8ae2435..d13683851 100644 --- a/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts +++ b/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts @@ -3,9 +3,9 @@ import { TaskRunExecution, TaskRunExecutionPayload, TaskRunExecutionResult, - ZodMessageSender, serverWebsocketMessages, } from "@trigger.dev/core/v3"; +import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler"; import { BackgroundWorker, BackgroundWorkerTask } from "@trigger.dev/database"; import { z } from "zod"; import { prisma } from "~/db.server"; diff --git a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts index a37314f5a..3816c6b34 100644 --- a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts +++ b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts @@ -8,9 +8,9 @@ import { TaskRunExecutionResult, TaskRunFailedExecutionResult, TaskRunSuccessfulExecutionResult, - ZodMessageSender, serverWebsocketMessages, } from "@trigger.dev/core/v3"; +import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler"; import { BackgroundWorker, BackgroundWorkerTask, @@ -26,7 +26,6 @@ import { EnvironmentVariablesRepository } from "../environmentVariables/environm import { generateFriendlyId } from "../friendlyIdentifiers"; import { socketIo } from "../handleSocketIo.server"; import { findCurrentWorkerDeployment } from "../models/workerDeployment.server"; -import { CancelAttemptService } from "../services/cancelAttempt.server"; import { RestoreCheckpointService } from "../services/restoreCheckpoint.server"; import { tracer } from "../tracer.server"; diff --git a/apps/webapp/app/v3/services/createCheckpoint.server.ts b/apps/webapp/app/v3/services/createCheckpoint.server.ts index 9a0a0ddba..9ed984f85 100644 --- a/apps/webapp/app/v3/services/createCheckpoint.server.ts +++ b/apps/webapp/app/v3/services/createCheckpoint.server.ts @@ -1,4 +1,5 @@ -import { CoordinatorToPlatformMessages, InferSocketMessageSchema } from "@trigger.dev/core/v3"; +import { CoordinatorToPlatformMessages } from "@trigger.dev/core/v3"; +import type { InferSocketMessageSchema } from "@trigger.dev/core/v3/zodSocket"; import type { CheckpointRestoreEvent, TaskRunAttemptStatus, diff --git a/apps/webapp/app/v3/services/resumeAttempt.server.ts b/apps/webapp/app/v3/services/resumeAttempt.server.ts index 4e4affe94..376f850f4 100644 --- a/apps/webapp/app/v3/services/resumeAttempt.server.ts +++ b/apps/webapp/app/v3/services/resumeAttempt.server.ts @@ -1,9 +1,9 @@ import { CoordinatorToPlatformMessages, - InferSocketMessageSchema, TaskRunExecution, TaskRunExecutionResult, } from "@trigger.dev/core/v3"; +import type { InferSocketMessageSchema } from "@trigger.dev/core/v3/zodSocket"; import { $transaction, PrismaClientOrTransaction } from "~/db.server"; import { logger } from "~/services/logger.server"; import { marqs } from "~/v3/marqs/index.server"; diff --git a/apps/webapp/app/v3/sharedSocketConnection.ts b/apps/webapp/app/v3/sharedSocketConnection.ts index d889f065c..634f0384b 100644 --- a/apps/webapp/app/v3/sharedSocketConnection.ts +++ b/apps/webapp/app/v3/sharedSocketConnection.ts @@ -1,11 +1,10 @@ +import { clientWebsocketMessages, serverWebsocketMessages } from "@trigger.dev/core/v3"; import { - MessageCatalogToSocketIoEvents, - StructuredLogger, ZodMessageHandler, ZodMessageSender, - clientWebsocketMessages, - serverWebsocketMessages, -} from "@trigger.dev/core/v3"; + MessageCatalogToSocketIoEvents, +} from "@trigger.dev/core/v3/zodMessageHandler"; +import type { StructuredLogger } from "@trigger.dev/core/v3/utils/structuredLogger"; import { Evt } from "evt"; import { randomUUID } from "node:crypto"; import { logger } from "~/services/logger.server"; diff --git a/apps/webapp/app/v3/utils/zodPubSub.server.ts b/apps/webapp/app/v3/utils/zodPubSub.server.ts index e72dc53c0..d9103bb8c 100644 --- a/apps/webapp/app/v3/utils/zodPubSub.server.ts +++ b/apps/webapp/app/v3/utils/zodPubSub.server.ts @@ -1,5 +1,5 @@ import { Logger } from "@trigger.dev/core-backend"; -import { ZodMessageCatalogSchema, ZodMessageHandler, ZodMessageSender } from "@trigger.dev/core/v3"; +import { ZodMessageCatalogSchema, ZodMessageHandler } from "@trigger.dev/core/v3/zodMessageHandler"; import { Evt } from "evt"; import Redis, { RedisOptions } from "ioredis"; import { z } from "zod"; diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 45321e743..0fefac87e 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -150,7 +150,7 @@ "simple-oauth2": "^5.0.0", "simplur": "^3.0.1", "slug": "^6.0.0", - "socket.io": "^4.7.4", + "socket.io": "4.7.4", "socket.io-adapter": "^2.5.4", "sonner": "^1.0.3", "sqs-consumer": "^7.4.0", diff --git a/config-packages/tsconfig/package.json b/config-packages/tsconfig/package.json index 1ede492fc..dde64db1d 100644 --- a/config-packages/tsconfig/package.json +++ b/config-packages/tsconfig/package.json @@ -6,4 +6,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 7882c5df0..c5159e1b0 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,8 @@ "pnpm": { "patchedDependencies": { "@changesets/assemble-release-plan@5.2.4": "patches/@changesets__assemble-release-plan@5.2.4.patch", - "tsup@8.0.1": "patches/tsup@8.0.1.patch" + "tsup@8.0.1": "patches/tsup@8.0.1.patch", + "engine.io-parser@5.2.2": "patches/engine.io-parser@5.2.2.patch" } } } \ No newline at end of file diff --git a/packages/cli-v3/src/cli/common.ts b/packages/cli-v3/src/cli/common.ts index 96202dfb1..454875126 100644 --- a/packages/cli-v3/src/cli/common.ts +++ b/packages/cli-v3/src/cli/common.ts @@ -1,4 +1,5 @@ -import { flattenAttributes, recordSpanException } from "@trigger.dev/core/v3"; +import { flattenAttributes } from "@trigger.dev/core/v3"; +import { recordSpanException } from "@trigger.dev/core/v3/workers"; import { Command } from "commander"; import { z } from "zod"; import { getTracer, provider } from "../telemetry/tracing"; diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 94f974917..55193c349 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -6,8 +6,8 @@ import { TaskMetadataFailedToParseData, detectDependencyVersion, flattenAttributes, - recordSpanException, } from "@trigger.dev/core/v3"; +import { recordSpanException } from "@trigger.dev/core/v3/workers"; import chalk from "chalk"; import { Command, Option as CommandOption } from "commander"; import { Metafile, build } from "esbuild"; @@ -63,7 +63,6 @@ import { docs, getInTouch } from "../utilities/links"; const DeployCommandOptions = CommonCommandOptions.extend({ skipTypecheck: z.boolean().default(false), skipDeploy: z.boolean().default(false), - ignoreEnvVarCheck: z.boolean().default(false), env: z.enum(["prod", "staging"]), loadImage: z.boolean().default(false), buildPlatform: z.enum(["linux/amd64", "linux/arm64"]).default("linux/amd64"), @@ -93,10 +92,6 @@ export function configureDeployCommand(program: Command) { ) .option("--skip-typecheck", "Whether to skip the pre-build typecheck") .option("--skip-update-check", "Skip checking for @trigger.dev package updates") - .option( - "--ignore-env-var-check", - "Detected missing environment variables won't block deployment" - ) .option("-c, --config ", "The name of the config file, found at [path]") .option( "-p, --project-ref ", @@ -127,6 +122,12 @@ export function configureDeployCommand(program: Command) { "(Coming soon) Specify the tag to use when pushing the image to the registry" ).hideHelp() ) + .addOption( + new CommandOption( + "--ignore-env-var-check", + "(deprecated) Detected missing environment variables won't block deployment" + ).hideHelp() + ) .addOption(new CommandOption("-D, --skip-deploy", "Skip deploying the image").hideHelp()) .addOption( new CommandOption("--load-image", "Load the built image into your local docker").hideHelp() @@ -239,16 +240,6 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { logger.debug("Compilation result", { compilation }); - if (compilation.envVars.length > 0) { - await checkEnvVars( - compilation.envVars ?? [], - resolvedConfig.config, - options, - environmentClient, - authorization.dashboardUrl - ); - } - // Step 2: Initialize a deployment on the server (response will have everything we need to build an image) const deploymentResponse = await environmentClient.initializeDeployment({ contentHash: compilation.contentHash, @@ -680,73 +671,6 @@ async function failDeploy( // TODO: Let platform know so it can fail the deploy with an appropriate error } -async function checkEnvVars( - envVars: string[], - config: ResolvedConfig, - options: DeployCommandOptions, - environmentClient: CliApiClient, - apiUrl: string -) { - return await tracer.startActiveSpan("detectEnvVars", async (span) => { - try { - span.setAttribute("envVars.check", envVars); - - const environmentVariablesSpinner = spinner(); - - environmentVariablesSpinner.start("Checking environment variables"); - - const environmentVariables = await environmentClient.getEnvironmentVariables(config.project); - - if (!environmentVariables.success) { - environmentVariablesSpinner.stop(`Failed to fetch environment variables, skipping check`); - } else { - // Check to see if all the environment variables in the compilation exist - const missingEnvironmentVariables = envVars.filter( - (envVar) => environmentVariables.data.variables[envVar] === undefined - ); - - if (missingEnvironmentVariables.length > 0) { - environmentVariablesSpinner.stop( - `Found missing env vars in ${options.env}: ${arrayToSentence( - missingEnvironmentVariables - )}. ${ - options.ignoreEnvVarCheck - ? "Continuing deployment because of --ignore-env-var-check. " - : "Aborting deployment. " - }${chalk.bgBlueBright( - terminalLink( - "Manage env vars", - `${apiUrl}/projects/v3/${config.project}/environment-variables` - ) - )}` - ); - - span.setAttributes({ - "envVars.missing": missingEnvironmentVariables, - }); - - if (!options.ignoreEnvVarCheck) { - throw new SkipLoggingError("Found missing environment variables"); - } else { - span.end(); - return; - } - } - - environmentVariablesSpinner.stop(`Environment variable check passed`); - } - - span.end(); - } catch (e) { - recordSpanException(span, e); - - span.end(); - - throw e; - } - }); -} - // Poll every 1 second for the deployment to finish async function waitForDeploymentToFinish( deploymentId: string, @@ -1396,25 +1320,13 @@ async function compileProject( const contentHash = contentHasher.digest("hex"); - const workerSetupEnvVars = await findAllEnvironmentVariableReferencesInFile(workerSetupPath); - - const workerFacadeEnvVars = findAllEnvironmentVariableReferences(workerContents); - - const envVars = findAllEnvironmentVariableReferences(workerOutputFile.text); - - // Remove workerFacadeEnvVars and workerSetupEnvVars from envVars - const finalEnvVars = envVars.filter( - (envVar) => !workerFacadeEnvVars.includes(envVar) && !workerSetupEnvVars.includes(envVar) - ); - span.setAttributes({ contentHash: contentHash, - envVars: finalEnvVars, }); span.end(); - return { path: tempDir, contentHash, envVars: finalEnvVars }; + return { path: tempDir, contentHash }; } catch (e) { recordSpanException(span, e); @@ -1808,36 +1720,3 @@ async function ensureLoggedIntoDockerRegistry( return tmpDir; } - -async function findAllEnvironmentVariableReferencesInFile(filePath: string) { - const fileContents = await readFile(filePath, "utf-8"); - - return findAllEnvironmentVariableReferences(fileContents); -} - -const IGNORED_ENV_VARS = ["NODE_ENV", "SHELL", "HOME", "PWD", "LOGNAME", "USER", "PATH", "DEBUG"]; - -function findAllEnvironmentVariableReferences(code: string): string[] { - const regex = /\bprocess\.env\.([a-zA-Z_][a-zA-Z0-9_]*)\b/g; - - const matches = code.matchAll(regex); - - const matchesArray = Array.from(matches, (match) => match[1]).filter(Boolean) as string[]; - - const filteredMatches = matchesArray.filter((match) => !IGNORED_ENV_VARS.includes(match)); - - // Make sure and remove duplicates - return Array.from(new Set(filteredMatches)); -} - -function arrayToSentence(items: string[]): string { - if (items.length === 1 && typeof items[0] === "string") { - return items[0]; - } - - if (items.length === 2) { - return `${items[0]} and ${items[1]}`; - } - - return `${items.slice(0, -1).join(", ")}, and ${items[items.length - 1]}`; -} diff --git a/packages/cli-v3/src/commands/dev.tsx b/packages/cli-v3/src/commands/dev.tsx index 6ae86d72d..fac0ea6a5 100644 --- a/packages/cli-v3/src/commands/dev.tsx +++ b/packages/cli-v3/src/commands/dev.tsx @@ -2,12 +2,11 @@ import { CreateBackgroundWorkerRequestBody, ResolvedConfig, TaskResource, - ZodMessageHandler, - ZodMessageSender, clientWebsocketMessages, detectDependencyVersion, serverWebsocketMessages, } from "@trigger.dev/core/v3"; +import { ZodMessageHandler, ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler"; import { watch } from "chokidar"; import { Command } from "commander"; import { BuildContext, Metafile, context } from "esbuild"; @@ -425,10 +424,6 @@ function useDev({ const metaOutputKey = join("out", `stdin.js`).replace(/\\/g, "/"); - logger.debug("Metafile", { - metafileOutputs: JSON.stringify(result.metafile?.outputs), - }); - const metaOutput = result.metafile!.outputs[metaOutputKey]; if (!metaOutput) { @@ -509,8 +504,15 @@ function useDev({ const taskResources: Array = []; - if (!backgroundWorker.tasks) { - throw new Error(`Background Worker started without tasks`); + if (!backgroundWorker.tasks || backgroundWorker.tasks.length === 0) { + logger.log( + `${chalkError( + "X Error:" + )} Worker failed to build: no tasks found. Searched in ${config.triggerDirectories.join( + ", " + )}` + ); + return; } for (const task of backgroundWorker.tasks) { @@ -536,6 +538,10 @@ function useDev({ return; } + logger.debug("Creating background worker with tasks", { + tasks: taskResources, + }); + const backgroundWorkerBody: CreateBackgroundWorkerRequestBody = { localOnly: true, metadata: { @@ -638,7 +644,7 @@ function useDev({ const throttledRebuild = pDebounce(runBuild, 250, { before: true }); const taskFileWatcher = watch( - config.triggerDirectories.map((triggerDir) => `${triggerDir}/*.ts`), + config.triggerDirectories.map((triggerDir) => `${triggerDir}/**/*.ts`), { ignoreInitial: true, } diff --git a/packages/cli-v3/src/commands/init.ts b/packages/cli-v3/src/commands/init.ts index 7d91ab385..675728a8e 100644 --- a/packages/cli-v3/src/commands/init.ts +++ b/packages/cli-v3/src/commands/init.ts @@ -1,10 +1,7 @@ import { intro, isCancel, log, outro, select, text } from "@clack/prompts"; import { context, trace } from "@opentelemetry/api"; -import { - GetProjectResponseBody, - flattenAttributes, - recordSpanException, -} from "@trigger.dev/core/v3"; +import { GetProjectResponseBody, flattenAttributes } from "@trigger.dev/core/v3"; +import { recordSpanException } from "@trigger.dev/core/v3/workers"; import chalk from "chalk"; import { Command } from "commander"; import { execa } from "execa"; diff --git a/packages/cli-v3/src/commands/login.ts b/packages/cli-v3/src/commands/login.ts index 7b15a5916..ed3c1b0f2 100644 --- a/packages/cli-v3/src/commands/login.ts +++ b/packages/cli-v3/src/commands/login.ts @@ -1,5 +1,5 @@ import { intro, log, outro, select } from "@clack/prompts"; -import { recordSpanException } from "@trigger.dev/core/v3"; +import { recordSpanException } from "@trigger.dev/core/v3/workers"; import { Command } from "commander"; import open from "open"; import pRetry, { AbortError } from "p-retry"; diff --git a/packages/cli-v3/src/telemetry/tracing.ts b/packages/cli-v3/src/telemetry/tracing.ts index 6da77e900..a85caea82 100644 --- a/packages/cli-v3/src/telemetry/tracing.ts +++ b/packages/cli-v3/src/telemetry/tracing.ts @@ -5,6 +5,10 @@ import { NodeTracerProvider, SimpleSpanProcessor } from "@opentelemetry/sdk-trac import { FetchInstrumentation } from "@opentelemetry/instrumentation-fetch"; import { DiagConsoleLogger, DiagLogLevel, diag, trace } from "@opentelemetry/api"; import * as packageJson from "../../package.json"; +import { + SEMRESATTRS_SERVICE_NAME, + SEMRESATTRS_SERVICE_VERSION, +} from "@opentelemetry/semantic-conventions"; function initializeTracing(): NodeTracerProvider | undefined { if (process.argv.includes("--skip-telemetry") || process.env.TRIGGER_DEV_SKIP_TELEMETRY) { @@ -19,7 +23,8 @@ function initializeTracing(): NodeTracerProvider | undefined { detectors: [processDetectorSync], }).merge( new Resource({ - service: "trigger.dev cli v3", + [SEMRESATTRS_SERVICE_NAME]: "trigger.dev cli v3", + [SEMRESATTRS_SERVICE_VERSION]: packageJson.version, }) ); @@ -38,9 +43,9 @@ function initializeTracing(): NodeTracerProvider | undefined { const spanExporter = new OTLPTraceExporter({ url: "https://otel.baselime.io/v1", - timeoutMillis: 500, + timeoutMillis: 5000, headers: { - "x-api-key": "e9f963244f8b092850d42e34a5339b2d5e68070b".split("").reverse().join(""), // this is a joke + "x-api-key": "b6e0fbbaf8dc2524773d2152ae2e9eb5c7fbaa52", }, }); @@ -59,5 +64,5 @@ function initializeTracing(): NodeTracerProvider | undefined { export const provider = initializeTracing(); export function getTracer() { - return trace.getTracer("trigger.dev cli", packageJson.version); + return trace.getTracer("trigger.dev cli v3", packageJson.version); } diff --git a/packages/cli-v3/src/utilities/build.ts b/packages/cli-v3/src/utilities/build.ts index b84b641c0..34b4e8f3a 100644 --- a/packages/cli-v3/src/utilities/build.ts +++ b/packages/cli-v3/src/utilities/build.ts @@ -11,7 +11,7 @@ export function bundleTriggerDevCore(buildIdentifier: string, tsconfigPath?: str name: "trigger-bundle-core", setup(build) { build.onResolve({ filter: /.*/ }, (args) => { - if (args.path !== "@trigger.dev/core/v3") { + if (!args.path.startsWith("@trigger.dev/core/v3")) { return undefined; } @@ -22,18 +22,15 @@ export function bundleTriggerDevCore(buildIdentifier: string, tsconfigPath?: str triggerSdkPath, }); - const resolvedPath = require.resolve("@trigger.dev/core/v3", { + const resolvedPath = require.resolve(args.path, { paths: [triggerSdkPath], }); - logger.debug( - `[${buildIdentifier}][trigger-bundle-core] Externalizing @trigger.dev/core/v3`, - { - ...args, - triggerSdkPath, - resolvedPath, - } - ); + logger.debug(`[${buildIdentifier}][trigger-bundle-core] Externalizing ${args.path}`, { + ...args, + triggerSdkPath, + resolvedPath, + }); return { path: resolvedPath, diff --git a/packages/cli-v3/src/utilities/configFiles.ts b/packages/cli-v3/src/utilities/configFiles.ts index 2251c72ce..87ed14779 100644 --- a/packages/cli-v3/src/utilities/configFiles.ts +++ b/packages/cli-v3/src/utilities/configFiles.ts @@ -99,6 +99,18 @@ async function getConfigPath(dir: string, fileName?: string): Promise { + const result = await findUp([fileName], { cwd: dir }); + + logger.debug("Searched for the file", { + dir, + fileName, + result, + }); + + return result; +} + export type ReadConfigOptions = { projectRef?: string; configFile?: string; @@ -187,6 +199,8 @@ export async function resolveConfig(path: string, config: Config): Promise { return await tracer.startActiveSpan("isLoggedIn", async (span) => { diff --git a/packages/cli-v3/src/utilities/taskFiles.ts b/packages/cli-v3/src/utilities/taskFiles.ts index 39fc36b97..1f2175216 100644 --- a/packages/cli-v3/src/utilities/taskFiles.ts +++ b/packages/cli-v3/src/utilities/taskFiles.ts @@ -21,9 +21,27 @@ export async function gatherTaskFiles(config: ResolvedConfig): Promise = []; for (const triggerDir of config.triggerDirectories) { - const files = await fs.promises.readdir(triggerDir, { withFileTypes: true }); - for (const file of files) { - if (!file.isFile()) continue; + const files = await gatherTaskFilesFromDir(triggerDir, triggerDir, config); + taskFiles.push(...files); + } + + return taskFiles; +} + +async function gatherTaskFilesFromDir( + dirPath: string, + triggerDir: string, + config: ResolvedConfig +): Promise { + const taskFiles: TaskFile[] = []; + + const files = await fs.promises.readdir(dirPath, { withFileTypes: true }); + for (const file of files) { + if (!file.isFile()) { + // Recurse into subdirectories + const fullPath = join(dirPath, file.name); + taskFiles.push(...(await gatherTaskFilesFromDir(fullPath, triggerDir, config))); + } else { if ( !file.name.endsWith(".js") && !file.name.endsWith(".ts") && @@ -33,7 +51,7 @@ export async function gatherTaskFiles(config: ResolvedConfig): Promise { const triggerDirectories: string[] = []; for (const entry of entries) { - if (!entry.isDirectory() || IGNORED_DIRS.includes(entry.name)) continue; + if (!entry.isDirectory() || IGNORED_DIRS.includes(entry.name) || entry.name.startsWith(".")) + continue; const fullPath = join(dirPath, entry.name); + // Ignore the directory if it's /app/api/trigger + if (fullPath.endsWith("app/api/trigger")) { + continue; + } + if (entry.name === "trigger") { triggerDirectories.push(fullPath); } diff --git a/packages/cli-v3/src/workers/dev/backgroundWorker.ts b/packages/cli-v3/src/workers/dev/backgroundWorker.ts index e65126731..0b2b2d715 100644 --- a/packages/cli-v3/src/workers/dev/backgroundWorker.ts +++ b/packages/cli-v3/src/workers/dev/backgroundWorker.ts @@ -11,13 +11,12 @@ import { TaskRunExecution, TaskRunExecutionPayload, TaskRunExecutionResult, - ZodMessageHandler, - ZodMessageSender, childToWorkerMessages, correctErrorStackTrace, formatDurationMilliseconds, workerToChildMessages, } from "@trigger.dev/core/v3"; +import { ZodMessageHandler, ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler"; import dotenv from "dotenv"; import { Evt } from "evt"; import { ChildProcess, fork } from "node:child_process"; diff --git a/packages/cli-v3/src/workers/dev/worker-facade.ts b/packages/cli-v3/src/workers/dev/worker-facade.ts index c5b454538..3102c2323 100644 --- a/packages/cli-v3/src/workers/dev/worker-facade.ts +++ b/packages/cli-v3/src/workers/dev/worker-facade.ts @@ -1,17 +1,20 @@ import { Config, - DurableClock, LogLevel, ProjectConfig, - TaskExecutor, - ZodSchemaParsedError, clock, - getEnvVar, - logLevels, taskCatalog, type HandleErrorFunction, - type TracingSDK, } from "@trigger.dev/core/v3"; +import { + TaskExecutor, + DurableClock, + getEnvVar, + logLevels, + OtelTaskLogger, + ConsoleInterceptor, + type TracingSDK, +} from "@trigger.dev/core/v3/workers"; __WORKER_SETUP__; declare const __WORKER_SETUP__: unknown; @@ -28,19 +31,20 @@ const otelTracer = tracingSDK.getTracer("trigger-dev-worker", packageJson.versio const otelLogger = tracingSDK.getLogger("trigger-dev-worker", packageJson.version); import { - ConsoleInterceptor, - DevRuntimeManager, - OtelTaskLogger, TaskRunErrorCodes, TaskRunExecution, TriggerTracer, - ZodMessageHandler, - ZodMessageSender, childToWorkerMessages, logger, runtime, workerToChildMessages, } from "@trigger.dev/core/v3"; +import { DevRuntimeManager } from "@trigger.dev/core/v3/dev"; +import { + ZodMessageHandler, + ZodMessageSender, + ZodSchemaParsedError, +} from "@trigger.dev/core/v3/zodMessageHandler"; import * as packageJson from "../../../package.json"; declare const sender: ZodMessageSender; @@ -94,10 +98,12 @@ declare const __TASKS__: Record; "id" in task && typeof task.id === "string" ) { - taskCatalog.registerTaskFileMetadata(task.id, { - exportName, - filePath: (taskFile as any).filePath, - }); + if (taskCatalog.taskExists(task.id)) { + taskCatalog.registerTaskFileMetadata(task.id, { + exportName, + filePath: (taskFile as any).filePath, + }); + } } } } diff --git a/packages/cli-v3/src/workers/dev/worker-setup.ts b/packages/cli-v3/src/workers/dev/worker-setup.ts index b8393b2a7..a9139eb31 100644 --- a/packages/cli-v3/src/workers/dev/worker-setup.ts +++ b/packages/cli-v3/src/workers/dev/worker-setup.ts @@ -3,13 +3,15 @@ import { Resource } from "@opentelemetry/resources"; import { ProjectConfig, SemanticInternalAttributes, - StandardTaskCatalog, - TracingDiagnosticLogLevel, - TracingSDK, - ZodMessageSender, childToWorkerMessages, taskCatalog, } from "@trigger.dev/core/v3"; +import { + TracingDiagnosticLogLevel, + TracingSDK, + StandardTaskCatalog, +} from "@trigger.dev/core/v3/workers"; +import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler"; __SETUP_IMPORTED_PROJECT_CONFIG__; declare const __SETUP_IMPORTED_PROJECT_CONFIG__: unknown; diff --git a/packages/cli-v3/src/workers/prod/backgroundWorker.ts b/packages/cli-v3/src/workers/prod/backgroundWorker.ts index 3fb9db27b..f5c5e85e4 100644 --- a/packages/cli-v3/src/workers/prod/backgroundWorker.ts +++ b/packages/cli-v3/src/workers/prod/backgroundWorker.ts @@ -2,7 +2,6 @@ import { BackgroundWorkerProperties, Config, CreateBackgroundWorkerResponse, - InferSocketMessageSchema, ProdChildToWorkerMessages, ProdTaskRunExecution, ProdTaskRunExecutionPayload, @@ -14,9 +13,10 @@ import { TaskRunExecution, TaskRunExecutionPayload, TaskRunExecutionResult, - ZodIpcConnection, correctErrorStackTrace, } from "@trigger.dev/core/v3"; +import { ZodIpcConnection } from "@trigger.dev/core/v3/zodIpc"; +import type { InferSocketMessageSchema } from "@trigger.dev/core/v3/zodSocket"; import { Evt } from "evt"; import { ChildProcess, fork } from "node:child_process"; import { TaskMetadataParseError, UncaughtExceptionError } from "../common/errors"; diff --git a/packages/cli-v3/src/workers/prod/entry-point.ts b/packages/cli-v3/src/workers/prod/entry-point.ts index 1cb2b9e60..2c75b8eae 100644 --- a/packages/cli-v3/src/workers/prod/entry-point.ts +++ b/packages/cli-v3/src/workers/prod/entry-point.ts @@ -6,8 +6,8 @@ import { ProdWorkerToCoordinatorMessages, TaskResource, WaitReason, - ZodSocketConnection, } from "@trigger.dev/core/v3"; +import { ZodSocketConnection } from "@trigger.dev/core/v3/zodSocket"; import { HttpReply, SimpleLogger, getRandomPortNumber } from "@trigger.dev/core-apps"; import { readFile } from "node:fs/promises"; import { createServer } from "node:http"; diff --git a/packages/cli-v3/src/workers/prod/worker-facade.ts b/packages/cli-v3/src/workers/prod/worker-facade.ts index 9424ba256..8c9885753 100644 --- a/packages/cli-v3/src/workers/prod/worker-facade.ts +++ b/packages/cli-v3/src/workers/prod/worker-facade.ts @@ -1,20 +1,24 @@ import { Config, - DurableClock, HandleErrorFunction, LogLevel, ProdChildToWorkerMessages, ProdWorkerToChildMessages, ProjectConfig, - TaskExecutor, - ZodIpcConnection, - ZodSchemaParsedError, clock, + taskCatalog, +} from "@trigger.dev/core/v3"; +import { + TaskExecutor, + DurableClock, getEnvVar, logLevels, - taskCatalog, + OtelTaskLogger, + ConsoleInterceptor, type TracingSDK, -} from "@trigger.dev/core/v3"; +} from "@trigger.dev/core/v3/workers"; +import { ZodIpcConnection } from "@trigger.dev/core/v3/zodIpc"; +import { ZodSchemaParsedError } from "@trigger.dev/core/v3/zodMessageHandler"; import "source-map-support/register.js"; __WORKER_SETUP__; @@ -32,22 +36,20 @@ const otelTracer = tracingSDK.getTracer("trigger-prod-worker", packageJson.versi const otelLogger = tracingSDK.getLogger("trigger-prod-worker", packageJson.version); import { - ConsoleInterceptor, - OtelTaskLogger, - ProdRuntimeManager, TaskRunErrorCodes, TaskRunExecution, TriggerTracer, logger, runtime, } from "@trigger.dev/core/v3"; +import { ProdRuntimeManager } from "@trigger.dev/core/v3/prod"; import * as packageJson from "../../../package.json"; const durableClock = new DurableClock(); clock.setGlobalClock(durableClock); const tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger }); -const consoleInterceptor = new ConsoleInterceptor(otelLogger, false); +const consoleInterceptor = new ConsoleInterceptor(otelLogger, true); const triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL"); @@ -85,10 +87,12 @@ declare const __TASKS__: Record; "id" in task && typeof task.id === "string" ) { - taskCatalog.registerTaskFileMetadata(task.id, { - exportName, - filePath: (taskFile as any).filePath, - }); + if (taskCatalog.taskExists(task.id)) { + taskCatalog.registerTaskFileMetadata(task.id, { + exportName, + filePath: (taskFile as any).filePath, + }); + } } } } diff --git a/packages/cli-v3/src/workers/prod/worker-setup.ts b/packages/cli-v3/src/workers/prod/worker-setup.ts index 2b5bbcb5a..82bf65d47 100644 --- a/packages/cli-v3/src/workers/prod/worker-setup.ts +++ b/packages/cli-v3/src/workers/prod/worker-setup.ts @@ -1,12 +1,10 @@ import { Resource } from "@opentelemetry/resources"; +import { ProjectConfig, SemanticInternalAttributes, taskCatalog } from "@trigger.dev/core/v3"; import { - ProjectConfig, - SemanticInternalAttributes, - StandardTaskCatalog, TracingDiagnosticLogLevel, TracingSDK, - taskCatalog, -} from "@trigger.dev/core/v3"; + StandardTaskCatalog, +} from "@trigger.dev/core/v3/workers"; __SETUP_IMPORTED_PROJECT_CONFIG__; declare const __SETUP_IMPORTED_PROJECT_CONFIG__: unknown; diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 1978b90a0..f03146cc9 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -21,7 +21,7 @@ import { logger } from "../utils/logger"; import { resolvePath } from "../utils/parseNameAndPath"; import { readPackageJson } from "../utils/readPackageJson"; import { renderTitle } from "../utils/renderTitle"; -import { TriggerApi, WhoamiResponse } from "../utils/triggerApi"; +import { TriggerApi } from "../utils/triggerApi"; import { getJsRuntime } from "../utils/jsRuntime"; export type InitCommandOptions = { @@ -165,7 +165,9 @@ async function printNextSteps( framework: Framework ) { logger.success(`✔ Successfully initialized Trigger.dev!`); - logger.warn(`⚠️ Warning: We don't currently support long-running servers! For more details, check out https://github.com/triggerdotdev/trigger.dev/issues/244.`); + logger.warn( + `⚠️ Warning: We don't currently support long-running servers! For more details, check out https://github.com/triggerdotdev/trigger.dev/issues/244.` + ); logger.info("Next steps:"); logger.info(` 1. Run your ${framework.name} project locally with '${packageManager} run dev'`); logger.info( diff --git a/packages/core-apps/package.json b/packages/core-apps/package.json index b670a9255..c4b04214e 100644 --- a/packages/core-apps/package.json +++ b/packages/core-apps/package.json @@ -28,7 +28,8 @@ "@trigger.dev/core": "workspace:*", "@trigger.dev/tsconfig": "workspace:*", "@types/node": "18", - "typescript": "^5.3.0" + "typescript": "^5.3.0", + "socket.io-client": "^4.7.4" }, "engines": { "node": ">=18.0.0" diff --git a/packages/core-apps/src/provider.ts b/packages/core-apps/src/provider.ts index 82f0ba515..cb1b0c4d5 100644 --- a/packages/core-apps/src/provider.ts +++ b/packages/core-apps/src/provider.ts @@ -7,9 +7,9 @@ import { PlatformToProviderMessages, ProviderToPlatformMessages, SharedQueueToClientMessages, - ZodMessageSender, - ZodSocketConnection, } from "@trigger.dev/core/v3"; +import { ZodMessageSender } from "@trigger.dev/core/v3/zodMessageHandler"; +import { ZodSocketConnection } from "@trigger.dev/core/v3/zodSocket"; import { getRandomPortNumber, HttpReply, getTextBody } from "./http"; import { SimpleLogger } from "./logger"; diff --git a/packages/core/package.json b/packages/core/package.json index b9cf97477..0c51272f3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -37,6 +37,70 @@ "require": "./dist/v3/otel/index.js", "types": "./dist/v3/otel/index.d.ts" }, + "./v3/zodMessageHandler": { + "import": { + "types": "./dist/v3/zodMessageHandler.d.mts", + "default": "./dist/v3/zodMessageHandler.mjs" + }, + "require": "./dist/v3/zodMessageHandler.js", + "types": "./dist/v3/zodMessageHandler.d.ts" + }, + "./v3/zodNamespace": { + "import": { + "types": "./dist/v3/zodNamespace.d.mts", + "default": "./dist/v3/zodNamespace.mjs" + }, + "require": "./dist/v3/zodNamespace.js", + "types": "./dist/v3/zodNamespace.d.ts" + }, + "./v3/zodSocket": { + "import": { + "types": "./dist/v3/zodSocket.d.mts", + "default": "./dist/v3/zodSocket.mjs" + }, + "require": "./dist/v3/zodSocket.js", + "types": "./dist/v3/zodSocket.d.ts" + }, + "./v3/zodIpc": { + "import": { + "types": "./dist/v3/zodIpc.d.mts", + "default": "./dist/v3/zodIpc.mjs" + }, + "require": "./dist/v3/zodIpc.js", + "types": "./dist/v3/zodIpc.d.ts" + }, + "./v3/utils/structuredLogger": { + "import": { + "types": "./dist/v3/utils/structuredLogger.d.mts", + "default": "./dist/v3/utils/structuredLogger.mjs" + }, + "require": "./dist/v3/utils/structuredLogger.js", + "types": "./dist/v3/utils/structuredLogger.d.ts" + }, + "./v3/dev": { + "import": { + "types": "./dist/v3/dev/index.d.mts", + "default": "./dist/v3/dev/index.mjs" + }, + "require": "./dist/v3/dev/index.js", + "types": "./dist/v3/dev/index.d.ts" + }, + "./v3/prod": { + "import": { + "types": "./dist/v3/prod/index.d.mts", + "default": "./dist/v3/prod/index.mjs" + }, + "require": "./dist/v3/prod/index.js", + "types": "./dist/v3/prod/index.d.ts" + }, + "./v3/workers": { + "import": { + "types": "./dist/v3/workers/index.d.mts", + "default": "./dist/v3/workers/index.mjs" + }, + "require": "./dist/v3/workers/index.js", + "types": "./dist/v3/workers/index.d.ts" + }, "./package.json": "./package.json" }, "typesVersions": { @@ -71,25 +135,25 @@ "@opentelemetry/sdk-trace-node": "^1.22.0", "@opentelemetry/semantic-conventions": "^1.22.0", "humanize-duration": "^3.27.3", - "socket.io": "^4.7.4", - "socket.io-client": "^4.7.4", "superjson": "^2.2.1", "ulidx": "^2.2.1", "zod": "3.22.3", "zod-error": "1.5.0", - "zod-validation-error": "^1.5.0" + "zod-validation-error": "^1.5.0", + "socket.io-client": "4.7.4" }, "devDependencies": { "@trigger.dev/tsconfig": "workspace:*", "@trigger.dev/tsup": "workspace:*", "@types/humanize-duration": "^3.27.1", "@types/jest": "^29.5.3", - "@types/node": "^18", + "@types/node": "20.12.7", "jest": "^29.6.2", "rimraf": "^3.0.2", "ts-jest": "^29.1.1", "tsup": "^8.0.1", - "typescript": "^5.3.0" + "typescript": "^5.3.0", + "socket.io": "4.7.4" }, "engines": { "node": ">=18.0.0" diff --git a/packages/core/src/v3/apiClient/index.ts b/packages/core/src/v3/apiClient/index.ts index 506409cc8..d89860527 100644 --- a/packages/core/src/v3/apiClient/index.ts +++ b/packages/core/src/v3/apiClient/index.ts @@ -17,7 +17,7 @@ import { TriggerTaskResponse, UpdateScheduleOptions, } from "../schemas"; -import { taskContextManager } from "../tasks/taskContextManager"; +import { taskContext } from "../task-context-api"; import { getEnvVar } from "../utils/getEnv"; import { SafeAsyncLocalStorage } from "../utils/safeAsyncLocalStorage"; import { APIError } from "../apiErrors"; @@ -229,7 +229,7 @@ export class ApiClient { }; // Only inject the context if we are inside a task - if (taskContextManager.isInsideTask) { + if (taskContext.isInsideTask) { propagation.inject(context.active(), headers); if (spanParentAsLink) { diff --git a/packages/core/src/v3/dev/index.ts b/packages/core/src/v3/dev/index.ts new file mode 100644 index 000000000..32573adb7 --- /dev/null +++ b/packages/core/src/v3/dev/index.ts @@ -0,0 +1 @@ +export { DevRuntimeManager } from "../runtime/devRuntimeManager"; diff --git a/packages/core/src/v3/index.ts b/packages/core/src/v3/index.ts index 491b7020a..2428a7c7e 100644 --- a/packages/core/src/v3/index.ts +++ b/packages/core/src/v3/index.ts @@ -1,76 +1,52 @@ -import { BatchTriggerTaskRequestBody, TriggerTaskRequestBody } from "./schemas"; - -export * from "./schemas"; export * from "./apiClient"; -export * from "./zodMessageHandler"; -export * from "./zodNamespace"; -export * from "./zodSocket"; -export * from "./zodIpc"; -export * from "./errors"; export * from "./apiErrors"; -export * from "./runtime-api"; -export * from "./logger-api"; export * from "./clock-api"; +export * from "./errors"; +export * from "./limits"; +export * from "./logger-api"; +export * from "./runtime-api"; +export * from "./task-context-api"; +export * from "./schemas"; +export { SemanticInternalAttributes } from "./semanticInternalAttributes"; export * from "./task-catalog-api"; export * from "./types"; -export * from "./limits"; -export { SemanticInternalAttributes } from "./semanticInternalAttributes"; -export { iconStringForSeverity } from "./icons"; export { formatDuration, + formatDurationInDays, formatDurationMilliseconds, formatDurationNanoseconds, - formatDurationInDays, - nanosecondsToMilliseconds, millisecondsToNanoseconds, + nanosecondsToMilliseconds, } from "./utils/durations"; -export { getEnvVar } from "./utils/getEnv"; -export function parseTriggerTaskRequestBody(body: unknown) { - return TriggerTaskRequestBody.safeParse(body); -} - -export function parseBatchTriggerTaskRequestBody(body: unknown) { - return BatchTriggerTaskRequestBody.safeParse(body); -} - -export { taskContextManager, TaskContextSpanProcessor } from "./tasks/taskContextManager"; -export type { RuntimeManager } from "./runtime/manager"; -export { DevRuntimeManager } from "./runtime/devRuntimeManager"; -export { ProdRuntimeManager } from "./runtime/prodRuntimeManager"; -export { PreciseWallClock as DurableClock } from "./clock/preciseWallClock"; export { TriggerTracer } from "./tracer"; -export type { TaskLogger, LogLevel } from "./logger/taskLogger"; -export { OtelTaskLogger, logLevels } from "./logger/taskLogger"; -export { ConsoleInterceptor } from "./consoleInterceptor"; +export type { LogLevel } from "./logger/taskLogger"; + +export { eventFilterMatches } from "../eventFilterMatches"; export { flattenAttributes, - unflattenAttributes, primitiveValueOrflattenedAttributes, + unflattenAttributes, } from "./utils/flattenAttributes"; +export { omit } from "./utils/omit"; export { - defaultRetryOptions, - defaultFetchRetryOptions, calculateNextRetryDelay, calculateResetAt, + defaultFetchRetryOptions, + defaultRetryOptions, } from "./utils/retries"; export { accessoryAttributes } from "./utils/styleAttributes"; -export { eventFilterMatches } from "../eventFilterMatches"; -export { omit } from "./utils/omit"; -export { TracingSDK, type TracingDiagnosticLogLevel, recordSpanException } from "./otel"; -export { TaskExecutor, type TaskExecutorOptions } from "./workers/taskExecutor"; + export { detectDependencyVersion } from "./utils/detectDependencyVersion"; export { - parsePacket, - stringifyIO, - prettyPrintPacket, - createPacketAttributes, - createPacketAttributesAsJson, conditionallyExportPacket, conditionallyImportPacket, + createPacketAttributes, + createPacketAttributesAsJson, packetRequiresOffloading, + parsePacket, + prettyPrintPacket, + stringifyIO, type IOPacket, } from "./utils/ioSerialization"; - -export { StandardTaskCatalog } from "./task-catalog/standardTaskCatalog"; diff --git a/packages/core/src/v3/otel/tracingSDK.ts b/packages/core/src/v3/otel/tracingSDK.ts index 016d7d53b..50d344da5 100644 --- a/packages/core/src/v3/otel/tracingSDK.ts +++ b/packages/core/src/v3/otel/tracingSDK.ts @@ -38,7 +38,7 @@ import { OTEL_SPAN_EVENT_COUNT_LIMIT, } from "../limits"; import { SemanticInternalAttributes } from "../semanticInternalAttributes"; -import { TaskContextLogProcessor, TaskContextSpanProcessor } from "../tasks/taskContextManager"; +import { TaskContextLogProcessor, TaskContextSpanProcessor } from "../taskContext/otelProcessors"; import { getEnvVar } from "../utils/getEnv"; class AsyncResourceDetector implements DetectorSync { diff --git a/packages/core/src/v3/prod/index.ts b/packages/core/src/v3/prod/index.ts new file mode 100644 index 000000000..ac1f1214c --- /dev/null +++ b/packages/core/src/v3/prod/index.ts @@ -0,0 +1 @@ +export { ProdRuntimeManager } from "../runtime/prodRuntimeManager"; diff --git a/packages/core/src/v3/schemas/messages.ts b/packages/core/src/v3/schemas/messages.ts index ac384bd58..149b2c4c6 100644 --- a/packages/core/src/v3/schemas/messages.ts +++ b/packages/core/src/v3/schemas/messages.ts @@ -1,13 +1,5 @@ import { z } from "zod"; import { TaskRunExecution, TaskRunExecutionResult } from "./common"; -import { - RunFnParams, - InitFnParams, - InitOutput, - MiddlewareFnParams, - HandleErrorFnParams, - HandleErrorResult, -} from "../types"; export const EnvironmentType = z.enum(["PRODUCTION", "STAGING", "DEVELOPMENT", "PREVIEW"]); export type EnvironmentType = z.infer; diff --git a/packages/core/src/v3/task-catalog/catalog.ts b/packages/core/src/v3/task-catalog/catalog.ts index 8ccb078ee..fd89ee70f 100644 --- a/packages/core/src/v3/task-catalog/catalog.ts +++ b/packages/core/src/v3/task-catalog/catalog.ts @@ -8,4 +8,5 @@ export interface TaskCatalog { getAllTaskMetadata(): Array; getTaskMetadata(id: string): TaskMetadataWithFilePath | undefined; getTask(id: string): TaskMetadataWithFunctions | undefined; + taskExists(id: string): boolean; } diff --git a/packages/core/src/v3/task-catalog/index.ts b/packages/core/src/v3/task-catalog/index.ts index 03a2b2644..213c68d4e 100644 --- a/packages/core/src/v3/task-catalog/index.ts +++ b/packages/core/src/v3/task-catalog/index.ts @@ -53,6 +53,10 @@ export class TaskCatalogAPI { return this.#getCatalog().getTask(id); } + public taskExists(id: string): boolean { + return this.#getCatalog().taskExists(id); + } + #getCatalog(): TaskCatalog { return getGlobal(API_NAME) ?? NOOP_TASK_CATALOG; } diff --git a/packages/core/src/v3/task-catalog/noopTaskCatalog.ts b/packages/core/src/v3/task-catalog/noopTaskCatalog.ts index f3aedf4da..41f1b4a5e 100644 --- a/packages/core/src/v3/task-catalog/noopTaskCatalog.ts +++ b/packages/core/src/v3/task-catalog/noopTaskCatalog.ts @@ -27,6 +27,10 @@ export class NoopTaskCatalog implements TaskCatalog { return undefined; } + taskExists(id: string): boolean { + return false; + } + disable() { // noop } diff --git a/packages/core/src/v3/task-catalog/standardTaskCatalog.ts b/packages/core/src/v3/task-catalog/standardTaskCatalog.ts index 23b04db65..71a6471e2 100644 --- a/packages/core/src/v3/task-catalog/standardTaskCatalog.ts +++ b/packages/core/src/v3/task-catalog/standardTaskCatalog.ts @@ -90,6 +90,10 @@ export class StandardTaskCatalog implements TaskCatalog { }; } + taskExists(id: string): boolean { + return this._taskMetadata.has(id); + } + disable() { // noop } diff --git a/packages/core/src/v3/task-context-api.ts b/packages/core/src/v3/task-context-api.ts new file mode 100644 index 000000000..1777d02bf --- /dev/null +++ b/packages/core/src/v3/task-context-api.ts @@ -0,0 +1,5 @@ +// Split module-level variable definition into separate files to allow +// tree-shaking on each api instance. +import { TaskContextAPI } from "./taskContext"; +/** Entrypoint for logger API */ +export const taskContext = TaskContextAPI.getInstance(); diff --git a/packages/core/src/v3/taskContext/index.ts b/packages/core/src/v3/taskContext/index.ts new file mode 100644 index 000000000..35adc7d59 --- /dev/null +++ b/packages/core/src/v3/taskContext/index.ts @@ -0,0 +1,95 @@ +import { Attributes } from "@opentelemetry/api"; +import { BackgroundWorkerProperties, TaskRunContext } from "../schemas"; +import { getGlobal, registerGlobal, unregisterGlobal } from "../utils/globals"; +import { TaskContext } from "./types"; +import { SemanticInternalAttributes } from "../semanticInternalAttributes"; + +const API_NAME = "task-context"; + +export class TaskContextAPI { + private static _instance?: TaskContextAPI; + + private constructor() {} + + public static getInstance(): TaskContextAPI { + if (!this._instance) { + this._instance = new TaskContextAPI(); + } + + return this._instance; + } + + get isInsideTask(): boolean { + return this.#getTaskContext() !== undefined; + } + + get ctx(): TaskRunContext | undefined { + return this.#getTaskContext()?.ctx; + } + + get worker(): BackgroundWorkerProperties | undefined { + return this.#getTaskContext()?.worker; + } + + get attributes(): Attributes { + if (this.ctx) { + return { + ...this.contextAttributes, + ...this.workerAttributes, + }; + } + + return {}; + } + + get workerAttributes(): Attributes { + if (this.worker) { + return { + [SemanticInternalAttributes.WORKER_ID]: this.worker.id, + [SemanticInternalAttributes.WORKER_VERSION]: this.worker.version, + }; + } + + return {}; + } + + get contextAttributes(): Attributes { + if (this.ctx) { + return { + [SemanticInternalAttributes.ATTEMPT_ID]: this.ctx.attempt.id, + [SemanticInternalAttributes.ATTEMPT_NUMBER]: this.ctx.attempt.number, + [SemanticInternalAttributes.TASK_SLUG]: this.ctx.task.id, + [SemanticInternalAttributes.TASK_PATH]: this.ctx.task.filePath, + [SemanticInternalAttributes.TASK_EXPORT_NAME]: this.ctx.task.exportName, + [SemanticInternalAttributes.QUEUE_NAME]: this.ctx.queue.name, + [SemanticInternalAttributes.QUEUE_ID]: this.ctx.queue.id, + [SemanticInternalAttributes.ENVIRONMENT_ID]: this.ctx.environment.id, + [SemanticInternalAttributes.ENVIRONMENT_TYPE]: this.ctx.environment.type, + [SemanticInternalAttributes.ORGANIZATION_ID]: this.ctx.organization.id, + [SemanticInternalAttributes.PROJECT_ID]: this.ctx.project.id, + [SemanticInternalAttributes.PROJECT_REF]: this.ctx.project.ref, + [SemanticInternalAttributes.PROJECT_NAME]: this.ctx.project.name, + [SemanticInternalAttributes.RUN_ID]: this.ctx.run.id, + [SemanticInternalAttributes.RUN_IS_TEST]: this.ctx.run.isTest, + [SemanticInternalAttributes.ORGANIZATION_SLUG]: this.ctx.organization.slug, + [SemanticInternalAttributes.ORGANIZATION_NAME]: this.ctx.organization.name, + [SemanticInternalAttributes.BATCH_ID]: this.ctx.batch?.id, + [SemanticInternalAttributes.IDEMPOTENCY_KEY]: this.ctx.run.idempotencyKey, + }; + } + + return {}; + } + + public disable() { + unregisterGlobal(API_NAME); + } + + public setGlobalTaskContext(taskContext: TaskContext): boolean { + return registerGlobal(API_NAME, taskContext); + } + + #getTaskContext(): TaskContext | undefined { + return getGlobal(API_NAME); + } +} diff --git a/packages/core/src/v3/taskContext/otelProcessors.ts b/packages/core/src/v3/taskContext/otelProcessors.ts new file mode 100644 index 000000000..9e9a62853 --- /dev/null +++ b/packages/core/src/v3/taskContext/otelProcessors.ts @@ -0,0 +1,75 @@ +import { LogRecord, LogRecordProcessor } from "@opentelemetry/sdk-logs"; +import { Span, SpanProcessor } from "@opentelemetry/sdk-trace-base"; +import { SemanticInternalAttributes } from "../semanticInternalAttributes"; +import { Context } from "@opentelemetry/api"; +import { flattenAttributes } from "../utils/flattenAttributes"; +import { taskContext } from "../task-context-api"; + +export class TaskContextSpanProcessor implements SpanProcessor { + private _innerProcessor: SpanProcessor; + + constructor(innerProcessor: SpanProcessor) { + this._innerProcessor = innerProcessor; + } + + // Called when a span starts + onStart(span: Span, parentContext: Context): void { + if (taskContext.ctx) { + span.setAttributes( + flattenAttributes( + { + [SemanticInternalAttributes.ATTEMPT_ID]: taskContext.ctx.attempt.id, + [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContext.ctx.attempt.number, + }, + SemanticInternalAttributes.METADATA + ) + ); + } + + this._innerProcessor.onStart(span, parentContext); + } + + // Delegate the rest of the methods to the wrapped processor + + onEnd(span: Span): void { + this._innerProcessor.onEnd(span); + } + + shutdown(): Promise { + return this._innerProcessor.shutdown(); + } + + forceFlush(): Promise { + return this._innerProcessor.forceFlush(); + } +} + +export class TaskContextLogProcessor implements LogRecordProcessor { + private _innerProcessor: LogRecordProcessor; + + constructor(innerProcessor: LogRecordProcessor) { + this._innerProcessor = innerProcessor; + } + forceFlush(): Promise { + return this._innerProcessor.forceFlush(); + } + onEmit(logRecord: LogRecord, context?: Context | undefined): void { + // Adds in the context attributes to the log record + if (taskContext.ctx) { + logRecord.setAttributes( + flattenAttributes( + { + [SemanticInternalAttributes.ATTEMPT_ID]: taskContext.ctx.attempt.id, + [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContext.ctx.attempt.number, + }, + SemanticInternalAttributes.METADATA + ) + ); + } + + this._innerProcessor.onEmit(logRecord, context); + } + shutdown(): Promise { + return this._innerProcessor.shutdown(); + } +} diff --git a/packages/core/src/v3/taskContext/types.ts b/packages/core/src/v3/taskContext/types.ts new file mode 100644 index 000000000..9a727224f --- /dev/null +++ b/packages/core/src/v3/taskContext/types.ts @@ -0,0 +1,6 @@ +import { BackgroundWorkerProperties, TaskRunContext } from "../schemas"; + +export type TaskContext = { + ctx: TaskRunContext; + worker: BackgroundWorkerProperties; +}; diff --git a/packages/core/src/v3/tasks/taskContextManager.ts b/packages/core/src/v3/tasks/taskContextManager.ts deleted file mode 100644 index f30a88c48..000000000 --- a/packages/core/src/v3/tasks/taskContextManager.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { Attributes, Context } from "@opentelemetry/api"; -import { TaskRunContext, type BackgroundWorkerProperties } from "../schemas"; -import { flattenAttributes } from "../utils/flattenAttributes"; -import { SafeAsyncLocalStorage } from "../utils/safeAsyncLocalStorage"; - -type TaskContext = { - ctx: TaskRunContext; - worker: BackgroundWorkerProperties; -}; - -export class TaskContextManager { - private _storage: SafeAsyncLocalStorage = new SafeAsyncLocalStorage(); - - get isInsideTask(): boolean { - return this.#getStore() !== undefined; - } - - get ctx(): TaskRunContext | undefined { - const store = this.#getStore(); - return store?.ctx; - } - - get worker(): BackgroundWorkerProperties | undefined { - const store = this.#getStore(); - return store?.worker; - } - - get attributes(): Attributes { - if (this.ctx) { - return { - ...this.contextAttributes, - ...this.workerAttributes, - }; - } - - return {}; - } - - get workerAttributes(): Attributes { - if (this.worker) { - return { - [SemanticInternalAttributes.WORKER_ID]: this.worker.id, - [SemanticInternalAttributes.WORKER_VERSION]: this.worker.version, - }; - } - - return {}; - } - - get contextAttributes(): Attributes { - if (this.ctx) { - return { - [SemanticInternalAttributes.ATTEMPT_ID]: this.ctx.attempt.id, - [SemanticInternalAttributes.ATTEMPT_NUMBER]: this.ctx.attempt.number, - [SemanticInternalAttributes.TASK_SLUG]: this.ctx.task.id, - [SemanticInternalAttributes.TASK_PATH]: this.ctx.task.filePath, - [SemanticInternalAttributes.TASK_EXPORT_NAME]: this.ctx.task.exportName, - [SemanticInternalAttributes.QUEUE_NAME]: this.ctx.queue.name, - [SemanticInternalAttributes.QUEUE_ID]: this.ctx.queue.id, - [SemanticInternalAttributes.ENVIRONMENT_ID]: this.ctx.environment.id, - [SemanticInternalAttributes.ENVIRONMENT_TYPE]: this.ctx.environment.type, - [SemanticInternalAttributes.ORGANIZATION_ID]: this.ctx.organization.id, - [SemanticInternalAttributes.PROJECT_ID]: this.ctx.project.id, - [SemanticInternalAttributes.PROJECT_REF]: this.ctx.project.ref, - [SemanticInternalAttributes.PROJECT_NAME]: this.ctx.project.name, - [SemanticInternalAttributes.RUN_ID]: this.ctx.run.id, - [SemanticInternalAttributes.RUN_IS_TEST]: this.ctx.run.isTest, - [SemanticInternalAttributes.ORGANIZATION_SLUG]: this.ctx.organization.slug, - [SemanticInternalAttributes.ORGANIZATION_NAME]: this.ctx.organization.name, - [SemanticInternalAttributes.BATCH_ID]: this.ctx.batch?.id, - [SemanticInternalAttributes.IDEMPOTENCY_KEY]: this.ctx.run.idempotencyKey, - }; - } - - return {}; - } - - runWith Promise>( - context: TaskContext, - fn: R - ): Promise> { - return this._storage.runWith(context, fn); - } - - #getStore(): TaskContext | undefined { - return this._storage.getStore(); - } -} - -export const taskContextManager = new TaskContextManager(); - -import { LogRecord, LogRecordProcessor } from "@opentelemetry/sdk-logs"; -import { Span, SpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { SemanticInternalAttributes } from "../semanticInternalAttributes"; - -export class TaskContextSpanProcessor implements SpanProcessor { - private _innerProcessor: SpanProcessor; - - constructor(innerProcessor: SpanProcessor) { - this._innerProcessor = innerProcessor; - } - - // Called when a span starts - onStart(span: Span, parentContext: Context): void { - if (taskContextManager.ctx) { - span.setAttributes( - flattenAttributes( - { - [SemanticInternalAttributes.ATTEMPT_ID]: taskContextManager.ctx.attempt.id, - [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContextManager.ctx.attempt.number, - }, - SemanticInternalAttributes.METADATA - ) - ); - } - - this._innerProcessor.onStart(span, parentContext); - } - - // Delegate the rest of the methods to the wrapped processor - - onEnd(span: Span): void { - this._innerProcessor.onEnd(span); - } - - shutdown(): Promise { - return this._innerProcessor.shutdown(); - } - - forceFlush(): Promise { - return this._innerProcessor.forceFlush(); - } -} - -export class TaskContextLogProcessor implements LogRecordProcessor { - private _innerProcessor: LogRecordProcessor; - - constructor(innerProcessor: LogRecordProcessor) { - this._innerProcessor = innerProcessor; - } - forceFlush(): Promise { - return this._innerProcessor.forceFlush(); - } - onEmit(logRecord: LogRecord, context?: Context | undefined): void { - // Adds in the context attributes to the log record - if (taskContextManager.ctx) { - logRecord.setAttributes( - flattenAttributes( - { - [SemanticInternalAttributes.ATTEMPT_ID]: taskContextManager.ctx.attempt.id, - [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContextManager.ctx.attempt.number, - }, - SemanticInternalAttributes.METADATA - ) - ); - } - - this._innerProcessor.onEmit(logRecord, context); - } - shutdown(): Promise { - return this._innerProcessor.shutdown(); - } -} diff --git a/packages/core/src/v3/utils/globals.ts b/packages/core/src/v3/utils/globals.ts index 145392eba..3e9dba3e4 100644 --- a/packages/core/src/v3/utils/globals.ts +++ b/packages/core/src/v3/utils/globals.ts @@ -1,6 +1,7 @@ import { Clock } from "../clock/clock"; import type { RuntimeManager } from "../runtime/manager"; import { TaskCatalog } from "../task-catalog/catalog"; +import { TaskContext } from "../taskContext/types"; import { _globalThis } from "./platform"; const GLOBAL_TRIGGER_DOT_DEV_KEY = Symbol.for(`dev.trigger.ts.api`); @@ -48,4 +49,5 @@ type TriggerDotDevGlobalAPI = { logger?: any; clock?: Clock; ["task-catalog"]?: TaskCatalog; + ["task-context"]?: TaskContext; }; diff --git a/packages/core/src/v3/utils/structuredLogger.ts b/packages/core/src/v3/utils/structuredLogger.ts new file mode 100644 index 000000000..cc38cdb7e --- /dev/null +++ b/packages/core/src/v3/utils/structuredLogger.ts @@ -0,0 +1,80 @@ +type StructuredArgs = (Record | undefined)[]; + +export interface StructuredLogger { + log: (message: string, ...args: StructuredArgs) => any; + error: (message: string, ...args: StructuredArgs) => any; + warn: (message: string, ...args: StructuredArgs) => any; + info: (message: string, ...args: StructuredArgs) => any; + debug: (message: string, ...args: StructuredArgs) => any; + child: (fields: Record) => StructuredLogger; +} + +export enum LogLevel { + "log", + "error", + "warn", + "info", + "debug", +} + +export class SimpleStructuredLogger implements StructuredLogger { + constructor( + private name: string, + private level: LogLevel = ["1", "true"].includes(process.env.DEBUG ?? "") + ? LogLevel.debug + : LogLevel.info, + private fields?: Record + ) {} + + child(fields: Record, level?: LogLevel) { + return new SimpleStructuredLogger(this.name, level, { ...this.fields, ...fields }); + } + + log(message: string, ...args: StructuredArgs) { + if (this.level < LogLevel.log) return; + + this.#structuredLog(console.log, message, "log", ...args); + } + + error(message: string, ...args: StructuredArgs) { + if (this.level < LogLevel.error) return; + + this.#structuredLog(console.error, message, "error", ...args); + } + + warn(message: string, ...args: StructuredArgs) { + if (this.level < LogLevel.warn) return; + + this.#structuredLog(console.warn, message, "warn", ...args); + } + + info(message: string, ...args: StructuredArgs) { + if (this.level < LogLevel.info) return; + + this.#structuredLog(console.info, message, "info", ...args); + } + + debug(message: string, ...args: StructuredArgs) { + if (this.level < LogLevel.debug) return; + + this.#structuredLog(console.debug, message, "debug", ...args); + } + + #structuredLog( + loggerFunction: (message: string, ...args: any[]) => void, + message: string, + level: string, + ...args: StructuredArgs + ) { + const structuredLog = { + ...(args.length === 1 ? args[0] : args), + ...this.fields, + timestamp: new Date(), + name: this.name, + message, + level, + }; + + loggerFunction(JSON.stringify(structuredLog)); + } +} diff --git a/packages/core/src/v3/workers/index.ts b/packages/core/src/v3/workers/index.ts new file mode 100644 index 000000000..056a155a7 --- /dev/null +++ b/packages/core/src/v3/workers/index.ts @@ -0,0 +1,9 @@ +export { TaskExecutor, type TaskExecutorOptions } from "./taskExecutor"; +export type { RuntimeManager } from "../runtime/manager"; +export { PreciseWallClock as DurableClock } from "../clock/preciseWallClock"; +export { getEnvVar } from "../utils/getEnv"; +export { OtelTaskLogger, logLevels } from "../logger/taskLogger"; +export { ConsoleInterceptor } from "../consoleInterceptor"; +export { TracingSDK, type TracingDiagnosticLogLevel, recordSpanException } from "../otel"; +export { StandardTaskCatalog } from "../task-catalog/standardTaskCatalog"; +export { TaskContextSpanProcessor, TaskContextLogProcessor } from "../taskContext/otelProcessors"; diff --git a/packages/core/src/v3/workers/taskExecutor.ts b/packages/core/src/v3/workers/taskExecutor.ts index 8b1341bf6..48fd1abd1 100644 --- a/packages/core/src/v3/workers/taskExecutor.ts +++ b/packages/core/src/v3/workers/taskExecutor.ts @@ -12,7 +12,7 @@ import { TaskRunExecutionRetry, } from "../schemas"; import { SemanticInternalAttributes } from "../semanticInternalAttributes"; -import { taskContextManager } from "../tasks/taskContextManager"; +import { taskContext } from "../task-context-api"; import { TriggerTracer } from "../tracer"; import { HandleErrorFunction, ProjectConfig, TaskMetadataWithFunctions } from "../types"; import { @@ -67,141 +67,137 @@ export class TaskExecutor { dataType: execution.run.payloadType, }; - const result = await taskContextManager.runWith( - { - ctx, - worker, - }, - async () => { - this._tracingSDK.asyncResourceDetector.resolveWithAttributes({ - ...taskContextManager.attributes, - [SemanticInternalAttributes.SDK_VERSION]: this.task.packageVersion, - [SemanticInternalAttributes.SDK_LANGUAGE]: "typescript", - }); + taskContext.setGlobalTaskContext({ + ctx, + worker, + }); - return await this._tracer.startActiveSpan( - attemptMessage, - async (span) => { - return await this._consoleInterceptor.intercept(console, async () => { - let parsedPayload: any; - let initOutput: any; + this._tracingSDK.asyncResourceDetector.resolveWithAttributes({ + ...taskContext.attributes, + [SemanticInternalAttributes.SDK_VERSION]: this.task.packageVersion, + [SemanticInternalAttributes.SDK_LANGUAGE]: "typescript", + }); - try { - const payloadPacket = await conditionallyImportPacket(originalPacket, this._tracer); + const result = await this._tracer.startActiveSpan( + attemptMessage, + async (span) => { + return await this._consoleInterceptor.intercept(console, async () => { + let parsedPayload: any; + let initOutput: any; - parsedPayload = await parsePacket(payloadPacket); + try { + const payloadPacket = await conditionallyImportPacket(originalPacket, this._tracer); - initOutput = await this.#callTaskInit(parsedPayload, ctx); + parsedPayload = await parsePacket(payloadPacket); - const output = await this.#callRun(parsedPayload, ctx, initOutput); + initOutput = await this.#callTaskInit(parsedPayload, ctx); - try { - const stringifiedOutput = await stringifyIO(output); + const output = await this.#callRun(parsedPayload, ctx, initOutput); - const finalOutput = await conditionallyExportPacket( - stringifiedOutput, - `${execution.attempt.id}/output`, - this._tracer - ); + try { + const stringifiedOutput = await stringifyIO(output); - const attributes = await createPacketAttributes( - finalOutput, - SemanticInternalAttributes.OUTPUT, - SemanticInternalAttributes.OUTPUT_TYPE - ); + const finalOutput = await conditionallyExportPacket( + stringifiedOutput, + `${execution.attempt.id}/output`, + this._tracer + ); - if (attributes) { - span.setAttributes(attributes); - } + const attributes = await createPacketAttributes( + finalOutput, + SemanticInternalAttributes.OUTPUT, + SemanticInternalAttributes.OUTPUT_TYPE + ); - return { - ok: true, - id: execution.run.id, - output: finalOutput.data, - outputType: finalOutput.dataType, - } satisfies TaskRunExecutionResult; - } catch (stringifyError) { - recordSpanException(span, stringifyError); - - return { - ok: false, - id: execution.run.id, - error: { - type: "INTERNAL_ERROR", - code: TaskRunErrorCodes.TASK_OUTPUT_ERROR, - message: - stringifyError instanceof Error - ? stringifyError.message - : typeof stringifyError === "string" - ? stringifyError - : undefined, - }, - } satisfies TaskRunExecutionResult; - } - } catch (runError) { - try { - const handleErrorResult = await this.#handleError( - execution, - runError, - parsedPayload, - ctx - ); - - recordSpanException(span, handleErrorResult.error ?? runError); - - return { - id: execution.run.id, - ok: false, - error: handleErrorResult.error - ? parseError(handleErrorResult.error) - : parseError(runError), - retry: - handleErrorResult.status === "retry" ? handleErrorResult.retry : undefined, - skippedRetrying: handleErrorResult.status === "skipped", - } satisfies TaskRunExecutionResult; - } catch (handleErrorError) { - recordSpanException(span, handleErrorError); - - return { - ok: false, - id: execution.run.id, - error: { - type: "INTERNAL_ERROR", - code: TaskRunErrorCodes.HANDLE_ERROR_ERROR, - message: - handleErrorError instanceof Error - ? handleErrorError.message - : typeof handleErrorError === "string" - ? handleErrorError - : undefined, - }, - } satisfies TaskRunExecutionResult; - } - } finally { - await this.#callTaskCleanup(parsedPayload, ctx, initOutput); + if (attributes) { + span.setAttributes(attributes); } - }); - }, - { - kind: SpanKind.CONSUMER, - attributes: { - [SemanticInternalAttributes.STYLE_ICON]: "attempt", - ...accessoryAttributes({ - items: [ - { - text: ctx.task.filePath, - }, - { - text: `${ctx.task.exportName}.run()`, - }, - ], - style: "codepath", - }), - }, - }, - this._tracer.extractContext(traceContext) - ); - } + + return { + ok: true, + id: execution.run.id, + output: finalOutput.data, + outputType: finalOutput.dataType, + } satisfies TaskRunExecutionResult; + } catch (stringifyError) { + recordSpanException(span, stringifyError); + + return { + ok: false, + id: execution.run.id, + error: { + type: "INTERNAL_ERROR", + code: TaskRunErrorCodes.TASK_OUTPUT_ERROR, + message: + stringifyError instanceof Error + ? stringifyError.message + : typeof stringifyError === "string" + ? stringifyError + : undefined, + }, + } satisfies TaskRunExecutionResult; + } + } catch (runError) { + try { + const handleErrorResult = await this.#handleError( + execution, + runError, + parsedPayload, + ctx + ); + + recordSpanException(span, handleErrorResult.error ?? runError); + + return { + id: execution.run.id, + ok: false, + error: handleErrorResult.error + ? parseError(handleErrorResult.error) + : parseError(runError), + retry: handleErrorResult.status === "retry" ? handleErrorResult.retry : undefined, + skippedRetrying: handleErrorResult.status === "skipped", + } satisfies TaskRunExecutionResult; + } catch (handleErrorError) { + recordSpanException(span, handleErrorError); + + return { + ok: false, + id: execution.run.id, + error: { + type: "INTERNAL_ERROR", + code: TaskRunErrorCodes.HANDLE_ERROR_ERROR, + message: + handleErrorError instanceof Error + ? handleErrorError.message + : typeof handleErrorError === "string" + ? handleErrorError + : undefined, + }, + } satisfies TaskRunExecutionResult; + } + } finally { + await this.#callTaskCleanup(parsedPayload, ctx, initOutput); + } + }); + }, + { + kind: SpanKind.CONSUMER, + attributes: { + [SemanticInternalAttributes.STYLE_ICON]: "attempt", + ...accessoryAttributes({ + items: [ + { + text: ctx.task.filePath, + }, + { + text: `${ctx.task.exportName}.run()`, + }, + ], + style: "codepath", + }), + }, + }, + this._tracer.extractContext(traceContext) ); return result; diff --git a/packages/core/src/v3/zodMessageHandler.ts b/packages/core/src/v3/zodMessageHandler.ts index 7e78b520b..d4573caac 100644 --- a/packages/core/src/v3/zodMessageHandler.ts +++ b/packages/core/src/v3/zodMessageHandler.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { StructuredLogger } from "./zodNamespace"; +import { StructuredLogger } from "./utils/structuredLogger"; export class ZodSchemaParsedError extends Error { constructor( diff --git a/packages/core/src/v3/zodNamespace.ts b/packages/core/src/v3/zodNamespace.ts index fac0a109f..fafb39ed0 100644 --- a/packages/core/src/v3/zodNamespace.ts +++ b/packages/core/src/v3/zodNamespace.ts @@ -1,4 +1,4 @@ -import { DisconnectReason, Namespace, Server, Socket } from "socket.io"; +import type { DisconnectReason, Namespace, Server, Socket } from "socket.io"; import { ZodMessageSender } from "./zodMessageHandler"; import { ZodMessageCatalogToSocketIoEvents, @@ -6,8 +6,9 @@ import { ZodSocketMessageHandler, ZodSocketMessageHandlers, } from "./zodSocket"; -import { DefaultEventsMap, EventsMap } from "socket.io/dist/typed-events"; +import type { DefaultEventsMap, EventsMap } from "socket.io/dist/typed-events"; import { z } from "zod"; +import { SimpleStructuredLogger, StructuredLogger } from "./utils/structuredLogger"; interface ExtendedError extends Error { data?: any; @@ -25,87 +26,6 @@ export type ZodNamespaceSocket< z.infer >; -type StructuredArgs = (Record | undefined)[]; - -export interface StructuredLogger { - log: (message: string, ...args: StructuredArgs) => any; - error: (message: string, ...args: StructuredArgs) => any; - warn: (message: string, ...args: StructuredArgs) => any; - info: (message: string, ...args: StructuredArgs) => any; - debug: (message: string, ...args: StructuredArgs) => any; - child: (fields: Record) => StructuredLogger; -} - -export enum LogLevel { - "log", - "error", - "warn", - "info", - "debug", -} - -export class SimpleStructuredLogger implements StructuredLogger { - constructor( - private name: string, - private level: LogLevel = ["1", "true"].includes(process.env.DEBUG ?? "") - ? LogLevel.debug - : LogLevel.info, - private fields?: Record - ) {} - - child(fields: Record, level?: LogLevel) { - return new SimpleStructuredLogger(this.name, level, { ...this.fields, ...fields }); - } - - log(message: string, ...args: StructuredArgs) { - if (this.level < LogLevel.log) return; - - this.#structuredLog(console.log, message, "log", ...args); - } - - error(message: string, ...args: StructuredArgs) { - if (this.level < LogLevel.error) return; - - this.#structuredLog(console.error, message, "error", ...args); - } - - warn(message: string, ...args: StructuredArgs) { - if (this.level < LogLevel.warn) return; - - this.#structuredLog(console.warn, message, "warn", ...args); - } - - info(message: string, ...args: StructuredArgs) { - if (this.level < LogLevel.info) return; - - this.#structuredLog(console.info, message, "info", ...args); - } - - debug(message: string, ...args: StructuredArgs) { - if (this.level < LogLevel.debug) return; - - this.#structuredLog(console.debug, message, "debug", ...args); - } - - #structuredLog( - loggerFunction: (message: string, ...args: any[]) => void, - message: string, - level: string, - ...args: StructuredArgs - ) { - const structuredLog = { - ...(args.length === 1 ? args[0] : args), - ...this.fields, - timestamp: new Date(), - name: this.name, - message, - level, - }; - - loggerFunction(JSON.stringify(structuredLog)); - } -} - interface ZodNamespaceOptions< TClientMessages extends ZodSocketMessageCatalogSchema, TServerMessages extends ZodSocketMessageCatalogSchema, diff --git a/packages/core/src/v3/zodSocket.ts b/packages/core/src/v3/zodSocket.ts index 0898ce210..1e2ae1e9e 100644 --- a/packages/core/src/v3/zodSocket.ts +++ b/packages/core/src/v3/zodSocket.ts @@ -1,7 +1,8 @@ -import { io, Socket } from "socket.io-client"; +import type { Socket } from "socket.io-client"; +import { io } from "socket.io-client"; import { z } from "zod"; import { EventEmitterLike, ZodMessageValueSchema } from "./zodMessageHandler"; -import { LogLevel, SimpleStructuredLogger, StructuredLogger } from "./zodNamespace"; +import { LogLevel, SimpleStructuredLogger, StructuredLogger } from "./utils/structuredLogger"; export interface ZodSocketMessageCatalogSchema { [key: string]: diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json index f444efc19..7aacde3a4 100644 --- a/packages/core/tsconfig.build.json +++ b/packages/core/tsconfig.build.json @@ -5,7 +5,8 @@ "experimentalDecorators": true, "emitDecoratorMetadata": true, "declaration": false, - "declarationMap": false + "declarationMap": false, + "skipLibCheck": true }, "exclude": ["node_modules"] } diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts index 794b1e585..edb33fc2d 100644 --- a/packages/core/tsup.config.ts +++ b/packages/core/tsup.config.ts @@ -3,5 +3,17 @@ import { packageOptions, defineConfig } from "@trigger.dev/tsup"; export default defineConfig({ ...packageOptions, config: "tsconfig.build.json", - entry: ["./src/index.ts", "./src/v3/index.ts", "./src/v3/otel/index.ts"], + entry: [ + "./src/index.ts", + "./src/v3/index.ts", + "./src/v3/otel/index.ts", + "./src/v3/zodMessageHandler.ts", + "./src/v3/zodNamespace.ts", + "./src/v3/zodSocket.ts", + "./src/v3/zodIpc.ts", + "./src/v3/utils/structuredLogger.ts", + "./src/v3/dev/index.ts", + "./src/v3/prod/index.ts", + "./src/v3/workers/index.ts", + ], }); diff --git a/packages/remix/package.json b/packages/remix/package.json index c94e11b97..e0dcf6f5a 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -49,4 +49,4 @@ "node": ">=18.0.0" }, "module": "./dist/index.mjs" -} +} \ No newline at end of file diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 98df8dde7..90790553b 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -62,7 +62,8 @@ "ulid": "^2.3.0", "uuid": "^9.0.0", "ws": "^8.11.0", - "zod": "3.22.3" + "zod": "3.22.3", + "msw": "^2.2.1" }, "devDependencies": { "@trigger.dev/tsconfig": "workspace:*", @@ -79,15 +80,7 @@ "typed-emitter": "^2.1.0", "typescript": "^5.3.0" }, - "peerDependencies": { - "msw": "^2.2.1" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - } - }, "engines": { "node": ">=18.0.0" } -} +} \ No newline at end of file diff --git a/packages/trigger-sdk/src/v3/shared.ts b/packages/trigger-sdk/src/v3/shared.ts index 3bd369b81..aa950897a 100644 --- a/packages/trigger-sdk/src/v3/shared.ts +++ b/packages/trigger-sdk/src/v3/shared.ts @@ -30,7 +30,7 @@ import { runtime, stringifyIO, taskCatalog, - taskContextManager, + taskContext, } from "@trigger.dev/core/v3"; import * as packageJson from "../../package.json"; import { tracer } from "./tracer"; @@ -293,7 +293,7 @@ export function createTask { - const ctx = taskContextManager.ctx; + const ctx = taskContext.ctx; if (!ctx) { throw new Error("triggerAndWait can only be used from inside a task.run()"); @@ -419,10 +419,10 @@ export function createTask { - const ctx = taskContextManager.ctx; + const ctx = taskContext.ctx; if (!ctx) { throw new Error("batchTriggerAndWait can only be used from inside a task.run()"); @@ -503,10 +503,10 @@ export function createTask { return createTask(options); } + +export type { TaskOptions, Task }; diff --git a/patches/engine.io-parser@5.2.2.patch b/patches/engine.io-parser@5.2.2.patch new file mode 100644 index 000000000..3a39b451d --- /dev/null +++ b/patches/engine.io-parser@5.2.2.patch @@ -0,0 +1,12 @@ +diff --git a/build/esm/index.d.ts b/build/esm/index.d.ts +index f126d758bb0d2216fc2a3759c538fa15a741217b..54d6893aac1285fb1d78d854c1ab400496327570 100644 +--- a/build/esm/index.d.ts ++++ b/build/esm/index.d.ts +@@ -2,7 +2,6 @@ + import { encodePacket } from "./encodePacket.js"; + import { decodePacket } from "./decodePacket.js"; + import { Packet, PacketType, RawData, BinaryType } from "./commons.js"; +-import type { TransformStream } from "node:stream/web"; + declare const encodePayload: (packets: Packet[], callback: (encodedPayload: string) => void) => void; + declare const decodePayload: (encodedPayload: string, binaryType?: BinaryType) => Packet[]; + export declare function createPacketEncoderStream(): TransformStream; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62c43d20f..fd7473909 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ patchedDependencies: '@changesets/assemble-release-plan@5.2.4': hash: 3wuhjtl4hjck4itk3w32z4cd5u path: patches/@changesets__assemble-release-plan@5.2.4.patch + engine.io-parser@5.2.2: + hash: e6nctogrhpxoivwiwy37ersfu4 + path: patches/engine.io-parser@5.2.2.patch tsup@8.0.1: hash: a5ztaafw5l4qfghy2hjjuynb34 path: patches/tsup@8.0.1.patch @@ -84,10 +87,10 @@ importers: specifier: ^15.1.0 version: 15.1.0 socket.io: - specifier: ^4.7.4 + specifier: 4.7.4 version: 4.7.4 socket.io-client: - specifier: ^4.7.4 + specifier: 4.7.4 version: 4.7.4 devDependencies: '@types/node': @@ -565,7 +568,7 @@ importers: specifier: ^6.0.0 version: 6.1.0 socket.io: - specifier: ^4.7.4 + specifier: 4.7.4 version: 4.7.4 socket.io-adapter: specifier: ^2.5.4 @@ -1721,11 +1724,8 @@ importers: humanize-duration: specifier: ^3.27.3 version: 3.27.3 - socket.io: - specifier: ^4.7.4 - version: 4.7.4 socket.io-client: - specifier: ^4.7.4 + specifier: 4.7.4 version: 4.7.4 superjson: specifier: ^2.2.1 @@ -1756,14 +1756,17 @@ importers: specifier: ^29.5.3 version: 29.5.3 '@types/node': - specifier: ^18 - version: 18.17.1 + specifier: 20.12.7 + version: 20.12.7 jest: specifier: ^29.6.2 - version: 29.6.2(@types/node@18.17.1) + version: 29.6.2(@types/node@20.12.7) rimraf: specifier: ^3.0.2 version: 3.0.2 + socket.io: + specifier: 4.7.4 + version: 4.7.4 ts-jest: specifier: ^29.1.1 version: 29.1.1(@babel/core@7.22.17)(esbuild@0.19.11)(jest@29.6.2)(typescript@5.3.2) @@ -1785,6 +1788,9 @@ importers: '@types/node': specifier: '18' version: 18.17.1 + socket.io-client: + specifier: ^4.7.4 + version: 4.7.4 typescript: specifier: ^5.3.0 version: 5.3.3 @@ -2332,6 +2338,9 @@ importers: git-repo-info: specifier: ^2.1.1 version: 2.1.1 + msw: + specifier: ^2.2.1 + version: 2.2.1(typescript@5.3.2) slug: specifier: ^6.0.0 version: 6.1.0 @@ -2375,9 +2384,6 @@ importers: encoding: specifier: ^0.1.13 version: 0.1.13 - msw: - specifier: ^2.2.1 - version: 2.2.1(typescript@5.3.2) rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -5236,11 +5242,13 @@ packages: resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} dependencies: cookie: 0.5.0 + dev: false /@bundled-es-modules/statuses@1.0.1: resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} dependencies: statuses: 2.0.1 + dev: false /@changesets/apply-release-plan@6.1.4: resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} @@ -7683,6 +7691,7 @@ packages: dependencies: '@inquirer/core': 7.0.0 '@inquirer/type': 1.2.0 + dev: false /@inquirer/core@7.0.0: resolution: {integrity: sha512-g13W5yEt9r1sEVVriffJqQ8GWy94OnfxLCreNSOTw0HPVcszmc/If1KIf7YBmlwtX4klmvwpZHnQpl3N7VX2xA==} @@ -7690,7 +7699,7 @@ packages: dependencies: '@inquirer/type': 1.2.0 '@types/mute-stream': 0.0.4 - '@types/node': 20.11.22 + '@types/node': 20.12.7 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -7702,10 +7711,12 @@ packages: signal-exit: 4.1.0 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + dev: false /@inquirer/type@1.2.0: resolution: {integrity: sha512-/vvkUkYhrjbm+RolU7V1aUFDydZVKNKqKHR5TsE+j5DXgXFwrsOPcoGUJ02K0O7q7O53CU2DOTMYCHeGZ25WHA==} engines: {node: '>=18'} + dev: false /@internationalized/date@3.5.1: resolution: {integrity: sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ==} @@ -7789,14 +7800,14 @@ packages: '@jest/test-result': 29.6.2 '@jest/transform': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.11.22 + '@types/node': 18.19.20 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.5.0 - jest-config: 29.6.2(@types/node@20.11.22) + jest-config: 29.6.2(@types/node@18.19.20) jest-haste-map: 29.6.2 jest-message-util: 29.6.2 jest-regex-util: 29.4.3 @@ -7978,7 +7989,7 @@ packages: '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.11.22 + '@types/node': 18.19.20 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -8029,7 +8040,7 @@ packages: resolution: {integrity: sha512-xxlv5GLX4FVR/dDKEsmi4SPeuB49aRc35stndyxcC73XnUEEwF39vXbROpHOirmDse8WE9vxOjABnSVS+jb7EA==} dependencies: '@types/js-yaml': 4.0.9 - '@types/node': 20.6.0 + '@types/node': 20.11.22 '@types/request': 2.48.12 '@types/ws': 8.5.10 byline: 5.0.0 @@ -8187,6 +8198,7 @@ packages: /@mswjs/cookies@1.1.0: resolution: {integrity: sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw==} engines: {node: '>=18'} + dev: false /@mswjs/interceptors@0.17.6: resolution: {integrity: sha512-201pBIWehTURb6q8Gheu4Zhvd3Ox1U4BJq5KiOQsYzkWyfiOG4pwcz5hPZIEryztgrf8/sdwABpvY757xMmfrQ==} @@ -8214,6 +8226,7 @@ packages: is-node-process: 1.2.0 outvariant: 1.4.2 strict-event-emitter: 0.5.1 + dev: false /@nestjs/cli@10.1.18: resolution: {integrity: sha512-jQtG47keLsACt7b4YwJbTBYRm90n82gJpMaiR1HGAyQ9pccbctjSYu592eT4bxqkUWxPgBE3mpNynXj7dWAfrw==} @@ -9013,12 +9026,14 @@ packages: /@open-draft/deferred-promise@2.2.0: resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: false /@open-draft/logger@0.3.0: resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} dependencies: is-node-process: 1.2.0 outvariant: 1.4.2 + dev: false /@open-draft/until@1.0.3: resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} @@ -9026,6 +9041,7 @@ packages: /@open-draft/until@2.1.0: resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + dev: false /@opentelemetry/api-logs@0.48.0: resolution: {integrity: sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==} @@ -9448,7 +9464,7 @@ packages: engines: {node: '>=16'} hasBin: true dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 playwright-core: 1.37.0 optionalDependencies: fsevents: 2.3.2 @@ -12707,7 +12723,7 @@ packages: resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 dev: false /@slack/types@2.8.0: @@ -12722,7 +12738,7 @@ packages: '@slack/logger': 3.0.0 '@slack/types': 2.8.0 '@types/is-stream': 1.1.0 - '@types/node': 20.6.0 + '@types/node': 18.19.20 axios: 0.27.2 eventemitter3: 3.1.2 form-data: 2.5.1 @@ -13099,7 +13115,6 @@ packages: /@socket.io/component-emitter@3.1.0: resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: false /@socket.io/redis-adapter@8.3.0(socket.io-adapter@2.5.4): resolution: {integrity: sha512-ly0cra+48hDmChxmIpnESKrc94LjRL80TEmZVscuQ/WWkRP81nNj8W8cCGMqbI4L6NCuAaPRSzZF1a9GlAxxnA==} @@ -13671,7 +13686,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.11.22 + '@types/node': 18.19.20 dev: true /@types/btoa-lite@1.0.0: @@ -13711,7 +13726,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 dev: true /@types/cookie@0.4.1: @@ -13723,6 +13738,7 @@ packages: /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + dev: false /@types/cookiejar@2.1.2: resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} @@ -13731,7 +13747,7 @@ packages: /@types/cors@2.8.17: resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 /@types/d3-array@3.0.8: resolution: {integrity: sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ==} @@ -13824,7 +13840,7 @@ packages: /@types/express-serve-static-core@4.17.32: resolution: {integrity: sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -13832,7 +13848,7 @@ packages: /@types/express-serve-static-core@4.17.37: resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.2 @@ -13902,7 +13918,7 @@ packages: /@types/is-stream@1.1.0: resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 dev: false /@types/istanbul-lib-coverage@2.0.4: @@ -14018,13 +14034,13 @@ packages: /@types/mock-fs@4.13.1: resolution: {integrity: sha512-m6nFAJ3lBSnqbvDZioawRvpLXSaPyn52Srf7OfzjubYbYX8MTUdIgDxQl0wEapm4m/pNYSd9TXocpQ0TvZFlYA==} dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 dev: true /@types/morgan@1.9.4: resolution: {integrity: sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 dev: true /@types/ms@0.7.31: @@ -14034,6 +14050,7 @@ packages: resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} dependencies: '@types/node': 18.19.20 + dev: false /@types/nlcst@1.0.1: resolution: {integrity: sha512-aVIyXt6pZiiMOtVByE4Y0gf+BLm1Cxc4ZLSK8VRHn1CgkO+kXbQwN/EBhQmhPdBMjFJCMBKtmNW2zWQuFywz8Q==} @@ -14043,7 +14060,7 @@ packages: /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 form-data: 3.0.1 dev: true @@ -14093,6 +14110,12 @@ packages: resolution: {integrity: sha512-/G+IxWxma6V3E+pqK1tSl2Fo1kl41pK1yeCyDsgkF9WlVAme4j5ISYM2zR11bgLFJGLN5sVK40T4RJNuiZbEjA==} dependencies: undici-types: 5.26.5 + dev: false + + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + dependencies: + undici-types: 5.26.5 /@types/node@20.4.2: resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} @@ -14107,6 +14130,7 @@ packages: /@types/node@20.6.0: resolution: {integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==} + dev: true /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -14125,7 +14149,7 @@ packages: /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: false @@ -14189,7 +14213,7 @@ packages: resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} dependencies: '@types/caseless': 0.12.5 - '@types/node': 20.6.0 + '@types/node': 18.19.20 '@types/tough-cookie': 4.0.5 form-data: 2.5.1 dev: false @@ -14238,7 +14262,7 @@ packages: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.11.22 + '@types/node': 18.19.20 dev: true /@types/set-cookie-parser@2.4.2: @@ -14265,12 +14289,13 @@ packages: /@types/statuses@2.0.4: resolution: {integrity: sha512-eqNDvZsCNY49OAXB0Firg/Sc2BgoWsntsLUdybGFOhAfCD6QJ2n9HXUIHGqt5qjrxmMv4wS8WLAw43ZkKcJ8Pw==} + dev: false /@types/superagent@4.1.19: resolution: {integrity: sha512-McM1mlc7PBZpCaw0fw/36uFqo0YeA6m8JqoyE4OfqXsZCIg0hPP2xdE6FM7r6fdprDZHlJwDpydUj1R++93hCA==} dependencies: '@types/cookiejar': 2.1.2 - '@types/node': 20.11.22 + '@types/node': 18.19.20 dev: true /@types/supertest@2.0.14: @@ -14282,14 +14307,14 @@ packages: /@types/tar@6.1.4: resolution: {integrity: sha512-Cp4oxpfIzWt7mr2pbhHT2OTXGMAL0szYCzuf8lRWyIMCgsx6/Hfc3ubztuhvzXHXgraTQxyOCmmg7TDGIMIJJQ==} dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 minipass: 4.0.0 dev: true /@types/through@0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 20.11.22 + '@types/node': 18.19.20 dev: true /@types/tinycolor2@1.4.3: @@ -14314,17 +14339,18 @@ packages: /@types/wrap-ansi@3.0.0: resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + dev: false /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 dev: false /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 dev: true /@types/yargs-parser@21.0.0: @@ -17054,6 +17080,7 @@ packages: /cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + dev: false /cli-table3@0.6.3: resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} @@ -17083,6 +17110,7 @@ packages: /cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + dev: false /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -18427,18 +18455,18 @@ packages: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4(supports-color@8.1.1) - engine.io-parser: 5.2.2 + engine.io-parser: 5.2.2(patch_hash=e6nctogrhpxoivwiwy37ersfu4) ws: 8.11.0 xmlhttprequest-ssl: 2.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - dev: false - /engine.io-parser@5.2.2: + /engine.io-parser@5.2.2(patch_hash=e6nctogrhpxoivwiwy37ersfu4): resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} engines: {node: '>=10.0.0'} + patched: true /engine.io@6.5.4: resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} @@ -18446,13 +18474,13 @@ packages: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.6.0 + '@types/node': 18.19.20 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 debug: 4.3.4(supports-color@8.1.1) - engine.io-parser: 5.2.2 + engine.io-parser: 5.2.2(patch_hash=e6nctogrhpxoivwiwy37ersfu4) ws: 8.11.0 transitivePeerDependencies: - bufferutil @@ -20445,7 +20473,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.6.2 - '@types/node': 20.11.22 + '@types/node': 18.19.20 jest-get-type: 29.4.3 jest-matcher-utils: 29.6.2 jest-message-util: 29.6.2 @@ -21615,6 +21643,7 @@ packages: /graphql@16.8.1: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dev: false /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -21845,6 +21874,7 @@ packages: /headers-polyfill@4.0.2: resolution: {integrity: sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw==} + dev: false /hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} @@ -22631,6 +22661,7 @@ packages: /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + dev: false /is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} @@ -23056,6 +23087,35 @@ packages: - ts-node dev: true + /jest-cli@29.6.2(@types/node@20.12.7): + resolution: {integrity: sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.2 + '@jest/test-result': 29.6.2 + '@jest/types': 29.6.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 29.6.2(@types/node@20.12.7) + jest-util: 29.6.2 + jest-validate: 29.6.2 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jest-config@29.6.2(@types/node@18.15.13): resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -23136,7 +23196,7 @@ packages: - supports-color dev: true - /jest-config@29.6.2(@types/node@20.11.22): + /jest-config@29.6.2(@types/node@18.19.20): resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -23151,7 +23211,47 @@ packages: '@babel/core': 7.22.17 '@jest/test-sequencer': 29.6.2 '@jest/types': 29.6.1 - '@types/node': 20.11.22 + '@types/node': 18.19.20 + babel-jest: 29.6.2(@babel/core@7.22.17) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.6.2 + jest-environment-node: 29.6.2 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.6.2 + jest-runner: 29.6.2 + jest-util: 29.6.2 + jest-validate: 29.6.2 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.2 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-config@29.6.2(@types/node@20.12.7): + resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.17 + '@jest/test-sequencer': 29.6.2 + '@jest/types': 29.6.1 + '@types/node': 20.12.7 babel-jest: 29.6.2(@babel/core@7.22.17) chalk: 4.1.2 ci-info: 3.8.0 @@ -23416,7 +23516,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.11.22 + '@types/node': 18.19.20 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.10 @@ -23510,6 +23610,27 @@ packages: - ts-node dev: true + /jest@29.6.2(@types/node@20.12.7): + resolution: {integrity: sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.6.2 + '@jest/types': 29.6.1 + import-local: 3.1.0 + jest-cli: 29.6.2(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jiti@1.18.2: resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} hasBin: true @@ -25359,7 +25480,7 @@ packages: type-fest: 4.10.3 typescript: 5.3.2 yargs: 17.7.2 - dev: true + dev: false /msw@2.2.1(typescript@5.3.3): resolution: {integrity: sha512-DCsZAQwan+2onEcpD86fiEnCKW4IvYzqcwDq/2TIoeNrmBqNp/mJW4wHQyxcoYrRPwgujin7wDFflqiSO1iT/w==} @@ -25415,6 +25536,7 @@ packages: /mute-stream@1.0.0: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -26440,6 +26562,7 @@ packages: /outvariant@1.4.2: resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + dev: false /p-all@2.1.0: resolution: {integrity: sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==} @@ -27826,7 +27949,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.11.22 + '@types/node': 18.19.20 long: 5.2.3 /proxy-addr@2.0.7: @@ -29262,6 +29385,7 @@ packages: /run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} + dev: false /run-exclusive@2.2.18: resolution: {integrity: sha512-TXr1Gkl1iEAOCCpBTRm/2m0+1KGjORcWpZZ+VGGTe7dYX8E4y8/fMvrHk0zf+kclec2R//tpvdBxgG0bDgaJfw==} @@ -29799,7 +29923,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false /socket.io-client@4.7.4: resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} @@ -29813,7 +29936,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false /socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} @@ -29823,7 +29945,6 @@ packages: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: false /socket.io@4.7.4: resolution: {integrity: sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==} @@ -29840,7 +29961,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false /socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} @@ -30188,6 +30308,7 @@ packages: /strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + dev: false /string-hash@1.1.3: resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} @@ -30357,7 +30478,7 @@ packages: resolution: {integrity: sha512-WrDlYH1p5jliY7uzSU5nLDY7OCIeRe6FkC0hhScpTGwMthP/Muk38WXGeggjDHKeXAGCs43jUheZ7Ud/NEAJdg==} engines: {node: '>=12.*'} dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 qs: 6.11.0 /striptags@2.2.1: @@ -31891,6 +32012,7 @@ packages: /type-fest@4.10.3: resolution: {integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==} engines: {node: '>=16'} + dev: false /type-fest@4.3.1: resolution: {integrity: sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw==} @@ -32580,7 +32702,7 @@ packages: - terser dev: true - /vite-node@0.28.5(@types/node@20.6.0): + /vite-node@0.28.5(@types/node@18.19.20): resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} hasBin: true @@ -32592,7 +32714,7 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.4.9(@types/node@20.6.0) + vite: 4.4.9(@types/node@18.19.20) transitivePeerDependencies: - '@types/node' - less @@ -32604,7 +32726,7 @@ packages: - terser dev: true - /vite-node@0.34.4(@types/node@20.6.0): + /vite-node@0.34.4(@types/node@18.19.20): resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -32614,7 +32736,7 @@ packages: mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.6.0) + vite: 4.4.9(@types/node@18.19.20) transitivePeerDependencies: - '@types/node' - less @@ -32691,7 +32813,7 @@ packages: fsevents: 2.3.3 dev: true - /vite@4.1.4(@types/node@20.6.0): + /vite@4.1.4(@types/node@18.19.20): resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -32716,7 +32838,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 esbuild: 0.16.17 postcss: 8.4.29 resolve: 1.22.1 @@ -32796,7 +32918,7 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vite@4.4.9(@types/node@20.6.0): + /vite@4.4.9(@types/node@18.19.20): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -32824,7 +32946,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.6.0 + '@types/node': 18.19.20 esbuild: 0.18.11 postcss: 8.4.29 rollup: 3.29.1 @@ -32901,7 +33023,7 @@ packages: dependencies: '@types/chai': 4.3.4 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.0 + '@types/node': 18.19.20 '@vitest/expect': 0.28.5 '@vitest/runner': 0.28.5 '@vitest/spy': 0.28.5 @@ -32920,8 +33042,8 @@ packages: tinybench: 2.3.1 tinypool: 0.3.1 tinyspy: 1.0.2 - vite: 4.1.4(@types/node@20.6.0) - vite-node: 0.28.5(@types/node@20.6.0) + vite: 4.1.4(@types/node@18.19.20) + vite-node: 0.28.5(@types/node@18.19.20) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -32966,7 +33088,7 @@ packages: dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 - '@types/node': 20.6.0 + '@types/node': 18.19.20 '@vitest/expect': 0.34.4 '@vitest/runner': 0.34.4 '@vitest/snapshot': 0.34.4 @@ -32985,8 +33107,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.6.0) - vite-node: 0.34.4(@types/node@20.6.0) + vite: 4.4.9(@types/node@18.19.20) + vite-node: 0.34.4(@types/node@18.19.20) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -33597,7 +33719,6 @@ packages: /xmlhttprequest-ssl@2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} - dev: false /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} diff --git a/references/v3-catalog/src/trigger/subdir/another/byeWorld.ts b/references/v3-catalog/src/trigger/subdir/another/byeWorld.ts new file mode 100644 index 000000000..cd3a7980a --- /dev/null +++ b/references/v3-catalog/src/trigger/subdir/another/byeWorld.ts @@ -0,0 +1,10 @@ +import { task } from "@trigger.dev/sdk/v3"; + +export const byeWorldSubdir = task({ + id: "bye-world-subdir-2", + run: async (payload: { message: string }) => { + return { + bye: "worlds", + }; + }, +}); diff --git a/references/v3-catalog/src/trigger/subdir/helloWorld.ts b/references/v3-catalog/src/trigger/subdir/helloWorld.ts new file mode 100644 index 000000000..d24b96851 --- /dev/null +++ b/references/v3-catalog/src/trigger/subdir/helloWorld.ts @@ -0,0 +1,10 @@ +import { task } from "@trigger.dev/sdk/v3"; + +export const helloWorldSubdir = task({ + id: "hello-world-subdir-2", + run: async (payload: { message: string }) => { + return { + hello: "worlds", + }; + }, +}); diff --git a/references/v3-catalog/src/trigger/subtasks.ts b/references/v3-catalog/src/trigger/subtasks.ts index 05b65dbc3..58f56a85c 100644 --- a/references/v3-catalog/src/trigger/subtasks.ts +++ b/references/v3-catalog/src/trigger/subtasks.ts @@ -4,7 +4,7 @@ import { taskWithRetries } from "./retries"; export const simpleParentTask = task({ id: "simple-parent-task", run: async (payload: { message: string }) => { - await simpleChildTask.trigger({ + const result = await simpleChildTask.trigger({ message: `${payload.message} - 2.a`, }); diff --git a/references/v3-catalog/src/trigger/utils/cache.ts b/references/v3-catalog/src/trigger/utils/cache.ts index 8cbba5d6c..11f727f73 100644 --- a/references/v3-catalog/src/trigger/utils/cache.ts +++ b/references/v3-catalog/src/trigger/utils/cache.ts @@ -1,3 +1,7 @@ import { InMemoryCache, createCache } from "@trigger.dev/sdk/v3"; export const cache = createCache(new InMemoryCache()); + +export const fakeTask = { + id: "this-task-doesnt-exist", +};