wrangler 2.1.6 → 2.1.8

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 (52) hide show
  1. package/miniflare-dist/index.mjs +5 -20
  2. package/package.json +14 -3
  3. package/src/__tests__/api-dev.test.ts +20 -0
  4. package/src/__tests__/configuration.test.ts +125 -22
  5. package/src/__tests__/dev.test.tsx +0 -2
  6. package/src/__tests__/helpers/mock-oauth-flow.ts +4 -2
  7. package/src/__tests__/index.test.ts +2 -0
  8. package/src/__tests__/paths.test.ts +23 -1
  9. package/src/__tests__/publish.test.ts +8 -10
  10. package/src/__tests__/user.test.ts +4 -4
  11. package/src/__tests__/whoami.test.tsx +0 -1
  12. package/src/__tests__/worker-namespace.test.ts +102 -112
  13. package/src/api/dev.ts +12 -12
  14. package/src/bundle.ts +59 -1
  15. package/src/cfetch/internal.ts +37 -21
  16. package/src/config/environment.ts +20 -0
  17. package/src/config/index.ts +32 -0
  18. package/src/config/validation.ts +59 -0
  19. package/src/config-cache.ts +1 -1
  20. package/src/create-worker-upload-form.ts +9 -0
  21. package/src/d1/backups.tsx +212 -0
  22. package/src/d1/create.tsx +54 -0
  23. package/src/d1/delete.tsx +56 -0
  24. package/src/d1/execute.tsx +294 -0
  25. package/src/d1/formatTimeAgo.ts +14 -0
  26. package/src/d1/index.ts +75 -0
  27. package/src/d1/list.tsx +48 -0
  28. package/src/d1/options.ts +12 -0
  29. package/src/d1/types.tsx +14 -0
  30. package/src/d1/utils.ts +39 -0
  31. package/src/dev/dev.tsx +30 -3
  32. package/src/dev/get-local-persistence-path.tsx +31 -0
  33. package/src/dev/local.tsx +73 -11
  34. package/src/dev/start-server.ts +6 -3
  35. package/src/dev/use-esbuild.ts +12 -1
  36. package/src/dev.tsx +48 -29
  37. package/src/dialogs.tsx +4 -0
  38. package/src/environment-variables.ts +17 -2
  39. package/src/index.tsx +18 -16
  40. package/src/logger.ts +11 -4
  41. package/src/miniflare-cli/index.ts +11 -16
  42. package/src/pages/dev.tsx +13 -9
  43. package/src/paths.ts +30 -4
  44. package/src/proxy.ts +21 -1
  45. package/src/publish.ts +7 -0
  46. package/src/user/user.tsx +1 -0
  47. package/src/worker.ts +30 -0
  48. package/templates/d1-beta-facade.js +174 -0
  49. package/templates/experimental-local-cache-stubs.js +27 -0
  50. package/wrangler-dist/cli.d.ts +438 -7
  51. package/wrangler-dist/cli.js +11679 -3911
  52. package/src/miniflare-cli/enum-keys.ts +0 -17
package/src/dev/local.tsx CHANGED
@@ -2,6 +2,7 @@ import { fork } from "node:child_process";
2
2
  import { realpathSync } from "node:fs";
