Skip to content

Commit 71fd250

Browse files
Provide unsafe metadata for wrangler versions secret put (#8037)
1 parent ca5e942 commit 71fd250

File tree

6 files changed

+166
-1
lines changed

6 files changed

+166
-1
lines changed

.changeset/wise-pants-raise.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"wrangler": minor
3+
---
4+
5+
Provides unsafe.metadata configurations when using wrangler versions secret put.

packages/wrangler/src/__tests__/versions/secrets/bulk.test.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { mockConsoleMethods } from "../../helpers/mock-console";
66
import { clearDialogs } from "../../helpers/mock-dialogs";
77
import { runInTempDir } from "../../helpers/run-in-tmp";
88
import { runWrangler } from "../../helpers/run-wrangler";
9+
import { writeWranglerConfig } from "../../helpers/write-wrangler-config";
910
import { mockPostVersion, mockSetupApiCalls } from "./utils";
1011
import type { Interface } from "node:readline";
1112

@@ -184,4 +185,93 @@ describe("versions secret bulk", () => {
184185
"
185186
`);
186187
});
188+
189+
test("unsafe metadata is provided", async () => {
190+
writeWranglerConfig({
191+
name: "script-name",
192+
unsafe: { metadata: { build_options: { stable_id: "foo/bar" } } },
193+
});
194+
195+
await writeFile(
196+
"secrets.json",
197+
JSON.stringify({
198+
SECRET_1: "secret-1",
199+
SECRET_2: "secret-2",
200+
SECRET_3: "secret-3",
201+
}),
202+
{ encoding: "utf8" }
203+
);
204+
205+
mockSetupApiCalls();
206+
mockPostVersion((metadata) => {
207+
expect(metadata.bindings).toStrictEqual([
208+
{ type: "secret_text", name: "SECRET_1", text: "secret-1" },
209+
{ type: "secret_text", name: "SECRET_2", text: "secret-2" },
210+
{ type: "secret_text", name: "SECRET_3", text: "secret-3" },
211+
]);
212+
expect(metadata.keep_bindings).toStrictEqual([
213+
"secret_key",
214+
"secret_text",
215+
]);
216+
expect(metadata.keep_assets).toBeTruthy();
217+
expect(metadata["build_options"]).toStrictEqual({ stable_id: "foo/bar" });
218+
});
219+
220+
await runWrangler(`versions secret bulk secrets.json --name script-name`);
221+
expect(std.out).toMatchInlineSnapshot(
222+
`
223+
"🌀 Creating the secrets for the Worker \\"script-name\\"
224+
✨ Successfully created secret for key: SECRET_1
225+
✨ Successfully created secret for key: SECRET_2
226+
✨ Successfully created secret for key: SECRET_3
227+
✨ Success! Created version id with 3 secrets.
228+
➡️ To deploy this version to production traffic use the command \\"wrangler versions deploy\\"."
229+
`
230+
);
231+
expect(std.err).toMatchInlineSnapshot(`""`);
232+
});
233+
234+
test("unsafe metadata not included if not in wrangler.toml", async () => {
235+
writeWranglerConfig({
236+
name: "script-name",
237+
});
238+
239+
await writeFile(
240+
"secrets.json",
241+
JSON.stringify({
242+
SECRET_1: "secret-1",
243+
SECRET_2: "secret-2",
244+
SECRET_3: "secret-3",
245+
}),
246+
{ encoding: "utf8" }
247+
);
248+
249+
mockSetupApiCalls();
250+
mockPostVersion((metadata) => {
251+
expect(metadata.bindings).toStrictEqual([
252+
{ type: "secret_text", name: "SECRET_1", text: "secret-1" },
253+
{ type: "secret_text", name: "SECRET_2", text: "secret-2" },
254+
{ type: "secret_text", name: "SECRET_3", text: "secret-3" },
255+
]);
256+
expect(metadata.keep_bindings).toStrictEqual([
257+
"secret_key",
258+
"secret_text",
259+
]);
260+
expect(metadata.keep_assets).toBeTruthy();
261+
expect(metadata["build_options"]).toBeUndefined();
262+
});
263+
264+
await runWrangler(`versions secret bulk secrets.json --name script-name`);
265+
expect(std.out).toMatchInlineSnapshot(
266+
`
267+
"🌀 Creating the secrets for the Worker \\"script-name\\"
268+
✨ Successfully created secret for key: SECRET_1
269+
✨ Successfully created secret for key: SECRET_2
270+
✨ Successfully created secret for key: SECRET_3
271+
✨ Success! Created version id with 3 secrets.
272+
➡️ To deploy this version to production traffic use the command \\"wrangler versions deploy\\"."
273+
`
274+
);
275+
expect(std.err).toMatchInlineSnapshot(`""`);
276+
});
187277
});

packages/wrangler/src/__tests__/versions/secrets/put.test.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,68 @@ describe("versions secret put", () => {
5353
expect(std.err).toMatchInlineSnapshot(`""`);
5454
});
5555

56+
test("unsafe metadata is provided", async () => {
57+
writeWranglerConfig({
58+
name: "script-name",
59+
unsafe: { metadata: { build_options: { stable_id: "foo/bar" } } },
60+
});
61+
62+
setIsTTY(true);
63+
64+
mockPrompt({
65+
text: "Enter a secret value:",
66+
options: { isSecret: true },
67+
result: "the-secret",
68+
});
69+
70+
mockSetupApiCalls();
71+
mockPostVersion((metadata) => {
72+
expect(metadata["build_options"]).toStrictEqual({ stable_id: "foo/bar" });
73+
});
74+
await runWrangler("versions secret put NEW_SECRET --name script-name");
75+
76+
expect(std.out).toMatchInlineSnapshot(`
77+
"🌀 Creating the secret for the Worker \\"script-name\\"
78+
✨ Success! Created version id with secret NEW_SECRET.
79+
➡️ To deploy this version with secret NEW_SECRET to production traffic use the command \\"wrangler versions deploy\\"."
80+
`);
81+
expect(std.err).toMatchInlineSnapshot(`""`);
82+
});
83+
84+
test("unsafe metadata not included if not in wrangler.toml", async () => {
85+
writeWranglerConfig({
86+
name: "script-name",
87+
});
88+
89+
setIsTTY(true);
90+
91+
mockPrompt({
92+
text: "Enter a secret value:",
93+
options: { isSecret: true },
94+
result: "the-secret",
95+
});
96+
97+
mockSetupApiCalls();
98+
mockPostVersion((metadata) => {
99+
expect(metadata.bindings).toStrictEqual([
100+
{ type: "secret_text", name: "NEW_SECRET", text: "the-secret" },
101+
]);
102+
expect(metadata.keep_bindings).toStrictEqual([
103+
"secret_key",
104+
"secret_text",
105+
]);
106+
expect(metadata["build_options"]).toBeUndefined();
107+
});
108+
await runWrangler("versions secret put NEW_SECRET --name script-name");
109+
110+
expect(std.out).toMatchInlineSnapshot(`
111+
"🌀 Creating the secret for the Worker \\"script-name\\"
112+
✨ Success! Created version id with secret NEW_SECRET.
113+
➡️ To deploy this version with secret NEW_SECRET to production traffic use the command \\"wrangler versions deploy\\"."
114+
`);
115+
expect(std.err).toMatchInlineSnapshot(`""`);
116+
});
117+
56118
test("no wrangler configuration warnings shown", async () => {
57119
await writeFile("wrangler.json", JSON.stringify({ invalid_field: true }));
58120
setIsTTY(true);

packages/wrangler/src/versions/secrets/bulk.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export const versionsSecretBulkCommand = createCommand({
8686
versionMessage: args.message ?? `Bulk updated ${secrets.length} secrets`,
8787
versionTag: args.tag,
8888
sendMetrics: config.send_metrics,
89+
unsafeMetadata: config.unsafe.metadata,
8990
});
9091

9192
for (const secret of secrets) {

packages/wrangler/src/versions/secrets/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ interface ScriptSettings {
7878
observability: Observability;
7979
}
8080

81+
type CfUnsafeMetadata = Record<string, unknown>;
82+
8183
interface CopyLatestWorkerVersionArgs {
8284
accountId: string;
8385
scriptName: string;
@@ -87,6 +89,7 @@ interface CopyLatestWorkerVersionArgs {
8789
versionTag?: string;
8890
sendMetrics?: boolean;
8991
overrideAllSecrets?: boolean; // Used for delete - this will make sure we do not inherit any
92+
unsafeMetadata?: CfUnsafeMetadata | undefined;
9093
}
9194

9295
// TODO: This is a naive implementation, replace later
@@ -98,6 +101,7 @@ export async function copyWorkerVersionWithNewSecrets({
98101
versionMessage,
99102
versionTag,
100103
sendMetrics,
104+
unsafeMetadata,
101105
overrideAllSecrets,
102106
}: CopyLatestWorkerVersionArgs) {
103107
// Grab the specific version info
@@ -157,7 +161,9 @@ export async function copyWorkerVersionWithNewSecrets({
157161
const worker: CfWorkerInit = {
158162
name: scriptName,
159163
main: mainModule,
160-
bindings: {} as CfWorkerInit["bindings"], // handled in rawBindings
164+
bindings: {
165+
unsafe: { metadata: unsafeMetadata }, // pass along unsafe metadata
166+
} as CfWorkerInit["bindings"], // handled in rawBindings
161167
rawBindings: bindings,
162168
modules,
163169
sourceMaps: sourceMaps,

packages/wrangler/src/versions/secrets/put.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ export const versionsSecretPutCommand = createCommand({
9090
versionMessage: args.message ?? `Updated secret "${args.key}"`,
9191
versionTag: args.tag,
9292
sendMetrics: config.send_metrics,
93+
unsafeMetadata: config.unsafe.metadata,
9394
});
9495

9596
logger.log(

0 commit comments

Comments
 (0)