wrangler 0.0.0-e6e1daba → 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 (101) hide show
  1. package/bin/wrangler.js +1 -1
  2. package/miniflare-dist/index.mjs +1 -1
  3. package/package.json +14 -9
  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__/d1/execute.test.ts +3 -1
  8. package/src/__tests__/d1/migrate.test.ts +2 -0
  9. package/src/__tests__/delete.test.ts +6 -0
  10. package/src/__tests__/deployments.test.ts +335 -95
  11. package/src/__tests__/dev.test.tsx +87 -57
  12. package/src/__tests__/generate.test.ts +3 -4
  13. package/src/__tests__/helpers/mock-console.ts +6 -0
  14. package/src/__tests__/helpers/msw/handlers/deployments.ts +70 -3
  15. package/src/__tests__/helpers/msw/index.ts +4 -2
  16. package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
  17. package/src/__tests__/index.test.ts +10 -4
  18. package/src/__tests__/init.test.ts +136 -104
  19. package/src/__tests__/jest.setup.ts +4 -0
  20. package/src/__tests__/kv.test.ts +9 -9
  21. package/src/__tests__/logger.test.ts +68 -2
  22. package/src/__tests__/middleware.scheduled.test.ts +2 -2
  23. package/src/__tests__/middleware.test.ts +4 -3
  24. package/src/__tests__/mtls-certificates.test.ts +5 -2
  25. package/src/__tests__/pages/deployment-list.test.ts +2 -0
  26. package/src/__tests__/pages/functions-build.test.ts +91 -41
  27. package/src/__tests__/pages/project-list.test.ts +2 -0
  28. package/src/__tests__/pages/project-upload.test.ts +43 -24
  29. package/src/__tests__/pages/publish.test.ts +267 -148
  30. package/src/__tests__/publish.test.ts +420 -164
  31. package/src/__tests__/pubsub.test.ts +3 -0
  32. package/src/__tests__/queues.test.ts +5 -2
  33. package/src/__tests__/test-old-node-version.js +3 -3
  34. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  35. package/src/__tests__/tsconfig.tsbuildinfo +1 -1
  36. package/src/__tests__/type-generation.test.ts +1 -0
  37. package/src/__tests__/user.test.ts +1 -1
  38. package/src/__tests__/worker-namespace.test.ts +1 -0
  39. package/src/api/dev.ts +10 -22
  40. package/src/api/pages/create-worker-bundle-contents.ts +1 -0
  41. package/src/api/pages/publish.tsx +38 -51
  42. package/src/bundle.ts +44 -13
  43. package/src/config/environment.ts +36 -4
  44. package/src/config/index.ts +30 -2
  45. package/src/config/validation-helpers.ts +1 -1
  46. package/src/config/validation.ts +149 -5
  47. package/src/create-worker-upload-form.ts +28 -3
  48. package/src/d1/backups.tsx +15 -11
  49. package/src/d1/create.tsx +20 -16
  50. package/src/d1/execute.tsx +22 -19
  51. package/src/d1/list.tsx +2 -2
  52. package/src/d1/migrations/apply.tsx +35 -29
  53. package/src/d1/migrations/create.tsx +15 -12
  54. package/src/d1/migrations/list.tsx +10 -7
  55. package/src/deployments.ts +260 -8
  56. package/src/dev/dev.tsx +4 -4
  57. package/src/dev/local.tsx +14 -16
  58. package/src/dev/start-server.ts +12 -16
  59. package/src/dev/use-esbuild.ts +11 -13
  60. package/src/dev/validate-dev-props.ts +9 -0
  61. package/src/dev-registry.ts +2 -1
  62. package/src/dev.tsx +28 -13
  63. package/src/entry.ts +18 -8
  64. package/src/generate/index.ts +2 -2
  65. package/src/index.ts +76 -23
  66. package/src/init.ts +144 -134
  67. package/src/logger.ts +18 -3
  68. package/src/metrics/send-event.ts +2 -1
  69. package/src/miniflare-cli/index.ts +1 -1
  70. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -1
  71. package/src/module-collection.ts +91 -25
  72. package/src/pages/build.ts +277 -99
  73. package/src/pages/buildFunctions.ts +20 -10
  74. package/src/pages/deployments.tsx +3 -5
  75. package/src/pages/dev.ts +21 -21
  76. package/src/pages/errors.ts +1 -0
  77. package/src/pages/functions/buildPlugin.ts +57 -34
  78. package/src/pages/functions/buildWorker.ts +34 -31
  79. package/src/pages/functions/tsconfig.tsbuildinfo +1 -1
  80. package/src/pages/projects.tsx +2 -5
  81. package/src/pages/publish.tsx +1 -10
  82. package/src/pages/upload.tsx +29 -9
  83. package/src/paths.ts +1 -1
  84. package/src/publish/index.ts +1 -1
  85. package/src/publish/publish.ts +29 -34
  86. package/src/queues/cli/commands/consumer/add.ts +6 -0
  87. package/src/queues/client.ts +1 -0
  88. package/src/secret/index.ts +2 -1
  89. package/src/traverse-module-graph.ts +53 -0
  90. package/src/type-generation.ts +1 -1
  91. package/src/user/user.ts +1 -1
  92. package/src/utils/render.ts +93 -0
  93. package/src/worker.ts +18 -1
  94. package/templates/d1-beta-facade.js +5 -2
  95. package/templates/gitignore +1 -0
  96. package/templates/middleware/middleware-miniflare3-json-error.ts +17 -5
  97. package/templates/tsconfig.init.json +1 -2
  98. package/templates/tsconfig.tsbuildinfo +1 -1
  99. package/wrangler-dist/cli.d.ts +33 -13
  100. package/wrangler-dist/cli.js +20732 -19984
  101. package/src/__tests__/api-devregistry.test.js +0 -64
