wrangler 0.0.0-e7a0cd5b → 0.0.0-e7cf0caa

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 (237) 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 +27 -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 -86
  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 -56
  15. package/src/__tests__/dev.test.tsx +198 -90
  16. package/src/__tests__/generate.test.ts +12 -10
  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 +128 -27
  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 +1615 -852
  61. package/src/__tests__/pubsub.test.ts +226 -100
  62. package/src/__tests__/queues.test.ts +238 -77
  63. package/src/__tests__/r2.test.ts +55 -57
  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 +43 -26
  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 +263 -140
  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 +79 -24
  87. package/src/config/index.ts +99 -38
  88. package/src/config/validation-helpers.ts +1 -1
  89. package/src/config/validation.ts +248 -19
  90. package/src/create-worker-preview.ts +19 -8
  91. package/src/create-worker-upload-form.ts +60 -22
  92. package/src/d1/backups.tsx +43 -42
  93. package/src/d1/constants.ts +2 -0
  94. package/src/d1/create.tsx +44 -30
  95. package/src/d1/{delete.tsx → delete.ts} +11 -14
  96. package/src/d1/execute.tsx +209 -151
  97. package/src/d1/index.ts +31 -7
  98. package/src/d1/list.tsx +22 -10
  99. package/src/d1/migrations/apply.tsx +212 -0
  100. package/src/d1/migrations/create.tsx +79 -0
  101. package/src/d1/migrations/helpers.ts +172 -0
  102. package/src/d1/migrations/index.ts +3 -0
  103. package/src/d1/migrations/list.tsx +95 -0
  104. package/src/d1/migrations/options.ts +23 -0
  105. package/src/d1/options.ts +12 -2
  106. package/src/d1/splitter.ts +161 -0
  107. package/src/d1/{types.tsx → types.ts} +11 -0
  108. package/src/d1/utils.ts +12 -2
  109. package/src/delete.ts +8 -16
  110. package/src/deployments.ts +340 -46
  111. package/src/deprecated/index.ts +8 -302
  112. package/src/dev/dev.tsx +57 -44
  113. package/src/dev/local.tsx +294 -91
  114. package/src/dev/remote.tsx +32 -3
  115. package/src/dev/start-server.ts +89 -68
  116. package/src/dev/use-esbuild.ts +17 -18
  117. package/src/dev/validate-dev-props.ts +9 -0
  118. package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
  119. package/src/dev.tsx +178 -118
  120. package/src/dialogs.ts +136 -0
  121. package/src/dispatch-namespace.ts +21 -17
  122. package/src/docs/index.ts +97 -0
  123. package/src/entry.ts +19 -11
  124. package/src/environment-variables/factory.ts +88 -0
  125. package/src/environment-variables/misc-variables.ts +30 -0
  126. package/src/generate/index.ts +298 -0
  127. package/src/git-client.ts +15 -4
  128. package/src/{index.tsx → index.ts} +137 -63
  129. package/src/init.ts +249 -187
  130. package/src/inspect.ts +16 -1
  131. package/src/jest.d.ts +4 -0
  132. package/src/kv/index.ts +15 -17
  133. package/src/logger.ts +32 -5
  134. package/src/metrics/metrics-config.ts +3 -3
  135. package/src/metrics/send-event.ts +6 -1
  136. package/src/miniflare-cli/assets.ts +64 -28
  137. package/src/miniflare-cli/index.ts +4 -7
  138. package/src/miniflare-cli/tsconfig.json +9 -0
  139. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  140. package/src/miniflare-cli/types.ts +11 -0
  141. package/src/module-collection.ts +91 -25
  142. package/src/mtls-certificate/cli.ts +155 -0
  143. package/src/pages/build.ts +410 -0
  144. package/src/pages/buildFunctions.ts +140 -0
  145. package/src/pages/deployment-tails.ts +281 -0
  146. package/src/pages/deployments.tsx +11 -33
  147. package/src/pages/{dev.tsx → dev.ts} +147 -124
  148. package/src/pages/errors.ts +1 -0
  149. package/src/pages/functions/buildPlugin.ts +72 -69
  150. package/src/pages/functions/buildWorker.ts +249 -114
  151. package/src/pages/functions/tsconfig.json +8 -0
  152. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  153. package/src/pages/{functions.tsx → functions.ts} +8 -4
  154. package/src/pages/{index.tsx → index.ts} +11 -3
  155. package/src/pages/projects.tsx +12 -22
  156. package/src/pages/prompt-select-project.tsx +31 -0
  157. package/src/pages/publish.tsx +45 -214
  158. package/src/pages/types.ts +6 -9
  159. package/src/pages/upload.tsx +58 -14
  160. package/src/pages/utils.ts +14 -3
  161. package/src/parse.ts +23 -1
  162. package/src/paths.ts +1 -1
  163. package/src/proxy.ts +5 -0
  164. package/src/publish/index.ts +20 -16
  165. package/src/publish/publish.ts +72 -47
  166. package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
  167. package/src/queues/cli/commands/consumer/add.ts +24 -24
  168. package/src/queues/cli/commands/consumer/index.ts +3 -6
  169. package/src/queues/cli/commands/consumer/remove.ts +11 -18
  170. package/src/queues/cli/commands/create.ts +8 -8
  171. package/src/queues/cli/commands/delete.ts +8 -8
  172. package/src/queues/cli/commands/index.ts +6 -4
  173. package/src/queues/cli/commands/list.ts +8 -8
  174. package/src/queues/client.ts +1 -0
  175. package/src/queues/utils.ts +18 -0
  176. package/src/r2/constants.ts +4 -0
  177. package/src/r2/helpers.ts +1 -0
  178. package/src/r2/index.ts +40 -28
  179. package/src/secret/index.ts +14 -17
  180. package/src/{sites.tsx → sites.ts} +1 -1
  181. package/src/tail/createTail.ts +94 -3
  182. package/src/tail/filters.ts +1 -1
  183. package/src/tail/index.ts +8 -11
  184. package/src/tail/printing.ts +15 -0
  185. package/src/traverse-module-graph.ts +53 -0
  186. package/src/tsconfig-sanity.ts +16 -0
  187. package/src/type-generation.ts +79 -57
  188. package/src/user/access.ts +0 -1
  189. package/src/user/auth-variables.ts +113 -0
  190. package/src/user/choose-account.tsx +1 -31
  191. package/src/user/index.ts +0 -1
  192. package/src/user/{user.tsx → user.ts} +123 -82
  193. package/src/utils/render.ts +93 -0
  194. package/src/{whoami.tsx → whoami.ts} +37 -71
  195. package/src/worker.ts +35 -3
  196. package/src/yargs-types.ts +22 -5
  197. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  198. package/templates/__tests__/tsconfig.json +8 -0
  199. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  200. package/templates/checked-fetch.js +9 -3
  201. package/templates/d1-beta-facade.js +95 -25
  202. package/templates/facade.d.ts +14 -0
  203. package/templates/first-party-worker-module-facade.ts +4 -3
  204. package/templates/format-dev-errors.ts +8 -6
  205. package/templates/gitignore +1 -0
  206. package/templates/init-tests/test-jest-new-worker.js +3 -5
  207. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  208. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  209. package/templates/middleware/loader-modules.ts +2 -2
  210. package/templates/middleware/loader-sw.ts +51 -31
  211. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  212. package/templates/new-worker.ts +3 -0
  213. package/templates/pages-dev-pipeline.ts +4 -1
  214. package/templates/pages-shim.ts +4 -1
  215. package/templates/pages-template-plugin.ts +19 -10
  216. package/templates/serve-static-assets.ts +17 -14
  217. package/templates/service-bindings-module-facade.js +1 -0
  218. package/templates/tsconfig-sanity.ts +11 -0
  219. package/templates/tsconfig.init.json +105 -0
  220. package/templates/tsconfig.json +5 -103
  221. package/templates/tsconfig.tsbuildinfo +1 -0
  222. package/wrangler-dist/cli.d.ts +826 -77
  223. package/wrangler-dist/cli.js +130734 -140838
  224. package/wrangler-dist/wasm-sync.wasm +0 -0
  225. package/src/__tests__/api-devregistry.test.js +0 -57
  226. package/src/__tests__/d1.test.ts +0 -72
  227. package/src/__tests__/dialogs.test.tsx +0 -40
  228. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  229. package/src/__tests__/pages.test.ts +0 -2223
  230. package/src/dialogs.tsx +0 -163
  231. package/src/environment-variables.ts +0 -50
  232. package/src/pages/build.tsx +0 -238
  233. package/src/user/env-vars.ts +0 -46
  234. package/templates/experimental-local-cache-stubs.js +0 -27
  235. /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
  236. /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
  237. /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");
