wrangler 0.0.0-e64812e → 0.0.0-e8e684c7

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 (214) hide show
  1. package/README.md +27 -3
  2. package/bin/wrangler.js +150 -62
  3. package/kv-asset-handler.js +1 -0
  4. package/miniflare-dist/index.mjs +663 -7
  5. package/package.json +173 -152
  6. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  7. package/src/__tests__/config-cache.test.ts +30 -24
  8. package/src/__tests__/configuration.test.ts +4015 -3363
  9. package/src/__tests__/dev.test.tsx +1290 -952
  10. package/src/__tests__/generate.test.ts +91 -0
  11. package/src/__tests__/guess-worker-format.test.ts +68 -68
  12. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  13. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  14. package/src/__tests__/helpers/mock-bin.ts +20 -20
  15. package/src/__tests__/helpers/mock-cfetch.ts +179 -94
  16. package/src/__tests__/helpers/mock-console.ts +49 -39
  17. package/src/__tests__/helpers/mock-dialogs.ts +94 -71
  18. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
  19. package/src/__tests__/helpers/mock-http-server.ts +30 -30
  20. package/src/__tests__/helpers/mock-istty.ts +65 -18
  21. package/src/__tests__/helpers/mock-known-routes.ts +7 -0
  22. package/src/__tests__/helpers/mock-kv.ts +26 -26
  23. package/src/__tests__/helpers/mock-oauth-flow.ts +223 -228
  24. package/src/__tests__/helpers/mock-process.ts +39 -0
  25. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  26. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  27. package/src/__tests__/helpers/run-in-tmp.ts +27 -28
  28. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  29. package/src/__tests__/helpers/write-worker-source.ts +16 -16
  30. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  31. package/src/__tests__/https-options.test.ts +142 -109
  32. package/src/__tests__/index.test.ts +222 -233
  33. package/src/__tests__/init.test.ts +2139 -1603
  34. package/src/__tests__/jest.setup.ts +114 -34
  35. package/src/__tests__/kv.test.ts +1222 -1032
  36. package/src/__tests__/logger.test.ts +100 -74
  37. package/src/__tests__/metrics.test.ts +450 -0
  38. package/src/__tests__/package-manager.test.ts +303 -303
  39. package/src/__tests__/pages.test.ts +1173 -652
  40. package/src/__tests__/parse.test.ts +252 -252
  41. package/src/__tests__/publish.test.ts +6788 -5301
  42. package/src/__tests__/pubsub.test.ts +367 -0
  43. package/src/__tests__/r2.test.ts +328 -225
  44. package/src/__tests__/route.test.ts +18 -18
  45. package/src/__tests__/secret.test.ts +470 -459
  46. package/src/__tests__/tail.test.ts +676 -564
  47. package/src/__tests__/test-old-node-version.js +31 -0
  48. package/src/__tests__/user.test.ts +136 -112
  49. package/src/__tests__/validate-dev-props.test.ts +56 -0
  50. package/src/__tests__/version.test.ts +35 -0
  51. package/src/__tests__/whoami.test.tsx +267 -83
  52. package/src/__tests__/worker-namespace.test.ts +329 -0
  53. package/src/abort.d.ts +1 -1
  54. package/src/api/dev.ts +93 -0
  55. package/src/api/index.ts +1 -0
  56. package/src/bundle-reporter.tsx +29 -0
  57. package/src/bundle.ts +430 -157
  58. package/src/cfetch/index.ts +80 -80
  59. package/src/cfetch/internal.ts +244 -91
  60. package/src/cli.ts +21 -7
  61. package/src/config/config.ts +224 -195
  62. package/src/config/diagnostics.ts +61 -61
  63. package/src/config/environment.ts +422 -357
  64. package/src/config/index.ts +219 -193
  65. package/src/config/validation-helpers.ts +379 -357
  66. package/src/config/validation.ts +1690 -1367
  67. package/src/config-cache.ts +81 -41
  68. package/src/create-worker-preview.ts +208 -136
  69. package/src/create-worker-upload-form.ts +275 -238
  70. package/src/dev/dev-vars.ts +13 -13
  71. package/src/dev/dev.tsx +477 -351
  72. package/src/dev/local.tsx +426 -295
  73. package/src/dev/remote.tsx +406 -211
  74. package/src/dev/use-esbuild.ts +154 -94
  75. package/src/dev/validate-dev-props.ts +31 -0
  76. package/src/dev-registry.tsx +160 -0
  77. package/src/dev.tsx +696 -0
  78. package/src/dialogs.tsx +97 -97
  79. package/src/dispatch-namespace.ts +206 -0
  80. package/src/durable.ts +87 -87
  81. package/src/entry.ts +234 -228
  82. package/src/environment-variables.ts +23 -23
  83. package/src/errors.ts +6 -6
  84. package/src/faye-websocket.d.ts +6 -0
  85. package/src/generate.ts +131 -0
  86. package/src/git-client.ts +42 -0
  87. package/src/global-wrangler-config-path.ts +26 -0
  88. package/src/https-options.ts +84 -80
  89. package/src/index.tsx +2164 -2768
  90. package/src/init.ts +622 -0
  91. package/src/inspect.ts +678 -593
  92. package/src/intl-polyfill.d.ts +123 -123
  93. package/src/is-ci.ts +14 -0
  94. package/src/is-interactive.ts +12 -0
  95. package/src/kv.ts +299 -277
  96. package/src/logger.ts +46 -39
  97. package/src/metrics/index.ts +5 -0
  98. package/src/metrics/metrics-config.ts +239 -0
  99. package/src/metrics/metrics-dispatcher.ts +96 -0
  100. package/src/metrics/metrics-usage-headers.ts +24 -0
  101. package/src/metrics/send-event.ts +92 -0
  102. package/src/miniflare-cli/assets.ts +554 -0
  103. package/src/miniflare-cli/enum-keys.ts +8 -8
  104. package/src/miniflare-cli/index.ts +198 -32
  105. package/src/miniflare-cli/request-context.ts +18 -18
  106. package/src/module-collection.ts +212 -212
  107. package/src/open-in-browser.ts +4 -6
  108. package/src/package-manager.ts +173 -128
  109. package/src/pages/build.tsx +238 -0
  110. package/src/pages/constants.ts +12 -0
  111. package/src/pages/deployments.tsx +106 -0
  112. package/src/pages/dev.tsx +528 -0
  113. package/src/pages/errors.ts +22 -0
  114. package/src/pages/functions/buildPlugin.ts +109 -0
  115. package/src/pages/functions/buildWorker.ts +155 -0
  116. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  117. package/src/pages/functions/filepath-routing.ts +189 -0
  118. package/src/pages/functions/identifiers.ts +78 -0
  119. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  120. package/src/pages/functions/routes-consolidation.ts +73 -0
  121. package/src/pages/functions/routes-transformation.test.ts +271 -0
  122. package/src/pages/functions/routes-transformation.ts +122 -0
  123. package/src/pages/functions/routes.ts +151 -0
  124. package/src/pages/functions.tsx +96 -0
  125. package/src/pages/index.tsx +94 -0
  126. package/src/pages/projects.tsx +169 -0
  127. package/src/pages/publish.tsx +391 -0
  128. package/src/pages/types.ts +49 -0
  129. package/src/pages/upload.tsx +413 -0
  130. package/src/pages/utils.ts +12 -0
  131. package/src/parse.ts +209 -125
  132. package/src/paths.ts +6 -6
  133. package/src/preview.ts +31 -0
  134. package/src/proxy.ts +410 -389
  135. package/src/publish.ts +773 -534
  136. package/src/pubsub/index.ts +286 -0
  137. package/src/pubsub/pubsub-commands.tsx +623 -0
  138. package/src/r2.ts +100 -19
  139. package/src/selfsigned.d.ts +23 -23
  140. package/src/sites.tsx +278 -201
  141. package/src/tail/filters.ts +111 -109
  142. package/src/tail/index.ts +230 -217
  143. package/src/tail/printing.ts +86 -46
  144. package/src/update-check.ts +11 -11
  145. package/src/user/choose-account.tsx +69 -0
  146. package/src/user/env-vars.ts +46 -0
  147. package/src/user/generate-auth-url.ts +33 -0
  148. package/src/user/generate-random-state.ts +16 -0
  149. package/src/user/index.ts +3 -0
  150. package/src/user/user.tsx +1191 -0
  151. package/src/whoami.tsx +141 -42
  152. package/src/worker.ts +123 -99
  153. package/src/zones.ts +167 -0
  154. package/templates/checked-fetch.js +17 -0
  155. package/templates/first-party-worker-module-facade.ts +18 -0
  156. package/templates/format-dev-errors.ts +32 -0
  157. package/templates/new-worker-scheduled.js +3 -3
  158. package/templates/new-worker-scheduled.ts +15 -15
  159. package/templates/new-worker.js +3 -3
  160. package/templates/new-worker.ts +15 -15
  161. package/templates/no-op-worker.js +10 -0
  162. package/templates/pages-shim.ts +9 -0
  163. package/templates/pages-template-plugin.ts +167 -0
  164. package/templates/pages-template-worker.ts +172 -0
  165. package/templates/serve-static-assets.ts +63 -0
  166. package/templates/service-bindings-module-facade.js +54 -0
  167. package/templates/service-bindings-sw-facade.js +42 -0
  168. package/templates/tsconfig.json +95 -95
  169. package/wrangler-dist/cli.d.ts +338 -0
  170. package/wrangler-dist/cli.js +95449 -67524
  171. package/pages/functions/buildPlugin.ts +0 -105
  172. package/pages/functions/buildWorker.ts +0 -151
  173. package/pages/functions/filepath-routing.ts +0 -189
  174. package/pages/functions/identifiers.ts +0 -78
  175. package/pages/functions/routes.ts +0 -156
  176. package/pages/functions/template-plugin.ts +0 -147
  177. package/pages/functions/template-worker.ts +0 -143
  178. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  179. package/src/pages.tsx +0 -2038
  180. package/src/user.tsx +0 -1203
  181. package/templates/static-asset-facade.js +0 -47
  182. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  183. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  184. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  185. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  186. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  187. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  188. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  189. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  190. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  191. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  192. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  193. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  194. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  195. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  196. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  197. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  198. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  199. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  200. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  201. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  202. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  203. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  204. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  205. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  206. package/vendor/wrangler-mime/LICENSE +0 -21
  207. package/vendor/wrangler-mime/Mime.js +0 -97
  208. package/vendor/wrangler-mime/README.md +0 -187
  209. package/vendor/wrangler-mime/cli.js +0 -46
  210. package/vendor/wrangler-mime/index.js +0 -4
  211. package/vendor/wrangler-mime/lite.js +0 -4
  212. package/vendor/wrangler-mime/package.json +0 -52
  213. package/vendor/wrangler-mime/types/other.js +0 -1
  214. package/vendor/wrangler-mime/types/standard.js +0 -1
