devflare 1.0.0-next.69 → 1.0.0-next.70

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.
@@ -1140,7 +1140,7 @@ async function runInit(parsed, logger, options) {
1140
1140
  return runInitCommand(parsed, logger, options);
1141
1141
  }
1142
1142
  async function runDev(parsed, logger, options) {
1143
- const { runDevCommand } = await import("./dev-D8JuhNjD.js");
1143
+ const { runDevCommand } = await import("./dev-BagtFegV.js");
1144
1144
  return runDevCommand(parsed, logger, options);
1145
1145
  }
1146
1146
  async function runWorkspace(parsed, logger, options) {
@@ -12,6 +12,7 @@ import { r as stopSpawnedProcessTree, t as detectViteProject } from "./vite-util
12
12
  import { dirname, relative, resolve } from "pathe";
13
13
  import { exec } from "node:child_process";
14
14
  import { createConsola } from "consola";
15
+ import { connect } from "node:net";
15
16
  import { promisify } from "node:util";
16
17
  //#region src/bridge/miniflare.ts
17
18
  function isIgnorableMiniflareDisposeError(error) {
@@ -204,6 +205,123 @@ function createReloadQueue({ reload, logger }) {
204
205
  };
205
206
  }
206
207
  //#endregion
208
+ //#region src/dev-server/runtime-health.ts
209
+ /** How often the runtime is probed. Cheap enough to be free, quick enough to catch a death between requests. */
210
+ const RUNTIME_PROBE_INTERVAL_MS = 2e3;
211
+ /** How long a single probe waits for the connection before counting as a failure. */
212
+ const RUNTIME_PROBE_TIMEOUT_MS = 1e3;
213
+ /**
214
+ * Whether something is accepting connections at this address.
215
+ *
216
+ * A plain TCP connect, deliberately: the bridge only needs the listener to exist, and an HTTP request
217
+ * would need a route that is meaningful for every app shape — a worker that 500s, hangs, or has no
218
+ * matching route would then read as "dead" and have its runtime rebuilt underneath it. The tradeoff
219
+ * is that a FOREIGN listener on the same port reads as alive; that only matters if something else
220
+ * seizes the port while the runtime is down, in which case the rebuild fails on the address anyway
221
+ * and the attempt limit reports it.
222
+ *
223
+ * @param options - `host`/`port` of the runtime, and how long to wait before giving up on the connect.
224
+ * @returns true when the connection was accepted.
225
+ */
226
+ function probeTcpReachable(options) {
227
+ const { host, port, timeoutMs = RUNTIME_PROBE_TIMEOUT_MS } = options;
228
+ return new Promise((resolve) => {
229
+ let settled = false;
230
+ const settle = (reachable) => {
231
+ if (settled) return;
232
+ settled = true;
233
+ socket.destroy();
234
+ resolve(reachable);
235
+ };
236
+ const socket = connect({
237
+ host,
238
+ port
239
+ });
240
+ socket.setTimeout(timeoutMs);
241
+ socket.once("connect", () => settle(true));
242
+ socket.once("timeout", () => settle(false));
243
+ socket.on("error", () => settle(false));
244
+ });
245
+ }
246
+ /**
247
+ * A connect target that is dialable regardless of the address the runtime was bound to.
248
+ *
249
+ * A wildcard bind is not itself a valid destination on every platform, so probe the loopback address
250
+ * of the SAME family. The families do not cross: a `::` bind is reachable on `::1` and NOT on
251
+ * `127.0.0.1`, so collapsing both wildcards to the IPv4 loopback makes a healthy IPv6 runtime look
252
+ * dead — and the watchdog would then kill and rebuild it on a loop.
253
+ *
254
+ * @param host - the configured Miniflare host.
255
+ * @returns a host that can be connected to.
256
+ */
257
+ function dialableHost(host) {
258
+ if (host === "::") return "::1";
259
+ if (host === "0.0.0.0") return "127.0.0.1";
260
+ return host;
261
+ }
262
+ /**
263
+ * Watch a runtime and report it lost when it stops answering.
264
+ *
265
+ * The next probe is scheduled only once the previous one (and any rebuild it triggered) has finished,
266
+ * so a slow rebuild cannot stack up signals. Reaching the threshold resets the failure count, which
267
+ * spaces successive rebuild attempts a full threshold apart instead of firing on every probe.
268
+ *
269
+ * @param options - see {@link RuntimeWatchdogOptions}.
270
+ * @returns a handle whose `stop()` ends the watch.
271
+ */
272
+ function createRuntimeWatchdog(options) {
273
+ const { probe, onRuntimeLost, intervalMs = RUNTIME_PROBE_INTERVAL_MS, failureThreshold = 3, recoveryAttemptLimit = 3, setTimer = (fn, ms) => setTimeout(fn, ms), clearTimer = (handle) => clearTimeout(handle), logger } = options;
274
+ let stopped = false;
275
+ let timer = null;
276
+ let consecutiveFailures = 0;
277
+ let recoveryAttempts = 0;
278
+ function scheduleNext() {
279
+ if (stopped) return;
280
+ timer = setTimer(() => {
281
+ tick();
282
+ }, intervalMs);
283
+ }
284
+ async function tick() {
285
+ if (stopped) return;
286
+ const reachable = await probe().catch(() => false);
287
+ if (stopped) return;
288
+ if (reachable) {
289
+ consecutiveFailures = 0;
290
+ recoveryAttempts = 0;
291
+ scheduleNext();
292
+ return;
293
+ }
294
+ consecutiveFailures++;
295
+ if (consecutiveFailures < failureThreshold) {
296
+ scheduleNext();
297
+ return;
298
+ }
299
+ recoveryAttempts++;
300
+ if (recoveryAttempts > recoveryAttemptLimit) {
301
+ logger?.error(`The local runtime keeps going away after ${recoveryAttemptLimit} rebuild attempts. Giving up so the real error stays visible — restart \`devflare dev\` once it is resolved.`);
302
+ stop();
303
+ return;
304
+ }
305
+ try {
306
+ await onRuntimeLost();
307
+ } catch (error) {
308
+ logger?.error("[devflare dev] runtime rebuild failed:", error);
309
+ }
310
+ consecutiveFailures = 0;
311
+ scheduleNext();
312
+ }
313
+ function stop() {
314
+ if (stopped) return;
315
+ stopped = true;
316
+ if (timer !== null) {
317
+ clearTimer(timer);
318
+ timer = null;
319
+ }
320
+ }
321
+ scheduleNext();
322
+ return { stop };
323
+ }
324
+ //#endregion
207
325
  //#region src/dev-server/worker-source-watcher.ts
208
326
  async function startWorkerSourceWatcher(options) {
209
327
  const { watchTargets, resolvedWorkerConfigPath, logger, onConfigChange, onWorkerChange } = options;
@@ -313,8 +431,55 @@ function createDevServer(options) {
313
431
  const { cwd, configPath, vitePort = 5173, miniflarePort = 8787, miniflareHost = "127.0.0.1", enableVite: enableViteRequested = true, persist = true, logger, verbose = false, debug = process.env.DEVFLARE_DEBUG === "true" } = options;
314
432
  const state = createDevServerState({ enableVite: enableViteRequested });
315
433
  const r2PresignSecret = `${crypto.randomUUID()}${crypto.randomUUID()}`;
434
+ /** Whether the local runtime is still accepting connections. */
435
+ async function isRuntimeReachable() {
436
+ return probeTcpReachable({
437
+ host: dialableHost(miniflareHost),
438
+ port: miniflarePort
439
+ });
440
+ }
441
+ /**
442
+ * Drop a runtime that has already gone away.
443
+ *
444
+ * Disposing a dead Miniflare routinely throws (its runtime is not there to talk to), which is not a
445
+ * reason to abandon the rebuild — so anything unrecognised is logged rather than propagated.
446
+ */
447
+ async function discardDeadMiniflare() {
448
+ if (!state.miniflare) return;
449
+ try {
450
+ await state.miniflare.dispose();
451
+ } catch (error) {
452
+ if (!isIgnorableMiniflareDisposeError(error)) logger?.debug("Disposing the dead Miniflare threw (continuing with the rebuild):", error);
453
+ }
454
+ state.miniflare = null;
455
+ }
456
+ /**
457
+ * Set once {@link stop} begins. A rebuild started just before shutdown would otherwise construct a
458
+ * fresh Miniflare AFTER the teardown disposed the old one, leaking a runtime that outlives the
459
+ * server — which shows up as the next thing to use the port hanging.
460
+ */
461
+ let isStopping = false;
462
+ /**
463
+ * Set once the runtime has come up at least once. Gates the rebuild path so a reload that arrives
464
+ * before the first start cannot mistake "not started yet" for "died".
465
+ */
466
+ let hasStartedRuntime = false;
316
467
  const reloadQueue = createReloadQueue({
317
468
  reload: async () => {
469
+ if (isStopping) return;
470
+ if (hasStartedRuntime && !await isRuntimeReachable()) {
471
+ if (isStopping) return;
472
+ logger?.warn("Local runtime stopped responding — rebuilding it");
473
+ await discardDeadMiniflare();
474
+ await startMiniflare(state.currentDoResult);
475
+ await runD1Migrations({
476
+ cwd,
477
+ config: state.config,
478
+ miniflarePort,
479
+ logger
480
+ });
481
+ return;
482
+ }
318
483
  if (!state.miniflare) return;
319
484
  const { Log, LogLevel } = await import("miniflare");
320
485
  const mfConfig = buildMiniflareConfig(state.currentDoResult);
@@ -327,6 +492,29 @@ function createDevServer(options) {
327
492
  },
328
493
  logger
329
494
  });
495
+ /**
496
+ * Watches the runtime for the rest of the process's life, once it is first up.
497
+ *
498
+ * Held here rather than on {@link DevServerState} because it is pure server orchestration — it owns
499
+ * no resource the teardown sequence has to order around, only a timer.
500
+ */
501
+ let runtimeWatchdog = null;
502
+ /**
503
+ * Begin watching the runtime, if it is not already being watched.
504
+ *
505
+ * Deliberately idempotent, because `startMiniflare` also runs on the REBUILD path — replacing the
506
+ * watchdog there would hand each rebuild a fresh recovery budget, so a probe that is wrong about a
507
+ * healthy runtime could rebuild it forever without the attempt limit ever biting. One watchdog for
508
+ * the server's lifetime keeps that budget meaningful; only a successful probe clears it.
509
+ */
510
+ function watchRuntimeHealth() {
511
+ if (isStopping || runtimeWatchdog) return;
512
+ runtimeWatchdog = createRuntimeWatchdog({
513
+ probe: isRuntimeReachable,
514
+ onRuntimeLost: () => reloadQueue.schedule(),
515
+ logger
516
+ });
517
+ }
330
518
  async function bundleMainWorker() {
331
519
  if (!state.mainWorkerScriptPath || !state.config) {
332
520
  state.bundledMainWorkerScriptPath = null;
@@ -383,10 +571,13 @@ function createDevServer(options) {
383
571
  mfConfig.handleRuntimeStdio = createRuntimeStdioForwarder(logger);
384
572
  const shouldLogMiniflareDiagnostics = verbose || debug;
385
573
  if (shouldLogMiniflareDiagnostics) logMiniflareConfigDiagnostics(logger, mfConfig);
386
- state.miniflare = new Miniflare(mfConfig);
387
- await state.miniflare.ready;
574
+ const miniflare = new Miniflare(mfConfig);
575
+ state.miniflare = miniflare;
576
+ await miniflare.ready;
388
577
  const displayHost = miniflareHost === "0.0.0.0" || miniflareHost === "::" ? "localhost" : miniflareHost;
389
578
  logger?.success(`Miniflare ready on http://${displayHost}:${miniflarePort}`);
579
+ hasStartedRuntime = true;
580
+ watchRuntimeHealth();
390
581
  if (shouldLogMiniflareDiagnostics) await logMiniflareBindingDiagnostics(logger, state.miniflare, mfConfig);
391
582
  }
392
583
  /**
@@ -552,6 +743,10 @@ function createDevServer(options) {
552
743
  * Stop the dev server
553
744
  */
554
745
  async function stop() {
746
+ isStopping = true;
747
+ runtimeWatchdog?.stop();
748
+ runtimeWatchdog = null;
749
+ await reloadQueue.drain();
555
750
  await disposeDevServerState(state);
556
751
  }
557
752
  /**
package/dist/cli/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as runCli, t as parseArgs } from "../_chunks/cli-3RIFRu7O.js";
1
+ import { n as runCli, t as parseArgs } from "../_chunks/cli-ZJYtm-lW.js";
2
2
  export { parseArgs, runCli };
@@ -0,0 +1,79 @@
1
+ import type { ConsolaInstance } from 'consola';
2
+ /** How often the runtime is probed. Cheap enough to be free, quick enough to catch a death between requests. */
3
+ export declare const RUNTIME_PROBE_INTERVAL_MS = 2000;
4
+ /**
5
+ * Consecutive failed probes before the runtime is declared gone. More than one so a probe that lands
6
+ * inside a legitimate reload — when the listener is briefly absent — does not trigger a rebuild.
7
+ */
8
+ export declare const RUNTIME_PROBE_FAILURE_THRESHOLD = 3;
9
+ /** How long a single probe waits for the connection before counting as a failure. */
10
+ export declare const RUNTIME_PROBE_TIMEOUT_MS = 1000;
11
+ /**
12
+ * How many times an outage may be recovered before the watchdog stands down. A runtime that dies
13
+ * immediately on every rebuild is broken in a way retrying cannot fix; looping on it would bury the
14
+ * real error under restart noise.
15
+ */
16
+ export declare const RUNTIME_RECOVERY_ATTEMPT_LIMIT = 3;
17
+ /**
18
+ * Whether something is accepting connections at this address.
19
+ *
20
+ * A plain TCP connect, deliberately: the bridge only needs the listener to exist, and an HTTP request
21
+ * would need a route that is meaningful for every app shape — a worker that 500s, hangs, or has no
22
+ * matching route would then read as "dead" and have its runtime rebuilt underneath it. The tradeoff
23
+ * is that a FOREIGN listener on the same port reads as alive; that only matters if something else
24
+ * seizes the port while the runtime is down, in which case the rebuild fails on the address anyway
25
+ * and the attempt limit reports it.
26
+ *
27
+ * @param options - `host`/`port` of the runtime, and how long to wait before giving up on the connect.
28
+ * @returns true when the connection was accepted.
29
+ */
30
+ export declare function probeTcpReachable(options: {
31
+ host: string;
32
+ port: number;
33
+ timeoutMs?: number;
34
+ }): Promise<boolean>;
35
+ /**
36
+ * A connect target that is dialable regardless of the address the runtime was bound to.
37
+ *
38
+ * A wildcard bind is not itself a valid destination on every platform, so probe the loopback address
39
+ * of the SAME family. The families do not cross: a `::` bind is reachable on `::1` and NOT on
40
+ * `127.0.0.1`, so collapsing both wildcards to the IPv4 loopback makes a healthy IPv6 runtime look
41
+ * dead — and the watchdog would then kill and rebuild it on a loop.
42
+ *
43
+ * @param host - the configured Miniflare host.
44
+ * @returns a host that can be connected to.
45
+ */
46
+ export declare function dialableHost(host: string): string;
47
+ export interface RuntimeWatchdogOptions {
48
+ /** Answers "is the runtime still there?"; injected so the schedule can be tested without sockets. */
49
+ probe: () => Promise<boolean>;
50
+ /** Invoked once per outage, after {@link RUNTIME_PROBE_FAILURE_THRESHOLD} consecutive failures. */
51
+ onRuntimeLost: () => Promise<void>;
52
+ /** Probe period. */
53
+ intervalMs?: number;
54
+ /** Consecutive failures that constitute an outage. */
55
+ failureThreshold?: number;
56
+ /** Consecutive unrecovered outages before the watchdog stands down. */
57
+ recoveryAttemptLimit?: number;
58
+ /** Schedules the next probe; injected so tests can drive the clock. */
59
+ setTimer?: (fn: () => void, ms: number) => unknown;
60
+ /** Cancels a scheduled probe. */
61
+ clearTimer?: (handle: unknown) => void;
62
+ logger?: ConsolaInstance;
63
+ }
64
+ export interface RuntimeWatchdog {
65
+ /** Stop probing. Idempotent. */
66
+ stop(): void;
67
+ }
68
+ /**
69
+ * Watch a runtime and report it lost when it stops answering.
70
+ *
71
+ * The next probe is scheduled only once the previous one (and any rebuild it triggered) has finished,
72
+ * so a slow rebuild cannot stack up signals. Reaching the threshold resets the failure count, which
73
+ * spaces successive rebuild attempts a full threshold apart instead of firing on every probe.
74
+ *
75
+ * @param options - see {@link RuntimeWatchdogOptions}.
76
+ * @returns a handle whose `stop()` ends the watch.
77
+ */
78
+ export declare function createRuntimeWatchdog(options: RuntimeWatchdogOptions): RuntimeWatchdog;
79
+ //# sourceMappingURL=runtime-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-health.d.ts","sourceRoot":"","sources":["../../src/dev-server/runtime-health.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,gHAAgH;AAChH,eAAO,MAAM,yBAAyB,OAAO,CAAA;AAC7C;;;GAGG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAChD,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAC5C;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,IAAI,CAAA;AAE/C;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,MAAM,WAAW,sBAAsB;IACtC,qGAAqG;IACrG,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,mGAAmG;IACnG,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,oBAAoB;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;IAClD,iCAAiC;IACjC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,MAAM,CAAC,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC/B,gCAAgC;IAChC,IAAI,IAAI,IAAI,CAAA;CACZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CA+EtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dev-server/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAA;AAiD3D,MAAM,WAAW,gBAAgB;IAChC,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sBAAsB;IACtB,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACzB,2BAA2B;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,0BAA0B;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,yCAAyC;IACzC,YAAY,IAAI,aAAa,GAAG,IAAI,CAAA;CACpC;AAMD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAwYpE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dev-server/server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAA;AAwD3D,MAAM,WAAW,gBAAgB;IAChC,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sBAAsB;IACtB,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACzB,2BAA2B;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,0BAA0B;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,yCAAyC;IACzC,YAAY,IAAI,aAAa,GAAG,IAAI,CAAA;CACpC;AAMD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA0epE"}
package/dist/index.js CHANGED
@@ -5,6 +5,6 @@ import { a as ConfigResourceResolutionError, d as configSchema, n as ConfigValid
5
5
  import { n as compileConfig, s as stringifyConfig } from "./_chunks/compiler-UxXQgEPq.js";
6
6
  import { t as workerName } from "./_chunks/workerName-kEXwmV2m.js";
7
7
  import { n as getDurableObjectOptions, t as durableObject } from "./_chunks/decorators-eXNZ1S0N.js";
8
- import { n as runCli, t as parseArgs } from "./_chunks/cli-3RIFRu7O.js";
8
+ import { n as runCli, t as parseArgs } from "./_chunks/cli-ZJYtm-lW.js";
9
9
  import { i as vars, r as env } from "./_chunks/env-D4uJqqgu.js";
10
10
  export { ConfigNotFoundError, ConfigResourceResolutionError, ConfigValidationError, compileConfig, configSchema, defineConfig as default, defineConfig, defineWorkspace, durableObject, env, getDurableObjectOptions, loadConfig, loadResolvedConfig, parseArgs, preview, ref, runCli, stringifyConfig, vars, workerName };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devflare",
3
- "version": "1.0.0-next.69",
3
+ "version": "1.0.0-next.70",
4
4
  "description": "Devflare is a developer-first toolkit for Cloudflare Workers that sits on top of Miniflare and Wrangler-compatible config",
5
5
  "repository": {
6
6
  "type": "git",