wrangler 0.0.0-e2b7352 → 0.0.0-e305903a

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 (264) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +51 -14
  3. package/bin/wrangler.js +154 -31
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +6244 -21
  6. package/package.json +185 -141
  7. package/src/__tests__/api-dev.test.ts +209 -0
  8. package/src/__tests__/api-devregistry.test.js +56 -0
  9. package/src/__tests__/api.test.ts +80 -0
  10. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  11. package/src/__tests__/config-cache.test.ts +42 -0
  12. package/src/__tests__/configuration.test.ts +4122 -2810
  13. package/src/__tests__/dev.test.tsx +1341 -527
  14. package/src/__tests__/dialogs.test.tsx +40 -0
  15. package/src/__tests__/generate.test.ts +91 -0
  16. package/src/__tests__/guess-worker-format.test.ts +74 -57
  17. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  18. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  19. package/src/__tests__/helpers/mock-bin.ts +20 -20
  20. package/src/__tests__/helpers/mock-cfetch.ts +202 -93
  21. package/src/__tests__/helpers/mock-console.ts +68 -32
  22. package/src/__tests__/helpers/mock-dialogs.ts +121 -33
  23. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
  24. package/src/__tests__/helpers/mock-http-server.ts +46 -0
  25. package/src/__tests__/helpers/mock-istty.ts +74 -0
  26. package/src/__tests__/helpers/mock-known-routes.ts +7 -0
  27. package/src/__tests__/helpers/mock-kv.ts +26 -26
  28. package/src/__tests__/helpers/mock-oauth-flow.ts +252 -0
  29. package/src/__tests__/helpers/mock-process.ts +39 -0
  30. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  31. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  32. package/src/__tests__/helpers/msw/handlers/index.ts +13 -0
  33. package/src/__tests__/helpers/msw/handlers/namespaces.ts +104 -0
  34. package/src/__tests__/helpers/msw/handlers/oauth.ts +36 -0
  35. package/src/__tests__/helpers/msw/handlers/r2.ts +80 -0
  36. package/src/__tests__/helpers/msw/handlers/user.ts +63 -0
  37. package/src/__tests__/helpers/msw/index.ts +4 -0
  38. package/src/__tests__/helpers/run-in-tmp.ts +28 -22
  39. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  40. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  41. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  42. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  43. package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
  44. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  45. package/src/__tests__/helpers/write-worker-source.ts +31 -0
  46. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  47. package/src/__tests__/https-options.test.ts +144 -108
  48. package/src/__tests__/index.test.ts +233 -967
  49. package/src/__tests__/init.test.ts +2717 -0
  50. package/src/__tests__/jest.setup.ts +151 -34
  51. package/src/__tests__/kv.test.ts +1376 -1085
  52. package/src/__tests__/logger.test.ts +141 -0
  53. package/src/__tests__/metrics.test.ts +450 -0
  54. package/src/__tests__/middleware.scheduled.test.ts +135 -0
  55. package/src/__tests__/middleware.test.ts +726 -0
  56. package/src/__tests__/package-manager.test.ts +312 -165
  57. package/src/__tests__/pages.test.ts +1990 -77
  58. package/src/__tests__/parse.test.ts +253 -245
  59. package/src/__tests__/paths.test.ts +39 -0
  60. package/src/__tests__/publish.test.ts +6989 -3411
  61. package/src/__tests__/pubsub.test.ts +367 -0
  62. package/src/__tests__/r2.test.ts +363 -190
  63. package/src/__tests__/route.test.ts +22 -22
  64. package/src/__tests__/secret.test.ts +626 -407
  65. package/src/__tests__/tail.test.ts +653 -516
  66. package/src/__tests__/test-old-node-version.js +31 -0
  67. package/src/__tests__/user.test.ts +155 -0
  68. package/src/__tests__/validate-dev-props.test.ts +56 -0
  69. package/src/__tests__/version.test.ts +35 -0
  70. package/src/__tests__/whoami.test.tsx +261 -88
  71. package/src/__tests__/worker-namespace.test.ts +319 -0
  72. package/src/abort.d.ts +3 -0
  73. package/src/api/dev.ts +206 -0
  74. package/src/api/index.ts +2 -0
  75. package/src/bundle-reporter.tsx +29 -0
  76. package/src/bundle.ts +723 -122
  77. package/src/cfetch/index.ts +83 -66
  78. package/src/cfetch/internal.ts +267 -92
  79. package/src/cli.ts +24 -14
  80. package/src/config/README.md +1 -1
  81. package/src/config/config.ts +236 -179
  82. package/src/config/diagnostics.ts +61 -61
  83. package/src/config/environment.ts +450 -316
  84. package/src/config/index.ts +259 -38
  85. package/src/config/validation-helpers.ts +385 -342
  86. package/src/config/validation.ts +1797 -1099
  87. package/src/config-cache.ts +85 -0
  88. package/src/create-worker-preview.ts +233 -124
  89. package/src/create-worker-upload-form.ts +285 -201
  90. package/src/d1/backups.tsx +212 -0
  91. package/src/d1/create.tsx +54 -0
  92. package/src/d1/delete.tsx +56 -0
  93. package/src/d1/execute.tsx +294 -0
  94. package/src/d1/formatTimeAgo.ts +14 -0
  95. package/src/d1/index.ts +75 -0
  96. package/src/d1/list.tsx +48 -0
  97. package/src/d1/options.ts +12 -0
  98. package/src/d1/types.tsx +14 -0
  99. package/src/d1/utils.ts +39 -0
  100. package/src/dev/dev-vars.ts +36 -0
  101. package/src/dev/dev.tsx +501 -328
  102. package/src/dev/get-local-persistence-path.tsx +31 -0
  103. package/src/dev/local.tsx +629 -211
  104. package/src/dev/remote.tsx +398 -188
  105. package/src/dev/start-server.ts +443 -0
  106. package/src/dev/use-esbuild.ts +175 -82
  107. package/src/dev/validate-dev-props.ts +31 -0
  108. package/src/dev-registry.tsx +190 -0
  109. package/src/dev.tsx +869 -0
  110. package/src/dialogs.tsx +138 -57
  111. package/src/dispatch-namespace.ts +206 -0
  112. package/src/durable.ts +102 -0
  113. package/src/entry.ts +260 -171
  114. package/src/environment-variables.ts +40 -23
  115. package/src/errors.ts +11 -0
  116. package/src/faye-websocket.d.ts +6 -0
  117. package/src/generate.ts +131 -0
  118. package/src/git-client.ts +42 -0
  119. package/src/global-wrangler-config-path.ts +26 -0
  120. package/src/https-options.ts +85 -80
  121. package/src/index.tsx +2295 -2315
  122. package/src/init.ts +967 -0
  123. package/src/inspect.ts +687 -557
  124. package/src/intl-polyfill.d.ts +123 -123
  125. package/src/is-ci.ts +14 -0
  126. package/src/is-interactive.ts +12 -0
  127. package/src/kv.ts +353 -242
  128. package/src/logger.ts +80 -0
  129. package/src/metrics/index.ts +5 -0
  130. package/src/metrics/metrics-config.ts +239 -0
  131. package/src/metrics/metrics-dispatcher.ts +96 -0
  132. package/src/metrics/metrics-usage-headers.ts +24 -0
  133. package/src/metrics/send-event.ts +93 -0
  134. package/src/miniflare-cli/assets.ts +215 -0
  135. package/src/miniflare-cli/index.ts +201 -30
  136. package/src/miniflare-cli/request-context.ts +40 -0
  137. package/src/module-collection.ts +213 -213
  138. package/src/open-in-browser.ts +8 -16
  139. package/src/package-manager.ts +183 -90
  140. package/src/pages/build.tsx +238 -0
  141. package/src/pages/constants.ts +16 -0
  142. package/src/pages/deployments.tsx +106 -0
  143. package/src/pages/dev.tsx +684 -0
  144. package/src/pages/errors.ts +66 -0
  145. package/src/pages/functions/buildPlugin.ts +110 -0
  146. package/src/pages/functions/buildWorker.ts +156 -0
  147. package/src/pages/functions/filepath-routing.test.ts +234 -0
  148. package/src/pages/functions/filepath-routing.ts +189 -0
  149. package/src/pages/functions/identifiers.ts +78 -0
  150. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  151. package/src/pages/functions/routes-consolidation.ts +73 -0
  152. package/src/pages/functions/routes-transformation.test.ts +282 -0
  153. package/src/pages/functions/routes-transformation.ts +115 -0
  154. package/src/pages/functions/routes-validation.test.ts +403 -0
  155. package/src/pages/functions/routes-validation.ts +202 -0
  156. package/src/pages/functions/routes.ts +151 -0
  157. package/src/pages/functions.tsx +82 -0
  158. package/src/pages/hash.tsx +13 -0
  159. package/src/pages/index.tsx +94 -0
  160. package/src/pages/projects.tsx +169 -0
  161. package/src/pages/publish.tsx +419 -0
  162. package/src/pages/types.ts +49 -0
  163. package/src/pages/upload.tsx +398 -0
  164. package/src/pages/utils.ts +12 -0
  165. package/src/parse.ts +224 -121
  166. package/src/paths.ts +53 -8
  167. package/src/preview.ts +31 -0
  168. package/src/proxy.ts +436 -370
  169. package/src/publish.ts +839 -324
  170. package/src/pubsub/index.ts +286 -0
  171. package/src/pubsub/pubsub-commands.tsx +623 -0
  172. package/src/r2.ts +100 -19
  173. package/src/selfsigned.d.ts +23 -23
  174. package/src/sites.tsx +281 -189
  175. package/src/tail/filters.ts +108 -110
  176. package/src/tail/index.ts +234 -218
  177. package/src/tail/printing.ts +92 -47
  178. package/src/update-check.ts +19 -0
  179. package/src/user/choose-account.tsx +69 -0
  180. package/src/user/env-vars.ts +46 -0
  181. package/src/user/generate-auth-url.ts +33 -0
  182. package/src/user/generate-random-state.ts +16 -0
  183. package/src/user/index.ts +3 -0
  184. package/src/user/user.tsx +1192 -0
  185. package/src/whoami.tsx +142 -42
  186. package/src/worker.ts +171 -100
  187. package/src/zones.ts +167 -0
  188. package/templates/checked-fetch.js +17 -0
  189. package/templates/d1-beta-facade.js +174 -0
  190. package/templates/experimental-local-cache-stubs.js +27 -0
  191. package/templates/first-party-worker-module-facade.ts +18 -0
  192. package/templates/format-dev-errors.ts +32 -0
  193. package/templates/gitignore +171 -0
  194. package/templates/init-tests/test-jest-new-worker.js +25 -0
  195. package/templates/init-tests/test-vitest-new-worker.js +26 -0
  196. package/templates/middleware/common.ts +62 -0
  197. package/templates/middleware/loader-modules.ts +84 -0
  198. package/templates/middleware/loader-sw.ts +213 -0
  199. package/templates/middleware/middleware-pretty-error.ts +40 -0
  200. package/templates/middleware/middleware-scheduled.ts +15 -0
  201. package/templates/new-worker-scheduled.js +17 -0
  202. package/templates/new-worker-scheduled.ts +32 -0
  203. package/templates/new-worker.js +3 -3
  204. package/templates/new-worker.ts +18 -3
  205. package/templates/no-op-worker.js +10 -0
  206. package/templates/pages-dev-pipeline.ts +35 -0
  207. package/templates/pages-shim.ts +9 -0
  208. package/templates/pages-template-plugin.ts +167 -0
  209. package/templates/pages-template-worker.ts +172 -0
  210. package/templates/serve-static-assets.ts +63 -0
  211. package/templates/service-bindings-module-facade.js +54 -0
  212. package/templates/service-bindings-sw-facade.js +42 -0
  213. package/templates/tsconfig.json +95 -95
  214. package/wrangler-dist/cli.d.ts +841 -0
  215. package/wrangler-dist/cli.js +129492 -108210
  216. package/miniflare-dist/index.mjs.map +0 -7
  217. package/pages/functions/buildWorker.ts +0 -62
  218. package/pages/functions/filepath-routing.test.ts +0 -223
  219. package/pages/functions/filepath-routing.ts +0 -181
  220. package/pages/functions/identifiers.ts +0 -78
  221. package/pages/functions/routes.ts +0 -151
  222. package/pages/functions/template-worker.ts +0 -130
  223. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  224. package/src/__tests__/logout.test.ts +0 -52
  225. package/src/__tests__/sentry.test.ts +0 -146
  226. package/src/miniflare-cli/enum-keys.ts +0 -17
  227. package/src/pages.tsx +0 -1061
  228. package/src/reporting.ts +0 -131
  229. package/src/user.tsx +0 -1127
  230. package/templates/static-asset-facade.js +0 -47
  231. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  232. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  233. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  234. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  235. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  236. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  237. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  238. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  239. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  240. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  241. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  242. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  243. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  244. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  245. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  246. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  247. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  248. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  249. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  250. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  251. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  252. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  253. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  254. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  255. package/vendor/wrangler-mime/LICENSE +0 -21
  256. package/vendor/wrangler-mime/Mime.js +0 -97
  257. package/vendor/wrangler-mime/README.md +0 -187
  258. package/vendor/wrangler-mime/cli.js +0 -46
  259. package/vendor/wrangler-mime/index.js +0 -4
  260. package/vendor/wrangler-mime/lite.js +0 -4
  261. package/vendor/wrangler-mime/package.json +0 -52
  262. package/vendor/wrangler-mime/types/other.js +0 -1
  263. package/vendor/wrangler-mime/types/standard.js +0 -1
  264. package/wrangler-dist/cli.js.map +0 -7
