wrangler 0.0.0-e1c615f → 0.0.0-e1e2ee5c

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 (212) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +33 -14
  3. package/bin/wrangler.js +159 -27
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +5354 -0
  6. package/package.json +166 -123
  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 +3950 -0
  10. package/src/__tests__/dev.test.tsx +1199 -62
  11. package/src/__tests__/guess-worker-format.test.ts +85 -0
  12. package/src/__tests__/{clipboardy-mock.js → helpers/clipboardy-mock.js} +0 -0
  13. package/src/__tests__/helpers/cmd-shim.d.ts +11 -0
  14. package/src/__tests__/helpers/mock-account-id.ts +48 -0
  15. package/src/__tests__/helpers/mock-bin.ts +36 -0
  16. package/src/__tests__/helpers/mock-cfetch.ts +211 -0
  17. package/src/__tests__/helpers/mock-console.ts +97 -0
  18. package/src/__tests__/helpers/mock-dialogs.ts +153 -0
  19. package/src/__tests__/helpers/mock-http-server.ts +46 -0
  20. package/src/__tests__/helpers/mock-istty.ts +74 -0
  21. package/src/__tests__/helpers/mock-kv.ts +33 -0
  22. package/src/__tests__/helpers/mock-oauth-flow.ts +250 -0
  23. package/src/__tests__/helpers/mock-process.ts +39 -0
  24. package/src/__tests__/helpers/mock-stdin.ts +108 -0
  25. package/src/__tests__/helpers/mock-web-socket.ts +29 -0
  26. package/src/__tests__/helpers/run-in-tmp.ts +38 -0
  27. package/src/__tests__/helpers/run-wrangler.ts +16 -0
  28. package/src/__tests__/helpers/write-worker-source.ts +31 -0
  29. package/src/__tests__/helpers/write-wrangler-toml.ts +17 -0
  30. package/src/__tests__/https-options.test.ts +163 -0
  31. package/src/__tests__/index.test.ts +259 -284
  32. package/src/__tests__/init.test.ts +1992 -0
  33. package/src/__tests__/jest.setup.ts +108 -10
  34. package/src/__tests__/kv.test.ts +1459 -886
  35. package/src/__tests__/logger.test.ts +141 -0
  36. package/src/__tests__/metrics.test.ts +445 -0
  37. package/src/__tests__/package-manager.test.ts +353 -0
  38. package/src/__tests__/pages.test.ts +1261 -0
  39. package/src/__tests__/parse.test.ts +330 -0
  40. package/src/__tests__/publish.test.ts +6671 -0
  41. package/src/__tests__/pubsub.test.ts +367 -0
  42. package/src/__tests__/r2.test.ts +233 -0
  43. package/src/__tests__/route.test.ts +45 -0
  44. package/src/__tests__/secret.test.ts +492 -0
  45. package/src/__tests__/tail.test.ts +698 -0
  46. package/src/__tests__/test-old-node-version.js +31 -0
  47. package/src/__tests__/user.test.ts +143 -0
  48. package/src/__tests__/version.test.ts +35 -0
  49. package/src/__tests__/whoami.test.tsx +230 -0
  50. package/src/__tests__/worker-namespace.test.ts +327 -0
  51. package/src/abort.d.ts +3 -0
  52. package/src/api/dev.ts +86 -0
  53. package/src/api/index.ts +1 -0
  54. package/src/bundle-reporter.tsx +29 -0
  55. package/src/bundle.ts +236 -0
  56. package/src/cfetch/index.ts +88 -69
  57. package/src/cfetch/internal.ts +124 -44
  58. package/src/cli.ts +24 -6
  59. package/src/config/README.md +107 -0
  60. package/src/config/config.ts +251 -0
  61. package/src/config/diagnostics.ts +80 -0
  62. package/src/config/environment.ts +453 -0
  63. package/src/config/index.ts +238 -0
  64. package/src/config/validation-helpers.ts +584 -0
  65. package/src/config/validation.ts +1754 -0
  66. package/src/config-cache.ts +84 -0
  67. package/src/create-worker-preview.ts +255 -0
  68. package/src/create-worker-upload-form.ts +263 -0
  69. package/src/dev/dev-vars.ts +36 -0
  70. package/src/dev/dev.tsx +452 -0
  71. package/src/dev/local.tsx +373 -0
  72. package/src/dev/remote.tsx +386 -0
  73. package/src/dev/use-esbuild.ts +150 -0
  74. package/src/dev.tsx +581 -862
  75. package/src/dialogs.tsx +117 -59
  76. package/src/durable.ts +102 -0
  77. package/src/entry.ts +328 -0
  78. package/src/environment-variables.ts +35 -0
  79. package/src/errors.ts +11 -0
  80. package/src/faye-websocket.d.ts +6 -0
  81. package/src/generate.ts +33 -0
  82. package/src/git-client.ts +42 -0
  83. package/src/global-wrangler-config-path.ts +26 -0
  84. package/src/https-options.ts +127 -0
  85. package/src/index.tsx +1987 -1911
  86. package/src/init.ts +549 -0
  87. package/src/inspect.ts +662 -0
  88. package/src/intl-polyfill.d.ts +139 -0
  89. package/src/is-interactive.ts +12 -0
  90. package/src/kv.ts +430 -0
  91. package/src/logger.ts +73 -0
  92. package/src/metrics/index.ts +4 -0
  93. package/src/metrics/is-ci.ts +14 -0
  94. package/src/metrics/metrics-config.ts +239 -0
  95. package/src/metrics/metrics-dispatcher.ts +95 -0
  96. package/src/metrics/send-event.ts +92 -0
  97. package/src/miniflare-cli/README.md +30 -0
  98. package/src/miniflare-cli/assets.ts +543 -0
  99. package/src/miniflare-cli/enum-keys.ts +17 -0
  100. package/src/miniflare-cli/index.ts +85 -0
  101. package/src/miniflare-cli/request-context.ts +40 -0
  102. package/src/module-collection.ts +247 -53
  103. package/src/open-in-browser.ts +17 -0
  104. package/src/package-manager.ts +219 -0
  105. package/src/pages/build.tsx +204 -0
  106. package/src/pages/constants.ts +7 -0
  107. package/src/pages/deployments.tsx +106 -0
  108. package/src/pages/dev.tsx +401 -0
  109. package/src/pages/functions/buildPlugin.ts +105 -0
  110. package/src/pages/functions/buildWorker.ts +151 -0
  111. package/src/pages/functions/filepath-routing.test.ts +234 -0
  112. package/src/pages/functions/filepath-routing.ts +189 -0
  113. package/src/pages/functions/identifiers.ts +78 -0
  114. package/src/pages/functions/routes.ts +151 -0
  115. package/src/pages/index.tsx +84 -0
  116. package/src/pages/projects.tsx +163 -0
  117. package/src/pages/publish.tsx +338 -0
  118. package/src/pages/types.ts +40 -0
  119. package/src/pages/upload.tsx +396 -0
  120. package/src/pages/utils.ts +12 -0
  121. package/src/parse.ts +286 -0
  122. package/src/paths.ts +26 -0
  123. package/src/preview.ts +31 -0
  124. package/src/proxy.ts +464 -91
  125. package/src/publish.ts +780 -337
  126. package/src/pubsub/index.ts +286 -0
  127. package/src/pubsub/pubsub-commands.tsx +623 -0
  128. package/src/r2.ts +50 -0
  129. package/src/selfsigned.d.ts +29 -0
  130. package/src/sites.tsx +357 -99
  131. package/src/tail/filters.ts +279 -0
  132. package/src/tail/index.ts +299 -0
  133. package/src/tail/printing.ts +67 -0
  134. package/src/update-check.ts +19 -0
  135. package/src/user/choose-account.tsx +69 -0
  136. package/src/user/env-vars.ts +46 -0
  137. package/src/user/generate-auth-url.ts +33 -0
  138. package/src/user/generate-random-state.ts +16 -0
  139. package/src/user/index.ts +3 -0
  140. package/src/user/user.tsx +1171 -0
  141. package/src/whoami.tsx +91 -0
  142. package/src/worker-namespace.ts +206 -0
  143. package/src/worker.ts +191 -0
  144. package/src/zones.ts +76 -0
  145. package/templates/checked-fetch.js +17 -0
  146. package/templates/gitignore +171 -0
  147. package/templates/new-worker-scheduled.js +17 -0
  148. package/templates/new-worker-scheduled.ts +32 -0
  149. package/templates/new-worker.js +15 -0
  150. package/templates/new-worker.ts +30 -0
  151. package/templates/no-op-worker.js +10 -0
  152. package/templates/pages-shim.ts +9 -0
  153. package/templates/pages-template-plugin.ts +155 -0
  154. package/templates/pages-template-worker.ts +161 -0
  155. package/templates/static-asset-facade.js +49 -0
  156. package/templates/tsconfig.json +105 -0
  157. package/wrangler-dist/cli.d.ts +327 -0
  158. package/wrangler-dist/cli.js +112594 -112465
  159. package/pages/functions/buildWorker.ts +0 -57
  160. package/pages/functions/filepath-routing.test.ts +0 -39
  161. package/pages/functions/filepath-routing.ts +0 -221
  162. package/pages/functions/identifiers.ts +0 -78
  163. package/pages/functions/routes.ts +0 -158
  164. package/pages/functions/template-worker.ts +0 -137
  165. package/src/__tests__/mock-cfetch.ts +0 -171
  166. package/src/__tests__/mock-dialogs.ts +0 -65
  167. package/src/__tests__/run-in-tmp.ts +0 -19
  168. package/src/__tests__/run-wrangler.ts +0 -32
  169. package/src/api/form_data.ts +0 -131
  170. package/src/api/inspect.ts +0 -430
  171. package/src/api/preview.ts +0 -128
  172. package/src/api/worker.ts +0 -155
  173. package/src/config.ts +0 -131
  174. package/src/kv.tsx +0 -267
  175. package/src/pages.tsx +0 -968
  176. package/src/tail.tsx +0 -73
  177. package/src/user.tsx +0 -1022
  178. package/static-asset-facade.js +0 -47
  179. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  180. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  181. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  182. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  183. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  184. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  185. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  186. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  187. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  188. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  189. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  190. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  191. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  192. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  193. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  194. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  195. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  196. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  197. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  198. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  199. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  200. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  201. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  202. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  203. package/vendor/wrangler-mime/LICENSE +0 -21
  204. package/vendor/wrangler-mime/Mime.js +0 -97
  205. package/vendor/wrangler-mime/README.md +0 -187
  206. package/vendor/wrangler-mime/cli.js +0 -46
  207. package/vendor/wrangler-mime/index.js +0 -4
  208. package/vendor/wrangler-mime/lite.js +0 -4
  209. package/vendor/wrangler-mime/package.json +0 -52
  210. package/vendor/wrangler-mime/types/other.js +0 -1
  211. package/vendor/wrangler-mime/types/standard.js +0 -1
  212. package/wrangler-dist/cli.js.map +0 -7
