wrangler 0.0.0-e93063e9 → 0.0.0-e93d240f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +12 -14
  2. package/bin/wrangler.js +10 -76
  3. package/package.json +207 -194
  4. package/templates/__tests__/tsconfig.json +1 -1
  5. package/templates/checked-fetch.js +19 -6
  6. package/templates/facade.d.ts +4 -1
  7. package/templates/gitignore +1 -0
  8. package/templates/init-tests/test-vitest-new-worker.ts +1 -1
  9. package/templates/middleware/common.ts +9 -4
  10. package/templates/middleware/loader-modules.ts +64 -9
  11. package/templates/middleware/loader-sw.ts +2 -7
  12. package/templates/middleware/middleware-d1-beta.d.ts +3 -0
  13. package/templates/middleware/middleware-miniflare3-json-error.ts +18 -5
  14. package/templates/middleware/middleware-multiworker-dev.d.ts +4 -0
  15. package/templates/middleware/middleware-multiworker-dev.ts +59 -0
  16. package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
  17. package/templates/middleware/middleware-serve-static-assets.ts +56 -0
  18. package/templates/new-worker-scheduled.ts +1 -1
  19. package/templates/new-worker.ts +4 -1
  20. package/templates/pages-dev-util.ts +4 -1
  21. package/templates/pages-shim.ts +0 -3
  22. package/templates/pages-template-plugin.ts +19 -5
  23. package/templates/pages-template-worker.ts +11 -2
  24. package/templates/tsconfig.init.json +1 -2
  25. package/templates/tsconfig.json +1 -1
  26. package/wrangler-dist/cli.d.ts +909 -66
  27. package/wrangler-dist/cli.js +105289 -97941
  28. package/wrangler-dist/wasm-sync.wasm +0 -0
  29. package/import_meta_url.js +0 -3
  30. package/miniflare-config-stubs/.env.empty +0 -0
  31. package/miniflare-config-stubs/package.empty.json +0 -1
  32. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  33. package/miniflare-dist/index.mjs +0 -6364
  34. package/src/__tests__/access.test.ts +0 -25
  35. package/src/__tests__/api-dev.test.ts +0 -238
  36. package/src/__tests__/api-devregistry.test.js +0 -64
  37. package/src/__tests__/api.test.ts +0 -80
  38. package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
  39. package/src/__tests__/config-cache.test.ts +0 -42
  40. package/src/__tests__/configuration.test.ts +0 -4163
  41. package/src/__tests__/d1/d1.test.ts +0 -123
  42. package/src/__tests__/d1/splitter.test.ts +0 -255
  43. package/src/__tests__/delete.test.ts +0 -266
  44. package/src/__tests__/deployments.test.ts +0 -105
  45. package/src/__tests__/dev.test.tsx +0 -1586
  46. package/src/__tests__/generate.test.ts +0 -238
  47. package/src/__tests__/get-host-from-url.test.ts +0 -16
  48. package/src/__tests__/guess-worker-format.test.ts +0 -85
  49. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  50. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  51. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  52. package/src/__tests__/helpers/mock-auth-domain.ts +0 -20
  53. package/src/__tests__/helpers/mock-bin.ts +0 -36
  54. package/src/__tests__/helpers/mock-cfetch.ts +0 -278
  55. package/src/__tests__/helpers/mock-console.ts +0 -106
  56. package/src/__tests__/helpers/mock-dialogs.ts +0 -137
  57. package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -8
  58. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  59. package/src/__tests__/helpers/mock-istty.ts +0 -74
  60. package/src/__tests__/helpers/mock-known-routes.ts +0 -7
  61. package/src/__tests__/helpers/mock-kv.ts +0 -33
  62. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -271
  63. package/src/__tests__/helpers/mock-process.ts +0 -34
  64. package/src/__tests__/helpers/mock-stdin.ts +0 -108
  65. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  66. package/src/__tests__/helpers/msw/blob-worker.cjs +0 -19
  67. package/src/__tests__/helpers/msw/handlers/access.ts +0 -13
  68. package/src/__tests__/helpers/msw/handlers/deployments.ts +0 -59
  69. package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -104
  70. package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -31
  71. package/src/__tests__/helpers/msw/handlers/r2.ts +0 -80
  72. package/src/__tests__/helpers/msw/handlers/script.ts +0 -75
  73. package/src/__tests__/helpers/msw/handlers/user.ts +0 -63
  74. package/src/__tests__/helpers/msw/handlers/zones.ts +0 -22
  75. package/src/__tests__/helpers/msw/index.ts +0 -21
  76. package/src/__tests__/helpers/msw/read-file-sync.js +0 -61
  77. package/src/__tests__/helpers/run-in-tmp.ts +0 -38
  78. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  79. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
  80. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
  81. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
  82. package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -8
  83. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
  84. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  85. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  86. package/src/__tests__/https-options.test.ts +0 -163
  87. package/src/__tests__/index.test.ts +0 -268
  88. package/src/__tests__/init.test.ts +0 -3147
  89. package/src/__tests__/jest.setup.ts +0 -198
  90. package/src/__tests__/kv.test.ts +0 -1788
  91. package/src/__tests__/logger.test.ts +0 -141
  92. package/src/__tests__/logout.test.ts +0 -47
  93. package/src/__tests__/metrics.test.ts +0 -493
  94. package/src/__tests__/middleware.scheduled.test.ts +0 -145
  95. package/src/__tests__/middleware.test.ts +0 -750
  96. package/src/__tests__/package-manager.test.ts +0 -353
  97. package/src/__tests__/pages-deployment-tail.test.ts +0 -884
  98. package/src/__tests__/pages.test.ts +0 -2899
  99. package/src/__tests__/parse.test.ts +0 -330
  100. package/src/__tests__/paths.test.ts +0 -39
  101. package/src/__tests__/publish.test.ts +0 -7769
  102. package/src/__tests__/pubsub.test.ts +0 -490
  103. package/src/__tests__/queues.test.ts +0 -522
  104. package/src/__tests__/r2.test.ts +0 -393
  105. package/src/__tests__/route.test.ts +0 -45
  106. package/src/__tests__/secret.test.ts +0 -701
  107. package/src/__tests__/tail.test.ts +0 -905
  108. package/src/__tests__/test-old-node-version.js +0 -31
  109. package/src/__tests__/tsconfig-sanity.ts +0 -12
  110. package/src/__tests__/tsconfig.json +0 -8
  111. package/src/__tests__/tsconfig.tsbuildinfo +0 -1
  112. package/src/__tests__/type-generation.test.ts +0 -233
  113. package/src/__tests__/user.test.ts +0 -129
  114. package/src/__tests__/utils-collectKeyValues.test.ts +0 -47
  115. package/src/__tests__/validate-dev-props.test.ts +0 -56
  116. package/src/__tests__/version.test.ts +0 -35
  117. package/src/__tests__/whoami.test.tsx +0 -183
  118. package/src/__tests__/worker-namespace.test.ts +0 -326
  119. package/src/abort.d.ts +0 -3
  120. package/src/api/dev.ts +0 -247
  121. package/src/api/index.ts +0 -2
  122. package/src/bundle-reporter.ts +0 -68
  123. package/src/bundle.ts +0 -823
  124. package/src/cfetch/index.ts +0 -158
  125. package/src/cfetch/internal.ts +0 -261
  126. package/src/cli.ts +0 -28
  127. package/src/config/README.md +0 -107
  128. package/src/config/config.ts +0 -275
  129. package/src/config/diagnostics.ts +0 -80
  130. package/src/config/environment.ts +0 -577
  131. package/src/config/index.ts +0 -358
  132. package/src/config/validation-helpers.ts +0 -597
  133. package/src/config/validation.ts +0 -2151
  134. package/src/config-cache.ts +0 -85
  135. package/src/create-worker-preview.ts +0 -282
  136. package/src/create-worker-upload-form.ts +0 -325
  137. package/src/d1/backups.tsx +0 -223
  138. package/src/d1/constants.ts +0 -2
  139. package/src/d1/create.tsx +0 -63
  140. package/src/d1/delete.ts +0 -56
  141. package/src/d1/execute.tsx +0 -323
  142. package/src/d1/formatTimeAgo.ts +0 -14
  143. package/src/d1/index.ts +0 -101
  144. package/src/d1/list.tsx +0 -48
  145. package/src/d1/migrations/apply.tsx +0 -197
  146. package/src/d1/migrations/create.tsx +0 -77
  147. package/src/d1/migrations/helpers.ts +0 -147
  148. package/src/d1/migrations/index.ts +0 -3
  149. package/src/d1/migrations/list.tsx +0 -79
  150. package/src/d1/migrations/options.ts +0 -18
  151. package/src/d1/options.ts +0 -22
  152. package/src/d1/splitter.ts +0 -161
  153. package/src/d1/types.ts +0 -24
  154. package/src/d1/utils.ts +0 -48
  155. package/src/delete.ts +0 -103
  156. package/src/deployments.ts +0 -83
  157. package/src/deprecated/index.ts +0 -145
  158. package/src/dev/dev-vars.ts +0 -39
  159. package/src/dev/dev.tsx +0 -614
  160. package/src/dev/get-local-persistence-path.ts +0 -31
  161. package/src/dev/local.tsx +0 -932
  162. package/src/dev/remote.tsx +0 -630
  163. package/src/dev/start-server.ts +0 -543
  164. package/src/dev/use-esbuild.ts +0 -204
  165. package/src/dev/validate-dev-props.ts +0 -31
  166. package/src/dev-registry.ts +0 -201
  167. package/src/dev.tsx +0 -949
  168. package/src/dialogs.ts +0 -136
  169. package/src/dispatch-namespace.ts +0 -207
  170. package/src/docs/index.ts +0 -97
  171. package/src/durable.ts +0 -102
  172. package/src/entry.ts +0 -329
  173. package/src/environment-variables/factory.ts +0 -88
  174. package/src/environment-variables/misc-variables.ts +0 -30
  175. package/src/errors.ts +0 -11
  176. package/src/generate/index.ts +0 -300
  177. package/src/git-client.ts +0 -135
  178. package/src/global-wrangler-config-path.ts +0 -26
  179. package/src/https-options.ts +0 -127
  180. package/src/index.ts +0 -694
  181. package/src/init.ts +0 -1023
  182. package/src/inspect.ts +0 -767
  183. package/src/intl-polyfill.d.ts +0 -139
  184. package/src/is-ci.ts +0 -14
  185. package/src/is-interactive.ts +0 -16
  186. package/src/jest.d.ts +0 -4
  187. package/src/kv/helpers.ts +0 -430
  188. package/src/kv/index.ts +0 -596
  189. package/src/logger.ts +0 -104
  190. package/src/metrics/index.ts +0 -5
  191. package/src/metrics/metrics-config.ts +0 -239
  192. package/src/metrics/metrics-dispatcher.ts +0 -96
  193. package/src/metrics/metrics-usage-headers.ts +0 -24
  194. package/src/metrics/send-event.ts +0 -97
  195. package/src/miniflare-cli/README.md +0 -30
  196. package/src/miniflare-cli/assets.ts +0 -250
  197. package/src/miniflare-cli/index.ts +0 -210
  198. package/src/miniflare-cli/request-context.ts +0 -40
  199. package/src/miniflare-cli/tsconfig.json +0 -9
  200. package/src/miniflare-cli/tsconfig.tsbuildinfo +0 -1
  201. package/src/miniflare-cli/types.ts +0 -11
  202. package/src/module-collection.ts +0 -267
  203. package/src/open-in-browser.ts +0 -17
  204. package/src/package-manager.ts +0 -219
  205. package/src/pages/build.ts +0 -270
  206. package/src/pages/constants.ts +0 -18
  207. package/src/pages/deployment-tails.ts +0 -284
  208. package/src/pages/deployments.tsx +0 -84
  209. package/src/pages/dev.ts +0 -711
  210. package/src/pages/errors.ts +0 -66
  211. package/src/pages/functions/buildPlugin.ts +0 -107
  212. package/src/pages/functions/buildWorker.ts +0 -166
  213. package/src/pages/functions/filepath-routing.test.ts +0 -234
  214. package/src/pages/functions/filepath-routing.ts +0 -189
  215. package/src/pages/functions/identifiers.ts +0 -78
  216. package/src/pages/functions/routes-consolidation.test.ts +0 -250
  217. package/src/pages/functions/routes-consolidation.ts +0 -73
  218. package/src/pages/functions/routes-transformation.test.ts +0 -282
  219. package/src/pages/functions/routes-transformation.ts +0 -115
  220. package/src/pages/functions/routes-validation.test.ts +0 -403
  221. package/src/pages/functions/routes-validation.ts +0 -202
  222. package/src/pages/functions/routes.ts +0 -151
  223. package/src/pages/functions/tsconfig.json +0 -8
  224. package/src/pages/functions/tsconfig.tsbuildinfo +0 -1
  225. package/src/pages/functions.ts +0 -82
  226. package/src/pages/hash.ts +0 -13
  227. package/src/pages/index.ts +0 -102
  228. package/src/pages/projects.tsx +0 -167
  229. package/src/pages/prompt-select-project.tsx +0 -31
  230. package/src/pages/publish.tsx +0 -462
  231. package/src/pages/types.ts +0 -41
  232. package/src/pages/upload.tsx +0 -447
  233. package/src/pages/utils.ts +0 -23
  234. package/src/parse.ts +0 -286
  235. package/src/paths.ts +0 -71
  236. package/src/proxy.ts +0 -694
  237. package/src/publish/index.ts +0 -270
  238. package/src/publish/publish.ts +0 -1038
  239. package/src/pubsub/index.ts +0 -286
  240. package/src/pubsub/pubsub-commands.ts +0 -624
  241. package/src/queues/cli/commands/consumer/add.ts +0 -71
  242. package/src/queues/cli/commands/consumer/index.ts +0 -22
  243. package/src/queues/cli/commands/consumer/remove.ts +0 -38
  244. package/src/queues/cli/commands/create.ts +0 -25
  245. package/src/queues/cli/commands/delete.ts +0 -26
  246. package/src/queues/cli/commands/index.ts +0 -36
  247. package/src/queues/cli/commands/list.ts +0 -25
  248. package/src/queues/client.ts +0 -135
  249. package/src/queues/utils.ts +0 -18
  250. package/src/r2/constants.ts +0 -4
  251. package/src/r2/helpers.ts +0 -131
  252. package/src/r2/index.ts +0 -289
  253. package/src/routes.ts +0 -140
  254. package/src/secret/index.ts +0 -379
  255. package/src/selfsigned.d.ts +0 -29
  256. package/src/sites.ts +0 -372
  257. package/src/tail/createTail.ts +0 -379
  258. package/src/tail/filters.ts +0 -277
  259. package/src/tail/index.ts +0 -213
  260. package/src/tail/printing.ts +0 -107
  261. package/src/tsconfig-sanity.ts +0 -16
  262. package/src/type-generation.ts +0 -181
  263. package/src/update-check.ts +0 -19
  264. package/src/user/access.ts +0 -68
  265. package/src/user/auth-variables.ts +0 -113
  266. package/src/user/choose-account.tsx +0 -39
  267. package/src/user/generate-auth-url.ts +0 -33
  268. package/src/user/generate-random-state.ts +0 -16
  269. package/src/user/index.ts +0 -2
  270. package/src/user/user.ts +0 -1232
  271. package/src/utils/collectKeyValues.ts +0 -14
  272. package/src/whoami.ts +0 -135
  273. package/src/worker.ts +0 -251
  274. package/src/yargs-types.ts +0 -24
  275. package/src/zones.ts +0 -191
  276. package/templates/__tests__/tsconfig.tsbuildinfo +0 -1
  277. package/templates/d1-beta-facade.js +0 -241
  278. package/templates/first-party-worker-module-facade.ts +0 -19
  279. package/templates/format-dev-errors.ts +0 -33
  280. package/templates/serve-static-assets.ts +0 -65
  281. package/templates/service-bindings-module-facade.js +0 -54
  282. package/templates/service-bindings-sw-facade.js +0 -42
  283. package/templates/tsconfig.tsbuildinfo +0 -1