@@ -1,9 +1,21 @@
1
1
  import { URLSearchParams } from "url";
2
+ import TOML from "@iarna/toml";
3
+ import chalk from "chalk";
4
+ import { FormData } from "undici";
2
5
  import { fetchResult } from "./cfetch";
6
+ import { readConfig } from "./config";
7
+ import { confirm, prompt } from "./dialogs";
8
+ import { mapBindings } from "./init";
3
9
  import { logger } from "./logger";
4
10
  import * as metrics from "./metrics";
11
+ import { requireAuth } from "./user";
12
+ import { getScriptName, printWranglerBanner } from ".";
13
+
5
14
  import type { Config } from "./config";
15
+ import type { WorkerMetadataBinding } from "./create-worker-upload-form";
6
16
  import type { ServiceMetadataRes } from "./init";
17
+ import type { CommonYargsOptions } from "./yargs-types";
18
+ import type { ArgumentsCamelCase } from "yargs";
7
19
 
8
20
  type DeploymentDetails = {
9
21
  id: string;
@@ -11,6 +23,7 @@ type DeploymentDetails = {
11
23
  annotations: {
12
24
  "workers/triggered_by": string;
13
25
  "workers/rollback_from": string;
26
+ "workers/message": string;
14
27
  };
15
28
  metadata: {
16
29
  author_id: string;
@@ -20,8 +33,15 @@ type DeploymentDetails = {
20
33
  modified_on: string;
21
34
  };
22
35
  resources: {
23
- script: string;
24
- bindings: unknown[];
36
+ script: {
37
+ handlers: string[];
38
+ };
39
+ bindings: WorkerMetadataBinding[];
40
+ script_runtime: {
41
+ compatibility_date: string | undefined;
42
+ compatibility_flags: string[] | undefined;
43
+ usage_model: string | undefined;
44
+ };
25
45
  };
26
46
  };
27
47
 
@@ -49,11 +69,12 @@ export async function deployments(
49
69
  }
50
70
  );
51
71
 
52
- const scriptMetadata = await fetchResult<ServiceMetadataRes>(
53
- `/accounts/${accountId}/workers/services/${scriptName}`
54
- );
72
+ const scriptTag = (
73
+ await fetchResult<ServiceMetadataRes>(
74
+ `/accounts/${accountId}/workers/services/${scriptName}`
75
+ )
76
+ ).default_environment.script.tag;
55
77
 
56
- const scriptTag = scriptMetadata.default_environment.script.tag;
57
78
  const params = new URLSearchParams({ order: "asc" });
58
79
  const { items: deploys } = await fetchResult<DeploymentListResult>(
59
80
  `/accounts/${accountId}/workers/deployments/by-script/${scriptTag}`,
@@ -72,12 +93,16 @@ export async function deployments(
72
93
  Deployment ID: ${versions.id}
73
94
  Created on: ${versions.metadata.created_on}
74
95
  Author: ${versions.metadata.author_email}
75
- Trigger: ${triggerStr}`;
96
+ Source: ${triggerStr}`;
76
97
 
77
98
  if (versions.annotations?.["workers/rollback_from"]) {
78
99
  version += `\nRollback from: ${versions.annotations["workers/rollback_from"]}`;
79
100
  }
80
101
 
102
+ if (versions.annotations?.["workers/message"]) {
103
+ version += `\nMessage: ${versions.annotations["workers/message"]}`;
104
+ }
105
+
81
106
  return version + `\n`;
82
107
  });
83
108
 
@@ -99,7 +124,6 @@ function formatSource(source: string): string {
99
124
  return "Other";
100
125
  }
101
126
  }