@@ -0,0 +1,327 @@
1
+ import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
2
+ import { setMockResponse, unsetAllMocks } from "./helpers/mock-cfetch";
3
+ import { mockConsoleMethods } from "./helpers/mock-console";
4
+ import { runInTempDir } from "./helpers/run-in-tmp";
5
+ import { runWrangler } from "./helpers/run-wrangler";
6
+
7
+ describe("worker-namespace", () => {
8
+ runInTempDir();
9
+ const std = mockConsoleMethods();
10
+ mockAccountId();
11
+ mockApiToken();
12
+
13
+ afterEach(() => {
14
+ unsetAllMocks();
15
+ });
16
+
17
+ it("should should display a list of available subcommands, for worker-namespace with no subcommand", async () => {
18
+ await runWrangler("worker-namespace");
19
+
20
+ // wait a tick for the help menu to be printed
21
+ await new Promise((resolve) => setImmediate(resolve));
22
+
23
+ expect(std).toMatchInlineSnapshot(`
24
+ Object {
25
+ "debug": "",
26
+ "err": "",
27
+ "out": "wrangler worker-namespace
28
+
29
+ 📦 Interact with a worker namespace
30
+
31
+ Commands:
32
+ wrangler worker-namespace list List all Worker namespaces
33
+ wrangler worker-namespace get <name> Get information about a Worker namespace
34
+ wrangler worker-namespace create <name> Create a Worker namespace
35
+ wrangler worker-namespace delete <name> Delete a Worker namespace
36
+ wrangler worker-namespace rename <old-name> <new-name> Rename a Worker namespace
37
+
38
+ Flags:
39
+ -c, --config Path to .toml configuration file [string]
40
+ -h, --help Show help [boolean]
41
+ -v, --version Show version number [boolean]",
42
+ "warn": "",
43
+ }
44
+ `);
45
+ });
46
+
47
+ describe("create namespace", () => {
48
+ function mockCreateRequest(expectedName: string) {
49
+ const requests = { count: 0 };
50
+ setMockResponse(
51
+ "/accounts/:accountId/workers/dispatch/namespaces",
52
+ ([_url], init) => {
53
+ requests.count += 1;
54
+
55
+ const incomingText = init.body?.toString() || "";
56
+ const { name: namespace_name } = JSON.parse(incomingText);
57
+
58
+ expect(init.method).toBe("POST");
59
+ expect(namespace_name).toEqual(expectedName);
60
+
61
+ return {
62
+ namespace_id: "some-namespace-id",
63
+ namespace_name: "namespace-name",
64
+ created_on: "2022-06-29T14:30:08.16152Z",
65
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
66
+ modified_on: "2022-06-29T14:30:08.16152Z",
67
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
68
+ };
69
+ }
70
+ );
71
+ return requests;
72
+ }
73
+
74
+ it("should display help for create", async () => {
75
+ await expect(
76
+ runWrangler("worker-namespace create")
77
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
78
+ `"Not enough non-option arguments: got 0, need at least 1"`
79
+ );
80
+
81
+ expect(std.out).toMatchInlineSnapshot(`
82
+ "
83
+ wrangler worker-namespace create <name>
84
+
85
+ Create a Worker namespace
86
+
87
+ Positionals:
88
+ name Name of the Worker namespace [string] [required]
89
+
90
+ Flags:
91
+ -c, --config Path to .toml configuration file [string]
92
+ -h, --help Show help [boolean]
93
+ -v, --version Show version number [boolean]"
94
+ `);
95
+ });
96
+
97
+ it("should attempt to create the given namespace", async () => {
98
+ const namespaceName = "my-namespace";
99
+ const requests = mockCreateRequest(namespaceName);
100
+ await runWrangler(`worker-namespace create ${namespaceName}`);
101
+ expect(requests.count).toEqual(1);
102
+
103
+ expect(std.out).toMatchInlineSnapshot(
104
+ `"Created Worker namespace \\"my-namespace\\" with ID \\"some-namespace-id\\""`
105
+ );
106
+ });
107
+ });
108
+
109
+ describe("delete namespace", () => {
110
+ function mockDeleteRequest(expectedName: string) {
111
+ const requests = { count: 0 };
112
+ setMockResponse(
113
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceName",
114
+ ([_url, _, namespaceName], init) => {
115
+ requests.count += 1;
116
+
117
+ expect(init.method).toBe("DELETE");
118
+ expect(namespaceName).toEqual(expectedName);
119
+
120
+ return null;
121
+ }
122
+ );
123
+ return requests;
124
+ }
125
+
126
+ it("should display help for delete", async () => {
127
+ await expect(
128
+ runWrangler("worker-namespace create")
129
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
130
+ `"Not enough non-option arguments: got 0, need at least 1"`
131
+ );
132
+
133
+ expect(std.out).toMatchInlineSnapshot(`
134
+ "
135
+ wrangler worker-namespace create <name>
136
+
137
+ Create a Worker namespace
138
+
139
+ Positionals:
140
+ name Name of the Worker namespace [string] [required]
141
+
142
+ Flags:
143
+ -c, --config Path to .toml configuration file [string]
144
+ -h, --help Show help [boolean]
145
+ -v, --version Show version number [boolean]"
146
+ `);
147
+ });
148
+
149
+ it("should try to delete the given namespace", async () => {
150
+ const namespaceName = "my-namespace";
151
+ const requests = mockDeleteRequest(namespaceName);
152
+ await runWrangler(`worker-namespace delete ${namespaceName}`);
153
+ expect(requests.count).toBe(1);
154
+
155
+ expect(std.out).toMatchInlineSnapshot(
156
+ `"Deleted Worker namespace \\"my-namespace\\""`
157
+ );
158
+ });
159
+ });
160
+
161
+ describe("get namespace", () => {
162
+ function mockInfoRequest(expectedName: string) {
163
+ const requests = { count: 0 };
164
+ setMockResponse(
165
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceName",
166
+ ([_url, _, namespaceName], _init) => {
167
+ requests.count += 1;
168
+
169
+ expect(namespaceName).toEqual(expectedName);
170
+
171
+ return {
172
+ namespace_id: "some-namespace-id",
173
+ namespace_name: "namespace-name",
174
+ created_on: "2022-06-29T14:30:08.16152Z",
175
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
176
+ modified_on: "2022-06-29T14:30:08.16152Z",
177
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
178
+ };
179
+ }
180
+ );
181
+ return requests;
182
+ }
183
+
184
+ it("should display help for get", async () => {
185
+ await expect(
186
+ runWrangler("worker-namespace get")
187
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
188
+ `"Not enough non-option arguments: got 0, need at least 1"`
189
+ );
190
+
191
+ expect(std.out).toMatchInlineSnapshot(`
192
+ "
193
+ wrangler worker-namespace get <name>
194
+
195
+ Get information about a Worker namespace
196
+
197
+ Positionals:
198
+ name Name of the Worker namespace [string] [required]
199
+
200
+ Flags:
201
+ -c, --config Path to .toml configuration file [string]
202
+ -h, --help Show help [boolean]
203
+ -v, --version Show version number [boolean]"
204
+ `);
205
+ });
206
+
207
+ it("should attempt to get info for the given namespace", async () => {
208
+ const namespaceName = "my-namespace";
209
+ const requests = mockInfoRequest(namespaceName);
210
+ await runWrangler(`worker-namespace get ${namespaceName}`);
211
+ expect(requests.count).toBe(1);
212
+
213
+ expect(std.out).toMatchInlineSnapshot(`
214
+ "{
215
+ namespace_id: 'some-namespace-id',
216
+ namespace_name: 'namespace-name',
217
+ created_on: '2022-06-29T14:30:08.16152Z',
218
+ created_by: '1fc1df98cc4420fe00367c3ab68c1639',
219
+ modified_on: '2022-06-29T14:30:08.16152Z',
220
+ modified_by: '1fc1df98cc4420fe00367c3ab68c1639'
221
+ }"
222
+ `);
223
+ });
224
+ });
225
+
226
+ describe("list namespaces", () => {
227
+ function mockListRequest() {
228
+ const requests = { count: 0 };
229
+ setMockResponse(
230
+ "/accounts/:accountId/workers/dispatch/namespaces",
231
+ ([_url, _, _page, _perPage], _init) => {
232
+ requests.count += 1;
233
+
234
+ return [
235
+ {
236
+ namespace_id: "some-namespace-id",
237
+ namespace_name: "namespace-name",
238
+ created_on: "2022-06-29T14:30:08.16152Z",
239
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
240
+ modified_on: "2022-06-29T14:30:08.16152Z",
241
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
242
+ },
243
+ ];
244
+ }
245
+ );
246
+ return requests;
247
+ }
248
+
249
+ it("should list all namespaces", async () => {
250
+ const requests = mockListRequest();
251
+ await runWrangler("worker-namespace list");
252
+ expect(requests.count).toBe(1);
253
+ expect(std.out).toMatchInlineSnapshot(`
254
+ "[
255
+ {
256
+ namespace_id: 'some-namespace-id',
257
+ namespace_name: 'namespace-name',
258
+ created_on: '2022-06-29T14:30:08.16152Z',
259
+ created_by: '1fc1df98cc4420fe00367c3ab68c1639',
260
+ modified_on: '2022-06-29T14:30:08.16152Z',
261
+ modified_by: '1fc1df98cc4420fe00367c3ab68c1639'
262
+ }
263
+ ]"
264
+ `);
265
+ });
266
+ });
267
+
268
+ describe("rename namespace", () => {
269
+ function mockRenameRequest(expectedName: string) {
270
+ const requests = { count: 0 };
271
+ setMockResponse(
272
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceName",
273
+ ([_url, _, namespaceName], init) => {
274
+ requests.count += 1;
275
+
276
+ expect(init.method).toEqual("PUT");
277
+ expect(namespaceName).toEqual(expectedName);
278
+
279
+ return {
280
+ namespace_id: "some-namespace-id",
281
+ namespace_name: "namespace-name",
282
+ created_on: "2022-06-29T14:30:08.16152Z",
283
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
284
+ modified_on: "2022-06-29T14:30:08.16152Z",
285
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
286
+ };
287
+ }
288
+ );
289
+ return requests;
290
+ }
291
+
292
+ it("should display help for rename", async () => {
293
+ await expect(
294
+ runWrangler("worker-namespace rename")
295
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
296
+ `"Not enough non-option arguments: got 0, need at least 2"`
297
+ );
298
+
299
+ expect(std.out).toMatchInlineSnapshot(`
300
+ "
301
+ wrangler worker-namespace rename <old-name> <new-name>
302
+
303
+ Rename a Worker namespace
304
+
305
+ Positionals:
306
+ old-name Name of the Worker namespace [string] [required]
307
+ new-name New name of the Worker namespace [string] [required]
308
+
309
+ Flags:
310
+ -c, --config Path to .toml configuration file [string]
311
+ -h, --help Show help [boolean]
312
+ -v, --version Show version number [boolean]"
313
+ `);
314
+ });
315
+
316
+ it("should attempt to rename the given namespace", async () => {
317
+ const namespaceName = "my-namespace";
318
+ const newName = "new-namespace";
319
+ const requests = mockRenameRequest(namespaceName);
320
+ await runWrangler(`worker-namespace rename ${namespaceName} ${newName}`);
321
+ expect(requests.count).toBe(1);
322
+ expect(std.out).toMatchInlineSnapshot(
323
+ `"Renamed Worker namespace \\"my-namespace\\" to \\"new-namespace\\""`
324
+ );
325
+ });
326
+ });
327
+ });
package/src/abort.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ declare interface AbortSignal {
2
+ addEventListener(event: "abort", handler: () => void);
3
+ }
package/src/api/dev.ts ADDED
@@ -0,0 +1,86 @@
1
+ import { startDev } from "../dev";
2
+ import { logger } from "../logger";
3
+
4
+ import type { EnablePagesAssetsServiceBindingOptions } from "../miniflare-cli";
5
+ import type { RequestInit, Response } from "undici";
6
+
7
+ interface DevOptions {
8
+ env?: string;
9
+ ip?: string;
10
+ port?: number;
11
+ localProtocol?: "http" | "https";
12
+ assets?: string;
13
+ site?: string;
14
+ siteInclude?: string[];
15
+ siteExclude?: string[];
16
+ nodeCompat?: boolean;
17
+ compatibilityDate?: string;
18
+ experimentalEnableLocalPersistence?: boolean;
19
+ liveReload?: boolean;
20
+ watch?: boolean;
21
+ vars: {
22
+ [key: string]: unknown;
23
+ };
24
+ kv?: {
25
+ binding: string;
26
+ id: string;
27
+ preview_id?: string;
28
+ }[];
29
+ durableObjects?: {
30
+ name: string;
31
+ class_name: string;
32
+ script_name?: string | undefined;
33
+ environment?: string | undefined;
34
+ }[];
35
+ showInteractiveDevSession?: boolean;
36
+ logLevel?: "none" | "error" | "log" | "warn" | "debug";
37
+ logPrefix?: string;
38
+ inspect?: boolean;
39
+ forceLocal?: boolean;
40
+ enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
41
+ _?: (string | number)[]; //yargs wants this
42
+ $0?: string; //yargs wants this
43
+ }
44
+ /**
45
+ * unstable_dev starts a wrangler dev server, and returns a promise that resolves with utility functions to interact with it.
46
+ * @param {string} script
47
+ * @param {DevOptions} options
48
+ */
49
+ export async function unstable_dev(
50
+ script: string,
51
+ options: DevOptions,
52
+ disableExperimentalWarning?: boolean
53
+ ) {
54
+ if (!disableExperimentalWarning) {
55
+ logger.warn(
56
+ `unstable_dev() is experimental\nunstable_dev()'s behaviour will likely change in future releases`
57
+ );
58
+ }
59
+
60
+ return new Promise<{
61
+ stop: () => void;
62
+ fetch: (init?: RequestInit) => Promise<Response | undefined>;
63
+ waitUntilExit: () => Promise<void>;
64
+ }>((resolve) => {
65
+ //lmao
66
+ return new Promise<Awaited<ReturnType<typeof startDev>>>((ready) => {
67
+ const devServer = startDev({
68
+ script: script,
69
+ inspect: false,
70
+ logLevel: "none",
71
+ showInteractiveDevSession: false,
72
+ _: [],
73
+ $0: "",
74
+ ...options,
75
+ local: true,
76
+ onReady: () => ready(devServer),
77
+ });
78
+ }).then((devServer) => {
79
+ resolve({
80
+ stop: devServer.stop,
81
+ fetch: devServer.fetch,
82
+ waitUntilExit: devServer.devReactElement.waitUntilExit,
83
+ });
84
+ });
85
+ });
86
+ }
@@ -0,0 +1 @@
1
+ export { unstable_dev } from "./dev";
@@ -0,0 +1,29 @@
1
+ import { Blob } from "node:buffer";
2
+ import { gzipSync } from "node:zlib";
3
+ import { logger } from "./logger";
4
+ import type { CfModule } from "./worker";
5
+
6
+ async function getSize(modules: CfModule[]) {
7
+ const gzipSize = gzipSync(
8
+ await new Blob(modules.map((file) => file.content)).arrayBuffer()
9
+ ).byteLength;
10
+ const aggregateSize = new Blob(modules.map((file) => file.content)).size;
11
+
12
+ return { size: aggregateSize, gzipSize };
13
+ }
14
+
15
+ export async function printBundleSize(
16
+ main: {
17
+ name: string;
18
+ content: string;
19
+ },
20
+ modules: CfModule[]
21
+ ) {
22
+ const { size, gzipSize } = await getSize([...modules, main]);
23
+
24
+ const bundleReport = `${(size / 1024).toFixed(2)} KiB / gzip: ${(
25
+ gzipSize / 1024
26
+ ).toFixed(2)} KiB`;
27
+
28
+ logger.log(`Total Upload: ${bundleReport}`);
29
+ }
package/src/bundle.ts ADDED
@@ -0,0 +1,236 @@
1
+ import assert from "node:assert";
2
+ import * as fs from "node:fs";
3
+ import { builtinModules } from "node:module";
4
+ import * as path from "node:path";
5
+ import NodeGlobalsPolyfills from "@esbuild-plugins/node-globals-polyfill";
6
+ import NodeModulesPolyfills from "@esbuild-plugins/node-modules-polyfill";
7
+ import * as esbuild from "esbuild";
8
+ import createModuleCollector from "./module-collection";
9
+ import type { Config } from "./config";
10
+ import type { Entry } from "./entry";
11
+ import type { CfModule } from "./worker";
12
+
13
+ type BundleResult = {
14
+ modules: CfModule[];
15
+ resolvedEntryPointPath: string;
16
+ bundleType: "esm" | "commonjs";
17
+ stop: (() => void) | undefined;
18
+ };
19
+
20
+ /**
21
+ * Searches for any uses of node's builtin modules, and throws an error if it
22
+ * finds anything. This plugin is only used when nodeCompat is not enabled.
23
+ * Supports both regular node builtins, and the new "node:<MODULE>" format.
24
+ */
25
+ const checkForNodeBuiltinsPlugin = {
26
+ name: "checkForNodeBuiltins",
27
+ setup(build: esbuild.PluginBuild) {
28
+ build.onResolve(
29
+ {
30
+ filter: new RegExp(
31
+ "^(" +
32
+ builtinModules.join("|") +
33
+ "|" +
34
+ builtinModules.map((module) => "node:" + module).join("|") +
35
+ ")$"
36
+ ),
37
+ },
38
+ () => {
39
+ throw new Error(
40
+ `Detected a Node builtin module import while Node compatibility is disabled.\nAdd node_compat = true to your wrangler.toml file to enable Node compatibility.`
41
+ );
42
+ }
43
+ );
44
+ },
45
+ };
46
+
47
+ /**
48
+ * Generate a bundle for the worker identified by the arguments passed in.
49
+ */
50
+ export async function bundleWorker(
51
+ entry: Entry,
52
+ destination: string,
53
+ options: {
54
+ serveAssetsFromWorker: boolean;
55
+ jsxFactory: string | undefined;
56
+ jsxFragment: string | undefined;
57
+ rules: Config["rules"];
58
+ watch?: esbuild.WatchMode;
59
+ tsconfig: string | undefined;
60
+ minify: boolean | undefined;
61
+ nodeCompat: boolean | undefined;
62
+ define: Config["define"];
63
+ checkFetch: boolean;
64
+ }
65
+ ): Promise<BundleResult> {
66
+ const {
67
+ serveAssetsFromWorker,
68
+ jsxFactory,
69
+ jsxFragment,
70
+ rules,
71
+ watch,
72
+ tsconfig,
73
+ minify,
74
+ nodeCompat,
75
+ checkFetch,
76
+ } = options;
77
+ const entryDirectory = path.dirname(entry.file);
78
+ const moduleCollector = createModuleCollector({
79
+ wrangler1xlegacyModuleReferences: {
80
+ rootDirectory: entryDirectory,
81
+ fileNames: new Set(
82
+ fs
83
+ .readdirSync(entryDirectory, { withFileTypes: true })
84
+ .filter(
85
+ (dirEntry) =>
86
+ dirEntry.isFile() && dirEntry.name !== path.basename(entry.file)
87
+ )
88
+ .map((dirEnt) => dirEnt.name)
89
+ ),
90
+ },
91
+ format: entry.format,
92
+ rules,
93
+ });
94
+
95
+ // In dev, we want to patch `fetch()` with a special version that looks
96
+ // for bad usages and can warn the user about them; so we inject
97
+ // `checked-fetch.js` to do so. However, with yarn 3 style pnp,
98
+ // we need to extract that file to an accessible place before injecting
99
+ // it in, hence this code here.
100
+ const checkedFetchFileToInject = path.join(
101
+ destination,
102
+ "--temp-wrangler-files--",
103
+ "checked-fetch.js"
104
+ );
105
+
106
+ if (checkFetch) {
107
+ fs.mkdirSync(path.join(destination, "--temp-wrangler-files--"), {
108
+ recursive: true,
109
+ });
110
+ fs.writeFileSync(
111
+ checkedFetchFileToInject,
112
+ fs.readFileSync(path.resolve(__dirname, "../templates/checked-fetch.js"))
113
+ );
114
+ }
115
+ // TODO: we need to have similar logic like above for other files
116
+ // like the static asset facade, and other middleware that we
117
+ // plan on injecting/referencing.
118
+
119
+ const result = await esbuild.build({
120
+ ...getEntryPoint(entry.file, serveAssetsFromWorker),
121
+ bundle: true,
122
+ absWorkingDir: entry.directory,
123
+ outdir: destination,
124
+ inject: checkFetch ? [checkedFetchFileToInject] : [],
125
+ external: ["__STATIC_CONTENT_MANIFEST"],
126
+ format: entry.format === "modules" ? "esm" : "iife",
127
+ target: "es2020",
128
+ sourcemap: true,
129
+ minify,
130
+ metafile: true,
131
+ conditions: ["worker", "browser"],
132
+ ...(process.env.NODE_ENV && {
133
+ define: {
134
+ // use process.env["NODE_ENV" + ""] so that esbuild doesn't replace it
135
+ // when we do a build of wrangler. (re: https://github.com/cloudflare/wrangler2/issues/1477)
136
+ "process.env.NODE_ENV": `"${process.env["NODE_ENV" + ""]}"`,
137
+ ...(nodeCompat ? { global: "globalThis" } : {}),
138
+ ...(checkFetch ? { fetch: "checkedFetch" } : {}),
139
+ ...options.define,
140
+ },
141
+ }),
142
+ loader: {
143
+ ".js": "jsx",
144
+ ".mjs": "jsx",
145
+ ".cjs": "jsx",
146
+ },
147
+ plugins: [
148
+ moduleCollector.plugin,
149
+ ...(nodeCompat
150
+ ? [NodeGlobalsPolyfills({ buffer: true }), NodeModulesPolyfills()]
151
+ : // we use checkForNodeBuiltinsPlugin to throw a nicer error
152
+ // if we find node builtins when nodeCompat isn't turned on
153
+ [checkForNodeBuiltinsPlugin]),
154
+ ],
155
+ ...(jsxFactory && { jsxFactory }),
156
+ ...(jsxFragment && { jsxFragment }),
157
+ ...(tsconfig && { tsconfig }),
158
+ watch,
159
+ });
160
+
161
+ const entryPointOutputs = Object.entries(result.metafile.outputs).filter(
162
+ ([_path, output]) => output.entryPoint !== undefined
163
+ );
164
+ assert(
165
+ entryPointOutputs.length > 0,
166
+ `Cannot find entry-point "${entry.file}" in generated bundle.` +
167
+ listEntryPoints(entryPointOutputs)
168
+ );
169
+ assert(
170
+ entryPointOutputs.length < 2,
171
+ "More than one entry-point found for generated bundle." +
172
+ listEntryPoints(entryPointOutputs)
173
+ );
174
+
175
+ const entryPointExports = entryPointOutputs[0][1].exports;
176
+ const bundleType = entryPointExports.length > 0 ? "esm" : "commonjs";
177
+
178
+ return {
179
+ modules: moduleCollector.modules,
180
+ resolvedEntryPointPath: path.resolve(
181
+ entry.directory,
182
+ entryPointOutputs[0][0]
183
+ ),
184
+ bundleType,
185
+ stop: result.stop,
186
+ };
187
+ }
188
+
189
+ type EntryPoint = { stdin: esbuild.StdinOptions } | { entryPoints: string[] };
190
+
191
+ /**
192
+ * Create an object that describes the entry point for esbuild.
193
+ *
194
+ * If we are using the experimental asset handling, then the entry point is
195
+ * actually a shim worker that will either return an asset from a KV store,
196
+ * or delegate to the actual worker.
197
+ */
198
+ function getEntryPoint(
199
+ entryFile: string,
200
+ serveAssetsFromWorker: boolean
201
+ ): EntryPoint {
202
+ if (serveAssetsFromWorker) {
203
+ return {
204
+ stdin: {
205
+ contents: fs
206
+ .readFileSync(
207
+ path.join(__dirname, "../templates/static-asset-facade.js"),
208
+ "utf8"
209
+ )
210
+ // on windows, escape backslashes in the path (`\`)
211
+ .replace("__ENTRY_POINT__", entryFile.replaceAll("\\", "\\\\"))
212
+ .replace(
213
+ "__KV_ASSET_HANDLER__",
214
+ path
215
+ .join(__dirname, "../kv-asset-handler.js")
216
+ .replaceAll("\\", "\\\\")
217
+ ),
218
+ sourcefile: "static-asset-facade.js",
219
+ resolveDir: path.dirname(entryFile),
220
+ },
221
+ };
222
+ } else {
223
+ return { entryPoints: [entryFile] };
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Generate a string that describes the entry-points that were identified by esbuild.
229
+ */
230
+ function listEntryPoints(
231
+ outputs: [string, ValueOf<esbuild.Metafile["outputs"]>][]
232
+ ): string {
233
+ return outputs.map(([_input, output]) => output.entryPoint).join("\n");
234
+ }
235
+
236
+ type ValueOf<T> = T[keyof T];