wrangler 0.0.0-e33294b0 → 0.0.0-e351afcf

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 (127) hide show
  1. package/bin/wrangler.js +1 -1
  2. package/miniflare-dist/index.mjs +183 -92
  3. package/package.json +15 -10
  4. package/src/__tests__/api-devregistry.test.ts +121 -0
  5. package/src/__tests__/api.test.ts +27 -5
  6. package/src/__tests__/configuration.test.ts +294 -18
  7. package/src/__tests__/constellation.test.ts +371 -0
  8. package/src/__tests__/d1/execute.test.ts +3 -1
  9. package/src/__tests__/d1/migrate.test.ts +102 -0
  10. package/src/__tests__/delete.test.ts +6 -0
  11. package/src/__tests__/deployments.test.ts +335 -95
  12. package/src/__tests__/dev.test.tsx +87 -57
  13. package/src/__tests__/generate.test.ts +3 -4
  14. package/src/__tests__/guess-worker-format.test.ts +35 -0
  15. package/src/__tests__/helpers/mock-console.ts +6 -0
  16. package/src/__tests__/helpers/msw/handlers/deployments.ts +70 -3
  17. package/src/__tests__/helpers/msw/index.ts +4 -2
  18. package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
  19. package/src/__tests__/index.test.ts +14 -6
  20. package/src/__tests__/init.test.ts +136 -104
  21. package/src/__tests__/jest.setup.ts +4 -0
  22. package/src/__tests__/kv.test.ts +9 -9
  23. package/src/__tests__/logger.test.ts +68 -2
  24. package/src/__tests__/middleware.scheduled.test.ts +2 -2
  25. package/src/__tests__/middleware.test.ts +4 -3
  26. package/src/__tests__/mtls-certificates.test.ts +7 -3
  27. package/src/__tests__/pages/deployment-list.test.ts +2 -0
  28. package/src/__tests__/pages/functions-build.test.ts +159 -39
  29. package/src/__tests__/pages/project-list.test.ts +2 -0
  30. package/src/__tests__/pages/project-upload.test.ts +43 -24
  31. package/src/__tests__/pages/publish.test.ts +267 -148
  32. package/src/__tests__/publish.test.ts +1040 -339
  33. package/src/__tests__/pubsub.test.ts +3 -0
  34. package/src/__tests__/queues.test.ts +5 -2
  35. package/src/__tests__/test-old-node-version.js +3 -3
  36. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  37. package/src/__tests__/tsconfig.tsbuildinfo +1 -1
  38. package/src/__tests__/type-generation.test.ts +1 -0
  39. package/src/__tests__/user.test.ts +2 -2
  40. package/src/__tests__/worker-namespace.test.ts +1 -0
  41. package/src/api/dev.ts +15 -22
  42. package/src/api/pages/create-worker-bundle-contents.ts +1 -0
  43. package/src/api/pages/publish.tsx +64 -61
  44. package/src/bundle.ts +51 -16
  45. package/src/config/environment.ts +36 -4
  46. package/src/config/index.ts +30 -2
  47. package/src/config/validation-helpers.ts +1 -1
  48. package/src/config/validation.ts +149 -5
  49. package/src/constellation/createProject.tsx +51 -0
  50. package/src/constellation/deleteProject.ts +51 -0
  51. package/src/constellation/deleteProjectModel.ts +68 -0
  52. package/src/constellation/index.ts +75 -0
  53. package/src/constellation/listCatalog.tsx +35 -0
  54. package/src/constellation/listModel.tsx +41 -0
  55. package/src/constellation/listProject.tsx +28 -0
  56. package/src/constellation/listRuntime.tsx +28 -0
  57. package/src/constellation/options.ts +17 -0
  58. package/src/constellation/types.ts +17 -0
  59. package/src/constellation/uploadModel.tsx +64 -0
  60. package/src/constellation/utils.ts +90 -0
  61. package/src/create-worker-preview.ts +19 -8
  62. package/src/create-worker-upload-form.ts +28 -3
  63. package/src/d1/backups.tsx +19 -15
  64. package/src/d1/create.tsx +45 -39
  65. package/src/d1/delete.ts +1 -1
  66. package/src/d1/execute.tsx +23 -20
  67. package/src/d1/list.tsx +14 -12
  68. package/src/d1/migrations/apply.tsx +36 -30
  69. package/src/d1/migrations/create.tsx +15 -12
  70. package/src/d1/migrations/helpers.ts +5 -8
  71. package/src/d1/migrations/list.tsx +10 -7
  72. package/src/deployments.ts +260 -8
  73. package/src/dev/dev.tsx +6 -4
  74. package/src/dev/local.tsx +65 -40
  75. package/src/dev/start-server.ts +57 -52
  76. package/src/dev/use-esbuild.ts +59 -52
  77. package/src/dev/validate-dev-props.ts +9 -0
  78. package/src/dev-registry.ts +2 -1
  79. package/src/dev.tsx +38 -18
  80. package/src/docs/helpers.ts +50 -0
  81. package/src/docs/index.ts +25 -68
  82. package/src/entry.ts +19 -9
  83. package/src/environment-variables/factory.ts +2 -1
  84. package/src/generate/index.ts +2 -2
  85. package/src/index.ts +87 -24
  86. package/src/init.ts +144 -134
  87. package/src/inspect.ts +16 -1
  88. package/src/kv/helpers.ts +7 -4
  89. package/src/logger.ts +23 -4
  90. package/src/metrics/send-event.ts +2 -1
  91. package/src/miniflare-cli/assets.ts +8 -7
  92. package/src/miniflare-cli/index.ts +3 -3
  93. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -1
  94. package/src/module-collection.ts +92 -26
  95. package/src/pages/build.ts +290 -100
  96. package/src/pages/buildFunctions.ts +20 -10
  97. package/src/pages/deployments.tsx +3 -5
  98. package/src/pages/dev.ts +44 -26
  99. package/src/pages/errors.ts +1 -0
  100. package/src/pages/functions/buildPlugin.ts +57 -34
  101. package/src/pages/functions/buildWorker.ts +91 -31
  102. package/src/pages/functions/tsconfig.tsbuildinfo +1 -1
  103. package/src/pages/projects.tsx +2 -5
  104. package/src/pages/publish.tsx +1 -10
  105. package/src/pages/upload.tsx +29 -9
  106. package/src/paths.ts +1 -1
  107. package/src/publish/index.ts +1 -1
  108. package/src/publish/publish.ts +29 -34
  109. package/src/queues/cli/commands/consumer/add.ts +6 -0
  110. package/src/queues/client.ts +1 -0
  111. package/src/r2/helpers.ts +1 -0
  112. package/src/secret/index.ts +2 -1
  113. package/src/sites.ts +164 -52
  114. package/src/traverse-module-graph.ts +53 -0
  115. package/src/type-generation.ts +1 -1
  116. package/src/user/user.ts +2 -1
  117. package/src/utils/render.ts +93 -0
  118. package/src/worker.ts +18 -1
  119. package/templates/d1-beta-facade.js +5 -2
  120. package/templates/gitignore +1 -0
  121. package/templates/middleware/middleware-miniflare3-json-error.ts +17 -5
  122. package/templates/pages-template-plugin.ts +7 -3
  123. package/templates/tsconfig.init.json +1 -2
  124. package/templates/tsconfig.tsbuildinfo +1 -1
  125. package/wrangler-dist/cli.d.ts +552 -16
  126. package/wrangler-dist/cli.js +32141 -24052
  127. package/src/__tests__/api-devregistry.test.js +0 -64
