diff --git a/.changeset/eleven-carrots-happen.md b/.changeset/eleven-carrots-happen.md new file mode 100644 index 000000000000..b593dce6f13f --- /dev/null +++ b/.changeset/eleven-carrots-happen.md @@ -0,0 +1,7 @@ +--- +"wrangler": patch +--- + +fix: allow empty strings in secret:bulk upload + +Previously, the `secret:bulk` command would fail if any of the secrets in the secret.json file were empty strings and they already existed remotely. diff --git a/packages/wrangler/src/__tests__/secret.test.ts b/packages/wrangler/src/__tests__/secret.test.ts index b3300802b4b8..55b26420c048 100644 --- a/packages/wrangler/src/__tests__/secret.test.ts +++ b/packages/wrangler/src/__tests__/secret.test.ts @@ -736,6 +736,7 @@ describe("wrangler secret", () => { JSON.stringify({ "secret-name-2": "secret_text", "secret-name-3": "secret_text", + "secret-name-4": "", }) ); @@ -761,6 +762,7 @@ describe("wrangler secret", () => { }, { type: "secret_text", name: "secret-name-1" }, { type: "secret_text", name: "secret-name-2" }, + { type: "secret_text", name: "secret-name-4" }, ], }) ) @@ -795,6 +797,7 @@ describe("wrangler secret", () => { name: "secret-name-3", text: "secret_text", }, + { type: "secret_text", name: "secret-name-4", text: "" }, ], }); expect(parsedSettings).not.toHaveProperty(["bindings", 0, "text"]); @@ -811,9 +814,10 @@ describe("wrangler secret", () => { "🌀 Creating the secrets for the Worker \\"script-name\\" ✨ Successfully created secret for key: secret-name-2 ✨ Successfully created secret for key: secret-name-3 + ✨ Successfully created secret for key: secret-name-4 Finished processing secrets JSON file: - ✨ 2 secrets successfully uploaded" + ✨ 3 secrets successfully uploaded" `); expect(std.err).toMatchInlineSnapshot(`""`); }); diff --git a/packages/wrangler/src/secret/index.ts b/packages/wrangler/src/secret/index.ts index 3eef0521076a..fad01d9e265f 100644 --- a/packages/wrangler/src/secret/index.ts +++ b/packages/wrangler/src/secret/index.ts @@ -451,7 +451,9 @@ export const secretBulkHandler = async (secretBulkArgs: SecretBulkArgs) => { .filter((binding) => { // secrets that currently exist for the worker but are not provided for bulk update // are inherited over with other binding types - return binding.type !== "secret_text" || !content[binding.name]; + return ( + binding.type !== "secret_text" || content[binding.name] === undefined + ); }) .map((binding) => ({ type: binding.type, name: binding.name })); // secrets to upload are provided as bindings in their full form