wrangler 0.0.0-e88a54e → 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 (222) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +51 -14
  3. package/bin/wrangler.js +161 -29
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +5484 -21
  6. package/package.json +173 -143
  7. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  8. package/src/__tests__/config-cache.test.ts +42 -0
  9. package/src/__tests__/configuration.test.ts +4016 -2786
  10. package/src/__tests__/dev.test.tsx +1305 -483
  11. package/src/__tests__/generate.test.ts +91 -0
  12. package/src/__tests__/guess-worker-format.test.ts +75 -48
  13. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  14. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  15. package/src/__tests__/helpers/mock-bin.ts +20 -20
  16. package/src/__tests__/helpers/mock-cfetch.ts +182 -93
  17. package/src/__tests__/helpers/mock-console.ts +59 -32
  18. package/src/__tests__/helpers/mock-dialogs.ts +121 -33
  19. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
  20. package/src/__tests__/helpers/mock-http-server.ts +46 -0
  21. package/src/__tests__/helpers/mock-istty.ts +74 -0
  22. package/src/__tests__/helpers/mock-known-routes.ts +7 -0
  23. package/src/__tests__/helpers/mock-kv.ts +26 -26
  24. package/src/__tests__/helpers/mock-oauth-flow.ts +250 -0
  25. package/src/__tests__/helpers/mock-process.ts +39 -0
  26. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  27. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  28. package/src/__tests__/helpers/run-in-tmp.ts +28 -22
  29. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  30. package/src/__tests__/helpers/write-worker-source.ts +31 -0
  31. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  32. package/src/__tests__/https-options.test.ts +144 -108
  33. package/src/__tests__/index.test.ts +229 -975
  34. package/src/__tests__/init.test.ts +2170 -0
  35. package/src/__tests__/jest.setup.ts +122 -34
  36. package/src/__tests__/kv.test.ts +1376 -1087
  37. package/src/__tests__/logger.test.ts +141 -0
  38. package/src/__tests__/metrics.test.ts +450 -0
  39. package/src/__tests__/package-manager.test.ts +312 -165
  40. package/src/__tests__/pages.test.ts +1270 -39
  41. package/src/__tests__/parse.test.ts +253 -245
  42. package/src/__tests__/publish.test.ts +6878 -2627
  43. package/src/__tests__/pubsub.test.ts +367 -0
  44. package/src/__tests__/r2.test.ts +328 -190
  45. package/src/__tests__/route.test.ts +22 -22
  46. package/src/__tests__/secret.test.ts +474 -407
  47. package/src/__tests__/tail.test.ts +679 -441
  48. package/src/__tests__/test-old-node-version.js +31 -0
  49. package/src/__tests__/user.test.ts +155 -0
  50. package/src/__tests__/validate-dev-props.test.ts +56 -0
  51. package/src/__tests__/version.test.ts +35 -0
  52. package/src/__tests__/whoami.test.tsx +276 -87
  53. package/src/__tests__/worker-namespace.test.ts +329 -0
  54. package/src/abort.d.ts +3 -0
  55. package/src/api/dev.ts +93 -0
  56. package/src/api/index.ts +1 -0
  57. package/src/bundle-reporter.tsx +29 -0
  58. package/src/bundle.ts +441 -110
  59. package/src/cfetch/index.ts +83 -66
  60. package/src/cfetch/internal.ts +251 -92
  61. package/src/cli.ts +22 -14
  62. package/src/config/README.md +1 -1
  63. package/src/config/config.ts +224 -179
  64. package/src/config/diagnostics.ts +61 -61
  65. package/src/config/environment.ts +430 -311
  66. package/src/config/index.ts +227 -38
  67. package/src/config/validation-helpers.ts +414 -303
  68. package/src/config/validation.ts +1745 -973
  69. package/src/config-cache.ts +85 -0
  70. package/src/create-worker-preview.ts +209 -118
  71. package/src/create-worker-upload-form.ts +275 -201
  72. package/src/dev/dev-vars.ts +36 -0
  73. package/src/dev/dev.tsx +488 -307
  74. package/src/dev/local.tsx +427 -210
  75. package/src/dev/remote.tsx +407 -188
  76. package/src/dev/use-esbuild.ts +156 -78
  77. package/src/dev/validate-dev-props.ts +31 -0
  78. package/src/dev-registry.tsx +160 -0
  79. package/src/dev.tsx +696 -0
  80. package/src/dialogs.tsx +115 -57
  81. package/src/dispatch-namespace.ts +206 -0
  82. package/src/durable.ts +102 -0
  83. package/src/entry.ts +267 -147
  84. package/src/environment-variables.ts +25 -23
  85. package/src/errors.ts +11 -0
  86. package/src/faye-websocket.d.ts +6 -0
  87. package/src/generate.ts +131 -0
  88. package/src/git-client.ts +42 -0
  89. package/src/global-wrangler-config-path.ts +26 -0
  90. package/src/https-options.ts +85 -80
  91. package/src/index.tsx +2191 -2304
  92. package/src/init.ts +622 -0
  93. package/src/inspect.ts +687 -557
  94. package/src/intl-polyfill.d.ts +139 -0
  95. package/src/is-ci.ts +14 -0
  96. package/src/is-interactive.ts +12 -0
  97. package/src/kv.ts +353 -242
  98. package/src/logger.ts +73 -0
  99. package/src/metrics/index.ts +5 -0
  100. package/src/metrics/metrics-config.ts +239 -0
  101. package/src/metrics/metrics-dispatcher.ts +96 -0
  102. package/src/metrics/metrics-usage-headers.ts +24 -0
  103. package/src/metrics/send-event.ts +92 -0
  104. package/src/miniflare-cli/assets.ts +554 -0
  105. package/src/miniflare-cli/enum-keys.ts +8 -8
  106. package/src/miniflare-cli/index.ts +199 -29
  107. package/src/miniflare-cli/request-context.ts +40 -0
  108. package/src/module-collection.ts +213 -213
  109. package/src/open-in-browser.ts +8 -16
  110. package/src/package-manager.ts +183 -90
  111. package/src/pages/build.tsx +238 -0
  112. package/src/pages/constants.ts +12 -0
  113. package/src/pages/deployments.tsx +106 -0
  114. package/src/pages/dev.tsx +528 -0
  115. package/src/pages/errors.ts +22 -0
  116. package/src/pages/functions/buildPlugin.ts +109 -0
  117. package/src/pages/functions/buildWorker.ts +155 -0
  118. package/src/pages/functions/filepath-routing.test.ts +234 -0
  119. package/src/pages/functions/filepath-routing.ts +189 -0
  120. package/src/pages/functions/identifiers.ts +78 -0
  121. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  122. package/src/pages/functions/routes-consolidation.ts +73 -0
  123. package/src/pages/functions/routes-transformation.test.ts +271 -0
  124. package/src/pages/functions/routes-transformation.ts +122 -0
  125. package/src/pages/functions/routes.ts +151 -0
  126. package/src/pages/functions.tsx +96 -0
  127. package/src/pages/index.tsx +94 -0
  128. package/src/pages/projects.tsx +169 -0
  129. package/src/pages/publish.tsx +391 -0
  130. package/src/pages/types.ts +49 -0
  131. package/src/pages/upload.tsx +413 -0
  132. package/src/pages/utils.ts +12 -0
  133. package/src/parse.ts +224 -121
  134. package/src/paths.ts +6 -6
  135. package/src/preview.ts +31 -0
  136. package/src/proxy.ts +416 -370
  137. package/src/publish.ts +796 -321
  138. package/src/pubsub/index.ts +286 -0
  139. package/src/pubsub/pubsub-commands.tsx +623 -0
  140. package/src/r2.ts +100 -19
  141. package/src/selfsigned.d.ts +23 -23
  142. package/src/sites.tsx +281 -189
  143. package/src/tail/filters.ts +111 -109
  144. package/src/tail/index.ts +230 -217
  145. package/src/tail/printing.ts +92 -47
  146. package/src/update-check.ts +19 -0
  147. package/src/user/choose-account.tsx +69 -0
  148. package/src/user/env-vars.ts +46 -0
  149. package/src/user/generate-auth-url.ts +33 -0
  150. package/src/user/generate-random-state.ts +16 -0
  151. package/src/user/index.ts +3 -0
  152. package/src/user/user.tsx +1191 -0
  153. package/src/whoami.tsx +142 -42
  154. package/src/worker.ts +135 -94
  155. package/src/zones.ts +167 -0
  156. package/templates/checked-fetch.js +17 -0
  157. package/templates/first-party-worker-module-facade.ts +18 -0
  158. package/templates/format-dev-errors.ts +32 -0
  159. package/templates/gitignore +171 -0
  160. package/templates/new-worker-scheduled.js +17 -0
  161. package/templates/new-worker-scheduled.ts +32 -0
  162. package/templates/new-worker.js +3 -3
  163. package/templates/new-worker.ts +18 -3
  164. package/templates/no-op-worker.js +10 -0
  165. package/templates/pages-shim.ts +9 -0
  166. package/templates/pages-template-plugin.ts +167 -0
  167. package/templates/pages-template-worker.ts +172 -0
  168. package/templates/serve-static-assets.ts +63 -0
  169. package/templates/service-bindings-module-facade.js +54 -0
  170. package/templates/service-bindings-sw-facade.js +42 -0
  171. package/templates/tsconfig.json +95 -95
  172. package/wrangler-dist/cli.d.ts +338 -0
  173. package/wrangler-dist/cli.js +124611 -112403
  174. package/miniflare-dist/index.mjs.map +0 -7
  175. package/pages/functions/buildWorker.ts +0 -62
  176. package/pages/functions/filepath-routing.test.ts +0 -223
  177. package/pages/functions/filepath-routing.ts +0 -181
  178. package/pages/functions/identifiers.ts +0 -78
  179. package/pages/functions/routes.ts +0 -151
  180. package/pages/functions/template-worker.ts +0 -130
  181. package/src/__tests__/dev2.test.tsx +0 -154
  182. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  183. package/src/__tests__/logout.test.ts +0 -52
  184. package/src/__tests__/sentry.test.ts +0 -146
  185. package/src/pages.tsx +0 -1047
  186. package/src/reporting.ts +0 -131
  187. package/src/user.tsx +0 -1118
  188. package/templates/static-asset-facade.js +0 -47
  189. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  190. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  191. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  192. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  193. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  194. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  195. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  196. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  197. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  198. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  199. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  200. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  201. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  202. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  203. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  204. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  205. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  206. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  207. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  208. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  209. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  210. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  211. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  212. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  213. package/vendor/wrangler-mime/LICENSE +0 -21
  214. package/vendor/wrangler-mime/Mime.js +0 -97
  215. package/vendor/wrangler-mime/README.md +0 -187
  216. package/vendor/wrangler-mime/cli.js +0 -46
  217. package/vendor/wrangler-mime/index.js +0 -4
  218. package/vendor/wrangler-mime/lite.js +0 -4
  219. package/vendor/wrangler-mime/package.json +0 -52
  220. package/vendor/wrangler-mime/types/other.js +0 -1
  221. package/vendor/wrangler-mime/types/standard.js +0 -1
  222. package/wrangler-dist/cli.js.map +0 -7