@@ -1,233 +1,336 @@
1
+ import * as fs from "node:fs";
1
2
  import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
2
- import { setMockResponse, unsetAllMocks } from "./helpers/mock-cfetch";
3
+ import {
4
+ setMockFetchR2Objects,
5
+ setMockResponse,
6
+ unsetAllMocks,
7
+ } from "./helpers/mock-cfetch";
3
8
  import { mockConsoleMethods } from "./helpers/mock-console";
4
9
  import { runInTempDir } from "./helpers/run-in-tmp";
5
10
  import { runWrangler } from "./helpers/run-wrangler";
6
11
  import type { R2BucketInfo } from "../r2";
7
12
 
8
13
  describe("wrangler", () => {
9
- mockAccountId();
10
- mockApiToken();
11
- runInTempDir();
12
- const std = mockConsoleMethods();
13
-
14
- afterEach(() => {
15
- unsetAllMocks();
16
- });
17
-
18
- describe("r2", () => {
19
- describe("bucket", () => {
20
- it("should show the correct help when an invalid command is passed", async () => {
21
- await expect(() =>
22
- runWrangler("r2 bucket foo")
23
- ).rejects.toThrowErrorMatchingInlineSnapshot(`"Unknown argument: foo"`);
24
- expect(std.err).toMatchInlineSnapshot(`
25
- "X [ERROR] Unknown argument: foo
26
-
27
- "
28
- `);
29
- expect(std.out).toMatchInlineSnapshot(`
30
- "
31
- wrangler r2 bucket
32
-
33
- Manage R2 buckets
34
-
35
- Commands:
36
- wrangler r2 bucket create <name> Create a new R2 bucket
37
- wrangler r2 bucket list List R2 buckets
38
- wrangler r2 bucket delete <name> Delete an R2 bucket
39
-
40
- Flags:
41
- -c, --config Path to .toml configuration file [string]
42
- -h, --help Show help [boolean]
43
- -v, --version Show version number [boolean]"
44
- `);
45
- });
46
-
47
- describe("list", () => {
48
- function mockListRequest(buckets: R2BucketInfo[]) {
49
- const requests = { count: 0 };
50
- setMockResponse(
51
- "/accounts/:accountId/r2/buckets",
52
- ([_url, accountId], init) => {
53
- requests.count++;
54
- expect(accountId).toEqual("some-account-id");
55
- expect(init).toEqual({});
56
- return { buckets };
57
- }
58
- );
59
- return requests;
60
- }
61
-
62
- it("should list buckets", async () => {
63
- const expectedBuckets: R2BucketInfo[] = [
64
- { name: "bucket-1", creation_date: "01-01-2001" },
65
- { name: "bucket-2", creation_date: "01-01-2001" },
66
- ];
67
- mockListRequest(expectedBuckets);
68
- await runWrangler("r2 bucket list");
69
-
70
- expect(std.err).toMatchInlineSnapshot(`""`);
71
- const buckets = JSON.parse(std.out);
72
- expect(buckets).toEqual(expectedBuckets);
73
- });
74
- });
75
-
76
- describe("create", () => {
77
- function mockCreateRequest(expectedBucketName: string) {
78
- const requests = { count: 0 };
79
- setMockResponse(
80
- "/accounts/:accountId/r2/buckets/:bucketName",
81
- "PUT",
82
- ([_url, accountId, bucketName]) => {
83
- expect(accountId).toEqual("some-account-id");
84
- expect(bucketName).toEqual(expectedBucketName);
85
- requests.count += 1;
86
- }
87
- );
88
- return requests;
89
- }
90
-
91
- it("should error if no bucket name is given", async () => {
92
- await expect(
93
- runWrangler("r2 bucket create")
94
- ).rejects.toThrowErrorMatchingInlineSnapshot(
95
- `"Not enough non-option arguments: got 0, need at least 1"`
96
- );
97
- expect(std.out).toMatchInlineSnapshot(`
98
- "
99
- wrangler r2 bucket create <name>
100
-
101
- Create a new R2 bucket
102
-
103
- Positionals:
104
- name The name of the new bucket [string] [required]
105
-
106
- Flags:
107
- -c, --config Path to .toml configuration file [string]
108
- -h, --help Show help [boolean]
109
- -v, --version Show version number [boolean]"
110
- `);
111
- expect(std.err).toMatchInlineSnapshot(`
112
- "X [ERROR] Not enough non-option arguments: got 0, need at least 1
113
-
114
- "
115
- `);
116
- });
117
-
118
- it("should error if the bucket to create contains spaces", async () => {
119
- await expect(
120
- runWrangler("r2 bucket create abc def ghi")
121
- ).rejects.toThrowErrorMatchingInlineSnapshot(
122
- `"Unknown arguments: def, ghi"`
123
- );
124
- expect(std.out).toMatchInlineSnapshot(`
125
- "
126
- wrangler r2 bucket create <name>
127
-
128
- Create a new R2 bucket
129
-
130
- Positionals:
131
- name The name of the new bucket [string] [required]
132
-
133
- Flags:
134
- -c, --config Path to .toml configuration file [string]
135
- -h, --help Show help [boolean]
136
- -v, --version Show version number [boolean]"
137
- `);
138
- expect(std.err).toMatchInlineSnapshot(`
139
- "X [ERROR] Unknown arguments: def, ghi
140
-
141
- "
142
- `);
143
- });
144
-
145
- it("should create a bucket", async () => {
146
- const requests = mockCreateRequest("testBucket");
147
- await runWrangler("r2 bucket create testBucket");
148
- expect(std.out).toMatchInlineSnapshot(`
149
- "Creating bucket testBucket.
150
- Created bucket testBucket."
151
- `);
152
- expect(requests.count).toEqual(1);
153
- });
154
- });
155
-
156
- describe("delete", () => {
157
- function mockDeleteRequest(expectedBucketName: string) {
158
- const requests = { count: 0 };
159
- setMockResponse(
160
- "/accounts/:accountId/r2/buckets/:bucketName",
161
- "DELETE",
162
- ([_url, accountId, bucketName]) => {
163
- expect(accountId).toEqual("some-account-id");
164
- expect(bucketName).toEqual(expectedBucketName);
165
- requests.count += 1;
166
- }
167
- );
168
- return requests;
169
- }
170
-
171
- it("should error if no bucket name is given", async () => {
172
- await expect(
173
- runWrangler("r2 bucket delete")
174
- ).rejects.toThrowErrorMatchingInlineSnapshot(
175
- `"Not enough non-option arguments: got 0, need at least 1"`
176
- );
177
- expect(std.out).toMatchInlineSnapshot(`
178
- "
179
- wrangler r2 bucket delete <name>
180
-
181
- Delete an R2 bucket
182
-
183
- Positionals:
184
- name The name of the bucket to delete [string] [required]
185
-
186
- Flags:
187
- -c, --config Path to .toml configuration file [string]
188
- -h, --help Show help [boolean]
189
- -v, --version Show version number [boolean]"
190
- `);
191
- expect(std.err).toMatchInlineSnapshot(`
192
- "X [ERROR] Not enough non-option arguments: got 0, need at least 1
193
-
194
- "
195
- `);
196
- });
197
-
198
- it("should error if the bucket name to delete contains spaces", async () => {
199
- await expect(
200
- runWrangler("r2 bucket delete abc def ghi")
201
- ).rejects.toThrowErrorMatchingInlineSnapshot(
202
- `"Unknown arguments: def, ghi"`
203
- );
204
- expect(std.out).toMatchInlineSnapshot(`
205
- "
206
- wrangler r2 bucket delete <name>
207
-
208
- Delete an R2 bucket
209
-
210
- Positionals:
211
- name The name of the bucket to delete [string] [required]
212
-
213
- Flags:
214
- -c, --config Path to .toml configuration file [string]
215
- -h, --help Show help [boolean]
216
- -v, --version Show version number [boolean]"
217
- `);
218
- expect(std.err).toMatchInlineSnapshot(`
219
- "X [ERROR] Unknown arguments: def, ghi
220
-
221
- "
222
- `);
223
- });
224
-
225
- it("should delete a bucket specified by name", async () => {
226
- const requests = mockDeleteRequest("some-bucket");
227
- await runWrangler(`r2 bucket delete some-bucket`);
228
- expect(requests.count).toEqual(1);
229
- });
230
- });
231
- });
232
- });
14
+ mockAccountId();
15
+ mockApiToken();
16
+ runInTempDir();
17
+ const std = mockConsoleMethods();
18
+
19
+ afterEach(() => {
20
+ unsetAllMocks();
21
+ });
22
+
23
+ describe("r2", () => {
24
+ describe("bucket", () => {
25
+ it("should show the correct help when an invalid command is passed", async () => {
26
+ await expect(() =>
27
+ runWrangler("r2 bucket foo")
28
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`"Unknown argument: foo"`);
29
+ expect(std.err).toMatchInlineSnapshot(`
30
+ "X [ERROR] Unknown argument: foo
31
+
32
+ "
33
+ `);
34
+ expect(std.out).toMatchInlineSnapshot(`
35
+ "
36
+ wrangler r2 bucket
37
+
38
+ Manage R2 buckets
39
+
40
+ Commands:
41
+ wrangler r2 bucket create <name> Create a new R2 bucket
42
+ wrangler r2 bucket list List R2 buckets
43
+ wrangler r2 bucket delete <name> Delete an R2 bucket
44
+
45
+ Flags:
46
+ -c, --config Path to .toml configuration file [string]
47
+ -h, --help Show help [boolean]
48
+ -v, --version Show version number [boolean]"
49
+ `);
50
+ });
51
+
52
+ describe("list", () => {
53
+ function mockListRequest(buckets: R2BucketInfo[]) {
54
+ const requests = { count: 0 };
55
+ setMockResponse(
56
+ "/accounts/:accountId/r2/buckets",
57
+ ([_url, accountId], init) => {
58
+ requests.count++;
59
+ expect(accountId).toEqual("some-account-id");
60
+ expect(init).toEqual({});
61
+ return { buckets };
62
+ }
63
+ );
64
+ return requests;
65
+ }
66
+
67
+ it("should list buckets", async () => {
68
+ const expectedBuckets: R2BucketInfo[] = [
69
+ { name: "bucket-1", creation_date: "01-01-2001" },
70
+ { name: "bucket-2", creation_date: "01-01-2001" },
71
+ ];
72
+ mockListRequest(expectedBuckets);
73
+ await runWrangler("r2 bucket list");
74
+
75
+ expect(std.err).toMatchInlineSnapshot(`""`);
76
+ const buckets = JSON.parse(std.out);
77
+ expect(buckets).toEqual(expectedBuckets);
78
+ });
79
+ });
80
+
81
+ describe("create", () => {
82
+ function mockCreateRequest(expectedBucketName: string) {
83
+ const requests = { count: 0 };
84
+ setMockResponse(
85
+ "/accounts/:accountId/r2/buckets",
86
+ "POST",
87
+ ([_url, accountId], { body }) => {
88
+ expect(accountId).toEqual("some-account-id");
89
+ const bucketName = JSON.parse(body as string).name;
90
+ expect(bucketName).toEqual(expectedBucketName);
91
+ requests.count += 1;
92
+ }
93
+ );
94
+ return requests;
95
+ }
96
+
97
+ it("should error if no bucket name is given", async () => {
98
+ await expect(
99
+ runWrangler("r2 bucket create")
100
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
101
+ `"Not enough non-option arguments: got 0, need at least 1"`
102
+ );
103
+ expect(std.out).toMatchInlineSnapshot(`
104
+ "
105
+ wrangler r2 bucket create <name>
106
+
107
+ Create a new R2 bucket
108
+
109
+ Positionals:
110
+ name The name of the new bucket [string] [required]
111
+
112
+ Flags:
113
+ -c, --config Path to .toml configuration file [string]
114
+ -h, --help Show help [boolean]
115
+ -v, --version Show version number [boolean]"
116
+ `);
117
+ expect(std.err).toMatchInlineSnapshot(`
118
+ "X [ERROR] Not enough non-option arguments: got 0, need at least 1
119
+
120
+ "
121
+ `);
122
+ });
123
+
124
+ it("should error if the bucket to create contains spaces", async () => {
125
+ await expect(
126
+ runWrangler("r2 bucket create abc def ghi")
127
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
128
+ `"Unknown arguments: def, ghi"`
129
+ );
130
+ expect(std.out).toMatchInlineSnapshot(`
131
+ "
132
+ wrangler r2 bucket create <name>
133
+
134
+ Create a new R2 bucket
135
+
136
+ Positionals:
137
+ name The name of the new bucket [string] [required]
138
+
139
+ Flags:
140
+ -c, --config Path to .toml configuration file [string]
141
+ -h, --help Show help [boolean]
142
+ -v, --version Show version number [boolean]"
143
+ `);
144
+ expect(std.err).toMatchInlineSnapshot(`
145
+ "X [ERROR] Unknown arguments: def, ghi
146
+
147
+ "
148
+ `);
149
+ });
150
+
151
+ it("should create a bucket", async () => {
152
+ const requests = mockCreateRequest("testBucket");
153
+ await runWrangler("r2 bucket create testBucket");
154
+ expect(std.out).toMatchInlineSnapshot(`
155
+ "Creating bucket testBucket.
156
+ Created bucket testBucket."
157
+ `);
158
+ expect(requests.count).toEqual(1);
159
+ });
160
+ });
161
+
162
+ describe("delete", () => {
163
+ function mockDeleteRequest(expectedBucketName: string) {
164
+ const requests = { count: 0 };
165
+ setMockResponse(
166
+ "/accounts/:accountId/r2/buckets/:bucketName",
167
+ "DELETE",
168
+ ([_url, accountId, bucketName]) => {
169
+ expect(accountId).toEqual("some-account-id");
170
+ expect(bucketName).toEqual(expectedBucketName);
171
+ requests.count += 1;
172
+ }
173
+ );
174
+ return requests;
175
+ }
176
+
177
+ it("should error if no bucket name is given", async () => {
178
+ await expect(
179
+ runWrangler("r2 bucket delete")
180
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
181
+ `"Not enough non-option arguments: got 0, need at least 1"`
182
+ );
183
+ expect(std.out).toMatchInlineSnapshot(`
184
+ "
185
+ wrangler r2 bucket delete <name>
186
+
187
+ Delete an R2 bucket
188
+
189
+ Positionals:
190
+ name The name of the bucket to delete [string] [required]
191
+
192
+ Flags:
193
+ -c, --config Path to .toml configuration file [string]
194
+ -h, --help Show help [boolean]
195
+ -v, --version Show version number [boolean]"
196
+ `);
197
+ expect(std.err).toMatchInlineSnapshot(`
198
+ "X [ERROR] Not enough non-option arguments: got 0, need at least 1
199
+
200
+ "
201
+ `);
202
+ });
203
+
204
+ it("should error if the bucket name to delete contains spaces", async () => {
205
+ await expect(
206
+ runWrangler("r2 bucket delete abc def ghi")
207
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
208
+ `"Unknown arguments: def, ghi"`
209
+ );
210
+ expect(std.out).toMatchInlineSnapshot(`
211
+ "
212
+ wrangler r2 bucket delete <name>
213
+
214
+ Delete an R2 bucket
215
+
216
+ Positionals:
217
+ name The name of the bucket to delete [string] [required]
218
+
219
+ Flags:
220
+ -c, --config Path to .toml configuration file [string]
221
+ -h, --help Show help [boolean]
222
+ -v, --version Show version number [boolean]"
223
+ `);
224
+ expect(std.err).toMatchInlineSnapshot(`
225
+ "X [ERROR] Unknown arguments: def, ghi
226
+
227
+ "
228
+ `);
229
+ });
230
+
231
+ it("should delete a bucket specified by name", async () => {
232
+ const requests = mockDeleteRequest("some-bucket");
233
+ await runWrangler(`r2 bucket delete some-bucket`);
234
+ expect(requests.count).toEqual(1);
235
+ });
236
+ });
237
+ });
238
+
239
+ describe("r2 object", () => {
240
+ it("should download R2 object from bucket", async () => {
241
+ setMockFetchR2Objects({
242
+ accountId: "some-account-id",
243
+ bucketName: "bucketName-object-test",
244
+ objectName: "wormhole-img.png",
245
+ mockResponse: "R2-objects-test-data",
246
+ });
247
+
248
+ await runWrangler(
249
+ `r2 object get bucketName-object-test/wormhole-img.png --file ./wormhole-img.png`
250
+ );
251
+
252
+ expect(std.out).toMatchInlineSnapshot(`
253
+ "Downloading \\"wormhole-img.png\\" from \\"bucketName-object-test\\".
254
+ Download complete."
255
+ `);
256
+ });
257
+
258
+ it("should upload R2 object from bucket", async () => {
259
+ setMockFetchR2Objects({
260
+ accountId: "some-account-id",
261
+ bucketName: "bucketName-object-test",
262
+ objectName: "wormhole-img.png",
263
+ });
264
+ fs.writeFileSync("wormhole-img.png", "passageway");
265
+ await runWrangler(
266
+ `r2 object put bucketName-object-test/wormhole-img.png --file ./wormhole-img.png`
267
+ );
268
+
269
+ expect(std.out).toMatchInlineSnapshot(`
270
+ "Creating object \\"wormhole-img.png\\" in bucket \\"bucketName-object-test\\".
271
+ Upload complete."
272
+ `);
273
+ });
274
+
275
+ it("should pass all fetch option flags into requestInit", async () => {
276
+ fs.writeFileSync("wormhole-img.png", "passageway");
277
+ setMockFetchR2Objects({
278
+ accountId: "some-account-id",
279
+ bucketName: "bucketName-object-test",
280
+ objectName: "wormhole-img.png",
281
+ });
282
+ const flags =
283
+ "--ct content-type --cd content-disposition --ce content-encoding --cl content-lang --cc cache-control --e expire-time";
284
+
285
+ await runWrangler(
286
+ `r2 object put bucketName-object-test/wormhole-img.png ${flags} --file wormhole-img.png`
287
+ );
288
+
289
+ expect(std.out).toMatchInlineSnapshot(`
290
+ "Creating object \\"wormhole-img.png\\" in bucket \\"bucketName-object-test\\".
291
+ Upload complete."
292
+ `);
293
+ });
294
+
295
+ it("should delete R2 object from bucket", async () => {
296
+ setMockFetchR2Objects({
297
+ accountId: "some-account-id",
298
+ bucketName: "bucketName-object-test",
299
+ objectName: "wormhole-img.png",
300
+ });
301
+
302
+ await runWrangler(
303
+ `r2 object delete bucketName-object-test/wormhole-img.png`
304
+ );
305
+
306
+ expect(std.out).toMatchInlineSnapshot(`
307
+ "Deleting object \\"wormhole-img.png\\" from bucket \\"bucketName-object-test\\".
308
+ Delete complete."
309
+ `);
310
+ });
311
+
312
+ it("should not allow `--pipe` & `--file` to run together", async () => {
313
+ fs.writeFileSync("wormhole-img.png", "passageway");
314
+ setMockFetchR2Objects({
315
+ accountId: "some-account-id",
316
+ bucketName: "bucketName-object-test",
317
+ objectName: "wormhole-img.png",
318
+ });
319
+
320
+ await expect(
321
+ runWrangler(
322
+ `r2 object put bucketName-object-test/wormhole-img.png --pipe --file wormhole-img.png`
323
+ )
324
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
325
+ `"Arguments pipe and file are mutually exclusive"`
326
+ );
327
+
328
+ expect(std.err).toMatchInlineSnapshot(`
329
+ "X [ERROR] Arguments pipe and file are mutually exclusive
330
+
331
+ "
332
+ `);
333
+ });
334
+ });
335
+ });
233
336
  });