102
-
103
127
  function formatTrigger(trigger: string): string {
104
128
  switch (trigger) {
105
129
  case "upload":
@@ -114,3 +138,231 @@ function formatTrigger(trigger: string): string {
114
138
  return "Unknown";
115
139
  }
116
140
  }
141
+
142
+ export async function rollbackDeployment(
143
+ accountId: string,
144
+ scriptName: string | undefined,
145
+ { send_metrics: sendMetrics }: { send_metrics?: Config["send_metrics"] } = {},
146
+ deploymentId: string | undefined,
147
+ message: string | undefined
148
+ ) {
149
+ if (deploymentId === undefined) {
150
+ const scriptTag = (
151
+ await fetchResult<ServiceMetadataRes>(
152
+ `/accounts/${accountId}/workers/services/${scriptName}`
153
+ )
154
+ ).default_environment.script.tag;
155
+
156
+ const params = new URLSearchParams({ order: "asc" });
157
+ const { items: deploys } = await fetchResult<DeploymentListResult>(
158
+ `/accounts/${accountId}/workers/deployments/by-script/${scriptTag}`,
159
+ undefined,
160
+ params
161
+ );
162
+
163
+ if (deploys.length < 2) {
164
+ throw new Error(
165
+ "Cannot rollback to previous deployment since there are less than 2 deployemnts"
166
+ );
167
+ }
168
+
169
+ deploymentId = deploys.at(-2)?.id;
170
+ if (deploymentId === undefined) {
171
+ throw new Error("Cannot find previous deployment");
172
+ }
173
+ }
174
+
175
+ const firstHash = deploymentId.substring(0, deploymentId.indexOf("-"));
176
+
177
+ let rollbackMessage = "";
178
+ if (message !== undefined) {
179
+ rollbackMessage = message;
180
+ } else {
181
+ if (
182
+ !(await confirm(
183
+ `This deployment ${chalk.underline(
184
+ firstHash
185
+ )} will immediately replace the current deployment and become the active deployment across all your deployed routes and domains. However, your local development environment will not be affected by this rollback. ${chalk.blue.bold(
186
+ "Note:"
187
+ )} Rolling back to a previous deployment will not rollback any of the bound resources (Durable Object, R2, KV, etc.).`
188
+ ))
189
+ ) {
190
+ return;
191
+ }
192
+
193
+ rollbackMessage = await prompt(
194
+ "Please provide a message for this rollback (120 characters max)",
195
+ { defaultValue: "" }
196
+ );
197
+ }
198
+
199
+ let deployment_id = await rollbackRequest(
200
+ accountId,
201
+ scriptName,
202
+ deploymentId,
203
+ rollbackMessage
204
+ );
205
+
206
+ await metrics.sendMetricsEvent(
207
+ "rollback deployments",
208
+ { view: scriptName ? "single" : "all" },
209
+ {
210
+ sendMetrics,
211
+ }
212
+ );
213
+
214
+ deploymentId = addHyphens(deploymentId) ?? deploymentId;
215
+ deployment_id = addHyphens(deployment_id) ?? deployment_id;
216
+
217
+ logger.log(`\nSuccessfully rolled back to Deployment ID: ${deploymentId}`);
218
+ logger.log("Current Deployment ID:", deployment_id);
219
+ }
220
+
221
+ async function rollbackRequest(
222
+ accountId: string,
223
+ scriptName: string | undefined,
224
+ deploymentId: string,
225
+ rollbackReason: string
226
+ ): Promise<string | null> {
227
+ const body = new FormData();
228
+ body.set("message", rollbackReason);
229
+
230
+ const { deployment_id } = await fetchResult<{
231
+ deployment_id: string | null;
232
+ }>(
233
+ `/accounts/${accountId}/workers/scripts/${scriptName}?rollback_to=${deploymentId}`,
234
+ {
235
+ method: "PUT",
236
+ body,
237
+ }
238
+ );
239
+
240
+ return deployment_id;
241
+ }
242
+
243
+ export async function viewDeployment(
244
+ accountId: string,
245
+ scriptName: string | undefined,
246
+ { send_metrics: sendMetrics }: { send_metrics?: Config["send_metrics"] } = {},
247
+ deploymentId: string | undefined
248
+ ) {
249
+ await metrics.sendMetricsEvent(
250
+ "view deployments",
251
+ { view: scriptName ? "single" : "all" },
252
+ {
253
+ sendMetrics,
254
+ }
255
+ );
256
+
257
+ const scriptTag = (
258
+ await fetchResult<ServiceMetadataRes>(
259
+ `/accounts/${accountId}/workers/services/${scriptName}`
260
+ )
261
+ ).default_environment.script.tag;
262
+
263
+ if (deploymentId === undefined) {
264
+ const params = new URLSearchParams({ order: "asc" });
265
+ const { latest } = await fetchResult<DeploymentListResult>(
266
+ `/accounts/${accountId}/workers/deployments/by-script/${scriptTag}`,
267
+ undefined,
268
+ params
269
+ );
270
+
271
+ deploymentId = latest.id;
272
+ if (deploymentId === undefined) {
273
+ throw new Error("Cannot find previous deployment");
274
+ }
275
+ }
276
+
277
+ const deploymentDetails = await fetchResult<DeploymentListResult["latest"]>(
278
+ `/accounts/${accountId}/workers/deployments/by-script/${scriptTag}/detail/${deploymentId}`
279
+ );
280
+
281
+ const triggerStr = deploymentDetails.annotations?.["workers/triggered_by"]
282
+ ? `${formatTrigger(
283
+ deploymentDetails.annotations["workers/triggered_by"]
284
+ )} from ${formatSource(deploymentDetails.metadata.source)}`
285
+ : `${formatSource(deploymentDetails.metadata.source)}`;
286
+
287
+ const rollbackStr = deploymentDetails.annotations?.["workers/rollback_from"]
288
+ ? `\nRollback from: ${deploymentDetails.annotations["workers/rollback_from"]}`
289
+ : ``;
290
+
291
+ const reasonStr = deploymentDetails.annotations?.["workers/message"]
292
+ ? `\nMessage: ${deploymentDetails.annotations["workers/message"]}`
293
+ : ``;
294
+
295
+ const compatDateStr = deploymentDetails.resources.script_runtime
296
+ ?.compatibility_date
297
+ ? `\nCompatibility Date: ${deploymentDetails.resources.script_runtime?.compatibility_date}`
298
+ : ``;
299
+ const compatFlagsStr = deploymentDetails.resources.script_runtime
300
+ ?.compatibility_flags
301
+ ? `\nCompatibility Flags: ${deploymentDetails.resources.script_runtime?.compatibility_flags}`
302
+ : ``;
303
+
304
+ const bindings = deploymentDetails.resources.bindings;
305
+
306
+ const version = `
307
+ Deployment ID: ${deploymentDetails.id}
308
+ Created on: ${deploymentDetails.metadata.created_on}
309
+ Author: ${deploymentDetails.metadata.author_email}
310
+ Source: ${triggerStr}${rollbackStr}${reasonStr}
311
+ ------------------------------------------------------------
312
+ Author ID: ${deploymentDetails.metadata.author_id}
313
+ Usage Model: ${deploymentDetails.resources.script_runtime.usage_model}
314
+ Handlers: ${
315
+ deploymentDetails.resources.script.handlers
316
+ }${compatDateStr}${compatFlagsStr}
317
+ --------------------------bindings--------------------------
318
+ ${
319
+ bindings.length > 0
320
+ ? TOML.stringify(mapBindings(bindings) as TOML.JsonMap)
321
+ : `None`
322
+ }
323
+ `;
324
+
325
+ logger.log(version);
326
+
327
+ // early return to skip the deployments listings
328
+ return;
329
+ }
330
+
331
+ export async function commonDeploymentCMDSetup(
332
+ yargs: ArgumentsCamelCase<CommonYargsOptions>,
333
+ deploymentsWarning: string
334
+ ) {
335
+ await printWranglerBanner();
336
+ const config = readConfig(yargs.config, yargs);
337
+ const accountId = await requireAuth(config);
338
+ const scriptName = getScriptName(
339
+ { name: yargs.name as string, env: undefined },
340
+ config
341
+ );
342
+
343
+ logger.log(`${deploymentsWarning}\n`);
344
+
345
+ return { accountId, scriptName, config };
346
+ }
347
+
348
+ export function addHyphens(uuid: string | null): string | null {
349
+ if (uuid == null) {
350
+ return uuid;
351
+ }
352
+
353
+ if (uuid.length != 32) {
354
+ return null;
355
+ }
356
+
357
+ const uuid_parts: string[] = [];
358
+ uuid_parts.push(uuid.slice(0, 8));
359
+ uuid_parts.push(uuid.slice(8, 12));
360
+ uuid_parts.push(uuid.slice(12, 16));
361
+ uuid_parts.push(uuid.slice(16, 20));
362
+ uuid_parts.push(uuid.slice(20));
363
+
364
+ let hyphenated = "";
365
+ uuid_parts.forEach((part) => (hyphenated += part + "-"));
366
+
367
+ return hyphenated.slice(0, 36);
368
+ }
package/src/dev/dev.tsx CHANGED
@@ -138,7 +138,8 @@ export type DevProps = {
138
138
  compatibilityFlags: string[] | undefined;
139
139
  usageModel: "bundled" | "unbound" | undefined;
140
140
  minify: boolean | undefined;
141
- nodeCompat: boolean | undefined;
141
+ legacyNodeCompat: boolean | undefined;
142
+ nodejsCompat: boolean | undefined;
142
143
  build: Config["build"];
143
144
  env: string | undefined;
144
145
  legacyEnv: boolean;
@@ -146,7 +147,6 @@ export type DevProps = {
146
147
  host: string | undefined;
147
148
  routes: Route[] | undefined;
148
149
  inspect: boolean;
149
- logPrefix?: string;
150
150
  onReady: ((ip: string, port: number) => void) | undefined;
151
151
  showInteractiveDevSession: boolean | undefined;
152
152
  forceLocal: boolean | undefined;
@@ -278,7 +278,8 @@ function DevSession(props: DevSessionProps) {
278
278
  ),
279
279
  tsconfig: props.tsconfig,
280
280
  minify: props.minify,
281
- nodeCompat: props.nodeCompat,
281
+ legacyNodeCompat: props.legacyNodeCompat,
282
+ nodejsCompat: props.nodejsCompat,
282
283
  betaD1Shims,
283
284
  define: props.define,
284
285
  noBundle: props.noBundle,
@@ -341,7 +342,6 @@ function DevSession(props: DevSessionProps) {
341
342
  queueConsumers={props.queueConsumers}
342
343
  localProtocol={props.localProtocol}
343
344
  localUpstream={props.localUpstream}
344
- logPrefix={props.logPrefix}
345
345
  inspect={props.inspect}
346
346
  onReady={announceAndOnReady}
347
347
  enablePagesAssetsServiceBinding={props.enablePagesAssetsServiceBinding}
package/src/dev/local.tsx CHANGED
@@ -70,7 +70,6 @@ export interface LocalProps {
70
70
  localUpstream: string | undefined;
71
71
  inspect: boolean;
72
72
  onReady: ((ip: string, port: number) => void) | undefined;
73
- logPrefix?: string;
74
73
  enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
75
74
  testScheduled?: boolean;
76
75
  experimentalLocal: boolean | undefined;
@@ -121,7 +120,6 @@ function useLocalWorker({
121
120
  localUpstream,
122
121
  inspect,
123
122
  onReady,
124
- logPrefix,
125
123
  enablePagesAssetsServiceBinding,
126
124
  experimentalLocal,
127
125
  accountId,
@@ -216,13 +214,12 @@ function useLocalWorker({
216
214
  dataBlobBindings,
217
215
  crons,
218
216
  upstream,
219
- logPrefix,
220
217
  workerDefinitions,
221
218
  enablePagesAssetsServiceBinding,
222
219
  });
223
220
 
224
221
  if (experimentalLocal) {
225
- const log = await buildMiniflare3Logger(logPrefix);
222
+ const log = await buildMiniflare3Logger();
226
223
  const mf3Options = await transformMf2OptionsToMf3Options({
227
224
  miniflare2Options: options,
228
225
  format,
@@ -231,6 +228,7 @@ function useLocalWorker({
231
228
  enablePagesAssetsServiceBinding,
232
229
  kvNamespaces: bindings?.kv_namespaces,
233
230
  r2Buckets: bindings?.r2_buckets,
231
+ d1Databases: bindings?.d1_databases,
234
232
  authenticatedAccountId: accountId,
235
233
  kvRemote: experimentalLocalRemoteKv,
236
234
  inspectorPort: runtimeInspectorPort,
@@ -437,7 +435,6 @@ function useLocalWorker({
437
435
  localProtocol,
438
436
  localUpstream,
439
437
  inspect,
440
- logPrefix,
441
438
  onReady,
442
439
  enablePagesAssetsServiceBinding,
443
440
  experimentalLocal,
@@ -576,7 +573,6 @@ interface SetupMiniflareOptionsProps {
576
573
  dataBlobBindings: Record<string, string>;
577
574
  crons: Config["triggers"]["crons"];
578
575
  upstream: string | undefined;
579
- logPrefix: string | undefined;
580
576
  workerDefinitions: WorkerRegistry | undefined;
581
577
  enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
582
578
  }
@@ -608,7 +604,6 @@ export function setupMiniflareOptions({
608
604
  dataBlobBindings,
609
605
  crons,
610
606
  upstream,
611
- logPrefix,
612
607
  workerDefinitions,
613
608
  enablePagesAssetsServiceBinding,
614
609
  }: SetupMiniflareOptionsProps): {
@@ -721,7 +716,6 @@ export function setupMiniflareOptions({
721
716
  crons,
722
717
  upstream,
723
718
  logLevel: logger.loggerLevel,
724
- logOptions: logPrefix ? { prefix: logPrefix } : undefined,
725
719
  enablePagesAssetsServiceBinding,
726
720
  };
727
721
  // The path to the Miniflare CLI assumes that this file is being run from
@@ -776,6 +770,7 @@ export interface SetupMiniflare3Options {
776
770
  // we need actual namespace IDs to connect to.
777
771
  kvNamespaces: CfKvNamespace[] | undefined;
778
772
  r2Buckets: CfR2Bucket[] | undefined;
773
+ d1Databases: CfD1Database[] | undefined;
779
774
 
780
775
  // Account ID to use for authenticated Cloudflare fetch. If true, prompt
781
776
  // user for ID if multiple available.
@@ -787,18 +782,14 @@ export interface SetupMiniflare3Options {
787
782
  inspectorPort: number;
788
783
  }
789
784
 
790
- export async function buildMiniflare3Logger(
791
- logPrefix?: string
792
- ): Promise<Miniflare3LogType> {
785
+ export async function buildMiniflare3Logger(): Promise<Miniflare3LogType> {
793
786
  const { Log, NoOpLog, LogLevel } = await getMiniflare3();
794
787
 
795
788
  let level = logger.loggerLevel.toUpperCase() as Uppercase<LoggerLevel>;
796
789
  if (level === "LOG") level = "INFO";
797
790
  const logLevel = LogLevel[level];
798
791
 
799
- return logLevel === LogLevel.NONE
800
- ? new NoOpLog()
801
- : new Log(logLevel, { prefix: logPrefix });
792
+ return logLevel === LogLevel.NONE ? new NoOpLog() : new Log(logLevel);
802
793
  }
803
794
 
804
795
  export async function transformMf2OptionsToMf3Options({
@@ -809,6 +800,7 @@ export async function transformMf2OptionsToMf3Options({
809
800
  enablePagesAssetsServiceBinding,
810
801
  kvNamespaces,
811
802
  r2Buckets,
803
+ d1Databases,
812
804
  authenticatedAccountId,
813
805
  kvRemote,
814
806
  inspectorPort,
@@ -836,6 +828,12 @@ export async function transformMf2OptionsToMf3Options({
836
828
  r2Buckets: Object.fromEntries(
837
829
  r2Buckets?.map(({ binding, bucket_name }) => [binding, bucket_name]) ?? []
838
830
  ),
831
+ d1Databases: Object.fromEntries(
832
+ d1Databases?.map(({ binding, database_id, preview_database_id }) => [
833
+ binding,
834
+ preview_database_id ?? database_id,
835
+ ]) ?? []
836
+ ),
839
837
  inspectorPort,
840
838
  verbose: true,
841
839
  cloudflareFetch,
@@ -852,7 +850,7 @@ export async function transformMf2OptionsToMf3Options({
852
850
  // relies on the fact that `require` is untyped.
853
851
  //
854
852
  // eslint-disable-next-line @typescript-eslint/no-var-requires
855
- const generateASSETSBinding = require("../miniflare-cli/assets");
853
+ const generateASSETSBinding = require("../miniflare-cli/assets").default;
856
854
  options.serviceBindings = {
857
855
  ...options.serviceBindings,
858
856
  ASSETS: (await generateASSETSBinding({
@@ -918,5 +916,5 @@ export async function getMiniflare3(): Promise<
918
916
  // eslint-disable-next-line @typescript-eslint/consistent-type-imports
919
917
  typeof import("@miniflare/tre")
920
918
  > {
921
- return (miniflare3Module ??= await npxImport("@miniflare/tre@3.0.0-next.10"));
919
+ return (miniflare3Module ??= await npxImport("@miniflare/tre@3.0.0-next.12"));
922
920
  }
@@ -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,
@@ -98,7 +99,8 @@ export async function startDevServer(
98
99
  ),
99
100
  tsconfig: props.tsconfig,
100
101
  minify: props.minify,
101
- nodeCompat: props.nodeCompat,
102
+ legacyNodeCompat: props.legacyNodeCompat,
103
+ nodejsCompat: props.nodejsCompat,
102
104
  define: props.define,
103
105
  noBundle: props.noBundle,
104
106
  assets: props.assetsConfig,
@@ -131,7 +133,6 @@ export async function startDevServer(
131
133
  queueConsumers: props.queueConsumers,
132
134
  localProtocol: props.localProtocol,
133
135
  localUpstream: props.localUpstream,
134
- logPrefix: props.logPrefix,
135
136
  inspect: props.inspect,
136
137
  onReady: props.onReady,
137
138
  enablePagesAssetsServiceBinding: props.enablePagesAssetsServiceBinding,
@@ -210,7 +211,8 @@ async function runEsbuild({
210
211
  serveAssetsFromWorker,
211
212
  tsconfig,
212
213
  minify,
213
- nodeCompat,
214
+ legacyNodeCompat,
215
+ nodejsCompat,
214
216
  define,
215
217
  noBundle,
216
218
  workerDefinitions,
@@ -233,7 +235,8 @@ async function runEsbuild({
233
235
  serveAssetsFromWorker: boolean;
234
236
  tsconfig: string | undefined;
235
237
  minify: boolean | undefined;
236
- nodeCompat: boolean | undefined;
238
+ legacyNodeCompat: boolean | undefined;
239
+ nodejsCompat: boolean | undefined;
237
240
  noBundle: boolean;
238
241
  workerDefinitions: WorkerRegistry;
239
242
  firstPartyWorkerDevFacade: boolean | undefined;
@@ -251,14 +254,7 @@ async function runEsbuild({
251
254
  dependencies,
252
255
  sourceMapPath,
253
256
  }: 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
- }
257
+ ? await traverseModuleGraph(entry, rules)
262
258
  : await bundleWorker(entry, destination, {
263
259
  serveAssetsFromWorker,
264
260
  jsxFactory,
@@ -266,7 +262,8 @@ async function runEsbuild({
266
262
  rules,
267
263
  tsconfig,
268
264
  minify,
269
- nodeCompat,
265
+ legacyNodeCompat,
266
+ nodejsCompat,
270
267
  define,
271
268
  checkFetch: true,
272
269
  assets: assets && {
@@ -318,7 +315,6 @@ export async function startLocalServer({
318
315
  localUpstream,
319
316
  inspect,
320
317
  onReady,
321
- logPrefix,
322
318
  enablePagesAssetsServiceBinding,
323
319
  experimentalLocal,
324
320
  accountId,
@@ -398,13 +394,12 @@ export async function startLocalServer({
398
394
  dataBlobBindings,
399
395
  crons,
400
396
  upstream,
401
- logPrefix,
402
397
  workerDefinitions,
403
398
  enablePagesAssetsServiceBinding,
404
399
  });
405
400
 
406
401
  if (experimentalLocal) {
407
- const log = await buildMiniflare3Logger(logPrefix);
402
+ const log = await buildMiniflare3Logger();
408
403
  const mf3Options = await transformMf2OptionsToMf3Options({
409
404
  miniflare2Options: options,
410
405
  format,
@@ -412,6 +407,7 @@ export async function startLocalServer({
412
407
  log,
413
408
  kvNamespaces: bindings?.kv_namespaces,
414
409
  r2Buckets: bindings?.r2_buckets,
410
+ d1Databases: bindings?.d1_databases,
415
411
  authenticatedAccountId: accountId,
416
412
  kvRemote: experimentalLocalRemoteKv,
417
413
  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";
@@ -30,7 +31,8 @@ export function useEsbuild({
30
31
  serveAssetsFromWorker,
31
32
  tsconfig,
32
33
  minify,
33
- nodeCompat,
34
+ legacyNodeCompat,
35
+ nodejsCompat,
34
36
  betaD1Shims,
35
37
  define,
36
38
  noBundle,
@@ -54,7 +56,8 @@ export function useEsbuild({
54
56
  serveAssetsFromWorker: boolean;
55
57
  tsconfig: string | undefined;
56
58
  minify: boolean | undefined;
57
- nodeCompat: boolean | undefined;
59
+ legacyNodeCompat: boolean | undefined;
60
+ nodejsCompat: boolean | undefined;
58
61
  betaD1Shims?: string[];
59
62
  noBundle: boolean;
60
63
  workerDefinitions: WorkerRegistry;
@@ -85,7 +88,7 @@ export function useEsbuild({
85
88
  const watchMode: WatchMode = {
86
89
  async onRebuild(error) {
87
90
  if (error !== null) {
88
- if (!nodeCompat) rewriteNodeCompatBuildFailure(error);
91
+ if (!legacyNodeCompat) rewriteNodeCompatBuildFailure(error);
89
92
  logBuildFailure(error);
90
93
  logger.error("Watch build failed:", error.message);
91
94
  } else {
@@ -105,14 +108,7 @@ export function useEsbuild({
105
108
  stop,
106
109
  sourceMapPath,
107
110
  }: 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
- }
111
+ ? await traverseModuleGraph(entry, rules)
116
112
  : await bundleWorker(entry, destination, {
117
113
  serveAssetsFromWorker,
118
114
  jsxFactory,
@@ -121,7 +117,8 @@ export function useEsbuild({
121
117
  watch: watchMode,
122
118
  tsconfig,
123
119
  minify,
124
- nodeCompat,
120
+ legacyNodeCompat,
121
+ nodejsCompat,
125
122
  betaD1Shims,
126
123
  doBindings: durableObjects.bindings,
127
124
  define,
@@ -188,7 +185,8 @@ export function useEsbuild({
188
185
  exit,
189
186
  noBundle,
190
187
  minify,
191
- nodeCompat,
188
+ legacyNodeCompat,
189
+ nodejsCompat,
192
190
  define,
193
191
  assets,
194
192
  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
  /**