@@ -22,7 +19,7 @@ describe("wrangler", () => {
22
19
  expect(std.out).toMatchInlineSnapshot(`
23
20
  "wrangler queues
24
21
 
25
- 🆀 Configure Workers Queues
22
+ 🇶 Configure Workers Queues
26
23
 
27
24
  Commands:
28
25
  wrangler queues list List Queues
@@ -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."
@@ -1,8 +1,10 @@
1
1
  import * as fs from "node:fs";
2
2
  import { rest } from "msw";
3
+ import prettyBytes from "pretty-bytes";
4
+ import { MAX_UPLOAD_SIZE } from "../r2/constants";
3
5
  import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
4
6
  import { mockConsoleMethods } from "./helpers/mock-console";
5
- import { msw, mswSuccessR2handlers } from "./helpers/msw";
7
+ import { createFetchResult, msw, mswSuccessR2handlers } from "./helpers/msw";
6
8
  import { runInTempDir } from "./helpers/run-in-tmp";
7
9
  import { runWrangler } from "./helpers/run-wrangler";
8
10
  import type { R2BucketInfo } from "../r2/helpers";
@@ -37,10 +39,11 @@ describe("r2", () => {
37
39
  wrangler r2 bucket delete <name> Delete an R2 bucket
38
40
 
39
41
  Flags:
40
- -c, --config Path to .toml configuration file [string]
41
- -e, --env Environment to use for operations and .env files [string]
42
- -h, --help Show help [boolean]
43
- -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]"
44
47
  `);
45
48
  });