@@ -3,43 +3,43 @@ import { runInTempDir } from "./helpers/run-in-tmp";
3
3
  import { runWrangler } from "./helpers/run-wrangler";
4
4
 
5
5
  describe("wrangler route", () => {
6
- mockConsoleMethods();
7
- runInTempDir();
6
+ mockConsoleMethods();
7
+ runInTempDir();
8
8
 
9
- it("shows a deprecation notice when `wrangler route` is run", async () => {
10
- await expect(runWrangler("route")).rejects
11
- .toThrowErrorMatchingInlineSnapshot(`
9
+ it("shows a deprecation notice when `wrangler route` is run", async () => {
10
+ await expect(runWrangler("route")).rejects
11
+ .toThrowErrorMatchingInlineSnapshot(`
12
12
  "Deprecation:
13
13
  \`wrangler route\` has been deprecated.
14
14
  Please use wrangler.toml and/or \`wrangler publish --routes\` to modify routes"
15
15
  `);
16
- });
16
+ });
17
17
 
18
- it("shows a deprecation notice when `wrangler route delete` is run", async () => {
19
- await expect(runWrangler("route delete")).rejects
20
- .toThrowErrorMatchingInlineSnapshot(`
18
+ it("shows a deprecation notice when `wrangler route delete` is run", async () => {
19
+ await expect(runWrangler("route delete")).rejects
20
+ .toThrowErrorMatchingInlineSnapshot(`
21
21
  "Deprecation:
22
22
  \`wrangler route delete\` has been deprecated.
23
23
  Remove the unwanted route(s) from wrangler.toml and run \`wrangler publish\` to remove your worker from those routes."
24
24
  `);
25
- });
25
+ });
26
26
 
