From 2c8db309ca85357e6053c0da946a5968bf9280d7 Mon Sep 17 00:00:00 2001 From: Karan Dhaodiyal <256503836+karandhaodiyal28-hash@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:57:49 +0530 Subject: [PATCH] fix(sdk): envvars.update() ReferenceError outside task context The non-task-context branch of envvars.update() assigned \ = name!, but update()'s implementation signature has no name parameter (it uses nameOrRequestOptions). Calling envvars.update() outside a task run therefore threw ReferenceError: name is not defined. Use nameOrRequestOptions with a type guard, matching the other envvars functions. Closes #4264 --- .changeset/fix-envvars-update-name.md | 5 ++ packages/trigger-sdk/src/v3/envvars.test.ts | 67 +++++++++++++++++++++ packages/trigger-sdk/src/v3/envvars.ts | 6 +- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 .changeset/fix-envvars-update-name.md create mode 100644 packages/trigger-sdk/src/v3/envvars.test.ts diff --git a/.changeset/fix-envvars-update-name.md b/.changeset/fix-envvars-update-name.md new file mode 100644 index 00000000000..806611dddf0 --- /dev/null +++ b/.changeset/fix-envvars-update-name.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": patch +--- + +Fix `envvars.update()` throwing `ReferenceError: name is not defined` when called outside a task context. The non-task branch referenced an out-of-scope `name` variable instead of the `nameOrRequestOptions` parameter (#4264). diff --git a/packages/trigger-sdk/src/v3/envvars.test.ts b/packages/trigger-sdk/src/v3/envvars.test.ts new file mode 100644 index 00000000000..b92d008bcbe --- /dev/null +++ b/packages/trigger-sdk/src/v3/envvars.test.ts @@ -0,0 +1,67 @@ +import { createServer, type Server, type ServerResponse } from "node:http"; +import type { AddressInfo } from "node:net"; +import { apiClientManager } from "@trigger.dev/core/v3"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import * as envvars from "./envvars.js"; + +type ReceivedRequest = { + method: string; + url: string; +}; + +describe("envvars.update outside a task context (GH #4264)", () => { + let server: Server; + let baseUrl: string; + let requests: ReceivedRequest[]; + + beforeEach(async () => { + requests = []; + server = createServer((request, response) => { + requests.push({ method: request.method ?? "", url: request.url ?? "" }); + response.writeHead(200, { "content-type": "application/json" }); + response.end(JSON.stringify({ success: true })); + }); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", () => { + baseUrl = `http://127.0.0.1:${(server.address() as AddressInfo).port}`; + resolve(); + }); + }); + }); + + afterEach(async () => { + await new Promise((resolve) => server.close(() => resolve())); + }); + + it("resolves the name argument instead of throwing ReferenceError", async () => { + const key = "tr_prod_0123456789abcdefghijklmn"; + + // Outside a task context, taskContext.ctx is undefined. Before the fix this + // path evaluated `$name = name!`, but the implementation signature has no + // `name` parameter, so it threw `ReferenceError: name is not defined`. + await apiClientManager.runWithConfig({ baseURL: baseUrl, accessToken: key }, async () => { + try { + await envvars.update("proj_ref", "prod", "MY_SECRET", { value: "abc" }); + } catch (err) { + // Response-shape concerns are irrelevant here; only assert the + // argument-resolution crash is gone. + expect((err as Error).message).not.toContain("name is not defined"); + } + }); + + const updateRequest = requests.find((request) => request.url.includes("MY_SECRET")); + expect(updateRequest).toBeDefined(); + expect(updateRequest!.url).toContain("/projects/proj_ref/envvars/prod/MY_SECRET"); + }); + + it("throws a clear error when the name is missing", async () => { + const key = "tr_prod_0123456789abcdefghijklmn"; + + await apiClientManager.runWithConfig({ baseURL: baseUrl, accessToken: key }, async () => { + await expect( + // @ts-expect-error deliberately omitting the name argument + envvars.update("proj_ref", "prod", { value: "abc" }) + ).rejects.toThrow("name is required"); + }); + }); +}); diff --git a/packages/trigger-sdk/src/v3/envvars.ts b/packages/trigger-sdk/src/v3/envvars.ts index 153be22a3d3..549540aa8d5 100644 --- a/packages/trigger-sdk/src/v3/envvars.ts +++ b/packages/trigger-sdk/src/v3/envvars.ts @@ -336,9 +336,13 @@ export function update( throw new Error("params is required"); } + if (typeof nameOrRequestOptions !== "string") { + throw new Error("name is required"); + } + $projectRef = projectRefOrName; $slug = slugOrParams; - $name = name!; + $name = nameOrRequestOptions; $params = params; }