@@ -0,0 +1,319 @@
1
+ import { rest } from "msw";
2
+ import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
3
+ import { mockConsoleMethods } from "./helpers/mock-console";
4
+ import { msw } from "./helpers/msw";
5
+ import { runInTempDir } from "./helpers/run-in-tmp";
6
+ import { runWrangler } from "./helpers/run-wrangler";
7
+
8
+ describe("dispatch-namespace", () => {
9
+ runInTempDir();
10
+ const std = mockConsoleMethods();
11
+ mockAccountId();
12
+ mockApiToken();
13
+
14
+ it("should should display a list of available subcommands, for dispatch-namespace with no subcommand", async () => {
15
+ await runWrangler("dispatch-namespace");
16
+
17
+ // wait a tick for the help menu to be printed
18
+ await new Promise((resolve) => setImmediate(resolve));
19
+
20
+ expect(std).toMatchInlineSnapshot(`
21
+ Object {
22
+ "debug": "",
23
+ "err": "",
24
+ "out": "wrangler dispatch-namespace
25
+
26
+ 📦 Interact with a dispatch namespace
27
+
28
+ Commands:
29
+ wrangler dispatch-namespace list List all dispatch namespaces
30
+ wrangler dispatch-namespace get <name> Get information about a dispatch namespace
31
+ wrangler dispatch-namespace create <name> Create a dispatch namespace
32
+ wrangler dispatch-namespace delete <name> Delete a dispatch namespace
33
+ wrangler dispatch-namespace rename <old-name> <new-name> Rename a dispatch namespace
34
+
35
+ Flags:
36
+ -c, --config Path to .toml configuration file [string]
37
+ -h, --help Show help [boolean]
38
+ -v, --version Show version number [boolean]",
39
+ "warn": "",
40
+ }
41
+ `);
42
+ });
43
+
44
+ describe("create namespace", () => {
45
+ const namespaceName = "my-namespace";
46
+ let counter = 0;
47
+ msw.use(
48
+ rest.post(
49
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
50
+ (req, res, cxt) => {
51
+ counter++;
52
+ const { namespaceNameParam } = req.params;
53
+ expect(counter).toBe(1);
54
+ expect(namespaceNameParam).toBe(namespaceName);
55
+ return res.once(
56
+ cxt.status(200),
57
+ cxt.json({
58
+ namespace_id: "some-namespace-id",
59
+ namespace_name: "namespace-name",
60
+ created_on: "2022-06-29T14:30:08.16152Z",
61
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
62
+ modified_on: "2022-06-29T14:30:08.16152Z",
63
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
64
+ })
65
+ );
66
+ }
67
+ )
68
+ );
69
+
70
+ it("should display help for create", async () => {
71
+ await expect(
72
+ runWrangler("dispatch-namespace create")
73
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
74
+ `"Not enough non-option arguments: got 0, need at least 1"`
75
+ );
76
+
77
+ expect(std.out).toMatchInlineSnapshot(`
78
+ "
79
+ wrangler dispatch-namespace create <name>
80
+
81
+ Create a dispatch namespace
82
+
83
+ Positionals:
84
+ name Name of the dispatch namespace [string] [required]
85
+
86
+ Flags:
87
+ -c, --config Path to .toml configuration file [string]
88
+ -h, --help Show help [boolean]
89
+ -v, --version Show version number [boolean]"
90
+ `);
91
+ });
92
+
93
+ it("should attempt to create the given namespace", async () => {
94
+ await runWrangler(`dispatch-namespace create ${namespaceName}`);
95
+
96
+ expect(std.out).toMatchInlineSnapshot(
97
+ `"Created dispatch namespace \\"my-namespace\\" with ID \\"some-namespace-id\\""`
98
+ );
99
+ });
100
+ });
101
+
102
+ describe("delete namespace", () => {
103
+ const namespaceName = "my-namespace";
104
+ let counter = 0;
105
+ msw.use(
106
+ rest.delete(
107
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
108
+ (req, res, cxt) => {
109
+ counter++;
110
+ const { namespaceNameParam } = req.params;
111
+ expect(counter).toBe(1);
112
+ expect(namespaceNameParam).toBe(namespaceName);
113
+ return res.once(cxt.status(200), cxt.json(null));
114
+ }
115
+ )
116
+ );
117
+
118
+ it("should display help for delete", async () => {
119
+ await expect(
120
+ runWrangler("dispatch-namespace create")
121
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
122
+ `"Not enough non-option arguments: got 0, need at least 1"`
123
+ );
124
+
125
+ expect(std.out).toMatchInlineSnapshot(`
126
+ "
127
+ wrangler dispatch-namespace create <name>
128
+
129
+ Create a dispatch namespace
130
+
131
+ Positionals:
132
+ name Name of the dispatch namespace [string] [required]
133
+
134
+ Flags:
135
+ -c, --config Path to .toml configuration file [string]
136
+ -h, --help Show help [boolean]
137
+ -v, --version Show version number [boolean]"
138
+ `);
139
+ });
140
+
141
+ it("should try to delete the given namespace", async () => {
142
+ await runWrangler(`dispatch-namespace delete ${namespaceName}`);
143
+
144
+ expect(std.out).toMatchInlineSnapshot(
145
+ `"Deleted dispatch namespace \\"my-namespace\\""`
146
+ );
147
+ });
148
+ });
149
+
150
+ describe("get namespace", () => {
151
+ const namespaceName = "my-namespace";
152
+ let counter = 0;
153
+ msw.use(
154
+ rest.get(
155
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
156
+ (req, res, cxt) => {
157
+ counter++;
158
+ const { namespaceNameParam } = req.params;
159
+ expect(counter).toBe(1);
160
+ expect(namespaceNameParam).toBe(namespaceName);
161
+ return res.once(
162
+ cxt.status(200),
163
+ cxt.json({
164
+ namespace_id: "some-namespace-id",
165
+ namespace_name: "namespace-name",
166
+ created_on: "2022-06-29T14:30:08.16152Z",
167
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
168
+ modified_on: "2022-06-29T14:30:08.16152Z",
169
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
170
+ })
171
+ );
172
+ }
173
+ )
174
+ );
175
+
176
+ it("should display help for get", async () => {
177
+ await expect(
178
+ runWrangler("dispatch-namespace get")
179
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
180
+ `"Not enough non-option arguments: got 0, need at least 1"`
181
+ );
182
+
183
+ expect(std.out).toMatchInlineSnapshot(`
184
+ "
185
+ wrangler dispatch-namespace get <name>
186
+
187
+ Get information about a dispatch namespace
188
+
189
+ Positionals:
190
+ name Name of the dispatch namespace [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
+ });
198
+
199
+ it("should attempt to get info for the given namespace", async () => {
200
+ await runWrangler(`dispatch-namespace get ${namespaceName}`);
201
+
202
+ expect(std.out).toMatchInlineSnapshot(`
203
+ "{
204
+ namespace_id: 'some-namespace-id',
205
+ namespace_name: 'namespace-name',
206
+ created_on: '2022-06-29T14:30:08.16152Z',
207
+ created_by: '1fc1df98cc4420fe00367c3ab68c1639',
208
+ modified_on: '2022-06-29T14:30:08.16152Z',
209
+ modified_by: '1fc1df98cc4420fe00367c3ab68c1639'
210
+ }"
211
+ `);
212
+ });
213
+ });
214
+
215
+ describe("list namespaces", () => {
216
+ const namespaceName = "my-namespace";
217
+ let counter = 0;
218
+ msw.use(
219
+ rest.get(
220
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
221
+ (req, res, cxt) => {
222
+ counter++;
223
+ const { namespaceNameParam } = req.params;
224
+ expect(counter).toBe(1);
225
+ expect(namespaceNameParam).toBe(namespaceName);
226
+ return res.once(
227
+ cxt.status(200),
228
+ cxt.json({
229
+ namespace_id: "some-namespace-id",
230
+ namespace_name: "namespace-name",
231
+ created_on: "2022-06-29T14:30:08.16152Z",
232
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
233
+ modified_on: "2022-06-29T14:30:08.16152Z",
234
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
235
+ })
236
+ );
237
+ }
238
+ )
239
+ );
240
+
241
+ it("should list all namespaces", async () => {
242
+ await runWrangler("dispatch-namespace list");
243
+ expect(std.out).toMatchInlineSnapshot(`
244
+ "[
245
+ {
246
+ namespace_id: 'some-namespace-id',
247
+ namespace_name: 'namespace-name',
248
+ created_on: '2022-06-29T14:30:08.16152Z',
249
+ created_by: '1fc1df98cc4420fe00367c3ab68c1639',
250
+ modified_on: '2022-06-29T14:30:08.16152Z',
251
+ modified_by: '1fc1df98cc4420fe00367c3ab68c1639'
252
+ }
253
+ ]"
254
+ `);
255
+ });
256
+ });
257
+
258
+ describe("rename namespace", () => {
259
+ const namespaceName = "my-namespace";
260
+ let counter = 0;
261
+ msw.use(
262
+ rest.put(
263
+ "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
264
+ (req, res, cxt) => {
265
+ counter++;
266
+ const { namespaceNameParam } = req.params;
267
+ expect(counter).toBe(1);
268
+ expect(namespaceNameParam).toBe(namespaceName);
269
+ return res.once(
270
+ cxt.status(200),
271
+ cxt.json({
272
+ namespace_id: "some-namespace-id",
273
+ namespace_name: "namespace-name",
274
+ created_on: "2022-06-29T14:30:08.16152Z",
275
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
276
+ modified_on: "2022-06-29T14:30:08.16152Z",
277
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
278
+ })
279
+ );
280
+ }
281
+ )
282
+ );
283
+
284
+ it("should display help for rename", async () => {
285
+ await expect(
286
+ runWrangler("dispatch-namespace rename")
287
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
288
+ `"Not enough non-option arguments: got 0, need at least 2"`
289
+ );
290
+
291
+ expect(std.out).toMatchInlineSnapshot(`
292
+ "
293
+ wrangler dispatch-namespace rename <old-name> <new-name>
294
+
295
+ Rename a dispatch namespace
296
+
297
+ Positionals:
298
+ old-name Name of the dispatch namespace [string] [required]
299
+ new-name New name of the dispatch namespace [string] [required]
300
+
301
+ Flags:
302
+ -c, --config Path to .toml configuration file [string]
303
+ -h, --help Show help [boolean]
304
+ -v, --version Show version number [boolean]"
305
+ `);
306
+ });
307
+
308
+ it("should attempt to rename the given namespace", async () => {
309
+ const newName = "new-namespace";
310
+ await runWrangler(
311
+ `dispatch-namespace rename ${namespaceName} ${newName}`
312
+ );
313
+
314
+ expect(std.out).toMatchInlineSnapshot(
315
+ `"Renamed dispatch namespace \\"my-namespace\\" to \\"new-namespace\\""`
316
+ );
317
+ });
318
+ });
319
+ });
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,206 @@
1
+ import { fetch, Request } from "undici";
2
+ import { startApiDev, startDev } from "../dev";
3
+ import { logger } from "../logger";
4
+
5
+ import type { Environment } from "../config";
6
+ import type { EnablePagesAssetsServiceBindingOptions } from "../miniflare-cli";
7
+ import type { RequestInit, Response, RequestInfo } from "undici";
8
+
9
+ interface DevOptions {
10
+ config?: string;
11
+ env?: string;
12
+ ip?: string;
13
+ port?: number;
14
+ bundle?: boolean;
15
+ inspectorPort?: number;
16
+ localProtocol?: "http" | "https";
17
+ assets?: string;
18
+ site?: string;
19
+ siteInclude?: string[];
20
+ siteExclude?: string[];
21
+ nodeCompat?: boolean;
22
+ compatibilityDate?: string;
23
+ compatibilityFlags?: string[];
24
+ persist?: boolean;
25
+ persistTo?: string;
26
+ liveReload?: boolean;
27
+ watch?: boolean;
28
+ vars?: {
29
+ [key: string]: unknown;
30
+ };
31
+ kv?: {
32
+ binding: string;
33
+ id: string;
34
+ preview_id?: string;
35
+ }[];
36
+ durableObjects?: {
37
+ name: string;
38
+ class_name: string;
39
+ script_name?: string | undefined;
40
+ environment?: string | undefined;
41
+ }[];
42
+ r2?: {
43
+ binding: string;
44
+ bucket_name: string;
45
+ preview_bucket_name?: string;
46
+ }[];
47
+ d1Databases?: Environment["d1_databases"];
48
+ showInteractiveDevSession?: boolean;
49
+ logLevel?: "none" | "info" | "error" | "log" | "warn" | "debug";
50
+ logPrefix?: string;
51
+ inspect?: boolean;
52
+ forceLocal?: boolean;
53
+ enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
54
+ _?: (string | number)[]; //yargs wants this
55
+ $0?: string; //yargs wants this
56
+ testScheduled?: boolean;
57
+ }
58
+
59
+ interface DevApiOptions {
60
+ testMode?: boolean;
61
+ disableExperimentalWarning?: boolean;
62
+ }
63
+
64
+ export interface UnstableDevWorker {
65
+ port: number;
66
+ address: string;
67
+ stop: () => Promise<void>;
68
+ fetch: (input?: RequestInfo, init?: RequestInit) => Promise<Response>;
69
+ waitUntilExit: () => Promise<void>;
70
+ }
71
+ /**
72
+ * unstable_dev starts a wrangler dev server, and returns a promise that resolves with utility functions to interact with it.
73
+ */
74
+ export async function unstable_dev(
75
+ script: string,
76
+ options?: DevOptions,
77
+ apiOptions?: DevApiOptions
78
+ ): Promise<UnstableDevWorker> {
79
+ const { testMode = true, disableExperimentalWarning = false } =
80
+ apiOptions || {};
81
+ if (!disableExperimentalWarning) {
82
+ logger.warn(
83
+ `unstable_dev() is experimental\nunstable_dev()'s behaviour will likely change in future releases`
84
+ );
85
+ }
86
+ let readyPort: number;
87
+ let readyAddress: string;
88
+ //due to Pages adoption of unstable_dev, we can't *just* disable rebuilds and watching. instead, we'll have two versions of startDev, which will converge.
89
+ if (testMode) {
90
+ //in testMode, we can run multiple wranglers in parallel, but rebuilds might not work out of the box
91
+ return new Promise<UnstableDevWorker>((resolve) => {
92
+ //lmao
93
+ return new Promise<Awaited<ReturnType<typeof startApiDev>>>((ready) => {
94
+ // once the devServer is ready for requests, we resolve the inner promise
95
+ // (where we've named the resolve function "ready")
96
+ const devServer = startApiDev({
97
+ script: script,
98
+ inspect: false,
99
+ logLevel: "none",
100
+ showInteractiveDevSession: false,
101
+ _: [],
102
+ $0: "",
103
+ port: options?.port ?? 0,
104
+ ...options,
105
+ local: true,
106
+ onReady: (address, port) => {
107
+ readyPort = port;
108
+ readyAddress = address;
109
+ ready(devServer);
110
+ },
111
+ });
112
+ }).then((devServer) => {
113
+ // now that the inner promise has resolved, we can resolve the outer promise
114
+ // with an object that lets you fetch and stop the dev server
115
+ resolve({
116
+ port: readyPort,
117
+ address: readyAddress,
118
+ stop: devServer.stop,
119
+ fetch: async (input?: RequestInfo, init?: RequestInit) => {
120
+ return await fetch(
121
+ ...parseRequestInput(
122
+ readyAddress,
123
+ readyPort,
124
+ input,
125
+ init,
126
+ options?.localProtocol
127
+ )
128
+ );
129
+ },
130
+ //no-op, does nothing in tests
131
+ waitUntilExit: async () => {
132
+ return;
133
+ },
134
+ });
135
+ });
136
+ });
137
+ } else {
138
+ //outside of test mode, rebuilds work fine, but only one instance of wrangler will work at a time
139
+
140
+ return new Promise<UnstableDevWorker>((resolve) => {
141
+ //lmao
142
+ return new Promise<Awaited<ReturnType<typeof startDev>>>((ready) => {
143
+ const devServer = startDev({
144
+ script: script,
145
+ inspect: false,
146
+ showInteractiveDevSession: false,
147
+ _: [],
148
+ $0: "",
149
+ ...options,
150
+ local: true,
151
+ onReady: (address, port) => {
152
+ readyPort = port;
153
+ readyAddress = address;
154
+ ready(devServer);
155
+ },
156
+ });
157
+ }).then((devServer) => {
158
+ resolve({
159
+ port: readyPort,
160
+ address: readyAddress,
161
+ stop: devServer.stop,
162
+ fetch: async (input?: RequestInfo, init?: RequestInit) => {
163
+ return await fetch(
164
+ ...parseRequestInput(
165
+ readyAddress,
166
+ readyPort,
167
+ input,
168
+ init,
169
+ options?.localProtocol
170
+ )
171
+ );
172
+ },
173
+ waitUntilExit: devServer.devReactElement.waitUntilExit,
174
+ });
175
+ });
176
+ });
177
+ }
178
+ }
179
+
180
+ export function parseRequestInput(
181
+ readyAddress: string,
182
+ readyPort: number,
183
+ input?: RequestInfo,
184
+ init?: RequestInit,
185
+ protocol: "http" | "https" = "http"
186
+ ): [RequestInfo, RequestInit | undefined] {
187
+ if (input instanceof Request) {
188
+ return [input, undefined];
189
+ } else if (input instanceof URL) {
190
+ input = `${protocol}://${readyAddress}:${readyPort}${input.pathname}`;
191
+ } else if (typeof input === "string") {
192
+ try {
193
+ // Want to strip the URL to only get the pathname, but the user could pass in only the pathname
194
+ // Will error if we try and pass "/something" into new URL("/something")
195
+ input = `${protocol}://${readyAddress}:${readyPort}${
196
+ new URL(input).pathname
197
+ }`;
198
+ } catch {
199
+ input = `${protocol}://${readyAddress}:${readyPort}${input}`;
200
+ }
201
+ } else {
202
+ input = `${protocol}://${readyAddress}:${readyPort}`;
203
+ }
204
+
205
+ return [input, init];
206
+ }
@@ -0,0 +1,2 @@
1
+ export { unstable_dev } from "./dev";
2
+ export type { UnstableDevWorker } 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
+ }