package/src/dev/local.tsx CHANGED
@@ -47,7 +47,6 @@ import type {
47
47
  } from "@miniflare/tre";
48
48
  import type { MiniflareOptions } from "miniflare";
49
49
  import type { ChildProcess } from "node:child_process";
50
- import type { RequestInit } from "undici";
51
50
 
52
51
  export interface LocalProps {
53
52
  name: string | undefined;
@@ -71,7 +70,6 @@ export interface LocalProps {
71
70
  localUpstream: string | undefined;
72
71
  inspect: boolean;
73
72
  onReady: ((ip: string, port: number) => void) | undefined;
74
- logPrefix?: string;
75
73
  enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
76
74
  testScheduled?: boolean;
77
75
  experimentalLocal: boolean | undefined;
@@ -122,7 +120,6 @@ function useLocalWorker({
122
120
  localUpstream,
123
121
  inspect,
124
122
  onReady,
125
- logPrefix,
126
123
  enablePagesAssetsServiceBinding,
127
124
  experimentalLocal,
128
125
  accountId,
@@ -217,13 +214,12 @@ function useLocalWorker({
217
214
  dataBlobBindings,
218
215
  crons,
219
216
  upstream,
220
- logPrefix,
221
217
  workerDefinitions,
222
218
  enablePagesAssetsServiceBinding,
223
219
  });
224
220
 
225
221
  if (experimentalLocal) {
226
- const log = await buildMiniflare3Logger(logPrefix);
222
+ const log = await buildMiniflare3Logger();
227
223
  const mf3Options = await transformMf2OptionsToMf3Options({
228
224
  miniflare2Options: options,
229
225
  format,
@@ -232,6 +228,7 @@ function useLocalWorker({
232
228
  enablePagesAssetsServiceBinding,
233
229
  kvNamespaces: bindings?.kv_namespaces,
234
230
  r2Buckets: bindings?.r2_buckets,
231
+ d1Databases: bindings?.d1_databases,
235
232
  authenticatedAccountId: accountId,
236
233
  kvRemote: experimentalLocalRemoteKv,
237
234
  inspectorPort: runtimeInspectorPort,
@@ -438,7 +435,6 @@ function useLocalWorker({
438
435
  localProtocol,
439
436
  localUpstream,
440
437
  inspect,
441
- logPrefix,
442
438
  onReady,
443
439
  enablePagesAssetsServiceBinding,
444
440
  experimentalLocal,
@@ -577,7 +573,6 @@ interface SetupMiniflareOptionsProps {
577
573
  dataBlobBindings: Record<string, string>;
578
574
  crons: Config["triggers"]["crons"];
579
575
  upstream: string | undefined;
580
- logPrefix: string | undefined;
581
576
  workerDefinitions: WorkerRegistry | undefined;
582
577
  enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
583
578
  }
@@ -609,7 +604,6 @@ export function setupMiniflareOptions({
609
604
  dataBlobBindings,
610
605
  crons,
611
606
  upstream,
612
- logPrefix,
613
607
  workerDefinitions,
614
608
  enablePagesAssetsServiceBinding,
615
609
  }: SetupMiniflareOptionsProps): {
@@ -701,6 +695,7 @@ export function setupMiniflareOptions({
701
695
  durableObjectsPersist: true,
702
696
  kvPersist: true,
703
697
  r2Persist: true,
698
+ d1Persist: true,
704
699
  }),
705
700
 
706
701
  liveReload,
@@ -722,7 +717,6 @@ export function setupMiniflareOptions({
722
717
  crons,
723
718
  upstream,
724
719
  logLevel: logger.loggerLevel,
725
- logOptions: logPrefix ? { prefix: logPrefix } : undefined,
726
720
  enablePagesAssetsServiceBinding,
727
721
  };
728
722
  // The path to the Miniflare CLI assumes that this file is being run from
@@ -777,6 +771,7 @@ export interface SetupMiniflare3Options {
777
771
  // we need actual namespace IDs to connect to.
778
772
  kvNamespaces: CfKvNamespace[] | undefined;
779
773
  r2Buckets: CfR2Bucket[] | undefined;
774
+ d1Databases: CfD1Database[] | undefined;
780
775
 
781
776
  // Account ID to use for authenticated Cloudflare fetch. If true, prompt
782
777
  // user for ID if multiple available.
@@ -788,18 +783,26 @@ export interface SetupMiniflare3Options {
788
783
  inspectorPort: number;
789
784
  }
790
785
 
791
- export async function buildMiniflare3Logger(
792
- logPrefix?: string
793
- ): Promise<Miniflare3LogType> {
786
+ export async function buildMiniflare3Logger(): Promise<Miniflare3LogType> {
794
787
  const { Log, NoOpLog, LogLevel } = await getMiniflare3();
795
788
 
796
789
  let level = logger.loggerLevel.toUpperCase() as Uppercase<LoggerLevel>;
797
790
  if (level === "LOG") level = "INFO";
798
791
  const logLevel = LogLevel[level];
799
792
 
800
- return logLevel === LogLevel.NONE
801
- ? new NoOpLog()
802
- : new Log(logLevel, { prefix: logPrefix });
793
+ return logLevel === LogLevel.NONE ? new NoOpLog() : new Log(logLevel);
794
+ }
795
+
796
+ function transformMf2PersistToMf3(persist?: boolean | string) {
797
+ // Wrangler reuses Miniflare 3 instances between reloads but not Miniflare 2
798
+ // ones. We previously set `*Persist` options to `true` by default to
799
+ // persist data between reloads in the temporary script directory (Miniflare
800
+ // 2's working directory). However, with Miniflare 3, the working directory
801
+ // is the current working directory, so we want to set these to `false`
802
+ // and use Miniflare 3's native in-memory persistence.
803
+ //
804
+ // See https://github.com/cloudflare/workers-sdk/issues/2995.
805
+ return persist === true ? false : persist;
803
806
  }
804
807
 
805
808
  export async function transformMf2OptionsToMf3Options({
@@ -810,6 +813,7 @@ export async function transformMf2OptionsToMf3Options({
810
813
  enablePagesAssetsServiceBinding,
811
814
  kvNamespaces,
812
815
  r2Buckets,
816
+ d1Databases,
813
817
  authenticatedAccountId,
814
818
  kvRemote,
815
819
  inspectorPort,
@@ -817,19 +821,20 @@ export async function transformMf2OptionsToMf3Options({
817
821
  // Build authenticated Cloudflare API fetch function if required
818
822
  let cloudflareFetch: CloudflareFetch | undefined;
819
823
  if (kvRemote && authenticatedAccountId !== undefined) {
824
+ const { Response: Miniflare3Response } = await getMiniflare3();
820
825
  const preferredAccountId =
821
826
  authenticatedAccountId === true ? undefined : authenticatedAccountId;
822
827
  const accountId = await requireAuth({ account_id: preferredAccountId });
823
- cloudflareFetch = (resource, searchParams, init) => {
828
+ cloudflareFetch = async (resource, searchParams, init) => {
824
829
  resource = `/accounts/${accountId}/${resource}`;
825
- // Miniflare and Wrangler's `undici` versions may be slightly different,
826
- // but their `RequestInit` types *should* be compatible
827
- return performApiFetch(resource, init as RequestInit, searchParams);
830
+ const response = await performApiFetch(resource, init, searchParams);
831
+ return new Miniflare3Response(response.body, response);
828
832
  };
829
833
  }
830
834
 
831
- const options: Miniflare3Options = {
835
+ let options: Partial<Miniflare3Options> = {
832
836
  ...miniflare2Options,
837
+
833
838
  // Miniflare 3 distinguishes between binding name and namespace/bucket IDs.
834
839
  kvNamespaces: Object.fromEntries(
835
840
  kvNamespaces?.map(({ binding, id }) => [binding, id]) ?? []
@@ -837,8 +842,23 @@ export async function transformMf2OptionsToMf3Options({
837
842
  r2Buckets: Object.fromEntries(
838
843
  r2Buckets?.map(({ binding, bucket_name }) => [binding, bucket_name]) ?? []
839
844
  ),
845
+ d1Databases: Object.fromEntries(
846
+ d1Databases?.map(({ binding, database_id, preview_database_id }) => [
847
+ binding,
848
+ preview_database_id ?? database_id,
849
+ ]) ?? []
850
+ ),
851
+
852
+ cachePersist: transformMf2PersistToMf3(miniflare2Options.cachePersist),
853
+ durableObjectsPersist: transformMf2PersistToMf3(
854
+ miniflare2Options.durableObjectsPersist
855
+ ),
856
+ kvPersist: transformMf2PersistToMf3(miniflare2Options.kvPersist),
857
+ r2Persist: transformMf2PersistToMf3(miniflare2Options.r2Persist),
858
+ d1Persist: transformMf2PersistToMf3(miniflare2Options.d1Persist),
859
+
840
860
  inspectorPort,
841
- verbose: true,
861
+ verbose: logger.loggerLevel === "debug",
842
862
  cloudflareFetch,
843
863
  log,
844
864
  };
@@ -853,7 +873,7 @@ export async function transformMf2OptionsToMf3Options({
853
873
  // relies on the fact that `require` is untyped.
854
874
  //
855
875
  // eslint-disable-next-line @typescript-eslint/no-var-requires
856
- const generateASSETSBinding = require("../miniflare-cli/assets");
876
+ const generateASSETSBinding = require("../miniflare-cli/assets").default;
857
877
  options.serviceBindings = {
858
878
  ...options.serviceBindings,
859
879
  ASSETS: (await generateASSETSBinding({
@@ -876,22 +896,27 @@ export async function transformMf2OptionsToMf3Options({
876
896
  const root = path.dirname(bundle.path);
877
897
 
878
898
  assert.strictEqual(bundle.type, "esm");
879
- // Required for source mapped paths to resolve correctly
880
- options.modulesRoot = root;
881
- options.modules = [
882
- // Entrypoint
883
- {
884
- type: "ESModule",
885
- path: bundle.path,
886
- contents: await readFile(bundle.path, "utf-8"),
887
- },
888
- // Misc (WebAssembly, etc, ...)
889
- ...bundle.modules.map((module) => ({
890
- type: ModuleTypeToRuleType[module.type ?? "esm"],
891
- path: path.resolve(root, module.name),
892
- contents: module.content,
893
- })),
894
- ];
899
+ options = {
900
+ // Creating a new options object ensures types check (Miniflare's
901
+ // options type requires source code to be specified)
902
+ ...options,
903
+ // Required for source mapped paths to resolve correctly
904
+ modulesRoot: root,
905
+ modules: [
906
+ // Entrypoint
907
+ {
908
+ type: "ESModule",
909
+ path: bundle.path,
910
+ contents: await readFile(bundle.path, "utf-8"),
911
+ },
912
+ // Misc (WebAssembly, etc, ...)
913
+ ...bundle.modules.map((module) => ({
914
+ type: ModuleTypeToRuleType[module.type ?? "esm"],
915
+ path: path.resolve(root, module.name),
916
+ contents: module.content,
917
+ })),
918
+ ],
919
+ };
895
920
  }
896
921
 
897
922
  if (kvRemote) {
@@ -909,7 +934,7 @@ export async function transformMf2OptionsToMf3Options({
909
934
  options.kvPersist = `remote:?cache=${encodeURIComponent(kvRemoteCache)}`;
910
935
  }
911
936
 
912
- return options;
937
+ return options as Miniflare3Options;
913
938
  }
914
939
 
915
940
  // Caching of the `npx-import`ed `@miniflare/tre` package
@@ -919,5 +944,5 @@ export async function getMiniflare3(): Promise<
919
944
  // eslint-disable-next-line @typescript-eslint/consistent-type-imports
920
945
  typeof import("@miniflare/tre")
921
946
  > {
922
- return (miniflare3Module ??= await npxImport("@miniflare/tre@3.0.0-next.8"));
947
+ return (miniflare3Module ??= await npxImport("@miniflare/tre@3.0.0-next.13"));
923
948
  }
@@ -14,6 +14,7 @@ import {
14
14
  import { runCustomBuild } from "../entry";
15
15
  import { logger } from "../logger";
16
16
  import { waitForPortToBeAvailable } from "../proxy";
17
+ import traverseModuleGraph from "../traverse-module-graph";
17
18
  import {
18
19
  setupBindings,
19
20
  getMiniflare3,
@@ -91,6 +92,7 @@ export async function startDevServer(
91
92
  entry: props.entry,
92
93
  destination: directory.name,
93
94
  jsxFactory: props.jsxFactory,
95
+ processEntrypoint: props.processEntrypoint,
94
96
  rules: props.rules,
95
97
  jsxFragment: props.jsxFragment,
96
98
  serveAssetsFromWorker: Boolean(
@@ -98,7 +100,8 @@ export async function startDevServer(
98
100
  ),
99
101
  tsconfig: props.tsconfig,
100
102
  minify: props.minify,
101
- nodeCompat: props.nodeCompat,
103
+ legacyNodeCompat: props.legacyNodeCompat,
104
+ nodejsCompat: props.nodejsCompat,
102
105
  define: props.define,
103
106
  noBundle: props.noBundle,
104
107
  assets: props.assetsConfig,
@@ -131,7 +134,6 @@ export async function startDevServer(
131
134
  queueConsumers: props.queueConsumers,
132
135
  localProtocol: props.localProtocol,
133
136
  localUpstream: props.localUpstream,
134
- logPrefix: props.logPrefix,
135
137
  inspect: props.inspect,
136
138
  onReady: props.onReady,
137
139
  enablePagesAssetsServiceBinding: props.enablePagesAssetsServiceBinding,
@@ -204,13 +206,15 @@ async function runEsbuild({
204
206
  destination,
205
207
  jsxFactory,
206
208
  jsxFragment,
209
+ processEntrypoint,
207
210
  rules,
208
211
  assets,
209
212
  betaD1Shims,
210
213
  serveAssetsFromWorker,
211
214
  tsconfig,
212
215
  minify,
213
- nodeCompat,
216
+ legacyNodeCompat,
217
+ nodejsCompat,
214
218
  define,
215
219
  noBundle,
216
220
  workerDefinitions,
@@ -225,6 +229,7 @@ async function runEsbuild({
225
229
  destination: string | undefined;
226
230
  jsxFactory: string | undefined;
227
231
  jsxFragment: string | undefined;
232
+ processEntrypoint: boolean;
228
233
  rules: Config["rules"];
229
234
  assets: Config["assets"];
230
235
  betaD1Shims?: string[];
@@ -233,7 +238,8 @@ async function runEsbuild({
233
238
  serveAssetsFromWorker: boolean;
234
239
  tsconfig: string | undefined;
235
240
  minify: boolean | undefined;
236
- nodeCompat: boolean | undefined;
241
+ legacyNodeCompat: boolean | undefined;
242
+ nodejsCompat: boolean | undefined;
237
243
  noBundle: boolean;
238
244
  workerDefinitions: WorkerRegistry;
239
245
  firstPartyWorkerDevFacade: boolean | undefined;
@@ -244,55 +250,55 @@ async function runEsbuild({
244
250
  }): Promise<EsbuildBundle | undefined> {
245
251
  if (!destination) return;
246
252
 
247
- const {
248
- resolvedEntryPointPath,
249
- bundleType,
250
- modules,
251
- dependencies,
252
- sourceMapPath,
253
- }: Awaited<ReturnType<typeof bundleWorker>> = noBundle
254
- ? {
255
- modules: [],
256
- dependencies: {},
257
- resolvedEntryPointPath: entry.file,
258
- bundleType: entry.format === "modules" ? "esm" : "commonjs",
259
- stop: undefined,
260
- sourceMapPath: undefined,
261
- }
262
- : await bundleWorker(entry, destination, {
263
- serveAssetsFromWorker,
264
- jsxFactory,
265
- jsxFragment,
266
- rules,
267
- tsconfig,
268
- minify,
269
- nodeCompat,
270
- define,
271
- checkFetch: true,
272
- assets: assets && {
273
- ...assets,
274
- // disable the cache in dev
275
- bypassCache: true,
276
- },
277
- betaD1Shims,
278
- workerDefinitions,
279
- services,
280
- firstPartyWorkerDevFacade,
281
- targetConsumer: "dev", // We are starting a dev server
282
- testScheduled,
283
- local,
284
- experimentalLocal,
285
- doBindings,
286
- });
253
+ let traverseModuleGraphResult:
254
+ | Awaited<ReturnType<typeof bundleWorker>>
255
+ | undefined;
256
+ let bundleResult: Awaited<ReturnType<typeof bundleWorker>> | undefined;
257
+ if (noBundle) {
258
+ traverseModuleGraphResult = await traverseModuleGraph(entry, rules);
259
+ }
260
+
261
+ if (processEntrypoint || !noBundle) {
262
+ bundleResult = await bundleWorker(entry, destination, {
263
+ bundle: !noBundle,
264
+ disableModuleCollection: noBundle,
265
+ serveAssetsFromWorker,
266
+ jsxFactory,
267
+ jsxFragment,
268
+ rules,
269
+ tsconfig,
270
+ minify,
271
+ legacyNodeCompat,
272
+ nodejsCompat,
273
+ define,
274
+ checkFetch: true,
275
+ assets: assets && {
276
+ ...assets,
277
+ // disable the cache in dev
278
+ bypassCache: true,
279
+ },
280
+ betaD1Shims,
281
+ workerDefinitions,
282
+ services,
283
+ firstPartyWorkerDevFacade,
284
+ targetConsumer: "dev", // We are starting a dev server
285
+ testScheduled,
286
+ local,
287
+ experimentalLocal,
288
+ doBindings,
289
+ });
290
+ }
287
291
 
288
292
  return {
289
293
  id: 0,
290
294
  entry,
291
- path: resolvedEntryPointPath,
292
- type: bundleType,
293
- modules,
294
- dependencies,
295
- sourceMapPath,
295
+ path: bundleResult?.resolvedEntryPointPath ?? entry.file,
296
+ type:
297
+ bundleResult?.bundleType ??
298
+ (entry.format === "modules" ? "esm" : "commonjs"),
299
+ modules: traverseModuleGraphResult?.modules ?? bundleResult?.modules ?? [],
300
+ dependencies: bundleResult?.dependencies ?? {},
301
+ sourceMapPath: bundleResult?.sourceMapPath,
296
302
  };
297
303
  }
298
304
 
@@ -318,7 +324,6 @@ export async function startLocalServer({
318
324
  localUpstream,
319
325
  inspect,
320
326
  onReady,
321
- logPrefix,
322
327
  enablePagesAssetsServiceBinding,
323
328
  experimentalLocal,
324
329
  accountId,
@@ -398,13 +403,12 @@ export async function startLocalServer({
398
403
  dataBlobBindings,
399
404
  crons,
400
405
  upstream,
401
- logPrefix,
402
406
  workerDefinitions,
403
407
  enablePagesAssetsServiceBinding,
404
408
  });
405
409
 
406
410
  if (experimentalLocal) {
407
- const log = await buildMiniflare3Logger(logPrefix);
411
+ const log = await buildMiniflare3Logger();
408
412
  const mf3Options = await transformMf2OptionsToMf3Options({
409
413
  miniflare2Options: options,
410
414
  format,
@@ -412,6 +416,7 @@ export async function startLocalServer({
412
416
  log,
413
417
  kvNamespaces: bindings?.kv_namespaces,
414
418
  r2Buckets: bindings?.r2_buckets,
419
+ d1Databases: bindings?.d1_databases,
415
420
  authenticatedAccountId: accountId,
416
421
  kvRemote: experimentalLocalRemoteKv,
417
422
  inspectorPort,
@@ -4,6 +4,7 @@ import { useApp } from "ink";
4
4
  import { useState, useEffect } from "react";
5
5
  import { bundleWorker, rewriteNodeCompatBuildFailure } from "../bundle";
6
6
  import { logBuildFailure, logger } from "../logger";
7
+ import traverseModuleGraph from "../traverse-module-graph";
7
8
  import type { Config } from "../config";
8
9
  import type { WorkerRegistry } from "../dev-registry";
9
10
  import type { Entry } from "../entry";
@@ -25,12 +26,14 @@ export function useEsbuild({
25
26
  destination,
26
27
  jsxFactory,
27
28
  jsxFragment,
29
+ processEntrypoint,
28
30
  rules,
29
31
  assets,
30
32
  serveAssetsFromWorker,
31
33
  tsconfig,
32
34
  minify,
33
- nodeCompat,
35
+ legacyNodeCompat,
36
+ nodejsCompat,
34
37
  betaD1Shims,
35
38
  define,
36
39
  noBundle,
@@ -47,6 +50,7 @@ export function useEsbuild({
47
50
  destination: string | undefined;
48
51
  jsxFactory: string | undefined;
49
52
  jsxFragment: string | undefined;
53
+ processEntrypoint: boolean;
50
54
  rules: Config["rules"];
51
55
  assets: Config["assets"];
52
56
  define: Config["define"];
@@ -54,7 +58,8 @@ export function useEsbuild({
54
58
  serveAssetsFromWorker: boolean;
55
59
  tsconfig: string | undefined;
56
60
  minify: boolean | undefined;
57
- nodeCompat: boolean | undefined;
61
+ legacyNodeCompat: boolean | undefined;
62
+ nodejsCompat: boolean | undefined;
58
63
  betaD1Shims?: string[];
59
64
  noBundle: boolean;
60
65
  workerDefinitions: WorkerRegistry;
@@ -85,7 +90,7 @@ export function useEsbuild({
85
90
  const watchMode: WatchMode = {
86
91
  async onRebuild(error) {
87
92
  if (error !== null) {
88
- if (!nodeCompat) rewriteNodeCompatBuildFailure(error);
93
+ if (!legacyNodeCompat) rewriteNodeCompatBuildFailure(error);
89
94
  logBuildFailure(error);
90
95
  logger.error("Watch build failed:", error.message);
91
96
  } else {
@@ -97,51 +102,48 @@ export function useEsbuild({
97
102
  async function build() {
98
103
  if (!destination) return;
99
104
 
100
- const {
101
- resolvedEntryPointPath,
102
- bundleType,
103
- modules,
104
- dependencies,
105
- stop,
106
- sourceMapPath,
107
- }: Awaited<ReturnType<typeof bundleWorker>> = noBundle
108
- ? {
109
- modules: [],
110
- dependencies: {},
111
- resolvedEntryPointPath: entry.file,
112
- bundleType: entry.format === "modules" ? "esm" : "commonjs",
113
- stop: undefined,
114
- sourceMapPath: undefined,
115
- }
116
- : await bundleWorker(entry, destination, {
117
- serveAssetsFromWorker,
118
- jsxFactory,
119
- jsxFragment,
120
- rules,
121
- watch: watchMode,
122
- tsconfig,
123
- minify,
124
- nodeCompat,
125
- betaD1Shims,
126
- doBindings: durableObjects.bindings,
127
- define,
128
- checkFetch: true,
129
- assets: assets && {
130
- ...assets,
131
- // disable the cache in dev
132
- bypassCache: true,
133
- },
134
- workerDefinitions,
135
- services,
136
- firstPartyWorkerDevFacade,
137
- local,
138
- targetConsumer,
139
- testScheduled,
140
- experimentalLocal,
141
- });
105
+ let traverseModuleGraphResult:
106
+ | Awaited<ReturnType<typeof bundleWorker>>
107
+ | undefined;
108
+ let bundleResult: Awaited<ReturnType<typeof bundleWorker>> | undefined;
109
+ if (noBundle) {
110
+ traverseModuleGraphResult = await traverseModuleGraph(entry, rules);
111
+ }
112
+
113
+ if (processEntrypoint || !noBundle) {
114
+ bundleResult = await bundleWorker(entry, destination, {
115
+ bundle: !noBundle,
116
+ disableModuleCollection: noBundle,
117
+ serveAssetsFromWorker,
118
+ jsxFactory,
119
+ jsxFragment,
120
+ rules,
121
+ watch: watchMode,
122
+ tsconfig,
123
+ minify,
124
+ legacyNodeCompat,
125
+ nodejsCompat,
126
+ betaD1Shims,
127
+ doBindings: durableObjects.bindings,
128
+ define,
129
+ checkFetch: true,
130
+ assets: assets && {
131
+ ...assets,
132
+ // disable the cache in dev
133
+ bypassCache: true,
134
+ },
135
+ workerDefinitions,
136
+ services,
137
+ firstPartyWorkerDevFacade,
138
+ local,
139
+ targetConsumer,
140
+ testScheduled,
141
+ experimentalLocal,
142
+ });
143
+ }
142
144
 
143
145
  // Capture the `stop()` method to use as the `useEffect()` destructor.
144
- stopWatching = stop;
146
+ stopWatching = bundleResult?.stop;
145
147
 
146
148
  // if "noBundle" is true, then we need to manually watch the entry point and
147
149
  // trigger "builds" when it changes
@@ -159,11 +161,14 @@ export function useEsbuild({
159
161
  setBundle({
160
162
  id: 0,
161
163
  entry,
162
- path: resolvedEntryPointPath,
163
- type: bundleType,
164
- modules,
165
- dependencies,
166
- sourceMapPath,
164
+ path: bundleResult?.resolvedEntryPointPath ?? entry.file,
165
+ type:
166
+ bundleResult?.bundleType ??
167
+ (entry.format === "modules" ? "esm" : "commonjs"),
168
+ modules:
169
+ traverseModuleGraphResult?.modules ?? bundleResult?.modules ?? [],
170
+ dependencies: bundleResult?.dependencies ?? {},
171
+ sourceMapPath: bundleResult?.sourceMapPath,
167
172
  });
168
173
  }
169
174
 
@@ -183,12 +188,14 @@ export function useEsbuild({
183
188
  jsxFactory,
184
189
  jsxFragment,
185
190
  serveAssetsFromWorker,
191
+ processEntrypoint,
186
192
  rules,
187
193
  tsconfig,
188
194
  exit,
189
195
  noBundle,
190
196
  minify,
191
- nodeCompat,
197
+ legacyNodeCompat,
198
+ nodejsCompat,
192
199
  define,
193
200
  assets,
194
201
  services,
@@ -28,4 +28,13 @@ export function validateDevProps(props: DevProps) {
28
28
  "You cannot configure [data_blobs] with an ES module worker. Instead, import the file directly in your code, and optionally configure `[rules]` in your wrangler.toml"
29
29
  );
30
30
  }
31
+
32
+ if (
33
+ props.compatibilityFlags?.includes("nodejs_compat") &&
34
+ props.legacyNodeCompat
35
+ ) {
36
+ throw new Error(
37
+ "You cannot use the `nodejs_compat` compatibility flag in conjunction with the legacy `--node-compat` flag. If you want to use the new runtime Node.js compatibility features, please remove the `--node-compat` argument from your CLI command or your config file."
38
+ );
39
+ }
31
40
  }
@@ -13,7 +13,7 @@ import type { HttpTerminator } from "http-terminator";
13
13
  const DEV_REGISTRY_PORT = "6284";
14
14
  const DEV_REGISTRY_HOST = `http://localhost:${DEV_REGISTRY_PORT}`;
15
15
 
16
- let server: Server;
16
+ let server: Server | null;
17
17
  let terminator: HttpTerminator;
18
18
 
19
19
  export type WorkerRegistry = Record<string, WorkerDefinition>;
@@ -102,6 +102,7 @@ export async function startWorkerRegistry() {
102
102
  */
103
103
  export async function stopWorkerRegistry() {
104
104
  await terminator?.terminate();
105
+ server = null;
105
106
  }
106
107
 
107
108
  /**