From 22f2347cb64d7d0f918f86bc3a039bad8fc449f2 Mon Sep 17 00:00:00 2001 From: Daniel Rivas <1887507+danielrs@users.noreply.github.com> Date: Tue, 16 Sep 2025 00:41:28 -0500 Subject: [PATCH] wrangler: fix: support the deletion of secrets with complex names URL encode the secret names before being sent to the API, should allow users to delete secrets with complex names. Change is still compatible with older Wrangler versions thanks to the optional query param flag `url_encoded`. --- .changeset/warm-clowns-visit.md | 5 ++++ .../wrangler/src/__tests__/secret.test.ts | 28 +++++++++++++++---- packages/wrangler/src/secret/index.ts | 9 +++++- 3 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 .changeset/warm-clowns-visit.md diff --git a/.changeset/warm-clowns-visit.md b/.changeset/warm-clowns-visit.md new file mode 100644 index 00000000000..bf7d49908af --- /dev/null +++ b/.changeset/warm-clowns-visit.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +Support the deletion of secrets with complex names diff --git a/packages/wrangler/src/__tests__/secret.test.ts b/packages/wrangler/src/__tests__/secret.test.ts index 6a5a7623b29..45d7c58aea3 100644 --- a/packages/wrangler/src/__tests__/secret.test.ts +++ b/packages/wrangler/src/__tests__/secret.test.ts @@ -563,16 +563,15 @@ describe("wrangler secret", () => { msw.use( http.delete( `*/accounts/:accountId/workers/${servicesOrScripts}/:scriptName${environment}/secrets/:secretName`, - ({ params }) => { + ({ request, params }) => { expect(params.accountId).toEqual("some-account-id"); expect(params.scriptName).toEqual( legacyEnv && env ? `script-name-${env}` : "script-name" ); - if (!legacyEnv) { - if (env) { - expect(params.secretName).toEqual(input.secretName); - } - } + expect(params.secretName).toEqual(input.secretName); + expect( + new URL(request.url).searchParams.get("url_encoded") + ).toEqual("true"); return HttpResponse.json(createFetchResult(null)); }, { once: true } @@ -616,6 +615,23 @@ describe("wrangler secret", () => { expect(std.err).toMatchInlineSnapshot(`""`); }); + it("should delete a secret which name includes special characters", async () => { + mockDeleteRequest({ scriptName: "script-name", secretName: "the/key" }); + mockConfirm({ + text: "Are you sure you want to permanently delete the secret the/key on the Worker script-name?", + result: true, + }); + await runWrangler("secret delete the/key --name script-name"); + expect(std.out).toMatchInlineSnapshot(` + " + ⛅️ wrangler x.x.x + ────────────────── + 🌀 Deleting the secret the/key on the Worker script-name + ✨ Success! Deleted secret the/key" + `); + expect(std.err).toMatchInlineSnapshot(`""`); + }); + it("should delete a secret: legacy envs", async () => { mockDeleteRequest( { scriptName: "script-name", secretName: "the-key" }, diff --git a/packages/wrangler/src/secret/index.ts b/packages/wrangler/src/secret/index.ts index a03b0d7854a..099732875d7 100644 --- a/packages/wrangler/src/secret/index.ts +++ b/packages/wrangler/src/secret/index.ts @@ -318,7 +318,14 @@ export const secretDeleteCommand = createCommand({ ? `/accounts/${accountId}/workers/scripts/${scriptName}/secrets` : `/accounts/${accountId}/workers/services/${scriptName}/environments/${args.env}/secrets`; - await fetchResult(config, `${url}/${args.key}`, { method: "DELETE" }); + await fetchResult( + config, + `${url}/${encodeURIComponent(args.key)}`, + { method: "DELETE" }, + new URLSearchParams({ + url_encoded: "true", + }) + ); metrics.sendMetricsEvent("delete encrypted variable", { sendMetrics: config.send_metrics, });