Skip to content

Commit 2c8db30

Browse files
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
1 parent debfa2b commit 2c8db30

3 files changed

Lines changed: 77 additions & 1 deletion

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@trigger.dev/sdk": patch
3+
---
4+
5+
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).
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { createServer, type Server, type ServerResponse } from "node:http";
2+
import type { AddressInfo } from "node:net";
3+
import { apiClientManager } from "@trigger.dev/core/v3";
4+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
5+
import * as envvars from "./envvars.js";
6+
7+
type ReceivedRequest = {
8+
method: string;
9+
url: string;
10+
};
11+
12+
describe("envvars.update outside a task context (GH #4264)", () => {
13+
let server: Server;
14+
let baseUrl: string;
15+
let requests: ReceivedRequest[];
16+
17+
beforeEach(async () => {
18+
requests = [];
19+
server = createServer((request, response) => {
20+
requests.push({ method: request.method ?? "", url: request.url ?? "" });
21+
response.writeHead(200, { "content-type": "application/json" });
22+
response.end(JSON.stringify({ success: true }));
23+
});
24+
await new Promise<void>((resolve) => {
25+
server.listen(0, "127.0.0.1", () => {
26+
baseUrl = `http://127.0.0.1:${(server.address() as AddressInfo).port}`;
27+
resolve();
28+
});
29+
});
30+
});
31+
32+
afterEach(async () => {
33+
await new Promise<void>((resolve) => server.close(() => resolve()));
34+
});
35+
36+
it("resolves the name argument instead of throwing ReferenceError", async () => {
37+
const key = "tr_prod_0123456789abcdefghijklmn";
38+
39+
// Outside a task context, taskContext.ctx is undefined. Before the fix this
40+
// path evaluated `$name = name!`, but the implementation signature has no
41+
// `name` parameter, so it threw `ReferenceError: name is not defined`.
42+
await apiClientManager.runWithConfig({ baseURL: baseUrl, accessToken: key }, async () => {
43+
try {
44+
await envvars.update("proj_ref", "prod", "MY_SECRET", { value: "abc" });
45+
} catch (err) {
46+
// Response-shape concerns are irrelevant here; only assert the
47+
// argument-resolution crash is gone.
48+
expect((err as Error).message).not.toContain("name is not defined");
49+
}
50+
});
51+
52+
const updateRequest = requests.find((request) => request.url.includes("MY_SECRET"));
53+
expect(updateRequest).toBeDefined();
54+
expect(updateRequest!.url).toContain("/projects/proj_ref/envvars/prod/MY_SECRET");
55+
});
56+
57+
it("throws a clear error when the name is missing", async () => {
58+
const key = "tr_prod_0123456789abcdefghijklmn";
59+
60+
await apiClientManager.runWithConfig({ baseURL: baseUrl, accessToken: key }, async () => {
61+
await expect(
62+
// @ts-expect-error deliberately omitting the name argument
63+
envvars.update("proj_ref", "prod", { value: "abc" })
64+
).rejects.toThrow("name is required");
65+
});
66+
});
67+
});

packages/trigger-sdk/src/v3/envvars.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,13 @@ export function update(
336336
throw new Error("params is required");
337337
}
338338

339+
if (typeof nameOrRequestOptions !== "string") {
340+
throw new Error("name is required");
341+
}
342+
339343
$projectRef = projectRefOrName;
340344
$slug = slugOrParams;
341-
$name = name!;
345+
$name = nameOrRequestOptions;
342346
$params = params;
343347
}
344348

0 commit comments

Comments
 (0)