46
49
 
@@ -58,12 +61,8 @@ describe("r2", () => {
58
61
  expect(accountId).toEqual("some-account-id");
59
62
  expect(await request.text()).toEqual("");
60
63
  return response.once(
61
- context.status(200),
62
- context.json({
63
- success: true,
64
- errors: [],
65
- messages: [],
66
- result: {
64
+ context.json(
65
+ createFetchResult({
67
66
  buckets: [
68
67
  {
69
68
  name: "bucket-1-local-once",
@@ -74,8 +73,8 @@ describe("r2", () => {
74
73
  creation_date: "01-01-2001",
75
74
  },
76
75
  ],
77
- },
78
- })
76
+ })
77
+ )
79
78
  );
80
79
  }
81
80
  )
@@ -105,10 +104,11 @@ describe("r2", () => {
105
104
  name The name of the new bucket [string] [required]
106
105
 
107
106
  Flags:
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]"
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]"
112
112
  `);
113
113
  expect(std.err).toMatchInlineSnapshot(`
114
114
  "X [ERROR] Not enough non-option arguments: got 0, need at least 1
@@ -133,10 +133,11 @@ describe("r2", () => {
133
133
  name The name of the new bucket [string] [required]
134
134
 
135
135
  Flags:
136
- -c, --config Path to .toml configuration file [string]
137
- -e, --env Environment to use for operations and .env files [string]
138
- -h, --help Show help [boolean]
139
- -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]"
140
141
  `);
141
142
  expect(std.err).toMatchInlineSnapshot(`
142
143
  "X [ERROR] Unknown arguments: def, ghi
@@ -153,15 +154,7 @@ describe("r2", () => {
153
154
  const { accountId } = request.params;
154
155
  expect(accountId).toEqual("some-account-id");
155
156
  expect(await request.json()).toEqual({ name: "testBucket" });
156
- response.once(
157
- context.status(200),
158
- context.json({
159
- success: true,
160
- errors: [],
161
- messages: [],
162
- result: {},
163
- })
164
- );
157
+ return response.once(context.json(createFetchResult({})));
165
158
  }
166
159
  )
167
160
  );
@@ -190,10 +183,11 @@ describe("r2", () => {
190
183
  name The name of the bucket to delete [string] [required]
191
184
 
192
185
  Flags:
193
- -c, --config Path to .toml configuration file [string]
194
- -e, --env Environment to use for operations and .env files [string]
195
- -h, --help Show help [boolean]
196
- -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]"
197
191
  `);
198
192
  expect(std.err).toMatchInlineSnapshot(`
199
193
  "X [ERROR] Not enough non-option arguments: got 0, need at least 1
@@ -218,10 +212,11 @@ describe("r2", () => {
218
212
  name The name of the bucket to delete [string] [required]
219
213
 
220
214
  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]"
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]"
225
220
  `);
226
221
  expect(std.err).toMatchInlineSnapshot(`
227
222
  "X [ERROR] Unknown arguments: def, ghi
@@ -243,15 +238,7 @@ describe("r2", () => {
243
238
  "Bearer some-api-token"
244
239
  );
245
240
 
246
- return response.once(
247
- context.status(200),
248
- context.json({
249
- success: true,
250
- errors: [],
251
- messages: [],
252
- result: null,
253
- })
254
- );
241
+ return response.once(context.json(createFetchResult(null)));
255
242
  }
256
243
  )
257
244
  );
@@ -276,7 +263,7 @@ describe("r2", () => {
276
263
  `);
277
264
  });
278
265
 
279
- it("should upload R2 object from bucket", async () => {
266
+ it("should upload R2 object to bucket", async () => {
280
267
  fs.writeFileSync("wormhole-img.png", "passageway");
281
268
  await runWrangler(
282
269
  `r2 object put bucketName-object-test/wormhole-img.png --file ./wormhole-img.png`
@@ -288,6 +275,21 @@ describe("r2", () => {
288
275
  `);
289
276
  });
