wrangler 0.0.0-e7a0cd5b → 0.0.0-e7cf0caa

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +3 -3
  2. package/bin/wrangler.js +30 -10
  3. package/miniflare-dist/index.mjs +126 -74
  4. package/package.json +27 -19
  5. package/src/__tests__/api-dev.test.ts +65 -36
  6. package/src/__tests__/api-devregistry.test.ts +121 -0
  7. package/src/__tests__/api.test.ts +27 -5
  8. package/src/__tests__/configuration.test.ts +567 -86
  9. package/src/__tests__/d1/d1.test.ts +82 -0
  10. package/src/__tests__/d1/execute.test.ts +66 -0
  11. package/src/__tests__/d1/migrate.test.ts +157 -0
  12. package/src/__tests__/d1/splitter.test.ts +255 -0
  13. package/src/__tests__/delete.test.ts +91 -49
  14. package/src/__tests__/deployments.test.ts +330 -56
  15. package/src/__tests__/dev.test.tsx +198 -90
  16. package/src/__tests__/generate.test.ts +12 -10
  17. package/src/__tests__/guess-worker-format.test.ts +35 -0
  18. package/src/__tests__/helpers/end-event-loop.ts +6 -0
  19. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  20. package/src/__tests__/helpers/mock-console.ts +6 -0
  21. package/src/__tests__/helpers/mock-dialogs.ts +71 -85
  22. package/src/__tests__/helpers/mock-get-pages-upload-token.ts +25 -0
  23. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -5
  24. package/src/__tests__/helpers/mock-known-routes.ts +7 -2
  25. package/src/__tests__/helpers/mock-kv.ts +29 -16
  26. package/src/__tests__/helpers/mock-oauth-flow.ts +103 -92
  27. package/src/__tests__/helpers/mock-process.ts +8 -13
  28. package/src/__tests__/helpers/mock-set-timeout.ts +16 -0
  29. package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
  30. package/src/__tests__/helpers/msw/handlers/deployments.ts +128 -27
  31. package/src/__tests__/helpers/msw/handlers/namespaces.ts +18 -41
  32. package/src/__tests__/helpers/msw/handlers/oauth.ts +13 -18
  33. package/src/__tests__/helpers/msw/handlers/r2.ts +14 -34
  34. package/src/__tests__/helpers/msw/handlers/script.ts +9 -28
  35. package/src/__tests__/helpers/msw/handlers/user.ts +13 -24
  36. package/src/__tests__/helpers/msw/handlers/zones.ts +6 -8
  37. package/src/__tests__/helpers/msw/index.ts +32 -1
  38. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  39. package/src/__tests__/helpers/string-dynamic-values-matcher.ts +28 -0
  40. package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
  41. package/src/__tests__/index.test.ts +90 -72
  42. package/src/__tests__/init.test.ts +927 -631
  43. package/src/__tests__/jest.setup.ts +19 -42
  44. package/src/__tests__/kv.test.ts +355 -231
  45. package/src/__tests__/logger.test.ts +68 -2
  46. package/src/__tests__/logout.test.ts +47 -0
  47. package/src/__tests__/metrics.test.ts +94 -51
  48. package/src/__tests__/middleware.scheduled.test.ts +42 -32
  49. package/src/__tests__/middleware.test.ts +212 -122
  50. package/src/__tests__/mtls-certificates.test.ts +588 -0
  51. package/src/__tests__/pages/deployment-list.test.ts +80 -0
  52. package/src/__tests__/pages/functions-build.test.ts +452 -0
  53. package/src/__tests__/pages/pages.test.ts +81 -0
  54. package/src/__tests__/pages/project-create.test.ts +63 -0
  55. package/src/__tests__/pages/project-list.test.ts +110 -0
  56. package/src/__tests__/pages/project-upload.test.ts +500 -0
  57. package/src/__tests__/pages/publish.test.ts +2864 -0
  58. package/src/__tests__/pages-deployment-tail.test.ts +955 -0
  59. package/src/__tests__/parse.test.ts +106 -0
  60. package/src/__tests__/publish.test.ts +1615 -852
  61. package/src/__tests__/pubsub.test.ts +226 -100
  62. package/src/__tests__/queues.test.ts +238 -77
  63. package/src/__tests__/r2.test.ts +55 -57
  64. package/src/__tests__/secret.test.ts +179 -130
  65. package/src/__tests__/tail.test.ts +267 -109
  66. package/src/__tests__/test-old-node-version.js +3 -3
  67. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  68. package/src/__tests__/tsconfig-sanity.ts +12 -0
  69. package/src/__tests__/tsconfig.json +8 -0
  70. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  71. package/src/__tests__/type-generation.test.ts +43 -26
  72. package/src/__tests__/user.test.ts +35 -72
  73. package/src/__tests__/whoami.test.tsx +8 -114
  74. package/src/__tests__/worker-namespace.test.ts +83 -69
  75. package/src/api/dev.ts +168 -60
  76. package/src/api/index.ts +10 -1
  77. package/src/api/mtls-certificate.ts +148 -0
  78. package/src/api/pages/create-worker-bundle-contents.ts +76 -0
  79. package/src/api/pages/index.ts +5 -0
  80. package/src/api/pages/publish.tsx +355 -0
  81. package/src/bundle.ts +263 -140
  82. package/src/cfetch/index.ts +0 -2
  83. package/src/cfetch/internal.ts +16 -21
  84. package/src/cli.ts +4 -4
  85. package/src/config/config.ts +14 -7
  86. package/src/config/environment.ts +79 -24
  87. package/src/config/index.ts +99 -38
  88. package/src/config/validation-helpers.ts +1 -1
  89. package/src/config/validation.ts +248 -19
  90. package/src/create-worker-preview.ts +19 -8
  91. package/src/create-worker-upload-form.ts +60 -22
  92. package/src/d1/backups.tsx +43 -42
  93. package/src/d1/constants.ts +2 -0
  94. package/src/d1/create.tsx +44 -30
  95. package/src/d1/{delete.tsx → delete.ts} +11 -14
  96. package/src/d1/execute.tsx +209 -151
  97. package/src/d1/index.ts +31 -7
  98. package/src/d1/list.tsx +22 -10
  99. package/src/d1/migrations/apply.tsx +212 -0
  100. package/src/d1/migrations/create.tsx +79 -0
  101. package/src/d1/migrations/helpers.ts +172 -0
  102. package/src/d1/migrations/index.ts +3 -0
  103. package/src/d1/migrations/list.tsx +95 -0
  104. package/src/d1/migrations/options.ts +23 -0
  105. package/src/d1/options.ts +12 -2
  106. package/src/d1/splitter.ts +161 -0
  107. package/src/d1/{types.tsx → types.ts} +11 -0
  108. package/src/d1/utils.ts +12 -2
  109. package/src/delete.ts +8 -16
  110. package/src/deployments.ts +340 -46
  111. package/src/deprecated/index.ts +8 -302
  112. package/src/dev/dev.tsx +57 -44
  113. package/src/dev/local.tsx +294 -91
  114. package/src/dev/remote.tsx +32 -3
  115. package/src/dev/start-server.ts +89 -68
  116. package/src/dev/use-esbuild.ts +17 -18
  117. package/src/dev/validate-dev-props.ts +9 -0
  118. package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
  119. package/src/dev.tsx +178 -118
  120. package/src/dialogs.ts +136 -0
  121. package/src/dispatch-namespace.ts +21 -17
  122. package/src/docs/index.ts +97 -0
  123. package/src/entry.ts +19 -11
  124. package/src/environment-variables/factory.ts +88 -0
  125. package/src/environment-variables/misc-variables.ts +30 -0
  126. package/src/generate/index.ts +298 -0
  127. package/src/git-client.ts +15 -4
  128. package/src/{index.tsx → index.ts} +137 -63
  129. package/src/init.ts +249 -187
  130. package/src/inspect.ts +16 -1
  131. package/src/jest.d.ts +4 -0
  132. package/src/kv/index.ts +15 -17
  133. package/src/logger.ts +32 -5
  134. package/src/metrics/metrics-config.ts +3 -3
  135. package/src/metrics/send-event.ts +6 -1
  136. package/src/miniflare-cli/assets.ts +64 -28
  137. package/src/miniflare-cli/index.ts +4 -7
  138. package/src/miniflare-cli/tsconfig.json +9 -0
  139. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  140. package/src/miniflare-cli/types.ts +11 -0
  141. package/src/module-collection.ts +91 -25
  142. package/src/mtls-certificate/cli.ts +155 -0
  143. package/src/pages/build.ts +410 -0
  144. package/src/pages/buildFunctions.ts +140 -0
  145. package/src/pages/deployment-tails.ts +281 -0
  146. package/src/pages/deployments.tsx +11 -33
  147. package/src/pages/{dev.tsx → dev.ts} +147 -124
  148. package/src/pages/errors.ts +1 -0
  149. package/src/pages/functions/buildPlugin.ts +72 -69
  150. package/src/pages/functions/buildWorker.ts +249 -114
  151. package/src/pages/functions/tsconfig.json +8 -0
  152. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  153. package/src/pages/{functions.tsx → functions.ts} +8 -4
  154. package/src/pages/{index.tsx → index.ts} +11 -3
  155. package/src/pages/projects.tsx +12 -22
  156. package/src/pages/prompt-select-project.tsx +31 -0
  157. package/src/pages/publish.tsx +45 -214
  158. package/src/pages/types.ts +6 -9
  159. package/src/pages/upload.tsx +58 -14
  160. package/src/pages/utils.ts +14 -3
  161. package/src/parse.ts +23 -1
  162. package/src/paths.ts +1 -1
  163. package/src/proxy.ts +5 -0
  164. package/src/publish/index.ts +20 -16
  165. package/src/publish/publish.ts +72 -47
  166. package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
  167. package/src/queues/cli/commands/consumer/add.ts +24 -24
  168. package/src/queues/cli/commands/consumer/index.ts +3 -6
  169. package/src/queues/cli/commands/consumer/remove.ts +11 -18
  170. package/src/queues/cli/commands/create.ts +8 -8
  171. package/src/queues/cli/commands/delete.ts +8 -8
  172. package/src/queues/cli/commands/index.ts +6 -4
  173. package/src/queues/cli/commands/list.ts +8 -8
  174. package/src/queues/client.ts +1 -0
  175. package/src/queues/utils.ts +18 -0
  176. package/src/r2/constants.ts +4 -0
  177. package/src/r2/helpers.ts +1 -0
  178. package/src/r2/index.ts +40 -28
  179. package/src/secret/index.ts +14 -17
  180. package/src/{sites.tsx → sites.ts} +1 -1
  181. package/src/tail/createTail.ts +94 -3
  182. package/src/tail/filters.ts +1 -1
  183. package/src/tail/index.ts +8 -11
  184. package/src/tail/printing.ts +15 -0
  185. package/src/traverse-module-graph.ts +53 -0
  186. package/src/tsconfig-sanity.ts +16 -0
  187. package/src/type-generation.ts +79 -57
  188. package/src/user/access.ts +0 -1
  189. package/src/user/auth-variables.ts +113 -0
  190. package/src/user/choose-account.tsx +1 -31
  191. package/src/user/index.ts +0 -1
  192. package/src/user/{user.tsx → user.ts} +123 -82
  193. package/src/utils/render.ts +93 -0
  194. package/src/{whoami.tsx → whoami.ts} +37 -71
  195. package/src/worker.ts +35 -3
  196. package/src/yargs-types.ts +22 -5
  197. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  198. package/templates/__tests__/tsconfig.json +8 -0
  199. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  200. package/templates/checked-fetch.js +9 -3
  201. package/templates/d1-beta-facade.js +95 -25
  202. package/templates/facade.d.ts +14 -0
  203. package/templates/first-party-worker-module-facade.ts +4 -3
  204. package/templates/format-dev-errors.ts +8 -6
  205. package/templates/gitignore +1 -0
  206. package/templates/init-tests/test-jest-new-worker.js +3 -5
  207. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  208. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  209. package/templates/middleware/loader-modules.ts +2 -2
  210. package/templates/middleware/loader-sw.ts +51 -31
  211. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  212. package/templates/new-worker.ts +3 -0
  213. package/templates/pages-dev-pipeline.ts +4 -1
  214. package/templates/pages-shim.ts +4 -1
  215. package/templates/pages-template-plugin.ts +19 -10
  216. package/templates/serve-static-assets.ts +17 -14
  217. package/templates/service-bindings-module-facade.js +1 -0
  218. package/templates/tsconfig-sanity.ts +11 -0
  219. package/templates/tsconfig.init.json +105 -0
  220. package/templates/tsconfig.json +5 -103
  221. package/templates/tsconfig.tsbuildinfo +1 -0
  222. package/wrangler-dist/cli.d.ts +826 -77
  223. package/wrangler-dist/cli.js +130734 -140838
  224. package/wrangler-dist/wasm-sync.wasm +0 -0
  225. package/src/__tests__/api-devregistry.test.js +0 -57
  226. package/src/__tests__/d1.test.ts +0 -72
  227. package/src/__tests__/dialogs.test.tsx +0 -40
  228. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  229. package/src/__tests__/pages.test.ts +0 -2223
  230. package/src/dialogs.tsx +0 -163
  231. package/src/environment-variables.ts +0 -50
  232. package/src/pages/build.tsx +0 -238
  233. package/src/user/env-vars.ts +0 -46
  234. package/templates/experimental-local-cache-stubs.js +0 -27
  235. /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
  236. /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
  237. /package/src/pages/{hash.tsx → hash.ts} +0 -0