3
3
  import { writeFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
+ import { npxImport } from "npx-import";
5
6
  import { useState, useEffect, useRef } from "react";
6
7
  import onExit from "signal-exit";
7
8
  import { registerWorker } from "../dev-registry";
@@ -24,10 +25,20 @@ import type {
24
25
  CfKvNamespace,
25
26
  CfR2Bucket,
26
27
  CfVars,
28
+ CfD1Database,
27
29
  } from "../worker";
28
30
  import type { EsbuildBundle } from "./use-esbuild";
31
+ import type {
32
+ Miniflare as Miniflare3Type,
33
+ MiniflareOptions as Miniflare3Options,
34
+ } from "@miniflare/tre";
29
35
  import type { MiniflareOptions } from "miniflare";
30
36
  import type { ChildProcess } from "node:child_process";
37
+
38
+ // caching of the miniflare package
39
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
40
+ let Miniflare: typeof import("@miniflare/tre")["Miniflare"];
41
+
31
42
  export interface LocalProps {
32
43
  name: string | undefined;
33
44
  bundle: EsbuildBundle | undefined;
@@ -49,10 +60,10 @@ export interface LocalProps {
49
60
  localUpstream: string | undefined;
50
61
  inspect: boolean;
51
62
  onReady: ((ip: string, port: number) => void) | undefined;
52
- logLevel: "none" | "error" | "log" | "warn" | "debug" | undefined;
53
63
  logPrefix?: string;
54
64
  enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
55
65
  testScheduled?: boolean;
66
+ experimentalLocal?: boolean;
56
67
  }
57
68
 
58
69
  export function Local(props: LocalProps) {
@@ -65,6 +76,10 @@ export function Local(props: LocalProps) {
65
76
  return null;
66
77
  }
67
78
 
79
+ function arrayToObject(values: string[] = []): Record<string, string> {
80
+ return Object.fromEntries(values.map((value) => [value, value]));
81
+ }
82
+
68
83
  function useLocalWorker({
69
84
  name: workerName,
70
85
  bundle,
@@ -86,12 +101,13 @@ function useLocalWorker({
86
101
  localUpstream,
87
102
  inspect,
88
103
  onReady,
89
- logLevel,
90
104
  logPrefix,
91
105
  enablePagesAssetsServiceBinding,
106
+ experimentalLocal,
92
107
  }: LocalProps) {
93
108
  // TODO: pass vars via command line
94
109
  const local = useRef<ChildProcess>();
110
+ const experimentalLocalRef = useRef<Miniflare3Type>();
95
111
  const removeSignalExitListener = useRef<() => void>();
96
112
  const [inspectorUrl, setInspectorUrl] = useState<string | undefined>();
97
113
 
@@ -171,6 +187,7 @@ function useLocalWorker({
171
187
  usageModel,
172
188
  kv_namespaces: bindings?.kv_namespaces,
173
189
  r2_buckets: bindings?.r2_buckets,
190
+ d1_databases: bindings?.d1_databases,
174
191
  internalDurableObjects,
175
192
  externalDurableObjects,
176
193
  localPersistencePath,
@@ -182,12 +199,45 @@ function useLocalWorker({
182
199
  dataBlobBindings,
183
200
  crons,
184
201
  upstream,
185
- logLevel,
186
202
  logPrefix,
187
203
  workerDefinitions,
188
204
  enablePagesAssetsServiceBinding,
189
205
  });
190
206
 
207
+ if (experimentalLocal) {
208
+ // TODO: refactor setupMiniflareOptions so we don't need to parse here
209
+ const miniflare2Options: MiniflareOptions = JSON.parse(forkOptions[0]);
210
+ const options: Miniflare3Options = {
211
+ ...miniflare2Options,
212
+ // Miniflare 3 distinguishes between binding name and namespace/bucket
213
+ // IDs. For now, just use the same value as we did in Miniflare 2.
214
+ // TODO: use defined KV preview ID if any
215
+ kvNamespaces: arrayToObject(miniflare2Options.kvNamespaces),
216
+ r2Buckets: arrayToObject(miniflare2Options.r2Buckets),
217
+ // TODO: pass-through collected modules instead of getting Miniflare
218
+ // to collect them again
219
+ };
220
+
221
+ logger.log("⎔ Starting an experimental local server...");
222
+
223
+ if (Miniflare === undefined) {
224
+ ({ Miniflare } = await npxImport<
225
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
226
+ typeof import("@miniflare/tre")
227
+ >("@miniflare/tre"));
228
+ }
229
+
230
+ const mf = new Miniflare(options);
231
+ experimentalLocalRef.current = mf;
232
+ removeSignalExitListener.current = onExit((_code, _signal) => {
233
+ logger.log("⎔ Shutting down experimental local server.");
234
+ mf.dispose();
235
+ experimentalLocalRef.current = undefined;
236
+ });
237
+ await mf.ready;
238
+ return;
239
+ }
240
+
191
241
  const nodeOptions = setupNodeOptions({ inspect, ip, inspectorPort });
192
242
  logger.log("⎔ Starting a local server...");
193
243
 
@@ -280,9 +330,16 @@ function useLocalWorker({
280
330
  logger.log("⎔ Shutting down local server.");
281
331
  local.current?.kill();
282
332
  local.current = undefined;
283
- removeSignalExitListener.current && removeSignalExitListener.current();
284
- removeSignalExitListener.current = undefined;
285
333
  }
334
+ if (experimentalLocalRef.current) {
335
+ logger.log("⎔ Shutting down experimental local server.");
336
+ // Initialisation errors are also thrown asynchronously by dispose().
337
+ // The catch() above should've caught them though.
338
+ experimentalLocalRef.current?.dispose().catch(() => {});
339
+ experimentalLocalRef.current = undefined;
340
+ }
341
+ removeSignalExitListener.current?.();
342
+ removeSignalExitListener.current = undefined;
286
343
  };
287
344
  }, [
288
345
  bundle,
@@ -294,6 +351,7 @@ function useLocalWorker({
294
351
  bindings.durable_objects,
295
352
  bindings.kv_namespaces,
296
353
  bindings.r2_buckets,
354
+ bindings.d1_databases,
297
355
  bindings.vars,
298
356
  bindings.services,
299
357
  workerDefinitions,
@@ -311,10 +369,10 @@ function useLocalWorker({
311
369
  localProtocol,
312
370
  localUpstream,
313
371
  inspect,
314
- logLevel,
315
372
  logPrefix,
316
373
  onReady,
317
374
  enablePagesAssetsServiceBinding,
375
+ experimentalLocal,
318
376
  ]);
319
377
  return { inspectorUrl };
320
378
  }
@@ -414,6 +472,7 @@ interface SetupMiniflareOptionsProps {
414
472
  usageModel: "bundled" | "unbound" | undefined;
415
473
  kv_namespaces: CfKvNamespace[] | undefined;
416
474
  r2_buckets: CfR2Bucket[] | undefined;
475
+ d1_databases: CfD1Database[] | undefined;
417
476
  internalDurableObjects: CfDurableObject[];
418
477
  externalDurableObjects: CfDurableObject[];
419
478
  localPersistencePath: string | null;
@@ -425,7 +484,6 @@ interface SetupMiniflareOptionsProps {
425
484
  dataBlobBindings: Record<string, string>;
426
485
  crons: Config["triggers"]["crons"];
427
486
  upstream: string | undefined;
428
- logLevel: "none" | "error" | "log" | "warn" | "debug" | undefined;
429
487
  logPrefix: string | undefined;
430
488
  workerDefinitions: WorkerRegistry | undefined;
431
489
  enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
@@ -444,6 +502,7 @@ export function setupMiniflareOptions({
444
502
  usageModel,
445
503
  kv_namespaces,
446
504
  r2_buckets,
505
+ d1_databases,
447
506
  internalDurableObjects,
448
507
  externalDurableObjects,
449
508
  localPersistencePath,
@@ -455,12 +514,13 @@ export function setupMiniflareOptions({
455
514
  dataBlobBindings,
456
515
  crons,
457
516
  upstream,
458
- logLevel,
459
517
  logPrefix,
460
518
  workerDefinitions,
461
519
  enablePagesAssetsServiceBinding,
462
- }: SetupMiniflareOptionsProps): MiniflareOptions {
463
- // TODO: This was already messy with the custom `disableLogs` and `logOptions`.
520
+ }: SetupMiniflareOptionsProps): {
521
+ miniflareCLIPath: string;
522
+ forkOptions: string[];
523
+ } {
464
524
  // It's now getting _really_ messy now with Pages ASSETS binding outside and the external Durable Objects inside.
465
525
  const options = {
466
526
  name: workerName,
@@ -511,12 +571,14 @@ export function setupMiniflareOptions({
511
571
  })
512
572
  .filter(([_, details]) => !!details)
513
573
  ),
574
+ d1Databases: d1_databases?.map((db) => db.binding),
514
575
  ...(localPersistencePath
515
576
  ? {
516
577
  cachePersist: path.join(localPersistencePath, "cache"),
517
578
  durableObjectsPersist: path.join(localPersistencePath, "do"),
518
579
  kvPersist: path.join(localPersistencePath, "kv"),
519
580
  r2Persist: path.join(localPersistencePath, "r2"),
581
+ d1Persist: path.join(localPersistencePath, "d1"),
520
582
  }
521
583
  : {
522
584
  // We mark these as true, so that they'll
@@ -548,7 +610,7 @@ export function setupMiniflareOptions({
548
610
  logUnhandledRejections: true,
549
611
  crons,
550
612
  upstream,
551
- disableLogs: logLevel === "none",
613
+ logLevel: logger.loggerLevel,
552
614
  logOptions: logPrefix ? { prefix: logPrefix } : undefined,
553
615
  enablePagesAssetsServiceBinding,
554
616
  };
@@ -91,6 +91,7 @@ export async function startDevServer(
91
91
  services: props.bindings.services,
92
92
  firstPartyWorkerDevFacade: props.firstPartyWorker,
93
93
  testScheduled: props.testScheduled,
94
+ experimentalLocalStubCache: props.experimentalLocal,
94
95
  });
95
96
 
96
97
  //run local now
@@ -111,7 +112,6 @@ export async function startDevServer(
111
112
  crons: props.crons,
112
113
  localProtocol: props.localProtocol,
113
114
  localUpstream: props.localUpstream,
114
- logLevel: props.logLevel,
115
115
  logPrefix: props.logPrefix,
116
116
  inspect: props.inspect,
117
117
  onReady: props.onReady,
@@ -160,6 +160,7 @@ async function runEsbuild({
160
160
  services,
161
161
  firstPartyWorkerDevFacade,
162
162
  testScheduled,
163
+ experimentalLocalStubCache,
163
164
  }: {
164
165
  entry: Entry;
165
166
  destination: string | undefined;
@@ -177,6 +178,7 @@ async function runEsbuild({
177
178
  workerDefinitions: WorkerRegistry;
178
179
  firstPartyWorkerDevFacade: boolean | undefined;
179
180
  testScheduled?: boolean;
181
+ experimentalLocalStubCache: boolean | undefined;
180
182
  }): Promise<EsbuildBundle | undefined> {
181
183
  if (!destination) return;
182
184
 
@@ -212,7 +214,9 @@ async function runEsbuild({
212
214
  services,
213
215
  firstPartyWorkerDevFacade,
214
216
  targetConsumer: "dev", // We are starting a dev server
217
+ local: false,
215
218
  testScheduled,
219
+ experimentalLocalStubCache,
216
220
  });
217
221
 
218
222
  return {
@@ -246,7 +250,6 @@ export async function startLocalServer({
246
250
  localUpstream,
247
251
  inspect,
248
252
  onReady,
249
- logLevel,
250
253
  logPrefix,
251
254
  enablePagesAssetsServiceBinding,
252
255
  }: LocalProps) {
@@ -321,6 +324,7 @@ export async function startLocalServer({
321
324
  usageModel,
322
325
  kv_namespaces: bindings?.kv_namespaces,
323
326
  r2_buckets: bindings?.r2_buckets,
327
+ d1_databases: bindings?.d1_databases,
324
328
  internalDurableObjects,
325
329
  externalDurableObjects,
326
330
  localPersistencePath,
@@ -332,7 +336,6 @@ export async function startLocalServer({
332
336
  dataBlobBindings,
333
337
  crons,
334
338
  upstream,
335
- logLevel,
336
339
  logPrefix,
337
340
  workerDefinitions,
338
341
  enablePagesAssetsServiceBinding,
@@ -30,14 +30,17 @@ export function useEsbuild({
30
30
  tsconfig,
31
31
  minify,
32
32
  nodeCompat,
33
+ betaD1Shims,
33
34
  define,
34
35
  noBundle,
35
36
  workerDefinitions,
36
37
  services,
37
38
  durableObjects,
38
39
  firstPartyWorkerDevFacade,
40
+ local,
39
41
  targetConsumer,
40
42
  testScheduled,
43
+ experimentalLocalStubCache,
41
44
  }: {
42
45
  entry: Entry;
43
46
  destination: string | undefined;
@@ -51,12 +54,15 @@ export function useEsbuild({
51
54
  tsconfig: string | undefined;
52
55
  minify: boolean | undefined;
53
56
  nodeCompat: boolean | undefined;
57
+ betaD1Shims?: string[];
54
58
  noBundle: boolean;
55
59
  workerDefinitions: WorkerRegistry;
56
60
  durableObjects: Config["durable_objects"];
57
61
  firstPartyWorkerDevFacade: boolean | undefined;
62
+ local: boolean;
58
63
  targetConsumer: "dev" | "publish";
59
64
  testScheduled: boolean;
65
+ experimentalLocalStubCache: boolean | undefined;
60
66
  }): EsbuildBundle | undefined {
61
67
  const [bundle, setBundle] = useState<EsbuildBundle>();
62
68
  const { exit } = useApp();
@@ -110,6 +116,7 @@ export function useEsbuild({
110
116
  tsconfig,
111
117
  minify,
112
118
  nodeCompat,
119
+ betaD1Shims,
113
120
  define,
114
121
  checkFetch: true,
115
122
  assets: assets && {
@@ -120,8 +127,10 @@ export function useEsbuild({
120
127
  workerDefinitions,
121
128
  services,
122
129
  firstPartyWorkerDevFacade,
130
+ local,
123
131
  targetConsumer,
124
132
  testScheduled,
133
+ experimentalLocalStubCache,
125
134
  });
126
135
 
127
136
  // Capture the `stop()` method to use as the `useEffect()` destructor.
@@ -140,7 +149,6 @@ export function useEsbuild({
140
149
  watcher.close();
141
150
  };
142
151
  }
143
-
144
152
  setBundle({
145
153
  id: 0,
146
154
  entry,
@@ -179,8 +187,11 @@ export function useEsbuild({
179
187
  durableObjects,
180
188
  workerDefinitions,
181
189
  firstPartyWorkerDevFacade,
190
+ betaD1Shims,
191
+ local,
182
192
  targetConsumer,
183
193
  testScheduled,
194
+ experimentalLocalStubCache,
184
195
  ]);
185
196
  return bundle;
186
197
  }
package/src/dev.tsx CHANGED
@@ -6,6 +6,7 @@ import React from "react";
6
6
  import { findWranglerToml, printBindings, readConfig } from "./config";
7
7
  import Dev from "./dev/dev";
8
8
  import { getVarsForDev } from "./dev/dev-vars";
9
+ import { getLocalPersistencePath } from "./dev/get-local-persistence-path";
9
10
 
10
11
  import { startDevServer } from "./dev/start-server";
11
12
  import { getEntry } from "./entry";
@@ -13,18 +14,19 @@ import { logger } from "./logger";
13
14
  import * as metrics from "./metrics";
14
15
  import { getAssetPaths, getSiteAssetPaths } from "./sites";
15
16
  import { getAccountFromCache } from "./user";
16
- import { getZoneIdFromHost, getZoneForRoute, getHostFromRoute } from "./zones";
17
+ import { identifyD1BindingsAsBeta } from "./worker";
18
+ import { getHostFromRoute, getZoneForRoute, getZoneIdFromHost } from "./zones";
17
19
  import {
18
- printWranglerBanner,
19
- DEFAULT_LOCAL_PORT,
20
20
  type ConfigPath,
21
- getScriptName,
21
+ DEFAULT_INSPECTOR_PORT,
22
+ DEFAULT_LOCAL_PORT,
22
23
  getDevCompatibilityDate,
23
24
  getRules,
25
+ getScriptName,
24
26
  isLegacyEnv,
25
- DEFAULT_INSPECTOR_PORT,
27
+ printWranglerBanner,
26
28
  } from "./index";
27
- import type { Config } from "./config";
29
+ import type { Config, Environment } from "./config";
28
30
  import type { Route } from "./config/environment";
29
31
  import type { EnablePagesAssetsServiceBindingOptions } from "./miniflare-cli";
30
32
  import type { CfWorkerInit } from "./worker";
@@ -60,6 +62,7 @@ interface DevArgs {
60
62
  "jsx-fragment"?: string;
61
63
  tsconfig?: string;
62
64
  local?: boolean;
65
+ "experimental-local"?: boolean;
63
66
  minify?: boolean;
64
67
  var?: string[];
65
68
  define?: string[];
@@ -69,7 +72,7 @@ interface DevArgs {
69
72
  "persist-to"?: string;
70
73
  "live-reload"?: boolean;
71
74
  onReady?: (ip: string, port: number) => void;
72
- logLevel?: "none" | "error" | "log" | "warn" | "debug";
75
+ logLevel?: "none" | "info" | "error" | "log" | "warn" | "debug";
73
76
  logPrefix?: string;
74
77
  showInteractiveDevSession?: boolean;
75
78
  "test-scheduled"?: boolean;
@@ -232,6 +235,20 @@ export function devOptions(yargs: Argv): Argv<DevArgs> {
232
235
  type: "boolean",
233
236
  default: false, // I bet this will a point of contention. We'll revisit it.
234
237
  })
238
+ .option("experimental-local", {
239
+ describe: "Run on my machine using the Cloudflare Workers runtime",
240
+ type: "boolean",
241
+ default: false,
242
+ })
243
+ .check((argv) => {
244
+ if (argv.local && argv["experimental-local"]) {
245
+ throw new Error(
246
+ "--local and --experimental-local are mutually exclusive. " +
247
+ "Please select one or the other."
248
+ );
249
+ }
250
+ return true;
251
+ })
235
252
  .option("minify", {
236
253
  describe: "Minify the script",
237
254
  type: "boolean",
@@ -280,7 +297,6 @@ export function devOptions(yargs: Argv): Argv<DevArgs> {
280
297
  default: false,
281
298
  })
282
299
  .option("log-level", {
283
- // "none" will currently default to "error" for Wrangler Logger
284
300
  choices: ["debug", "info", "log", "warn", "error", "none"] as const,
285
301
  describe: "Specify logging level",
286
302
  default: "log",
@@ -320,6 +336,7 @@ export type AdditionalDevProps = {
320
336
  bucket_name: string;
321
337
  preview_bucket_name?: string;
322
338
  }[];
339
+ d1Databases?: Environment["d1_databases"];
323
340
  };
324
341
 
325
342
  type StartDevOptions = ArgumentsCamelCase<DevArgs> &
@@ -335,8 +352,7 @@ export async function startDev(args: StartDevOptions) {
335
352
  let rerender: (node: React.ReactNode) => void | undefined;
336
353
  try {
337
354
  if (args.logLevel) {
338
- // we don't define a "none" logLevel, so "error" will do for now.
339
- logger.loggerLevel = args.logLevel === "none" ? "error" : args.logLevel;
355
+ logger.loggerLevel = args.logLevel;
340
356
  }
341
357
  await printWranglerBanner();
342
358
 
@@ -404,7 +420,9 @@ export async function startDev(args: StartDevOptions) {
404
420
  nodeCompat={nodeCompat}
405
421
  build={configParam.build || {}}
406
422
  define={{ ...configParam.define, ...cliDefines }}
407
- initialMode={args.local ? "local" : "remote"}
423
+ initialMode={
424
+ args.local || args.experimentalLocal ? "local" : "remote"
425
+ }
408
426
  jsxFactory={args["jsx-factory"] || configParam.jsx_factory}
409
427
  jsxFragment={args["jsx-fragment"] || configParam.jsx_fragment}
410
428
  tsconfig={args.tsconfig ?? configParam.tsconfig}
@@ -434,7 +452,6 @@ export async function startDev(args: StartDevOptions) {
434
452
  usageModel={configParam.usage_model}
435
453
  bindings={bindings}
436
454
  crons={configParam.triggers.crons}
437
- logLevel={args.logLevel}
438
455
  logPrefix={args.logPrefix}
439
456
  onReady={args.onReady}
440
457
  inspect={args.inspect ?? true}
@@ -444,6 +461,7 @@ export async function startDev(args: StartDevOptions) {
444
461
  firstPartyWorker={configParam.first_party_worker}
445
462
  sendMetrics={configParam.send_metrics}
446
463
  testScheduled={args["test-scheduled"]}
464
+ experimentalLocal={args.experimentalLocal}
447
465
  />
448
466
  );
449
467
  }
@@ -464,8 +482,7 @@ export async function startDev(args: StartDevOptions) {
464
482
 
465
483
  export async function startApiDev(args: StartDevOptions) {
466
484
  if (args.logLevel) {
467
- // we don't define a "none" logLevel, so "error" will do for now.
468
- logger.loggerLevel = args.logLevel === "none" ? "error" : args.logLevel;
485
+ logger.loggerLevel = args.logLevel;
469
486
  }
470
487
  await printWranglerBanner();
471
488
 
@@ -501,9 +518,13 @@ export async function startApiDev(args: StartDevOptions) {
501
518
  configParam
502
519
  );
503
520
 
521
+ //if args.bundle is on, don't disable bundling
522
+ //if there's no args.bundle, and configParam.no_bundle is on, disable bundling
523
+ //otherwise, enable bundling
524
+ const enableBundling = args.bundle ?? !configParam.no_bundle;
504
525
  return await startDevServer({
505
526
  name: getScriptName({ name: args.name, env: args.env }, configParam),
506
- noBundle: !(args.bundle ?? !configParam.no_bundle),
527
+ noBundle: !enableBundling,
507
528
  entry: entry,
508
529
  env: args.env,
509
530
  zone: zoneId,
@@ -522,7 +543,7 @@ export async function startApiDev(args: StartDevOptions) {
522
543
  upstreamProtocol: upstreamProtocol,
523
544
  localProtocol: args.localProtocol || configParam.dev.local_protocol,
524
545
  localUpstream: args["local-upstream"] || host,
525
- localPersistencePath: localPersistencePath,
546
+ localPersistencePath,
526
547
  liveReload: args.liveReload || false,
527
548
  accountId: configParam.account_id || getAccountFromCache()?.id,
528
549
  assetPaths: assetPaths,
@@ -547,7 +568,6 @@ export async function startApiDev(args: StartDevOptions) {
547
568
  usageModel: configParam.usage_model,
548
569
  bindings: bindings,
549
570
  crons: configParam.triggers.crons,
550
- logLevel: args.logLevel,
551
571
  logPrefix: args.logPrefix,
552
572
  onReady: args.onReady,
553
573
  inspect: args.inspect ?? true,
@@ -558,6 +578,7 @@ export async function startApiDev(args: StartDevOptions) {
558
578
  firstPartyWorker: configParam.first_party_worker,
559
579
  sendMetrics: configParam.send_metrics,
560
580
  testScheduled: args.testScheduled,
581
+ experimentalLocal: undefined,
561
582
  });
562
583
  }
563
584
 
@@ -683,7 +704,6 @@ async function validateDevServerSettings(
683
704
  "The --assets argument is experimental and may change or break at any time"
684
705
  );
685
706
  }
686
-
687
707
  const upstreamProtocol =
688
708
  args["upstream-protocol"] || config.dev.upstream_protocol;
689
709
  if (upstreamProtocol === "http") {
@@ -708,17 +728,11 @@ async function validateDevServerSettings(
708
728
  );
709
729
  }
710
730
 
711
- const localPersistencePath = args.persistTo
712
- ? // If path specified, always treat it as relative to cwd()
713
- path.resolve(process.cwd(), args.persistTo)
714
- : args.persist
715
- ? // If just flagged on, treat it as relative to wrangler.toml,
716
- // if one can be found, otherwise cwd()
717
- path.resolve(
718
- config.configPath ? path.dirname(config.configPath) : process.cwd(),
719
- ".wrangler/state"
720
- )
721
- : null;
731
+ const localPersistencePath = getLocalPersistencePath(
732
+ args.persistTo,
733
+ Boolean(args.persist),
734
+ config.configPath
735
+ );
722
736
 
723
737
  const cliDefines =
724
738
  args.define?.reduce<Record<string, string>>((collectDefines, d) => {
@@ -758,6 +772,7 @@ async function getBindingsAndAssetPaths(
758
772
  vars: { ...args.vars, ...cliVars },
759
773
  durableObjects: args.durableObjects,
760
774
  r2: args.r2,
775
+ d1Databases: args.d1Databases,
761
776
  });
762
777
 
763
778
  const maskedVars = maskVars(bindings, configParam);
@@ -844,6 +859,10 @@ async function getBindings(
844
859
  services: configParam.services,
845
860
  unsafe: configParam.unsafe?.bindings,
846
861
  logfwdr: configParam.logfwdr,
862
+ d1_databases: identifyD1BindingsAsBeta([
863
+ ...configParam.d1_databases,
864
+ ...(args.d1Databases || []),
865
+ ]),
847
866
  };
848
867
 
849
868
  return bindings;
package/src/dialogs.tsx CHANGED
@@ -138,6 +138,10 @@ export function select(
138
138
  });
139
139
  }
140
140
 
141
+ export function logDim(msg: string) {
142
+ console.log(chalk.gray(msg));
143
+ }
144
+
141
145
  export async function fromDashMessagePrompt(
142
146
  deploySource: "dash" | "wrangler" | "api"
143
147
  ): Promise<boolean | void> {
@@ -1,5 +1,20 @@
1
1
  import { logger } from "./logger";
2
2
 
3
+ type VariableNames =
4
+ | "CLOUDFLARE_ACCOUNT_ID"
5
+ | "CLOUDFLARE_API_TOKEN"
6
+ | "CLOUDFLARE_API_KEY"
7
+ | "CLOUDFLARE_EMAIL"
8
+ | "WRANGLER_SEND_METRICS"
9
+ | "CLOUDFLARE_API_BASE_URL"
10
+ | "WRANGLER_LOG";
11
+
12
+ type DeprecatedNames =
13
+ | "CF_ACCOUNT_ID"
14
+ | "CF_API_TOKEN"
15
+ | "CF_API_KEY"
16
+ | "CF_EMAIL"
17
+ | "CF_API_BASE_URL";
3
18
  /**
4
19
  * Create a function used to access an environment variable.
5
20
  *
@@ -11,8 +26,8 @@ export function getEnvironmentVariableFactory({
11
26
  deprecatedName,
12
27
  defaultValue,
13
28
  }: {
14
- variableName: string;
15
- deprecatedName?: string;
29
+ variableName: VariableNames;
30
+ deprecatedName?: DeprecatedNames;
16
31
  defaultValue?: string;
17
32
  }) {
18
33
  let hasWarned = false;