290
277
 
278
+ it("should fail to upload R2 object to bucket if too large", async () => {
279
+ const TOO_BIG_FILE_SIZE = MAX_UPLOAD_SIZE + 1024 * 1024;
280
+ fs.writeFileSync("wormhole-img.png", Buffer.alloc(TOO_BIG_FILE_SIZE));
281
+ await expect(
282
+ runWrangler(
283
+ `r2 object put bucketName-object-test/wormhole-img.png --file ./wormhole-img.png`
284
+ )
285
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
286
+ "Error: Wrangler only supports uploading files up to ${prettyBytes(
287
+ MAX_UPLOAD_SIZE
288
+ )} in size
289
+ wormhole-img.png is ${prettyBytes(TOO_BIG_FILE_SIZE)} in size"
290
+ `);
291
+ });
292
+
291
293
  it("should pass all fetch option flags into requestInit & check request inputs", async () => {
292
294
  msw.use(
293
295
  rest.put(
@@ -315,18 +317,14 @@ describe("r2", () => {
315
317
  "host": "api.cloudflare.com",
316
318
  }
317
319
  `);
318
- response.once(
319
- context.status(200),
320
- context.json({
321
- success: true,
322
- errors: [],
323
- messages: [],
324
- result: {
320
+ return response.once(
321
+ context.json(
322
+ createFetchResult({
325
323
  accountId: "some-account-id",
326
324
  bucketName: "bucketName-object-test",
327
325
  objectName: "wormhole-img.png",
328
- },
329
- })
326
+ })
327
+ )
330
328
  );
331
329
  }
332
330
  )