@@ -1,10 +1,11 @@
1
1
  import * as fs from "node:fs";
2
2
  import getPort from "get-port";
3
+ import { rest } from "msw";
3
4
  import patchConsole from "patch-console";
4
5
  import dedent from "ts-dedent";
5
6
  import Dev from "../dev/dev";
7
+ import { CI } from "../is-ci";
6
8
  import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
7
- import { setMockResponse, unsetAllMocks } from "./helpers/mock-cfetch";
8
9
  import { mockConsoleMethods } from "./helpers/mock-console";
9
10
  import {
10
11
  msw,
@@ -32,7 +33,23 @@ describe("wrangler dev", () => {
32
33
  afterEach(() => {
33
34
  (Dev as jest.Mock).mockClear();
34
35
  patchConsole(() => {});
35
- unsetAllMocks();
36
+ msw.resetHandlers();
37
+ });
38
+
39
+ describe("authorization", () => {
40
+ mockApiToken({ apiToken: null });
41
+ const isCISpy = jest.spyOn(CI, "isCI").mockReturnValue(true);
42
+
43
+ it("should kick you to the login flow when running wrangler dev in remote mode without authorization", async () => {
44
+ fs.writeFileSync("index.js", `export default {};`);
45
+ await expect(
46
+ runWrangler("dev index.js")
47
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
48
+ `"You must be logged in to use wrangler dev in remote mode. Try logging in, or run wrangler dev --local."`
49
+ );
50
+ });
51
+
52
+ isCISpy.mockClear();
36
53
  });
37
54
 
38
55
  describe("compatibility-date", () => {
@@ -119,7 +136,7 @@ describe("wrangler dev", () => {
119
136
 
120
137
  expect(std.out).toMatchInlineSnapshot(`
121
138
  "
122
- If you think this is a bug then please create an issue at https://github.com/cloudflare/wrangler2/issues/new/choose"
139
+ If you think this is a bug then please create an issue at https://github.com/cloudflare/workers-sdk/issues/new/choose"
123
140
  `);
124
141
  expect(std.err).toMatchInlineSnapshot(`
125
142
  "X [ERROR] Missing entry-point: The entry-point should be specified via the command line (e.g. \`wrangler dev path/to/script\`) or the \`main\` config field.
@@ -422,16 +439,44 @@ describe("wrangler dev", () => {
422
439
  main: "index.js",
423
440
  });
424
441
  fs.writeFileSync("index.js", `export default {};`);
425
- mockGetZones("111.222.333.some-host.com", []);
426
- mockGetZones("222.333.some-host.com", []);
427
- mockGetZones("333.some-host.com", [{ id: "some-zone-id" }]);
428
- await runWrangler("dev --host 111.222.333.some-host.com");
429
- expect((Dev as jest.Mock).mock.calls[0][0]).toEqual(
430
- expect.objectContaining({
431
- host: "111.222.333.some-host.com",
432
- zone: "some-zone-id",
442
+
443
+ msw.use(
444
+ rest.get("*/zones", (req, res, ctx) => {
445
+ let zone: [] | [{ id: "some-zone-id" }] = [];
446
+ if (
447
+ req.url.searchParams.get("name") === "111.222.333.some-host.com"
448
+ ) {
449
+ zone = [];
450
+ } else if (
451
+ req.url.searchParams.get("name") === "222.333.some-host.com"
452
+ ) {
453
+ zone = [];
454
+ } else if (req.url.searchParams.get("name") === "333.some-host.com") {
455
+ zone = [{ id: "some-zone-id" }];
456
+ }
457
+
458
+ return res(
459
+ ctx.status(200),
460
+ ctx.json({
461
+ success: true,
462
+ errors: [],
463
+ messages: [],
464
+ result: zone,
465
+ })
466
+ );
433
467
  })
434
468
  );
469
+
470
+ await runWrangler("dev --host 111.222.333.some-host.com");
471
+
472
+ const devMockCall = (Dev as jest.Mock).mock.calls[0][0];
473
+
474
+ expect(devMockCall).toHaveProperty("host", "111.222.333.some-host.com");
475
+ expect(devMockCall).toHaveProperty(
476
+ "localUpstream",
477
+ "111.222.333.some-host.com"
478
+ );
479
+ expect(devMockCall).toHaveProperty("zone", "some-zone-id");
435
480
  });
436
481
 
437
482
  it("should, in order, use args.host/config.dev.host/args.routes/(config.route|config.routes)", async () => {
@@ -590,7 +635,7 @@ describe("wrangler dev", () => {
590
635
  it("should run a custom build before starting `dev`", async () => {
591
636
  writeWranglerToml({
592
637
  build: {
593
- command: `node -e "console.log('custom build'); require('fs').writeFileSync('index.js', 'export default { fetch(){ return new Response(123) } }')"`,
638
+ command: `node -e "4+4; require('fs').writeFileSync('index.js', 'export default { fetch(){ return new Response(123) } }')"`,
594
639
  },
595
640
  });
596
641
 
@@ -603,12 +648,12 @@ describe("wrangler dev", () => {
603
648
  // and the command would pass through
604
649
  expect((Dev as jest.Mock).mock.calls[0][0].build).toEqual({
605
650
  command:
606
- "node -e \"console.log('custom build'); require('fs').writeFileSync('index.js', 'export default { fetch(){ return new Response(123) } }')\"",
651
+ "node -e \"4+4; require('fs').writeFileSync('index.js', 'export default { fetch(){ return new Response(123) } }')\"",
607
652
  cwd: undefined,
608
653
  watch_dir: "src",
609
654
  });
610
655
  expect(std.out).toMatchInlineSnapshot(
611
- `"Running custom build: node -e \\"console.log('custom build'); require('fs').writeFileSync('index.js', 'export default { fetch(){ return new Response(123) } }')\\""`
656
+ `"Running custom build: node -e \\"4+4; require('fs').writeFileSync('index.js', 'export default { fetch(){ return new Response(123) } }')\\""`
612
657
  );
613
658
  expect(std.err).toMatchInlineSnapshot(`""`);
614
659
  expect(std.warn).toMatchInlineSnapshot(`""`);
@@ -618,7 +663,7 @@ describe("wrangler dev", () => {
618
663
  it("should run a custom build of multiple steps combined by && before starting `dev`", async () => {
619
664
  writeWranglerToml({
620
665
  build: {
621
- command: `echo "custom build" && echo "export default { fetch(){ return new Response(123) } }" > index.js`,
666
+ command: `echo "export default { fetch(){ return new Response(123) } }" > index.js`,
622
667
  },
623
668
  });
624
669
 
@@ -630,7 +675,7 @@ describe("wrangler dev", () => {
630
675
  `);
631
676
 
632
677
  expect(std.out).toMatchInlineSnapshot(
633
- `"Running custom build: echo \\"custom build\\" && echo \\"export default { fetch(){ return new Response(123) } }\\" > index.js"`
678
+ `"Running custom build: echo \\"export default { fetch(){ return new Response(123) } }\\" > index.js"`
634
679
  );
635
680
  expect(std.err).toMatchInlineSnapshot(`""`);
636
681
  expect(std.warn).toMatchInlineSnapshot(`""`);
@@ -641,27 +686,27 @@ describe("wrangler dev", () => {
641
686
  writeWranglerToml({
642
687
  main: "index.js",
643
688
  build: {
644
- command: `node -e "console.log('custom build');"`,
689
+ command: `node -e "4+4;"`,
645
690
  },
646
691
  });
647
692
 
648
693
  await expect(runWrangler("dev")).rejects
649
694
  .toThrowErrorMatchingInlineSnapshot(`
650
- "The expected output file at \\"index.js\\" was not found after running custom build: node -e \\"console.log('custom build');\\".
651
- The \`main\` property in wrangler.toml should point to the file generated by the custom build."
652
- `);
695
+ "The expected output file at \\"index.js\\" was not found after running custom build: node -e \\"4+4;\\".
696
+ The \`main\` property in wrangler.toml should point to the file generated by the custom build."
697
+ `);
653
698
  expect(std.out).toMatchInlineSnapshot(`
654
- "Running custom build: node -e \\"console.log('custom build');\\"
699
+ "Running custom build: node -e \\"4+4;\\"
655
700
 
656
- If you think this is a bug then please create an issue at https://github.com/cloudflare/wrangler2/issues/new/choose"
657
- `);
701
+ If you think this is a bug then please create an issue at https://github.com/cloudflare/workers-sdk/issues/new/choose"
702
+ `);
658
703
  expect(std.err).toMatchInlineSnapshot(`
659
- "X [ERROR] The expected output file at \\"index.js\\" was not found after running custom build: node -e \\"console.log('custom build');\\".
704
+ "X [ERROR] The expected output file at \\"index.js\\" was not found after running custom build: node -e \\"4+4;\\".
660
705
 
661
- The \`main\` property in wrangler.toml should point to the file generated by the custom build.
706
+ The \`main\` property in wrangler.toml should point to the file generated by the custom build.
662
707
 
663
- "
664
- `);
708
+ "
709
+ `);
665
710
  expect(std.warn).toMatchInlineSnapshot(`""`);
666
711
  });
667
712
 
@@ -729,7 +774,7 @@ describe("wrangler dev", () => {
729
774
  "▲ [WARNING] Setting upstream-protocol to http is not currently implemented.
730
775
 
731
776
  If this is required in your project, please add your use case to the following issue:
732
- https://github.com/cloudflare/wrangler2/issues/583.
777
+ https://github.com/cloudflare/workers-sdk/issues/583.
733
778
 
734
779
  "
735
780
  `);
@@ -792,7 +837,7 @@ describe("wrangler dev", () => {
792
837
  });
793
838
  fs.writeFileSync("index.js", `export default {};`);
794
839
  await runWrangler("dev");
795
- expect((Dev as jest.Mock).mock.calls[0][0].ip).toEqual("0.0.0.0");
840
+ expect((Dev as jest.Mock).mock.calls[0][0].initialIp).toEqual("0.0.0.0");
796
841
  expect(std.out).toMatchInlineSnapshot(`""`);
797
842
  expect(std.warn).toMatchInlineSnapshot(`""`);
798
843
  expect(std.err).toMatchInlineSnapshot(`""`);
@@ -807,7 +852,7 @@ describe("wrangler dev", () => {
807
852
  });
808
853
  fs.writeFileSync("index.js", `export default {};`);
809
854
  await runWrangler("dev");
810
- expect((Dev as jest.Mock).mock.calls[0][0].ip).toEqual("1.2.3.4");
855
+ expect((Dev as jest.Mock).mock.calls[0][0].initialIp).toEqual("1.2.3.4");
811
856
  expect(std.out).toMatchInlineSnapshot(`""`);
812
857
  expect(std.warn).toMatchInlineSnapshot(`""`);
813
858
  expect(std.err).toMatchInlineSnapshot(`""`);
@@ -822,7 +867,7 @@ describe("wrangler dev", () => {
822
867
  });
823
868
  fs.writeFileSync("index.js", `export default {};`);
824
869
  await runWrangler("dev --ip=5.6.7.8");
825
- expect((Dev as jest.Mock).mock.calls[0][0].ip).toEqual("5.6.7.8");
870
+ expect((Dev as jest.Mock).mock.calls[0][0].initialIp).toEqual("5.6.7.8");
826
871
  expect(std.out).toMatchInlineSnapshot(`""`);
827
872
  expect(std.warn).toMatchInlineSnapshot(`""`);
828
873
  expect(std.err).toMatchInlineSnapshot(`""`);
@@ -830,6 +875,32 @@ describe("wrangler dev", () => {
830
875
  });
831
876
 
832
877
  describe("inspector port", () => {
878
+ it("should connect WebSocket server with --experimental-local", async () => {
879
+ writeWranglerToml({
880
+ main: "./index.js",
881
+ });
882
+ fs.writeFileSync(
883
+ "index.js",
884
+ `export default {
885
+ async fetch(request, env, ctx ){
886
+ console.log('Hello World LOGGING');
887
+ },
888
+ };`
889
+ );
890
+ await runWrangler("dev --experimental-local");
891
+
892
+ expect((Dev as jest.Mock).mock.calls[0][0].inspectorPort).toEqual(9229);
893
+ expect(std).toMatchInlineSnapshot(`
894
+ Object {
895
+ "debug": "",
896
+ "err": "",
897
+ "info": "",
898
+ "out": "",
899
+ "warn": "",
900
+ }
901
+ `);
902
+ });
903
+
833
904
  it("should use 9229 as the default port", async () => {
834
905
  writeWranglerToml({
835
906
  main: "index.js",
@@ -841,6 +912,7 @@ describe("wrangler dev", () => {
841
912
  Object {
842
913
  "debug": "",
843
914
  "err": "",
915
+ "info": "",
844
916
  "out": "",
845
917
  "warn": "",
846
918
  }
@@ -858,6 +930,7 @@ describe("wrangler dev", () => {
858
930
  Object {
859
931
  "debug": "",
860
932
  "err": "",
933
+ "info": "",
861
934
  "out": "",
862
935
  "warn": "",
863
936
  }
@@ -878,6 +951,7 @@ describe("wrangler dev", () => {
878
951
  Object {
879
952
  "debug": "",
880
953
  "err": "",
954
+ "info": "",
881
955
  "out": "",
882
956
  "warn": "",
883
957
  }
@@ -908,7 +982,7 @@ describe("wrangler dev", () => {
908
982
  });
909
983
  fs.writeFileSync("index.js", `export default {};`);
910
984
  await runWrangler("dev");
911
- expect((Dev as jest.Mock).mock.calls[0][0].port).toEqual(8787);
985
+ expect((Dev as jest.Mock).mock.calls[0][0].initialPort).toEqual(8787);
912
986
  expect(std.out).toMatchInlineSnapshot(`""`);
913
987
  expect(std.warn).toMatchInlineSnapshot(`""`);
914
988
  expect(std.err).toMatchInlineSnapshot(`""`);
@@ -926,7 +1000,7 @@ describe("wrangler dev", () => {
926
1000
  (getPort as jest.Mock).mockResolvedValue(98765);
927
1001
 
928
1002
  await runWrangler("dev");
929
- expect((Dev as jest.Mock).mock.calls[0][0].port).toEqual(8888);
1003
+ expect((Dev as jest.Mock).mock.calls[0][0].initialPort).toEqual(8888);
930
1004
  expect(std.out).toMatchInlineSnapshot(`""`);
931
1005
  expect(std.warn).toMatchInlineSnapshot(`""`);
932
1006
  expect(std.err).toMatchInlineSnapshot(`""`);
@@ -960,7 +1034,7 @@ describe("wrangler dev", () => {
960
1034
  (getPort as jest.Mock).mockResolvedValue(98765);
961
1035
 
962
1036
  await runWrangler("dev --port=9999");
963
- expect((Dev as jest.Mock).mock.calls[0][0].port).toEqual(9999);
1037
+ expect((Dev as jest.Mock).mock.calls[0][0].initialPort).toEqual(9999);
964
1038
  expect(std.out).toMatchInlineSnapshot(`""`);
965
1039
  expect(std.warn).toMatchInlineSnapshot(`""`);
966
1040
  expect(std.err).toMatchInlineSnapshot(`""`);
@@ -975,7 +1049,7 @@ describe("wrangler dev", () => {
975
1049
  (getPort as jest.Mock).mockResolvedValue(98765);
976
1050
 
977
1051
  await runWrangler("dev");
978
- expect((Dev as jest.Mock).mock.calls[0][0].port).toEqual(98765);
1052
+ expect((Dev as jest.Mock).mock.calls[0][0].initialPort).toEqual(98765);
979
1053
  expect(std.out).toMatchInlineSnapshot(`""`);
980
1054
  expect(std.warn).toMatchInlineSnapshot(`""`);
981
1055
  expect(std.err).toMatchInlineSnapshot(`""`);
@@ -1005,7 +1079,7 @@ describe("wrangler dev", () => {
1005
1079
  });
1006
1080
  fs.writeFileSync("index.js", `export default {};`);
1007
1081
  await runWrangler("dev");
1008
- expect((Dev as jest.Mock).mock.calls[0][0].ip).toEqual("0.0.0.0");
1082
+ expect((Dev as jest.Mock).mock.calls[0][0].initialIp).toEqual("0.0.0.0");
1009
1083
  expect(std.out).toMatchInlineSnapshot(`
1010
1084
  "Your worker has access to the following bindings:
1011
1085
  - Durable Objects:
@@ -1139,6 +1213,7 @@ describe("wrangler dev", () => {
1139
1213
  "err": "X [ERROR] Not enough arguments following: site
1140
1214
 
1141
1215
  ",
1216
+ "info": "",
1142
1217
  "out": "
1143
1218
  wrangler dev [script]
1144
1219
 
@@ -1148,10 +1223,11 @@ describe("wrangler dev", () => {
1148
1223
  script The path to an entry point for your worker [string]
1149
1224
 
1150
1225
  Flags:
1151
- -c, --config Path to .toml configuration file [string]
1152
- -e, --env Environment to use for operations and .env files [string]
1153
- -h, --help Show help [boolean]
1154
- -v, --version Show version number [boolean]
1226
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
1227
+ -c, --config Path to .toml configuration file [string]
1228
+ -e, --env Environment to use for operations and .env files [string]
1229
+ -h, --help Show help [boolean]
1230
+ -v, --version Show version number [boolean]
1155
1231
 
1156
1232
  Options:
1157
1233
  --name Name of the worker [string]
@@ -1178,10 +1254,12 @@ describe("wrangler dev", () => {
1178
1254
  --tsconfig Path to a custom tsconfig.json file [string]
1179
1255
  -l, --local Run on my machine [boolean] [default: false]
1180
1256
  --experimental-local Run on my machine using the Cloudflare Workers runtime [boolean] [default: false]
1257
+ --experimental-local-remote-kv Read/write KV data from/to real namespaces on the Cloudflare network [boolean] [default: false]
1181
1258
  --minify Minify the script [boolean]
1182
- --node-compat Enable node.js compatibility [boolean]
1259
+ --node-compat Enable Node.js compatibility [boolean]
1183
1260
  --persist Enable persistence for local mode, using default path: .wrangler/state [boolean]
1184
1261
  --persist-to Specify directory to use for local persistence (implies --persist) [string]
1262
+ --live-reload Auto reload HTML pages when change is detected in local mode [boolean]
1185
1263
  --test-scheduled Test scheduled events by visiting /__scheduled in browser [boolean] [default: false]
1186
1264
  --log-level Specify logging level [choices: \\"debug\\", \\"info\\", \\"log\\", \\"warn\\", \\"error\\", \\"none\\"] [default: \\"log\\"]",
1187
1265
  "warn": "",
@@ -1270,15 +1348,16 @@ describe("wrangler dev", () => {
1270
1348
 
1271
1349
  await runWrangler('dev --assets "./assets"');
1272
1350
  expect(std).toMatchInlineSnapshot(`
1273
- Object {
1274
- "debug": "",
1275
- "err": "",
1276
- "out": "",
1277
- "warn": "▲ [WARNING] The --assets argument is experimental and may change or break at any time
1278
-
1279
- ",
1280
- }
1281
- `);
1351
+ Object {
1352
+ "debug": "",
1353
+ "err": "",
1354
+ "info": "",
1355
+ "out": "",
1356
+ "warn": "▲ [WARNING] The --assets argument is experimental and may change or break at any time
1357
+
1358
+ ",
1359
+ }
1360
+ `);
1282
1361
  });
1283
1362
 
1284
1363
  it("should warn if config.assets is used", async () => {
@@ -1291,17 +1370,18 @@ describe("wrangler dev", () => {
1291
1370
 
1292
1371
  await runWrangler("dev");
1293
1372
  expect(std).toMatchInlineSnapshot(`
1294
- Object {
1295
- "debug": "",
1296
- "err": "",
1297
- "out": "",
1298
- "warn": "▲ [WARNING] Processing wrangler.toml configuration:
1373
+ Object {
1374
+ "debug": "",
1375
+ "err": "",
1376
+ "info": "",
1377
+ "out": "",
1378
+ "warn": "▲ [WARNING] Processing wrangler.toml configuration:
1299
1379
 
1300
- - \\"assets\\" fields are experimental and may change or break at any time.
1380
+ - \\"assets\\" fields are experimental and may change or break at any time.
1301
1381
 
1302
- ",
1303
- }
1304
- `);
1382
+ ",
1383
+ }
1384
+ `);
1305
1385
  });
1306
1386
  });
1307
1387
 
@@ -1310,15 +1390,16 @@ describe("wrangler dev", () => {
1310
1390
  fs.writeFileSync("index.js", `export default {};`);
1311
1391
  await runWrangler("dev index.js --inspect");
1312
1392
  expect(std).toMatchInlineSnapshot(`
1313
- Object {
1314
- "debug": "",
1315
- "err": "",
1316
- "out": "",
1317
- "warn": "▲ [WARNING] Passing --inspect is unnecessary, now you can always connect to devtools.
1318
-
1319
- ",
1320
- }
1321
- `);
1393
+ Object {
1394
+ "debug": "",
1395
+ "err": "",
1396
+ "info": "",
1397
+ "out": "",
1398
+ "warn": "▲ [WARNING] Passing --inspect is unnecessary, now you can always connect to devtools.
1399
+
1400
+ ",
1401
+ }
1402
+ `);
1322
1403
  });
1323
1404
 
1324
1405
  it("should default to true, without a warning", async () => {
@@ -1329,6 +1410,7 @@ describe("wrangler dev", () => {
1329
1410
  Object {
1330
1411
  "debug": "",
1331
1412
  "err": "",
1413
+ "info": "",
1332
1414
  "out": "",
1333
1415
  "warn": "",
1334
1416
  }
@@ -1343,6 +1425,7 @@ describe("wrangler dev", () => {
1343
1425
  Object {
1344
1426
  "debug": "",
1345
1427
  "err": "",
1428
+ "info": "",
1346
1429
  "out": "",
1347
1430
  "warn": "▲ [WARNING] Passing --inspect is unnecessary, now you can always connect to devtools.
1348
1431
 
@@ -1359,6 +1442,7 @@ describe("wrangler dev", () => {
1359
1442
  Object {
1360
1443
  "debug": "",
1361
1444
  "err": "",
1445
+ "info": "",
1362
1446
  "out": "",
1363
1447
  "warn": "",
1364
1448
  }
@@ -1374,6 +1458,7 @@ describe("wrangler dev", () => {
1374
1458
  Object {
1375
1459
  "debug": "",
1376
1460
  "err": "",
1461
+ "info": "",
1377
1462
  "out": "",
1378
1463
  "warn": "",
1379
1464
  }
@@ -1387,6 +1472,7 @@ describe("wrangler dev", () => {
1387
1472
  Object {
1388
1473
  "debug": "",
1389
1474
  "err": "",
1475
+ "info": "",
1390
1476
  "out": "",
1391
1477
  "warn": "▲ [WARNING] Passing --inspect is unnecessary, now you can always connect to devtools.
1392
1478
 
@@ -1443,23 +1529,24 @@ describe("wrangler dev", () => {
1443
1529
  fs.writeFileSync("index.js", `export default {};`);
1444
1530
  await runWrangler("dev index.js");
1445
1531
  expect(std).toMatchInlineSnapshot(`
1446
- Object {
1447
- "debug": "",
1448
- "err": "",
1449
- "out": "Your worker has access to the following bindings:
1450
- - Services:
1451
- - WorkerA: A
1452
- - WorkerB: B - staging",
1453
- "warn": "▲ [WARNING] Processing wrangler.toml configuration:
1532
+ Object {
1533
+ "debug": "",
1534
+ "err": "",
1535
+ "info": "",
1536
+ "out": "Your worker has access to the following bindings:
1537
+ - Services:
1538
+ - WorkerA: A
1539
+ - WorkerB: B - staging",
1540
+ "warn": "▲ [WARNING] Processing wrangler.toml configuration:
1454
1541
 
1455
- - \\"services\\" fields are experimental and may change or break at any time.
1542
+ - \\"services\\" fields are experimental and may change or break at any time.
1456
1543
 
1457
1544
 
1458
- ▲ [WARNING] This worker is bound to live services: WorkerA (A), WorkerB (B@staging)
1545
+ ▲ [WARNING] This worker is bound to live services: WorkerA (A), WorkerB (B@staging)
1459
1546
 
1460
- ",
1461
- }
1462
- `);
1547
+ ",
1548
+ }
1549
+ `);
1463
1550
  });
1464
1551
 
1465
1552
  it("should mask vars that were overriden in .dev.vars", async () => {
@@ -1482,6 +1569,7 @@ describe("wrangler dev", () => {
1482
1569
  Object {
1483
1570
  "debug": "",
1484
1571
  "err": "",
1572
+ "info": "",
1485
1573
  "out": "Using vars defined in .dev.vars
1486
1574
  Your worker has access to the following bindings:
1487
1575
  - Vars:
@@ -1493,17 +1581,37 @@ describe("wrangler dev", () => {
1493
1581
  `);
1494
1582
  });
1495
1583
  });
1584
+
1585
+ describe("`nodejs_compat` compatibility flag", () => {
1586
+ it("should conflict with the --node-compat option", async () => {
1587
+ writeWranglerToml();
1588
+ fs.writeFileSync("index.js", `export default {};`);
1589
+
1590
+ await expect(
1591
+ runWrangler(
1592
+ "dev index.js --compatibility-flag=nodejs_compat --node-compat"
1593
+ )
1594
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
1595
+ `"The \`nodejs_compat\` compatibility flag cannot be used in conjunction with the legacy \`--node-compat\` flag. If you want to use the Workers runtime Node.js compatibility features, please remove the \`--node-compat\` argument from your CLI command or \`node_compat = true\` from your config file."`
1596
+ );
1597
+ });
1598
+ });
1496
1599
  });
1497
1600
 
1498
1601
  function mockGetZones(domain: string, zones: { id: string }[] = []) {
1499
- const removeMock = setMockResponse(
1500
- "/zones",
1501
- "GET",
1502
- (_urlPieces, _init, queryParams) => {
1503
- expect([...queryParams.entries()]).toEqual([["name", domain]]);
1504
- // Because the API URL `/zones` is the same for each request, we can get into a situation where earlier mocks get triggered for later requests. So, we simply clear the mock on every trigger.
1505
- removeMock();
1506
- return zones;
1507
- }
1602
+ msw.use(
1603
+ rest.get("*/zones", (req, res, ctx) => {
1604
+ expect([...req.url.searchParams.entries()]).toEqual([["name", domain]]);
1605
+
1606
+ return res(
1607
+ ctx.status(200),
1608
+ ctx.json({
1609
+ success: true,
1610
+ errors: [],
1611
+ messages: [],
1612
+ result: zones,
1613
+ })
1614
+ );
1615
+ })
1508
1616
  );
1509
1617
  }
@@ -1,18 +1,21 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { mockConsoleMethods } from "./helpers/mock-console";
4
- import { mockConfirm, clearConfirmMocks } from "./helpers/mock-dialogs";
4
+ import { mockConfirm } from "./helpers/mock-dialogs";
5
+ import { useMockIsTTY } from "./helpers/mock-istty";
5
6
  import { runInTempDir } from "./helpers/run-in-tmp";
6
7
  import { runWrangler } from "./helpers/run-wrangler";
7
8
 
8
9
  describe("generate", () => {
9
10
  runInTempDir();
11
+ const { setIsTTY } = useMockIsTTY();
10
12
  const std = mockConsoleMethods();
13
+ beforeEach(() => {
14
+ setIsTTY(true);
15
+ });
11
16
 
12
17
  describe("cli functionality", () => {
13
- afterEach(() => {
14
- clearConfirmMocks();
15
- });
18
+ afterEach(() => {});
16
19
 
17
20
  it("defers to `wrangler init` when no template is given", async () => {
18
21
  mockConfirm(
@@ -55,7 +58,7 @@ describe("generate", () => {
55
58
  `);
56
59
  });
57
60
 
58
- it("auto-increments the worker directory name", async () => {
61
+ it.skip("auto-increments the worker directory name", async () => {
59
62
  fs.mkdirSync("my-worker");
60
63
 
61
64
  expect(fs.existsSync("my-worker-1")).toBe(false);
@@ -113,10 +116,9 @@ describe("generate", () => {
113
116
  ".git": expect.any(Object),
114
117
  ".gitignore": expect.any(String),
115
118
  "README.md": expect.stringContaining("Template: worker-typescript"),
116
- "jest.config.json": expect.any(String),
117
119
  "package.json": expect.stringContaining("@cloudflare/workers-types"),
118
- src: expect.objectContaining({ "index.ts": expect.any(String) }),
119
- test: expect.objectContaining({
120
+ src: expect.objectContaining({
121
+ "index.ts": expect.any(String),
120
122
  "index.test.ts": expect.any(String),
121
123
  }),
122
124
  "tsconfig.json": expect.any(String),
@@ -128,7 +130,7 @@ describe("generate", () => {
128
130
  // was harder than i thought, leaving this for now.
129
131
  it.todo("clones a cloudflare template with full checkouts");
130
132
 
131
- it("clones a user/repo template", async () => {
133
+ it.skip("clones a user/repo template", async () => {
132
134
  await expect(
133
135
  runWrangler("generate my-worker caass/wrangler-generate-test-template")
134
136
  ).resolves.toBeUndefined();
@@ -143,7 +145,7 @@ describe("generate", () => {
143
145
  });
144
146
  });
145
147
 
146
- it("clones a user/repo/path/to/subdirectory template", async () => {
148
+ it.skip("clones a user/repo/path/to/subdirectory template", async () => {
147
149
  await expect(
148
150
  runWrangler("generate my-worker cloudflare/templates/worker-typescript")
149
151
  ).resolves.toBeUndefined();
@@ -32,6 +32,41 @@ describe("guess worker format", () => {
32
32
  expect(guess).toBe("service-worker");
33
33
  });
34
34
 
35
+ it('should detect a "service-worker" worker using `typeof module`', async () => {
36
+ await writeFile("./index.ts", "typeof module");
37
+ const guess = await guessWorkerFormat(
38
+ path.join(process.cwd(), "./index.ts"),
39
+ process.cwd(),
40
+ undefined
41
+ );
42
+ expect(guess).toBe("service-worker");
43
+ });
44
+
45
+ it('should detect a "service-worker" worker using imports', async () => {
46
+ await writeFile(
47
+ "./dep.ts",
48
+ `
49
+ const value = 'thing';
50
+ export default value;
51
+ `
52
+ );
53
+ await writeFile(
54
+ "./index.ts",
55
+ `
56
+ import value from './dep.ts';
57
+ addEventListener('fetch', (event) => {
58
+ event.respondWith(new Response(value));
59
+ });
60
+ `
61
+ );
62
+ const guess = await guessWorkerFormat(
63
+ path.join(process.cwd(), "./index.ts"),
64
+ process.cwd(),
65
+ undefined
66
+ );
67
+ expect(guess).toBe("service-worker");
68
+ });
69
+
35
70
  it("should throw an error when the hint doesn't match the guess (modules - service-worker)", async () => {
36
71
  await writeFile("./index.ts", "export default {};");
37
72
  await expect(
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Forces a tick and ensures that all pending promises resolve
3
+ */
4
+ export function endEventLoop() {
5
+ return new Promise((resolve) => setImmediate(resolve));
6
+ }