wrangler 0.0.0-e30d1013 → 0.0.0-e311bbbf

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 (236) hide show
  1. package/README.md +3 -3
  2. package/bin/wrangler.js +30 -10
  3. package/miniflare-dist/index.mjs +126 -74
  4. package/package.json +26 -19
  5. package/src/__tests__/api-dev.test.ts +65 -36
  6. package/src/__tests__/api-devregistry.test.ts +121 -0
  7. package/src/__tests__/api.test.ts +27 -5
  8. package/src/__tests__/configuration.test.ts +567 -39
  9. package/src/__tests__/d1/d1.test.ts +82 -0
  10. package/src/__tests__/d1/execute.test.ts +66 -0
  11. package/src/__tests__/d1/migrate.test.ts +157 -0
  12. package/src/__tests__/d1/splitter.test.ts +255 -0
  13. package/src/__tests__/delete.test.ts +91 -49
  14. package/src/__tests__/deployments.test.ts +330 -52
  15. package/src/__tests__/dev.test.tsx +198 -90
  16. package/src/__tests__/generate.test.ts +8 -5
  17. package/src/__tests__/guess-worker-format.test.ts +35 -0
  18. package/src/__tests__/helpers/end-event-loop.ts +6 -0
  19. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  20. package/src/__tests__/helpers/mock-console.ts +6 -0
  21. package/src/__tests__/helpers/mock-dialogs.ts +71 -85
  22. package/src/__tests__/helpers/mock-get-pages-upload-token.ts +25 -0
  23. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -5
  24. package/src/__tests__/helpers/mock-known-routes.ts +7 -2
  25. package/src/__tests__/helpers/mock-kv.ts +29 -16
  26. package/src/__tests__/helpers/mock-oauth-flow.ts +103 -92
  27. package/src/__tests__/helpers/mock-process.ts +8 -13
  28. package/src/__tests__/helpers/mock-set-timeout.ts +16 -0
  29. package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
  30. package/src/__tests__/helpers/msw/handlers/deployments.ts +127 -26
  31. package/src/__tests__/helpers/msw/handlers/namespaces.ts +18 -41
  32. package/src/__tests__/helpers/msw/handlers/oauth.ts +13 -18
  33. package/src/__tests__/helpers/msw/handlers/r2.ts +14 -34
  34. package/src/__tests__/helpers/msw/handlers/script.ts +9 -28
  35. package/src/__tests__/helpers/msw/handlers/user.ts +13 -24
  36. package/src/__tests__/helpers/msw/handlers/zones.ts +6 -8
  37. package/src/__tests__/helpers/msw/index.ts +32 -1
  38. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  39. package/src/__tests__/helpers/string-dynamic-values-matcher.ts +28 -0
  40. package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
  41. package/src/__tests__/index.test.ts +90 -72
  42. package/src/__tests__/init.test.ts +927 -631
  43. package/src/__tests__/jest.setup.ts +19 -42
  44. package/src/__tests__/kv.test.ts +355 -231
  45. package/src/__tests__/logger.test.ts +68 -2
  46. package/src/__tests__/logout.test.ts +47 -0
  47. package/src/__tests__/metrics.test.ts +94 -51
  48. package/src/__tests__/middleware.scheduled.test.ts +42 -32
  49. package/src/__tests__/middleware.test.ts +212 -122
  50. package/src/__tests__/mtls-certificates.test.ts +588 -0
  51. package/src/__tests__/pages/deployment-list.test.ts +80 -0
  52. package/src/__tests__/pages/functions-build.test.ts +452 -0
  53. package/src/__tests__/pages/pages.test.ts +81 -0
  54. package/src/__tests__/pages/project-create.test.ts +63 -0
  55. package/src/__tests__/pages/project-list.test.ts +110 -0
  56. package/src/__tests__/pages/project-upload.test.ts +500 -0
  57. package/src/__tests__/pages/publish.test.ts +2864 -0
  58. package/src/__tests__/pages-deployment-tail.test.ts +955 -0
  59. package/src/__tests__/parse.test.ts +106 -0
  60. package/src/__tests__/publish.test.ts +1620 -830
  61. package/src/__tests__/pubsub.test.ts +226 -100
  62. package/src/__tests__/queues.test.ts +237 -76
  63. package/src/__tests__/r2.test.ts +37 -56
  64. package/src/__tests__/secret.test.ts +179 -130
  65. package/src/__tests__/tail.test.ts +267 -109
  66. package/src/__tests__/test-old-node-version.js +3 -3
  67. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  68. package/src/__tests__/tsconfig-sanity.ts +12 -0
  69. package/src/__tests__/tsconfig.json +8 -0
  70. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  71. package/src/__tests__/type-generation.test.ts +11 -2
  72. package/src/__tests__/user.test.ts +35 -72
  73. package/src/__tests__/whoami.test.tsx +8 -114
  74. package/src/__tests__/worker-namespace.test.ts +83 -69
  75. package/src/api/dev.ts +168 -60
  76. package/src/api/index.ts +10 -1
  77. package/src/api/mtls-certificate.ts +148 -0
  78. package/src/api/pages/create-worker-bundle-contents.ts +76 -0
  79. package/src/api/pages/index.ts +5 -0
  80. package/src/api/pages/publish.tsx +355 -0
  81. package/src/bundle.ts +221 -128
  82. package/src/cfetch/index.ts +0 -2
  83. package/src/cfetch/internal.ts +16 -21
  84. package/src/cli.ts +4 -4
  85. package/src/config/config.ts +14 -7
  86. package/src/config/environment.ts +73 -16
  87. package/src/config/index.ts +99 -30
  88. package/src/config/validation-helpers.ts +1 -1
  89. package/src/config/validation.ts +248 -9
  90. package/src/create-worker-preview.ts +19 -8
  91. package/src/create-worker-upload-form.ts +48 -5
  92. package/src/d1/backups.tsx +43 -42
  93. package/src/d1/create.tsx +26 -21
  94. package/src/d1/{delete.tsx → delete.ts} +11 -14
  95. package/src/d1/execute.tsx +183 -170
  96. package/src/d1/index.ts +7 -6
  97. package/src/d1/list.tsx +22 -10
  98. package/src/d1/migrations/apply.tsx +212 -0
  99. package/src/d1/migrations/create.tsx +79 -0
  100. package/src/d1/migrations/helpers.ts +172 -0
  101. package/src/d1/migrations/index.ts +3 -0
  102. package/src/d1/migrations/list.tsx +95 -0
  103. package/src/d1/migrations/options.ts +23 -0
  104. package/src/d1/options.ts +3 -3
  105. package/src/d1/splitter.ts +161 -0
  106. package/src/d1/{types.tsx → types.ts} +1 -0
  107. package/src/d1/utils.ts +2 -1
  108. package/src/delete.ts +8 -16
  109. package/src/deployments.ts +333 -42
  110. package/src/deprecated/index.ts +8 -302
  111. package/src/dev/dev.tsx +57 -44
  112. package/src/dev/local.tsx +248 -74
  113. package/src/dev/remote.tsx +32 -3
  114. package/src/dev/start-server.ts +81 -66
  115. package/src/dev/use-esbuild.ts +17 -18
  116. package/src/dev/validate-dev-props.ts +9 -0
  117. package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
  118. package/src/dev.tsx +178 -117
  119. package/src/dialogs.ts +136 -0
  120. package/src/dispatch-namespace.ts +21 -17
  121. package/src/docs/index.ts +97 -0
  122. package/src/entry.ts +19 -11
  123. package/src/environment-variables/factory.ts +88 -0
  124. package/src/environment-variables/misc-variables.ts +30 -0
  125. package/src/generate/index.ts +298 -0
  126. package/src/git-client.ts +15 -4
  127. package/src/{index.tsx → index.ts} +134 -59
  128. package/src/init.ts +249 -187
  129. package/src/inspect.ts +16 -1
  130. package/src/jest.d.ts +4 -0
  131. package/src/kv/index.ts +15 -17
  132. package/src/logger.ts +32 -5
  133. package/src/metrics/metrics-config.ts +3 -3
  134. package/src/metrics/send-event.ts +6 -1
  135. package/src/miniflare-cli/assets.ts +64 -28
  136. package/src/miniflare-cli/index.ts +4 -7
  137. package/src/miniflare-cli/tsconfig.json +9 -0
  138. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  139. package/src/miniflare-cli/types.ts +11 -0
  140. package/src/module-collection.ts +91 -25
  141. package/src/mtls-certificate/cli.ts +155 -0
  142. package/src/pages/build.ts +410 -0
  143. package/src/pages/buildFunctions.ts +140 -0
  144. package/src/pages/deployment-tails.ts +281 -0
  145. package/src/pages/deployments.tsx +11 -33
  146. package/src/pages/{dev.tsx → dev.ts} +147 -139
  147. package/src/pages/errors.ts +1 -0
  148. package/src/pages/functions/buildPlugin.ts +61 -54
  149. package/src/pages/functions/buildWorker.ts +159 -33
  150. package/src/pages/functions/tsconfig.json +8 -0
  151. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  152. package/src/pages/{functions.tsx → functions.ts} +8 -4
  153. package/src/pages/{index.tsx → index.ts} +11 -3
  154. package/src/pages/projects.tsx +12 -22
  155. package/src/pages/prompt-select-project.tsx +31 -0
  156. package/src/pages/publish.tsx +46 -225
  157. package/src/pages/types.ts +6 -9
  158. package/src/pages/upload.tsx +58 -14
  159. package/src/pages/utils.ts +12 -1
  160. package/src/parse.ts +23 -1
  161. package/src/paths.ts +1 -1
  162. package/src/proxy.ts +5 -0
  163. package/src/publish/index.ts +20 -16
  164. package/src/publish/publish.ts +71 -46
  165. package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
  166. package/src/queues/cli/commands/consumer/add.ts +24 -24
  167. package/src/queues/cli/commands/consumer/index.ts +3 -6
  168. package/src/queues/cli/commands/consumer/remove.ts +11 -18
  169. package/src/queues/cli/commands/create.ts +8 -8
  170. package/src/queues/cli/commands/delete.ts +8 -8
  171. package/src/queues/cli/commands/index.ts +6 -4
  172. package/src/queues/cli/commands/list.ts +8 -8
  173. package/src/queues/client.ts +1 -0
  174. package/src/queues/utils.ts +18 -0
  175. package/src/r2/helpers.ts +1 -0
  176. package/src/r2/index.ts +28 -28
  177. package/src/secret/index.ts +14 -16
  178. package/src/{sites.tsx → sites.ts} +1 -1
  179. package/src/tail/createTail.ts +94 -3
  180. package/src/tail/filters.ts +1 -1
  181. package/src/tail/index.ts +8 -11
  182. package/src/tail/printing.ts +15 -0
  183. package/src/traverse-module-graph.ts +53 -0
  184. package/src/tsconfig-sanity.ts +16 -0
  185. package/src/type-generation.ts +28 -20
  186. package/src/user/access.ts +0 -1
  187. package/src/user/auth-variables.ts +113 -0
  188. package/src/user/choose-account.tsx +1 -31
  189. package/src/user/index.ts +0 -1
  190. package/src/user/{user.tsx → user.ts} +123 -82
  191. package/src/utils/render.ts +93 -0
  192. package/src/{whoami.tsx → whoami.ts} +37 -71
  193. package/src/worker.ts +30 -1
  194. package/src/yargs-types.ts +22 -5
  195. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  196. package/templates/__tests__/tsconfig.json +8 -0
  197. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  198. package/templates/checked-fetch.js +9 -3
  199. package/templates/d1-beta-facade.js +51 -3
  200. package/templates/facade.d.ts +14 -0
  201. package/templates/first-party-worker-module-facade.ts +4 -3
  202. package/templates/format-dev-errors.ts +8 -6
  203. package/templates/gitignore +1 -0
  204. package/templates/init-tests/test-jest-new-worker.js +3 -5
  205. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  206. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  207. package/templates/middleware/loader-modules.ts +2 -2
  208. package/templates/middleware/loader-sw.ts +51 -31
  209. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  210. package/templates/new-worker.ts +3 -0
  211. package/templates/pages-dev-pipeline.ts +4 -1
  212. package/templates/pages-shim.ts +4 -1
  213. package/templates/pages-template-plugin.ts +19 -10
  214. package/templates/serve-static-assets.ts +17 -14
  215. package/templates/service-bindings-module-facade.js +1 -0
  216. package/templates/tsconfig-sanity.ts +11 -0
  217. package/templates/tsconfig.init.json +105 -0
  218. package/templates/tsconfig.json +5 -103
  219. package/templates/tsconfig.tsbuildinfo +1 -0
  220. package/wrangler-dist/cli.d.ts +820 -70
  221. package/wrangler-dist/cli.js +68161 -78780
  222. package/wrangler-dist/wasm-sync.wasm +0 -0
  223. package/src/__tests__/api-devregistry.test.js +0 -56
  224. package/src/__tests__/d1.test.ts +0 -74
  225. package/src/__tests__/dialogs.test.tsx +0 -40
  226. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  227. package/src/__tests__/pages.test.ts +0 -2387
  228. package/src/d1/migrations.tsx +0 -446
  229. package/src/dialogs.tsx +0 -169
  230. package/src/environment-variables.ts +0 -50
  231. package/src/pages/build.tsx +0 -270
  232. package/src/user/env-vars.ts +0 -46
  233. package/templates/experimental-local-cache-stubs.js +0 -27
  234. /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
  235. /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
  236. /package/src/pages/{hash.tsx → hash.ts} +0 -0