@@ -1,198 +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
- describe("list", () => {
21
- function mockListRequest(buckets: R2BucketInfo[]) {
22
- const requests = { count: 0 };
23
- setMockResponse(
24
- "/accounts/:accountId/r2/buckets",
25
- ([_url, accountId], init) => {
26
- requests.count++;
27
- expect(accountId).toEqual("some-account-id");
28
- expect(init).toEqual({});
29
- return { buckets };
30
- }
31
- );
32
- return requests;
33
- }
34
-
35
- it("should list buckets", async () => {
36
- const expectedBuckets: R2BucketInfo[] = [
37
- { name: "bucket-1", creation_date: "01-01-2001" },
38
- { name: "bucket-2", creation_date: "01-01-2001" },
39
- ];
40
- mockListRequest(expectedBuckets);
41
- await runWrangler("r2 bucket list");
42
-
43
- expect(std.err).toMatchInlineSnapshot(`""`);
44
- const buckets = JSON.parse(std.out);
45
- expect(buckets).toEqual(expectedBuckets);
46
- });
47
- });
48
-
49
- describe("create", () => {
50
- function mockCreateRequest(expectedBucketName: string) {
51
- const requests = { count: 0 };
52
- setMockResponse(
53
- "/accounts/:accountId/r2/buckets/:bucketName",
54
- "PUT",
55
- ([_url, accountId, bucketName]) => {
56
- expect(accountId).toEqual("some-account-id");
57
- expect(bucketName).toEqual(expectedBucketName);
58
- requests.count += 1;
59
- }
60
- );
61
- return requests;
62
- }
63
-
64
- it("should error if no bucket name is given", async () => {
65
- await expect(
66
- runWrangler("r2 bucket create")
67
- ).rejects.toThrowErrorMatchingInlineSnapshot(
68
- `"Not enough non-option arguments: got 0, need at least 1"`
69
- );
70
- expect(std.out).toMatchInlineSnapshot(`""`);
71
- expect(std.err).toMatchInlineSnapshot(`
72
- "wrangler r2 bucket create <name>
73
-
74
- Create a new R2 bucket
75
-
76
- Positionals:
77
- name The name of the new bucket [string] [required]
78
-
79
- Flags:
80
- -c, --config Path to .toml configuration file [string]
81
- -h, --help Show help [boolean]
82
- -v, --version Show version number [boolean]
83
- --legacy-env Use legacy environments [boolean]
84
-
85
- Not enough non-option arguments: got 0, need at least 1"
86
- `);
87
- });
88
-
89
- it("should error if the bucket to create contains spaces", async () => {
90
- await expect(
91
- runWrangler("r2 bucket create abc def ghi")
92
- ).rejects.toThrowErrorMatchingInlineSnapshot(
93
- `"Unexpected additional positional arguments \\"def ghi\\"."`
94
- );
95
- expect(std.out).toMatchInlineSnapshot(`""`);
96
- expect(std.err).toMatchInlineSnapshot(`
97
- "wrangler r2 bucket create <name>
98
-
99
- Create a new R2 bucket
100
-
101
- Positionals:
102
- name The name of the new bucket [string] [required]
103
-
104
- Flags:
105
- -c, --config Path to .toml configuration file [string]
106
- -h, --help Show help [boolean]
107
- -v, --version Show version number [boolean]
108
- --legacy-env Use legacy environments [boolean]
109
-
110
- Unexpected additional positional arguments \\"def ghi\\"."
111
- `);
112
- });
113
-
114
- it("should create a bucket", async () => {
115
- const requests = mockCreateRequest("testBucket");
116
- await runWrangler("r2 bucket create testBucket");
117
- expect(std.out).toMatchInlineSnapshot(`
118
- "Creating bucket testBucket.
119
- Created bucket testBucket."
120
- `);
121
- expect(requests.count).toEqual(1);
122
- });
123
- });
124
-
125
- describe("delete", () => {
126
- function mockDeleteRequest(expectedBucketName: string) {
127
- const requests = { count: 0 };
128
- setMockResponse(
129
- "/accounts/:accountId/r2/buckets/:bucketName",
130
- "DELETE",
131
- ([_url, accountId, bucketName]) => {
132
- expect(accountId).toEqual("some-account-id");
133
- expect(bucketName).toEqual(expectedBucketName);
134
- requests.count += 1;
135
- }
136
- );
137
- return requests;
138
- }
139
-
140
- it("should error if no bucket name is given", async () => {
141
- await expect(
142
- runWrangler("r2 bucket delete")
143
- ).rejects.toThrowErrorMatchingInlineSnapshot(
144
- `"Not enough non-option arguments: got 0, need at least 1"`
145
- );
146
- expect(std.out).toMatchInlineSnapshot(`""`);
147
- expect(std.err).toMatchInlineSnapshot(`
148
- "wrangler r2 bucket delete <name>
149
-
150
- Delete an R2 bucket
151
-
152
- Positionals:
153
- name The name of the bucket to delete [string] [required]
154
-
155
- Flags:
156
- -c, --config Path to .toml configuration file [string]
157
- -h, --help Show help [boolean]
158
- -v, --version Show version number [boolean]
159
- --legacy-env Use legacy environments [boolean]
160
-
161
- Not enough non-option arguments: got 0, need at least 1"
162
- `);
163
- });
164
-
165
- it("should error if the bucket name to delete contains spaces", async () => {
166
- await expect(
167
- runWrangler("r2 bucket delete abc def ghi")
168
- ).rejects.toThrowErrorMatchingInlineSnapshot(
169
- `"Unexpected additional positional arguments \\"def ghi\\"."`
170
- );
171
- expect(std.out).toMatchInlineSnapshot(`""`);
172
- expect(std.err).toMatchInlineSnapshot(`
173
- "wrangler r2 bucket delete <name>
174
-
175
- Delete an R2 bucket
176
-
177
- Positionals:
178
- name The name of the bucket to delete [string] [required]
179
-
180
- Flags:
181
- -c, --config Path to .toml configuration file [string]
182
- -h, --help Show help [boolean]
183
- -v, --version Show version number [boolean]
184
- --legacy-env Use legacy environments [boolean]
185
-
186
- Unexpected additional positional arguments \\"def ghi\\"."
187
- `);
188
- });
189
-
190
- it("should delete a bucket specified by name", async () => {
191
- const requests = mockDeleteRequest("some-bucket");
192
- await runWrangler(`r2 bucket delete some-bucket`);
193
- expect(requests.count).toEqual(1);
194
- });
195
- });
196
- });
197
- });
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
+ });
198
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(`
12
- "DEPRECATION WARNING:
9
+ it("shows a deprecation notice when `wrangler route` is run", async () => {
10
+ await expect(runWrangler("route")).rejects
11
+ .toThrowErrorMatchingInlineSnapshot(`
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(`
21
- "DEPRECATION WARNING:
18
+ it("shows a deprecation notice when `wrangler route delete` is run", async () => {
19
+ await expect(runWrangler("route delete")).rejects
20
+ .toThrowErrorMatchingInlineSnapshot(`
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(`
30
- "DEPRECATION WARNING:
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
+ "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(`
39
- "DEPRECATION WARNING:
36
+ it("shows a deprecation notice when `wrangler route list` is run", async () => {
37
+ await expect(runWrangler("route list")).rejects
38
+ .toThrowErrorMatchingInlineSnapshot(`
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
  });