27
- it("shows a deprecation notice when `wrangler route delete <id>` is run", async () => {
28
- await expect(runWrangler("route delete some-zone-id")).rejects
29
- .toThrowErrorMatchingInlineSnapshot(`
27
+ it("shows a deprecation notice when `wrangler route delete <id>` is run", async () => {
28
+ await expect(runWrangler("route delete some-zone-id")).rejects
29
+ .toThrowErrorMatchingInlineSnapshot(`
30
30
  "Deprecation:
31
31
  \`wrangler route delete\` has been deprecated.
32
32
  Remove the unwanted route(s) from wrangler.toml and run \`wrangler publish\` to remove your worker from those routes."
33
33
  `);
34
- });
34
+ });
35
35
 
36
- it("shows a deprecation notice when `wrangler route list` is run", async () => {
37
- await expect(runWrangler("route list")).rejects
38
- .toThrowErrorMatchingInlineSnapshot(`
36
+ it("shows a deprecation notice when `wrangler route list` is run", async () => {
37
+ await expect(runWrangler("route list")).rejects
38
+ .toThrowErrorMatchingInlineSnapshot(`
39
39
  "Deprecation:
40
40
  \`wrangler route list\` has been deprecated.
41
41
  Refer to wrangler.toml for a list of routes the worker will be deployed to upon publishing.
42
42
  Refer to the Cloudflare Dashboard to see the routes this worker is currently running on."
43
43
  `);
44
- });
44
+ });
45
45
  });