@@ -1,701 +0,0 @@
1
- import * as fs from "node:fs";
2
- import { writeFileSync } from "node:fs";
3
- import * as TOML from "@iarna/toml";
4
- import { rest } from "msw";
5
- import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
6
- import { mockConsoleMethods } from "./helpers/mock-console";
7
- import { mockConfirm, mockPrompt, clearDialogs } from "./helpers/mock-dialogs";
8
- import { useMockIsTTY } from "./helpers/mock-istty";
9
-
10
- import { useMockStdin } from "./helpers/mock-stdin";
11
- import { msw } from "./helpers/msw";
12
- import { runInTempDir } from "./helpers/run-in-tmp";
13
- import { runWrangler } from "./helpers/run-wrangler";
14
-
15
- function createFetchResult(result: unknown, success = true) {
16
- return {
17
- success,
18
- errors: [],
19
- messages: [],
20
- result,
21
- };
22
- }
23
-
24
- export function mockGetMembershipsFail() {
25
- msw.use(
26
- rest.get("*/memberships", (req, res, ctx) => {
27
- return res.once(ctx.json(createFetchResult([], false)));
28
- })
29
- );
30
- }
31
-
32
- export function mockGetMemberships(
33
- accounts: { id: string; account: { id: string; name: string } }[]
34
- ) {
35
- msw.use(
36
- rest.get("*/memberships", (req, res, ctx) => {
37
- return res.once(ctx.json(createFetchResult(accounts)));
38
- })
39
- );
40
- }
41
-
42
- describe("wrangler secret", () => {
43
- const std = mockConsoleMethods();
44
- const { setIsTTY } = useMockIsTTY();
45
- runInTempDir();
46
- mockAccountId();
47
- mockApiToken();
48
- afterEach(() => {
49
- clearDialogs();
50
- });
51
-
52
- describe("put", () => {
53
- function mockPutRequest(
54
- input: { name: string; text: string },
55
- env?: string,
56
- legacyEnv = false
57
- ) {
58
- const servicesOrScripts = env && !legacyEnv ? "services" : "scripts";
59
- const environment = env && !legacyEnv ? "/environments/:envName" : "";
60
- msw.use(
61
- rest.put(
62
- `*/accounts/:accountId/workers/${servicesOrScripts}/:scriptName${environment}/secrets`,
63
- async (req, res, ctx) => {
64
- expect(req.params.accountId).toEqual("some-account-id");
65
- expect(req.params.scriptName).toEqual(
66
- legacyEnv && env ? `script-name-${env}` : "script-name"
67
- );
68
- if (!legacyEnv) {
69
- expect(req.params.envName).toEqual(env);
70
- }
71
- const { name, text, type } = await req.json();
72
- expect(type).toEqual("secret_text");
73
- expect(name).toEqual(input.name);
74
- expect(text).toEqual(input.text);
75
-
76
- return res.once(ctx.json(createFetchResult({ name, type })));
77
- }
78
- )
79
- );
80
- }
81
-
82
- describe("interactive", () => {
83
- beforeEach(() => {
84
- setIsTTY(true);
85
- });
86
-
87
- it("should trim stdin secret value", async () => {
88
- mockPrompt({
89
- text: "Enter a secret value:",
90
- options: { isSecret: true },
91
- result: `hunter2
92
- `,
93
- });
94
-
95
- mockPutRequest({ name: `secret-name`, text: `hunter2` });
96
- await runWrangler("secret put secret-name --name script-name");
97
- expect(std.out).toMatchInlineSnapshot(`
98
- "🌀 Creating the secret for the Worker \\"script-name\\"
99
- ✨ Success! Uploaded secret secret-name"
100
- `);
101
- });
102
-
103
- it("should create a secret", async () => {
104
- mockPrompt({
105
- text: "Enter a secret value:",
106
- options: { isSecret: true },
107
- result: "the-secret",
108
- });
109
-
110
- mockPutRequest({ name: "the-key", text: "the-secret" });
111
- await runWrangler("secret put the-key --name script-name");
112
-
113
- expect(std.out).toMatchInlineSnapshot(`
114
- "🌀 Creating the secret for the Worker \\"script-name\\"
115
- ✨ Success! Uploaded secret the-key"
116
- `);
117
- expect(std.err).toMatchInlineSnapshot(`""`);
118
- });
119
-
120
- it("should create secret:bulk", async () => {
121
- writeFileSync(
122
- "secret.json",
123
- JSON.stringify({
124
- "secret-name-1": "secret_text",
125
- "secret-name-2": "secret_text",
126
- })
127
- );
128
-
129
- // User counter to pass different secrets to the request mock
130
- let counter = 0;
131
- msw.use(
132
- rest.put(
133
- `*/accounts/:accountId/workers/scripts/:scriptName/secrets`,
134
- (req, res, ctx) => {
135
- expect(req.params.accountId).toEqual("some-account-id");
136
- counter++;
137
-
138
- return res(
139
- ctx.json(
140
- createFetchResult({
141
- name: `secret-name-${counter}`,
142
- type: "secret_text",
143
- })
144
- )
145
- );
146
- }
147
- )
148
- );
149
-
150
- await runWrangler("secret:bulk ./secret.json --name script-name");
151
-
152
- expect(std.out).toMatchInlineSnapshot(`
153
- "🌀 Creating the secrets for the Worker \\"script-name\\"
154
- ✨ Successfully created secret for key: secret-name-1
155
- ✨ Successfully created secret for key: secret-name-2
156
-
157
- Finished processing secrets JSON file:
158
- ✨ 2 secrets successfully uploaded"
159
- `);
160
- expect(std.err).toMatchInlineSnapshot(`""`);
161
- });
162
-
163
- it("should handle network failure on secret:bulk", async () => {
164
- writeFileSync(
165
- "secret.json",
166
- JSON.stringify({
167
- "secret-name-1": "secret_text",
168
- "secret-name-2": "secret_text",
169
- })
170
- );
171
-
172
- // User counter to pass different secrets to the request mock
173
- let counter = 0;
174
- msw.use(
175
- rest.put(
176
- `*/accounts/:accountId/workers/scripts/:scriptName/secrets`,
177
- (req, res) => {
178
- expect(req.params.accountId).toEqual("some-account-id");
179
- counter++;
180
-
181
- return res.networkError(`Failed to create secret ${counter}`);
182
- }
183
- )
184
- );
185
-
186
- await runWrangler("secret:bulk ./secret.json --name script-name");
187
-
188
- expect(std.out).toMatchInlineSnapshot(`
189
- "🌀 Creating the secrets for the Worker \\"script-name\\"
190
-
191
- Finished processing secrets JSON file:
192
- ✨ 0 secrets successfully uploaded
193
- 🚨 2 secrets failed to upload"
194
- `);
195
- expect(std.err).toMatchInlineSnapshot(`
196
- "X [ERROR] 🚨 Error uploading secret for key: secret-name-1:
197
-
198
- request to
199
- https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets
200
- failed, reason: Failed to create secret 1
201
-
202
-
203
- X [ERROR] 🚨 Error uploading secret for key: secret-name-2:
204
-
205
- request to
206
- https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets
207
- failed, reason: Failed to create secret 2
208
-
209
- "
210
- `);
211
- });
212
-
213
- it("should count success and network failure on secret:bulk", async () => {
214
- writeFileSync(
215
- "secret.json",
216
- JSON.stringify({
217
- "secret-name-1": "secret_text",
218
- "secret-name-2": "secret_text",
219
- "secret-name-3": "secret_text",
220
- "secret-name-4": "secret_text",
221
- "secret-name-5": "secret_text",
222
- "secret-name-6": "secret_text",
223
- "secret-name-7": "secret_text",
224
- })
225
- );
226
-
227
- // User counter to pass different secrets to the request mock
228
- let counter = 0;
229
- msw.use(
230
- rest.put(
231
- `*/accounts/:accountId/workers/scripts/:scriptName/secrets`,
232
- (req, res, ctx) => {
233
- expect(req.params.accountId).toEqual("some-account-id");
234
- counter++;
235
-
236
- if (counter % 2 === 0) {
237
- return res(
238
- ctx.json(
239
- createFetchResult({
240
- name: `secret-name-${counter}`,
241
- type: "secret_text",
242
- })
243
- )
244
- );
245
- } else {
246
- return res.networkError(`Failed to create secret ${counter}`);
247
- }
248
- }
249
- )
250
- );
251
-
252
- await runWrangler("secret:bulk ./secret.json --name script-name");
253
-
254
- expect(std.out).toMatchInlineSnapshot(`
255
- "🌀 Creating the secrets for the Worker \\"script-name\\"
256
- ✨ Successfully created secret for key: secret-name-2
257
- ✨ Successfully created secret for key: secret-name-4
258
- ✨ Successfully created secret for key: secret-name-6
259
-
260
- Finished processing secrets JSON file:
261
- ✨ 3 secrets successfully uploaded
262
- 🚨 4 secrets failed to upload"
263
- `);
264
- expect(std.err).toMatchInlineSnapshot(`
265
- "X [ERROR] 🚨 Error uploading secret for key: secret-name-1:
266
-
267
- request to
268
- https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets
269
- failed, reason: Failed to create secret 1
270
-
271
-
272
- X [ERROR] 🚨 Error uploading secret for key: secret-name-3:
273
-
274
- request to
275
- https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets
276
- failed, reason: Failed to create secret 3
277
-
278
-
279
- X [ERROR] 🚨 Error uploading secret for key: secret-name-5:
280
-
281
- request to
282
- https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets
283
- failed, reason: Failed to create secret 5
284
-
285
-
286
- X [ERROR] 🚨 Error uploading secret for key: secret-name-7:
287
-
288
- request to
289
- https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets
290
- failed, reason: Failed to create secret 7
291
-
292
- "
293
- `);
294
- });
295
-
296
- it("should create a secret: legacy envs", async () => {
297
- mockPrompt({
298
- text: "Enter a secret value:",
299
- options: { isSecret: true },
300
- result: "the-secret",
301
- });
302
-
303
- mockPutRequest(
304
- { name: "the-key", text: "the-secret" },
305
- "some-env",
306
- true
307
- );
308
- await runWrangler(
309
- "secret put the-key --name script-name --env some-env --legacy-env"
310
- );
311
-
312
- expect(std.out).toMatchInlineSnapshot(`
313
- "🌀 Creating the secret for the Worker \\"script-name-some-env\\"
314
- ✨ Success! Uploaded secret the-key"
315
- `);
316
- expect(std.err).toMatchInlineSnapshot(`""`);
317
- });
318
-
319
- it("should create a secret: service envs", async () => {
320
- mockPrompt({
321
- text: "Enter a secret value:",
322
- options: { isSecret: true },
323
- result: "the-secret",
324
- });
325
-
326
- mockPutRequest(
327
- { name: "the-key", text: "the-secret" },
328
- "some-env",
329
- false
330
- );
331
- await runWrangler(
332
- "secret put the-key --name script-name --env some-env --legacy-env false"
333
- );
334
-
335
- expect(std.out).toMatchInlineSnapshot(`
336
- "🌀 Creating the secret for the Worker \\"script-name\\" (some-env)
337
- ✨ Success! Uploaded secret the-key"
338
- `);
339
- expect(std.err).toMatchInlineSnapshot(`""`);
340
- });
341
-
342
- it("should error without a script name", async () => {
343
- let error: Error | undefined;
344
- try {
345
- await runWrangler("secret put the-key");
346
- } catch (e) {
347
- error = e as Error;
348
- }
349
- expect(std.out).toMatchInlineSnapshot(`
350
- "
351
- If you think this is a bug then please create an issue at https://github.com/cloudflare/wrangler2/issues/new/choose"
352
- `);
353
- expect(std.err).toMatchInlineSnapshot(`
354
- "X [ERROR] Required Worker name missing. Please specify the Worker name in wrangler.toml, or pass it as an argument with \`--name <worker-name>\`
355
-
356
- "
357
- `);
358
- expect(error).toMatchInlineSnapshot(
359
- `[Error: Required Worker name missing. Please specify the Worker name in wrangler.toml, or pass it as an argument with \`--name <worker-name>\`]`
360
- );
361
- });
362
- });
363
-
364
- describe("non-interactive", () => {
365
- beforeEach(() => {
366
- setIsTTY(false);
367
- });
368
- const mockStdIn = useMockStdin({ isTTY: false });
369
-
370
- it("should trim stdin secret value, from piped input", async () => {
371
- mockPutRequest({ name: "the-key", text: "the-secret" });
372
- // Pipe the secret in as three chunks to test that we reconstitute it correctly.
373
- mockStdIn.send(
374
- `the`,
375
- `-`,
376
- `secret
377
- ` // whitespace & newline being removed
378
- );
379
- await runWrangler("secret put the-key --name script-name");
380
-
381
- expect(std.out).toMatchInlineSnapshot(`
382
- "🌀 Creating the secret for the Worker \\"script-name\\"
383
- ✨ Success! Uploaded secret the-key"
384
- `);
385
- expect(std.warn).toMatchInlineSnapshot(`""`);
386
- expect(std.err).toMatchInlineSnapshot(`""`);
387
- });
388
-
389
- it("should create a secret, from piped input", async () => {
390
- mockPutRequest({ name: "the-key", text: "the-secret" });
391
- // Pipe the secret in as three chunks to test that we reconstitute it correctly.
392
- mockStdIn.send("the", "-", "secret");
393
- await runWrangler("secret put the-key --name script-name");
394
-
395
- expect(std.out).toMatchInlineSnapshot(`
396
- "🌀 Creating the secret for the Worker \\"script-name\\"
397
- ✨ Success! Uploaded secret the-key"
398
- `);
399
- expect(std.warn).toMatchInlineSnapshot(`""`);
400
- expect(std.err).toMatchInlineSnapshot(`""`);
401
- });
402
-
403
- it("should error if the piped input fails", async () => {
404
- mockPutRequest({ name: "the-key", text: "the-secret" });
405
- mockStdIn.throwError(new Error("Error in stdin stream"));
406
- await expect(
407
- runWrangler("secret put the-key --name script-name")
408
- ).rejects.toThrowErrorMatchingInlineSnapshot(`"Error in stdin stream"`);
409
-
410
- expect(std.out).toMatchInlineSnapshot(`
411
- "
412
- If you think this is a bug then please create an issue at https://github.com/cloudflare/wrangler2/issues/new/choose"
413
- `);
414
- expect(std.warn).toMatchInlineSnapshot(`""`);
415
- });
416
-
417
- describe("with accountId", () => {
418
- mockAccountId({ accountId: null });
419
-
420
- it("should error if request for memberships fails", async () => {
421
- mockGetMembershipsFail();
422
- await expect(
423
- runWrangler("secret put the-key --name script-name")
424
- ).rejects.toThrowErrorMatchingInlineSnapshot(
425
- `"A request to the Cloudflare API (/memberships) failed."`
426
- );
427
- });
428
-
429
- it("should error if a user has no account", async () => {
430
- mockGetMemberships([]);
431
- await expect(runWrangler("secret put the-key --name script-name"))
432
- .rejects.toThrowErrorMatchingInlineSnapshot(`
433
- "Failed to automatically retrieve account IDs for the logged in user.
434
- In a non-interactive environment, it is mandatory to specify an account ID, either by assigning its value to CLOUDFLARE_ACCOUNT_ID, or as \`account_id\` in your \`wrangler.toml\` file."
435
- `);
436
- });
437
-
438
- it("should use the account from wrangler.toml", async () => {
439
- fs.writeFileSync(
440
- "wrangler.toml",
441
- TOML.stringify({
442
- account_id: "some-account-id",
443
- }),
444
- "utf-8"
445
- );
446
- mockStdIn.send("the-secret");
447
- mockPutRequest({ name: "the-key", text: "the-secret" });
448
- await runWrangler("secret put the-key --name script-name");
449
- expect(std.out).toMatchInlineSnapshot(`
450
- "🌀 Creating the secret for the Worker \\"script-name\\"
451
- ✨ Success! Uploaded secret the-key"
452
- `);
453
- expect(std.warn).toMatchInlineSnapshot(`""`);
454
- expect(std.err).toMatchInlineSnapshot(`""`);
455
- });
456
-
457
- it("should error if a user has multiple accounts, and has not specified an account in wrangler.toml", async () => {
458
- mockGetMemberships([
459
- {
460
- id: "1",
461
- account: { id: "account-id-1", name: "account-name-1" },
462
- },
463
- {
464
- id: "2",
465
- account: { id: "account-id-2", name: "account-name-2" },
466
- },
467
- {
468
- id: "3",
469
- account: { id: "account-id-3", name: "account-name-3" },
470
- },
471
- ]);
472
-
473
- await expect(runWrangler("secret put the-key --name script-name"))
474
- .rejects.toThrowErrorMatchingInlineSnapshot(`
475
- "More than one account available but unable to select one in non-interactive mode.
476
- Please set the appropriate \`account_id\` in your \`wrangler.toml\` file.
477
- Available accounts are (\`<name>\`: \`<account_id>\`):
478
- \`account-name-1\`: \`account-id-1\`
479
- \`account-name-2\`: \`account-id-2\`
480
- \`account-name-3\`: \`account-id-3\`"
481
- `);
482
- });
483
- });
484
- });
485
- });
486
-
487
- describe("delete", () => {
488
- beforeEach(() => {
489
- setIsTTY(true);
490
- });
491
- function mockDeleteRequest(
492
- input: {
493
- scriptName: string;
494
- secretName: string;
495
- },
496
- env?: string,
497
- legacyEnv = false
498
- ) {
499
- const servicesOrScripts = env && !legacyEnv ? "services" : "scripts";
500
- const environment = env && !legacyEnv ? "/environments/:envName" : "";
501
- msw.use(
502
- rest.delete(
503
- `*/accounts/:accountId/workers/${servicesOrScripts}/:scriptName${environment}/secrets/:secretName`,
504
- (req, res, ctx) => {
505
- expect(req.params.accountId).toEqual("some-account-id");
506
- expect(req.params.scriptName).toEqual(
507
- legacyEnv && env ? `script-name-${env}` : "script-name"
508
- );
509
- if (!legacyEnv) {
510
- if (env) {
511
- expect(req.params.secretName).toEqual(input.secretName);
512
- }
513
- }
514
- return res.once(ctx.json(createFetchResult(null)));
515
- }
516
- )
517
- );
518
- }
519
-
520
- it("should delete a secret", async () => {
521
- mockDeleteRequest({ scriptName: "script-name", secretName: "the-key" });
522
- mockConfirm({
523
- text: "Are you sure you want to permanently delete the secret the-key on the Worker script-name?",
524
- result: true,
525
- });
526
- await runWrangler("secret delete the-key --name script-name");
527
- expect(std.out).toMatchInlineSnapshot(`
528
- "🌀 Deleting the secret the-key on the Worker script-name
529
- ✨ Success! Deleted secret the-key"
530
- `);
531
- expect(std.err).toMatchInlineSnapshot(`""`);
532
- });
533
-
534
- it("should delete a secret: legacy envs", async () => {
535
- mockDeleteRequest(
536
- { scriptName: "script-name", secretName: "the-key" },
537
- "some-env",
538
- true
539
- );
540
- mockConfirm({
541
- text: "Are you sure you want to permanently delete the secret the-key on the Worker script-name-some-env?",
542
- result: true,
543
- });
544
- await runWrangler(
545
- "secret delete the-key --name script-name --env some-env --legacy-env"
546
- );
547
- expect(std.out).toMatchInlineSnapshot(`
548
- "🌀 Deleting the secret the-key on the Worker script-name-some-env
549
- ✨ Success! Deleted secret the-key"
550
- `);
551
- expect(std.err).toMatchInlineSnapshot(`""`);
552
- });
553
-
554
- it("should delete a secret: service envs", async () => {
555
- mockDeleteRequest(
556
- { scriptName: "script-name", secretName: "the-key" },
557
- "some-env"
558
- );
559
- mockConfirm({
560
- text: "Are you sure you want to permanently delete the secret the-key on the Worker script-name (some-env)?",
561
- result: true,
562
- });
563
- await runWrangler(
564
- "secret delete the-key --name script-name --env some-env --legacy-env false"
565
- );
566
- expect(std.out).toMatchInlineSnapshot(`
567
- "🌀 Deleting the secret the-key on the Worker script-name (some-env)
568
- ✨ Success! Deleted secret the-key"
569
- `);
570
- expect(std.err).toMatchInlineSnapshot(`""`);
571
- });
572
-
573
- it("should error without a script name", async () => {
574
- let error: Error | undefined;
575
-
576
- try {
577
- await runWrangler("secret delete the-key");
578
- } catch (e) {
579
- error = e as Error;
580
- }
581
- expect(std.out).toMatchInlineSnapshot(`
582
- "
583
- If you think this is a bug then please create an issue at https://github.com/cloudflare/wrangler2/issues/new/choose"
584
- `);
585
- expect(std.err).toMatchInlineSnapshot(`
586
- "X [ERROR] Required Worker name missing. Please specify the Worker name in wrangler.toml, or pass it as an argument with \`--name <worker-name>\`
587
-
588
- "
589
- `);
590
- expect(error).toMatchInlineSnapshot(
591
- `[Error: Required Worker name missing. Please specify the Worker name in wrangler.toml, or pass it as an argument with \`--name <worker-name>\`]`
592
- );
593
- });
594
- });
595
-
596
- describe("list", () => {
597
- beforeEach(() => {
598
- setIsTTY(true);
599
- });
600
- function mockListRequest(
601
- input: { scriptName: string },
602
- env?: string,
603
- legacyEnv = false
604
- ) {
605
- const servicesOrScripts = env && !legacyEnv ? "services" : "scripts";
606
- const environment = env && !legacyEnv ? "/environments/:envName" : "";
607
- msw.use(
608
- rest.get(
609
- `*/accounts/:accountId/workers/${servicesOrScripts}/:scriptName${environment}/secrets`,
610
- (req, res, ctx) => {
611
- expect(req.params.accountId).toEqual("some-account-id");
612
- expect(req.params.scriptName).toEqual(
613
- legacyEnv && env ? `script-name-${env}` : "script-name"
614
- );
615
- if (!legacyEnv) {
616
- expect(req.params.envName).toEqual(env);
617
- }
618
-
619
- return res.once(
620
- ctx.json(
621
- createFetchResult([
622
- {
623
- name: "the-secret-name",
624
- type: "secret_text",
625
- },
626
- ])
627
- )
628
- );
629
- }
630
- )
631
- );
632
- }
633
-
634
- it("should list secrets", async () => {
635
- mockListRequest({ scriptName: "script-name" });
636
- await runWrangler("secret list --name script-name");
637
- expect(std.out).toMatchInlineSnapshot(`
638
- "[
639
- {
640
- \\"name\\": \\"the-secret-name\\",
641
- \\"type\\": \\"secret_text\\"
642
- }
643
- ]"
644
- `);
645
- expect(std.err).toMatchInlineSnapshot(`""`);
646
- });
647
-
648
- it("should list secrets: legacy envs", async () => {
649
- mockListRequest({ scriptName: "script-name" }, "some-env", true);
650
- await runWrangler(
651
- "secret list --name script-name --env some-env --legacy-env"
652
- );
653
- expect(std.out).toMatchInlineSnapshot(`
654
- "[
655
- {
656
- \\"name\\": \\"the-secret-name\\",
657
- \\"type\\": \\"secret_text\\"
658
- }
659
- ]"
660
- `);
661
- expect(std.err).toMatchInlineSnapshot(`""`);
662
- });
663
-
664
- it("should list secrets: service envs", async () => {
665
- mockListRequest({ scriptName: "script-name" }, "some-env");
666
- await runWrangler(
667
- "secret list --name script-name --env some-env --legacy-env false"
668
- );
669
- expect(std.out).toMatchInlineSnapshot(`
670
- "[
671
- {
672
- \\"name\\": \\"the-secret-name\\",
673
- \\"type\\": \\"secret_text\\"
674
- }
675
- ]"
676
- `);
677
- expect(std.err).toMatchInlineSnapshot(`""`);
678
- });
679
-
680
- it("should error without a script name", async () => {
681
- let error: Error | undefined;
682
- try {
683
- await runWrangler("secret list");
684
- } catch (e) {
685
- error = e as Error;
686
- }
687
- expect(std.out).toMatchInlineSnapshot(`
688
- "
689
- If you think this is a bug then please create an issue at https://github.com/cloudflare/wrangler2/issues/new/choose"
690
- `);
691
- expect(std.err).toMatchInlineSnapshot(`
692
- "X [ERROR] Required Worker name missing. Please specify the Worker name in wrangler.toml, or pass it as an argument with \`--name <worker-name>\`
693
-
694
- "
695
- `);
696
- expect(error).toMatchInlineSnapshot(
697
- `[Error: Required Worker name missing. Please specify the Worker name in wrangler.toml, or pass it as an argument with \`--name <worker-name>\`]`
698
- );
699
- });
700
- });
701
- });