@@ -1,9 +1,10 @@
1
- import { type QueueResponse, type PostConsumerBody } from "../queues/client";
1
+ import { rest } from "msw";
2
2
  import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
3
- import { setMockResponse, unsetAllMocks } from "./helpers/mock-cfetch";
4
3
  import { mockConsoleMethods } from "./helpers/mock-console";
4
+ import { msw } from "./helpers/msw";
5
5
  import { runInTempDir } from "./helpers/run-in-tmp";
6
6
  import { runWrangler } from "./helpers/run-wrangler";
7
+ import type { QueueResponse, PostConsumerBody } from "../queues/client";
7
8
 
8
9
  describe("wrangler", () => {
9
10
  mockAccountId();
@@ -11,10 +12,6 @@ describe("wrangler", () => {
11
12
  runInTempDir();
12
13
  const std = mockConsoleMethods();
13
14
 
14
- afterEach(() => {
15
- unsetAllMocks();
16
- });
17
-
18
15
  describe("queues", () => {
19
16
  it("should show the correct help text", async () => {
20
17
  await runWrangler("queues --help");
@@ -31,25 +28,35 @@ describe("wrangler", () => {
31
28
  wrangler queues consumer Configure Queue Consumers
32
29
 
33
30
  Flags:
34
- -c, --config Path to .toml configuration file [string]
35
- -e, --env Environment to use for operations and .env files [string]
36
- -h, --help Show help [boolean]
37
- -v, --version Show version number [boolean]"
31
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
32
+ -c, --config Path to .toml configuration file [string]
33
+ -e, --env Environment to use for operations and .env files [string]
34
+ -h, --help Show help [boolean]
35
+ -v, --version Show version number [boolean]"
38
36
  `);
39
37
  });
40
38
 
41
39
  describe("list", () => {
42
40
  function mockListRequest(queues: QueueResponse[], page: number) {
43
41
  const requests = { count: 0 };
44
- setMockResponse(
45
- "/accounts/:accountId/workers/queues",
46
- ([_url, accountId], init, params) => {
47
- requests.count++;
48
- expect(params.get("page")).toEqual((page || 1).toString());
49
- expect(accountId).toEqual("some-account-id");
50
- expect(init).toEqual({});
51
- return queues;
52
- }
42
+ msw.use(
43
+ rest.get(
44
+ "*/accounts/:accountId/workers/queues?*",
45
+ async (request, response, context) => {
46
+ requests.count += 1;
47
+ const query = request.url.searchParams;
48
+ expect(Number(query.get("page"))).toEqual(page);
49
+ expect(await request.text()).toEqual("");
50
+ return response.once(
51
+ context.json({
52
+ success: true,
53
+ errors: [],
54
+ messages: [],
55
+ result: queues,
56
+ })
57
+ );
58
+ }
59
+ )
53
60
  );
54
61
  return requests;
55
62
  }
@@ -63,10 +70,11 @@ describe("wrangler", () => {
63
70
  List Queues
64
71
 
65
72
  Flags:
66
- -c, --config Path to .toml configuration file [string]
67
- -e, --env Environment to use for operations and .env files [string]
68
- -h, --help Show help [boolean]
69
- -v, --version Show version number [boolean]
73
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
74
+ -c, --config Path to .toml configuration file [string]
75
+ -e, --env Environment to use for operations and .env files [string]
76
+ -h, --help Show help [boolean]
77
+ -v, --version Show version number [boolean]
70
78
 
71
79
  Options:
72
80
  --page Page number for pagination [number]"
@@ -116,15 +124,30 @@ describe("wrangler", () => {
116
124
  describe("create", () => {
117
125
  function mockCreateRequest(expectedQueueName: string) {
118
126
  const requests = { count: 0 };
119
- setMockResponse(
120
- "/accounts/:accountId/workers/queues",
121
- "POST",
122
- ([_url, accountId], { body }) => {
123
- expect(accountId).toEqual("some-account-id");
124
- const queueName = JSON.parse(body as string).queue_name;
125
- expect(queueName).toEqual(expectedQueueName);
126
- requests.count += 1;
127
- }
127
+
128
+ msw.use(
129
+ rest.post(
130
+ "*/accounts/:accountId/workers/queues",
131
+ async (request, response, context) => {
132
+ requests.count += 1;
133
+ const body = (await request.json()) as {
134
+ queue_name: string;
135
+ };
136
+ expect(body.queue_name).toEqual(expectedQueueName);
137
+ return response.once(
138
+ context.json({
139
+ success: true,
140
+ errors: [],
141
+ messages: [],
142
+ result: {
143
+ queue_name: expectedQueueName,
144
+ created_on: "01-01-2001",
145
+ modified_on: "01-01-2001",
146
+ },
147
+ })
148
+ );
149
+ }
150
+ )
128
151
  );
129
152
  return requests;
130
153
  }
@@ -141,10 +164,11 @@ describe("wrangler", () => {
141
164
  name The name of the queue [string] [required]
142
165
 
143
166
  Flags:
144
- -c, --config Path to .toml configuration file [string]
145
- -e, --env Environment to use for operations and .env files [string]
146
- -h, --help Show help [boolean]
147
- -v, --version Show version number [boolean]"
167
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
168
+ -c, --config Path to .toml configuration file [string]
169
+ -e, --env Environment to use for operations and .env files [string]
170
+ -h, --help Show help [boolean]
171
+ -v, --version Show version number [boolean]"
148
172
  `);
149
173
  });
150
174
 
@@ -157,18 +181,67 @@ describe("wrangler", () => {
157
181
  `);
158
182
  expect(requests.count).toEqual(1);
159
183
  });
184
+
185
+ it("should show link to dash when not enabled", async () => {
186
+ const queueName = "testQueue";
187
+ msw.use(
188
+ rest.post(
189
+ "*/accounts/:accountId/workers/queues",
190
+ async (request, response, context) => {
191
+ expect(request.params.accountId).toEqual("some-account-id");
192
+ return response.once(
193
+ context.status(403),
194
+ context.json({
195
+ success: false,
196
+ errors: [
197
+ { message: "workers.api.error.unauthorized", code: 10023 },
198
+ ],
199
+ messages: [],
200
+ })
201
+ );
202
+ }
203
+ )
204
+ );
205
+
206
+ await expect(
207
+ runWrangler(`queues create ${queueName}`)
208
+ ).rejects.toThrowError();
209
+ expect(std.out).toMatchInlineSnapshot(`
210
+ "Creating queue testQueue.
211
+ Queues is not currently enabled on this account. Go to https://dash.cloudflare.com/some-account-id/workers/queues to enable it.
212
+
213
+ X [ERROR] A request to the Cloudflare API (/accounts/some-account-id/workers/queues) failed.
214
+
215
+ workers.api.error.unauthorized [code: 10023]
216
+
217
+ If you think this is a bug, please open an issue at:
218
+ https://github.com/cloudflare/workers-sdk/issues/new/choose
219
+
220
+ "
221
+ `);
222
+ });
160
223
  });
161
224
 
162
225
  describe("delete", () => {
163
226
  function mockDeleteRequest(expectedQueueName: string) {
164
227
  const requests = { count: 0 };
165
- setMockResponse(
166
- `/accounts/:accountId/workers/queues/${expectedQueueName}`,
167
- "DELETE",
168
- ([_url, accountId]) => {
169
- expect(accountId).toEqual("some-account-id");
170
- requests.count += 1;
171
- }
228
+ msw.use(
229
+ rest.delete(
230
+ "*/accounts/:accountId/workers/queues/:queueName",
231
+ async (request, response, context) => {
232
+ requests.count += 1;
233
+ expect(request.params.queueName).toEqual(expectedQueueName);
234
+ expect(request.params.accountId).toEqual("some-account-id");
235
+ return response.once(
236
+ context.json({
237
+ success: true,
238
+ errors: [],
239
+ messages: [],
240
+ result: {},
241
+ })
242
+ );
243
+ }
244
+ )
172
245
  );
173
246
  return requests;
174
247
  }
@@ -185,10 +258,11 @@ describe("wrangler", () => {
185
258
  name The name of the queue [string] [required]
186
259
 
187
260
  Flags:
188
- -c, --config Path to .toml configuration file [string]
189
- -e, --env Environment to use for operations and .env files [string]
190
- -h, --help Show help [boolean]
191
- -v, --version Show version number [boolean]"
261
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
262
+ -c, --config Path to .toml configuration file [string]
263
+ -e, --env Environment to use for operations and .env files [string]
264
+ -h, --help Show help [boolean]
265
+ -v, --version Show version number [boolean]"
192
266
  `);
193
267
  });
194
268
 
@@ -218,10 +292,11 @@ describe("wrangler", () => {
218
292
  wrangler queues consumer remove <queue-name> <script-name> Remove a Queue Consumer
219
293
 
220
294
  Flags:
221
- -c, --config Path to .toml configuration file [string]
222
- -e, --env Environment to use for operations and .env files [string]
223
- -h, --help Show help [boolean]
224
- -v, --version Show version number [boolean]"
295
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
296
+ -c, --config Path to .toml configuration file [string]
297
+ -e, --env Environment to use for operations and .env files [string]
298
+ -h, --help Show help [boolean]
299
+ -v, --version Show version number [boolean]"
225
300
  `);
226
301
  });
227
302
 
@@ -231,14 +306,24 @@ describe("wrangler", () => {
231
306
  expectedBody: PostConsumerBody
232
307
  ) {
233
308
  const requests = { count: 0 };
234
- setMockResponse(
235
- `/accounts/:accountId/workers/queues/${expectedQueueName}/consumers`,
236
- "POST",
237
- ([_url, accountId], { body }) => {
238
- expect(accountId).toEqual("some-account-id");
239
- expect(JSON.parse(body as string)).toEqual(expectedBody);
240
- requests.count += 1;
241
- }
309
+ msw.use(
310
+ rest.post(
311
+ "*/accounts/:accountId/workers/queues/:queueName/consumers",
312
+ async (request, response, context) => {
313
+ requests.count += 1;
314
+ expect(request.params.queueName).toEqual(expectedQueueName);
315
+ expect(request.params.accountId).toEqual("some-account-id");
316
+ expect(await request.json()).toEqual(expectedBody);
317
+ return response.once(
318
+ context.json({
319
+ success: true,
320
+ errors: [],
321
+ messages: [],
322
+ result: {},
323
+ })
324
+ );
325
+ }
326
+ )
242
327
  );
243
328
  return requests;
244
329
  }
@@ -256,16 +341,18 @@ describe("wrangler", () => {
256
341
  script-name Name of the consumer script [string] [required]
257
342
 
258
343
  Flags:
259
- -c, --config Path to .toml configuration file [string]
260
- -e, --env Environment to use for operations and .env files [string]
261
- -h, --help Show help [boolean]
262
- -v, --version Show version number [boolean]
344
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
345
+ -c, --config Path to .toml configuration file [string]
346
+ -e, --env Environment to use for operations and .env files [string]
347
+ -h, --help Show help [boolean]
348
+ -v, --version Show version number [boolean]
263
349
 
264
350
  Options:
265
351
  --batch-size Maximum number of messages per batch [number]
266
352
  --batch-timeout Maximum number of seconds to wait to fill a batch with messages [number]
267
353
  --message-retries Maximum number of retries for each message [number]
268
- --dead-letter-queue Queue to send messages that failed to be consumed [string]"
354
+ --dead-letter-queue Queue to send messages that failed to be consumed [string]
355
+ --max-concurrency The maximum number of concurrent consumer Worker invocations. Must be a positive integer [number]"
269
356
  `);
270
357
  });
271
358
 
@@ -277,6 +364,7 @@ describe("wrangler", () => {
277
364
  batch_size: undefined,
278
365
  max_retries: undefined,
279
366
  max_wait_time_ms: undefined,
367
+ max_concurrency: undefined,
280
368
  },
281
369
  dead_letter_queue: undefined,
282
370
  };
@@ -296,19 +384,64 @@ describe("wrangler", () => {
296
384
  batch_size: 20,
297
385
  max_retries: 3,
298
386
  max_wait_time_ms: 10 * 1000,
387
+ max_concurrency: 3,
299
388
  },
300
389
  dead_letter_queue: "myDLQ",
301
390
  };
302
391
  mockPostRequest("testQueue", expectedBody);
303
392
 
304
393
  await runWrangler(
305
- "queues consumer add testQueue testScript --env myEnv --batch-size 20 --batch-timeout 10 --message-retries 3 --dead-letter-queue myDLQ"
394
+ "queues consumer add testQueue testScript --env myEnv --batch-size 20 --batch-timeout 10 --message-retries 3 --max-concurrency 3 --dead-letter-queue myDLQ"
306
395
  );
307
396
  expect(std.out).toMatchInlineSnapshot(`
308
397
  "Adding consumer to queue testQueue.
309
398
  Added consumer to queue testQueue."
310
399
  `);
311
400
  });
401
+
402
+ it("should show link to dash when not enabled", async () => {
403
+ const queueName = "testQueue";
404
+ msw.use(
405
+ rest.post(
406
+ "*/accounts/:accountId/workers/queues/:queueName/consumers",
407
+ async (request, response, context) => {
408
+ expect(request.params.queueName).toEqual(queueName);
409
+ expect(request.params.accountId).toEqual("some-account-id");
410
+ return response.once(
411
+ context.status(403),
412
+ context.json({
413
+ success: false,
414
+ errors: [
415
+ {
416
+ code: 10023,
417
+ message: "workers.api.error.unauthorized",
418
+ },
419
+ ],
420
+ messages: [],
421
+ result: {},
422
+ })
423
+ );
424
+ }
425
+ )
426
+ );
427
+
428
+ await expect(
429
+ runWrangler(`queues consumer add ${queueName} testScript`)
430
+ ).rejects.toThrowError();
431
+ expect(std.out).toMatchInlineSnapshot(`
432
+ "Adding consumer to queue testQueue.
433
+ Queues is not currently enabled on this account. Go to https://dash.cloudflare.com/some-account-id/workers/queues to enable it.
434
+
435
+ X [ERROR] A request to the Cloudflare API (/accounts/some-account-id/workers/queues/testQueue/consumers) failed.
436
+
437
+ workers.api.error.unauthorized [code: 10023]
438
+
439
+ If you think this is a bug, please open an issue at:
440
+ https://github.com/cloudflare/workers-sdk/issues/new/choose
441
+
442
+ "
443
+ `);
444
+ });
312
445
  });
313
446
 
314
447
  describe("delete", () => {
@@ -317,13 +450,32 @@ describe("wrangler", () => {
317
450
  expectedScriptName: string,
318
451
  expectedEnvName?: string
319
452
  ) {
320
- let resource = `/accounts/:accountId/workers/queues/${expectedQueueName}/consumers/${expectedScriptName}`;
453
+ const requests = { count: 0 };
454
+ let resource = `accounts/:accountId/workers/queues/:expectedQueueName/consumers/:expectedScriptName`;
321
455
  if (expectedEnvName !== undefined) {
322
- resource += `/environments/${expectedEnvName}`;
456
+ resource += `/environments/:expectedEnvName`;
323
457
  }
324
- setMockResponse(resource, "DELETE", ([_url, accountId]) => {
325
- expect(accountId).toEqual("some-account-id");
326
- });
458
+ msw.use(
459
+ rest.delete(`*/${resource}`, async (request, response, context) => {
460
+ requests.count++;
461
+ expect(request.params.accountId).toBe("some-account-id");
462
+ expect(request.params.expectedQueueName).toBe(expectedQueueName);
463
+ expect(request.params.expectedScriptName).toBe(
464
+ expectedScriptName
465
+ );
466
+ return response.once(
467
+ context.status(200),
468
+ context.json({
469
+ success: true,
470
+ errors: [],
471
+ messages: [],
472
+ result: {},
473
+ })
474
+ );
475
+ })
476
+ );
477
+
478
+ return requests;
327
479
  }
328
480
 
329
481
  it("should show the correct help text", async () => {
@@ -339,16 +491,19 @@ describe("wrangler", () => {
339
491
  script-name Name of the consumer script [string] [required]
340
492
 
341
493
  Flags:
342
- -c, --config Path to .toml configuration file [string]
343
- -e, --env Environment to use for operations and .env files [string]
344
- -h, --help Show help [boolean]
345
- -v, --version Show version number [boolean]"
494
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
495
+ -c, --config Path to .toml configuration file [string]
496
+ -e, --env Environment to use for operations and .env files [string]
497
+ -h, --help Show help [boolean]
498
+ -v, --version Show version number [boolean]"
346
499
  `);
347
500
  });
348
501
 
349
502
  it("should delete a consumer with no --env", async () => {
350
- mockDeleteRequest("testQueue", "testScript");
503
+ const requests = mockDeleteRequest("testQueue", "testScript");
351
504
  await runWrangler("queues consumer remove testQueue testScript");
505
+
506
+ expect(requests.count).toEqual(1);
352
507
  expect(std.out).toMatchInlineSnapshot(`
353
508
  "Removing consumer from queue testQueue.
354
509
  Removed consumer from queue testQueue."
@@ -356,10 +511,16 @@ describe("wrangler", () => {
356
511
  });
357
512
 
358
513
  it("should delete a consumer with --env", async () => {
359
- mockDeleteRequest("testQueue", "testScript", "myEnv");
514
+ const requests = mockDeleteRequest(
515
+ "testQueue",
516
+ "testScript",
517
+ "myEnv"
518
+ );
360
519
  await runWrangler(
361
520
  "queues consumer remove testQueue testScript --env myEnv"
362
521
  );
522
+
523
+ expect(requests.count).toEqual(1);
363
524
  expect(std.out).toMatchInlineSnapshot(`
364
525
  "Removing consumer from queue testQueue.
365
526
  Removed consumer from queue testQueue."
@@ -4,7 +4,7 @@ import prettyBytes from "pretty-bytes";
4
4
  import { MAX_UPLOAD_SIZE } from "../r2/constants";
5
5
  import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
6
6
  import { mockConsoleMethods } from "./helpers/mock-console";
7
- import { msw, mswSuccessR2handlers } from "./helpers/msw";
7
+ import { createFetchResult, msw, mswSuccessR2handlers } from "./helpers/msw";
8
8
  import { runInTempDir } from "./helpers/run-in-tmp";
9
9
  import { runWrangler } from "./helpers/run-wrangler";
10
10
  import type { R2BucketInfo } from "../r2/helpers";
@@ -39,10 +39,11 @@ describe("r2", () => {
39
39
  wrangler r2 bucket delete <name> Delete an R2 bucket
40
40
 
41
41
  Flags:
42
- -c, --config Path to .toml configuration file [string]
43
- -e, --env Environment to use for operations and .env files [string]
44
- -h, --help Show help [boolean]
45
- -v, --version Show version number [boolean]"
42
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
43
+ -c, --config Path to .toml configuration file [string]
44
+ -e, --env Environment to use for operations and .env files [string]
45
+ -h, --help Show help [boolean]
46
+ -v, --version Show version number [boolean]"
46
47
  `);
47
48
  });
48
49
 
@@ -60,12 +61,8 @@ describe("r2", () => {
60
61
  expect(accountId).toEqual("some-account-id");
61
62
  expect(await request.text()).toEqual("");
62
63
  return response.once(
63
- context.status(200),
64
- context.json({
65
- success: true,
66
- errors: [],
67
- messages: [],
68
- result: {
64
+ context.json(
65
+ createFetchResult({
69
66
  buckets: [
70
67
  {
71
68
  name: "bucket-1-local-once",
@@ -76,8 +73,8 @@ describe("r2", () => {
76
73
  creation_date: "01-01-2001",
77
74
  },
78
75
  ],
79
- },
80
- })
76
+ })
77
+ )
81
78
  );
82
79
  }
83
80
  )
@@ -107,10 +104,11 @@ describe("r2", () => {
107
104
  name The name of the new bucket [string] [required]
108
105
 
109
106
  Flags:
110
- -c, --config Path to .toml configuration file [string]
111
- -e, --env Environment to use for operations and .env files [string]
112
- -h, --help Show help [boolean]
113
- -v, --version Show version number [boolean]"
107
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
108
+ -c, --config Path to .toml configuration file [string]
109
+ -e, --env Environment to use for operations and .env files [string]
110
+ -h, --help Show help [boolean]
111
+ -v, --version Show version number [boolean]"
114
112
  `);
115
113
  expect(std.err).toMatchInlineSnapshot(`
116
114
  "X [ERROR] Not enough non-option arguments: got 0, need at least 1
@@ -135,10 +133,11 @@ describe("r2", () => {
135
133
  name The name of the new bucket [string] [required]
136
134
 
137
135
  Flags:
138
- -c, --config Path to .toml configuration file [string]
139
- -e, --env Environment to use for operations and .env files [string]
140
- -h, --help Show help [boolean]
141
- -v, --version Show version number [boolean]"
136
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
137
+ -c, --config Path to .toml configuration file [string]
138
+ -e, --env Environment to use for operations and .env files [string]
139
+ -h, --help Show help [boolean]
140
+ -v, --version Show version number [boolean]"
142
141
  `);
143
142
  expect(std.err).toMatchInlineSnapshot(`
144
143
  "X [ERROR] Unknown arguments: def, ghi
@@ -155,15 +154,7 @@ describe("r2", () => {
155
154
  const { accountId } = request.params;
156
155
  expect(accountId).toEqual("some-account-id");
157
156
  expect(await request.json()).toEqual({ name: "testBucket" });
158
- response.once(
159
- context.status(200),
160
- context.json({
161
- success: true,
162
- errors: [],
163
- messages: [],
164
- result: {},
165
- })
166
- );
157
+ return response.once(context.json(createFetchResult({})));
167
158
  }
168
159
  )
169
160
  );
@@ -192,10 +183,11 @@ describe("r2", () => {
192
183
  name The name of the bucket to delete [string] [required]
193
184
 
194
185
  Flags:
195
- -c, --config Path to .toml configuration file [string]
196
- -e, --env Environment to use for operations and .env files [string]
197
- -h, --help Show help [boolean]
198
- -v, --version Show version number [boolean]"
186
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
187
+ -c, --config Path to .toml configuration file [string]
188
+ -e, --env Environment to use for operations and .env files [string]
189
+ -h, --help Show help [boolean]
190
+ -v, --version Show version number [boolean]"
199
191
  `);
200
192
  expect(std.err).toMatchInlineSnapshot(`
201
193
  "X [ERROR] Not enough non-option arguments: got 0, need at least 1
@@ -220,10 +212,11 @@ describe("r2", () => {
220
212
  name The name of the bucket to delete [string] [required]
221
213
 
222
214
  Flags:
223
- -c, --config Path to .toml configuration file [string]
224
- -e, --env Environment to use for operations and .env files [string]
225
- -h, --help Show help [boolean]
226
- -v, --version Show version number [boolean]"
215
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
216
+ -c, --config Path to .toml configuration file [string]
217
+ -e, --env Environment to use for operations and .env files [string]
218
+ -h, --help Show help [boolean]
219
+ -v, --version Show version number [boolean]"
227
220
  `);
228
221
  expect(std.err).toMatchInlineSnapshot(`
229
222
  "X [ERROR] Unknown arguments: def, ghi
@@ -245,15 +238,7 @@ describe("r2", () => {
245
238
  "Bearer some-api-token"
246
239
  );
247
240
 
248
- return response.once(
249
- context.status(200),
250
- context.json({
251
- success: true,
252
- errors: [],
253
- messages: [],
254
- result: null,
255
- })
256
- );
241
+ return response.once(context.json(createFetchResult(null)));
257
242
  }
258
243
  )
259
244
  );
@@ -332,18 +317,14 @@ describe("r2", () => {
332
317
  "host": "api.cloudflare.com",
333
318
  }
334
319
  `);
335
- response.once(
336
- context.status(200),
337
- context.json({
338
- success: true,
339
- errors: [],
340
- messages: [],
341
- result: {
320
+ return response.once(
321
+ context.json(
322
+ createFetchResult({
342
323
  accountId: "some-account-id",
343
324
  bucketName: "bucketName-object-test",
344
325
  objectName: "wormhole-img.png",
345
- },
346
- })
326
+ })
327
+ )
347
328
  );
348
329
  }
349
330
  )