env-runner 0.1.7 → 0.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 (40) hide show
  1. package/dist/_chunks/base-runner.d.mts +0 -3
  2. package/dist/_chunks/base-runner.mjs +0 -2
  3. package/dist/_chunks/libs/cjs-module-lexer.mjs +0 -2
  4. package/dist/_chunks/runner.d.mts +0 -3
  5. package/dist/_chunks/runner.mjs +0 -2
  6. package/dist/_chunks/runner2.d.mts +0 -3
  7. package/dist/_chunks/runner2.mjs +3 -40
  8. package/dist/_chunks/runner3.d.mts +0 -3
  9. package/dist/_chunks/runner3.mjs +0 -2
  10. package/dist/_chunks/runner4.d.mts +0 -3
  11. package/dist/_chunks/runner4.mjs +58 -7
  12. package/dist/_chunks/runner5.d.mts +0 -3
  13. package/dist/_chunks/runner5.mjs +0 -2
  14. package/dist/_chunks/server.mjs +0 -14
  15. package/dist/_chunks/types.d.mts +0 -3
  16. package/dist/_chunks/worker-utils.mjs +0 -6
  17. package/dist/cli.mjs +0 -2
  18. package/dist/index.d.mts +0 -9
  19. package/dist/runners/bun-process/runner.d.mts +0 -3
  20. package/dist/runners/bun-process/runner.mjs +0 -2
  21. package/dist/runners/bun-process/worker.mjs +0 -2
  22. package/dist/runners/deno-process/runner.d.mts +1 -1
  23. package/dist/runners/deno-process/worker.mjs +0 -2
  24. package/dist/runners/miniflare/runner.d.mts +1 -1
  25. package/dist/runners/netlify/runner.d.mts +1 -1
  26. package/dist/runners/netlify/worker.mjs +0 -2
  27. package/dist/runners/node-process/runner.d.mts +0 -3
  28. package/dist/runners/node-process/runner.mjs +0 -2
  29. package/dist/runners/node-process/worker.mjs +0 -2
  30. package/dist/runners/node-worker/runner.d.mts +1 -1
  31. package/dist/runners/node-worker/worker.mjs +0 -2
  32. package/dist/runners/self/runner.d.mts +2 -7
  33. package/dist/runners/self/runner.mjs +0 -2
  34. package/dist/runners/vercel/queue-dev.d.mts +44 -0
  35. package/dist/runners/vercel/queue-dev.mjs +36 -0
  36. package/dist/runners/vercel/runner.d.mts +1 -1
  37. package/dist/runners/vercel/worker.mjs +3 -2
  38. package/dist/vite.d.mts +0 -3
  39. package/dist/vite.mjs +0 -14
  40. package/package.json +23 -17
@@ -1,8 +1,6 @@
1
1
  import { a as RunnerMessageListener, l as WorkerAddress, t as EnvRunner, u as WorkerHooks } from "./types.mjs";
2
2
  import { IncomingMessage } from "node:http";
3
3
  import { Socket } from "node:net";
4
-
5
- //#region src/common/base-runner.d.ts
6
4
  interface EnvRunnerData {
7
5
  name?: string;
8
6
  [key: string]: unknown;
@@ -45,5 +43,4 @@ declare abstract class BaseEnvRunner implements EnvRunner {
45
43
  protected abstract _closeRuntime(): Promise<void>;
46
44
  protected abstract _runtimeType(): string;
47
45
  }
48
- //#endregion
49
46
  export { EnvRunnerData as n, BaseEnvRunner as t };
@@ -1,6 +1,5 @@
1
1
  import { rm } from "node:fs/promises";
2
2
  import { proxyFetch, proxyUpgrade } from "httpxy";
3
- //#region src/common/base-runner.ts
4
3
  var BaseEnvRunner = class {
5
4
  closed = false;
6
5
  _name;
@@ -125,5 +124,4 @@ var BaseEnvRunner = class {
125
124
  this._address = void 0;
126
125
  }
127
126
  };
128
- //#endregion
129
127
  export { BaseEnvRunner as t };
@@ -1,4 +1,3 @@
1
- //#region node_modules/.pnpm/cjs-module-lexer@2.2.0/node_modules/cjs-module-lexer/dist/lexer.mjs
2
1
  let A;
3
2
  const B = 1 === new Uint8Array(new Uint16Array([1]).buffer)[0];
4
3
  function parse(E, g = "@") {
@@ -143,5 +142,4 @@ function init() {
143
142
  A = Q;
144
143
  })());
145
144
  }
146
- //#endregion
147
145
  export { parse as n, init as t };
@@ -1,7 +1,5 @@
1
1
  import { u as WorkerHooks } from "./types.mjs";
2
2
  import { n as EnvRunnerData, t as BaseEnvRunner } from "./base-runner.mjs";
3
-
4
- //#region src/runners/deno-process/runner.d.ts
5
3
  declare class DenoProcessEnvRunner extends BaseEnvRunner {
6
4
  #private;
7
5
  constructor(opts: {
@@ -16,5 +14,4 @@ declare class DenoProcessEnvRunner extends BaseEnvRunner {
16
14
  protected _runtimeType(): string;
17
15
  protected _closeRuntime(): Promise<void>;
18
16
  }
19
- //#endregion
20
17
  export { DenoProcessEnvRunner as t };
@@ -2,7 +2,6 @@ import { t as BaseEnvRunner } from "./base-runner.mjs";
2
2
  import { existsSync } from "node:fs";
3
3
  import { spawn } from "node:child_process";
4
4
  import { fileURLToPath } from "node:url";
5
- //#region src/runners/deno-process/runner.ts
6
5
  let _defaultEntry;
7
6
  var DenoProcessEnvRunner = class extends BaseEnvRunner {
8
7
  #process;
@@ -95,5 +94,4 @@ var DenoProcessEnvRunner = class extends BaseEnvRunner {
95
94
  this.#process = handle;
96
95
  }
97
96
  };
98
- //#endregion
99
97
  export { DenoProcessEnvRunner as t };
@@ -2,8 +2,6 @@ import { u as WorkerHooks } from "./types.mjs";
2
2
  import { n as EnvRunnerData, t as BaseEnvRunner } from "./base-runner.mjs";
3
3
  import { IncomingMessage } from "node:http";
4
4
  import { Socket } from "node:net";
5
-
6
- //#region src/runners/miniflare/runner.d.ts
7
5
  /** Result from a module transform (compatible with Vite's `TransformResult`). */
8
6
  interface TransformResult {
9
7
  code: string;
@@ -83,5 +81,4 @@ declare class MiniflareEnvRunner extends BaseEnvRunner {
83
81
  };
84
82
  }): Promise<void>;
85
83
  }
86
- //#endregion
87
84
  export { TransformResult as i, MiniflareEnvRunnerOptions as n, MiniflareExportInfo as r, MiniflareEnvRunner as t };
@@ -6,26 +6,8 @@ import { readFileSync } from "node:fs";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { basename, dirname, resolve } from "node:path";
8
8
  import { resolveModulePath } from "exsolve";
9
- //#region src/runners/miniflare/wrapper.ts
10
- const IPC_PATH$1 = "/__env_runner_ipc";
11
- /** Service binding name used for cross-request IPC (worker → runner). */
9
+ const IPC_PATH = "/__env_runner_ipc";
12
10
  const IPC_BINDING = "__ENV_RUNNER_IPC";
13
- /**
14
- * Generates a wrapper module that imports the user entry and adds IPC glue.
15
- *
16
- * The user module is expected to export `fetch` and optionally `ipc`.
17
- * The wrapper uses a persistent WebSocket pair for bidirectional IPC:
18
- * - Init: `fetch` with `upgrade: websocket` creates a WebSocketPair
19
- * - Messages: JSON over the WebSocket (no per-message `dispatchFetch`)
20
- * - Reload: `{ type: "reload" }` triggers cache-busted re-import
21
- * - Shutdown: `{ type: "shutdown" }` calls `ipc.onClose()`
22
- *
23
- * For outgoing messages during fetch request handling, uses a service binding
24
- * (`__ENV_RUNNER_IPC`) to avoid workerd's cross-request I/O restriction on
25
- * the WebSocket object.
26
- *
27
- * Passed as an in-memory `script` to Miniflare (no temp files needed).
28
- */
29
11
  function generateWrapper(entryPath, opts) {
30
12
  const staticReExport = opts?.dynamicOnly ? "" : `export * from ${JSON.stringify(entryPath)};`;
31
13
  const explicitExports = opts?.dynamicOnly && opts.exports?.length ? opts.exports.map((name) => `export { ${name} } from ${JSON.stringify(entryPath)};`).join("\n") : "";
@@ -48,7 +30,7 @@ if (!globalThis.process) { globalThis.process = __process; }
48
30
  ${staticReExport}
49
31
  ${explicitExports}
50
32
 
51
- const __IPC_PATH = "${IPC_PATH$1}";
33
+ const __IPC_PATH = "${IPC_PATH}";
52
34
  const __IPC_BINDING = "${IPC_BINDING}";
53
35
  const __entryPath = ${JSON.stringify(entryPath)};
54
36
  let __userEntry;
@@ -194,9 +176,6 @@ export default {
194
176
  };
195
177
  `;
196
178
  }
197
- //#endregion
198
- //#region src/runners/miniflare/runner.ts
199
- const IPC_PATH = "/__env_runner_ipc";
200
179
  const _miniflareCache = /* @__PURE__ */ new Map();
201
180
  var MiniflareEnvRunner = class extends BaseEnvRunner {
202
181
  #miniflare;
@@ -222,13 +201,11 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
222
201
  this.#exportConditions = opts.exportConditions ?? ["workerd", "worker"];
223
202
  this.#init();
224
203
  }
225
- /** Dispose all persistent Miniflare instances from the cache. */
226
204
  static async disposeAll() {
227
205
  const entries = [..._miniflareCache.values()];
228
206
  _miniflareCache.clear();
229
207
  for (const entry of entries) await entry.mf.dispose().catch(() => {});
230
208
  }
231
- /** Fully dispose the Miniflare instance (even if persistent). */
232
209
  async dispose() {
233
210
  if (this.#miniflare) {
234
211
  if (this.#ws) {
@@ -267,13 +244,6 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
267
244
  data: message
268
245
  }));
269
246
  }
270
- /**
271
- * Hot-reload the user entry module without recreating the Miniflare instance.
272
- *
273
- * Sends `reload-module` event over the WebSocket. The worker wrapper uses
274
- * `unsafeEvalBinding` to re-import the entry with a cache-busting query string
275
- * and responds with `module-reloaded` when done.
276
- */
277
247
  async reloadModule(timeout = 5e3) {
278
248
  if (!this.#ws) throw new Error("Miniflare env runner should be initialized before reloading.");
279
249
  if (!this._data?.entry) return;
@@ -513,7 +483,7 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
513
483
  refCount: 1
514
484
  });
515
485
  }
516
- const initRes = await this.#miniflare.dispatchFetch("http://localhost" + IPC_PATH, { headers: { upgrade: "websocket" } });
486
+ const initRes = await this.#miniflare.dispatchFetch("http://localhost/__env_runner_ipc", { headers: { upgrade: "websocket" } });
517
487
  const ws = initRes.webSocket;
518
488
  if (!ws) {
519
489
  const body = await initRes.text().catch(() => "");
@@ -533,10 +503,6 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
533
503
  } });
534
504
  }
535
505
  };
536
- /**
537
- * Detect `export class` declarations in the entry file.
538
- * Merges with explicitly declared exports from options.
539
- */
540
506
  function detectExportedClasses(entryPath, explicit) {
541
507
  const names = new Set(Object.keys(explicit));
542
508
  try {
@@ -547,11 +513,9 @@ function detectExportedClasses(entryPath, explicit) {
547
513
  } catch {}
548
514
  return [...names];
549
515
  }
550
- /** Convert PascalCase/camelCase to SCREAMING_SNAKE_CASE (e.g. `Counter` → `COUNTER`, `MyDurableObject` → `MY_DURABLE_OBJECT`). */
551
516
  function toScreamingSnakeCase(name) {
552
517
  return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toUpperCase();
553
518
  }
554
- /** Compute a stable cache key for persistent Miniflare instances. */
555
519
  function computeCacheKey(entryPath, opts) {
556
520
  const serializableOpts = {};
557
521
  for (const [k, v] of Object.entries(opts)) if (typeof v !== "function") serializableOpts[k] = v;
@@ -572,5 +536,4 @@ function createCjsEsmShim(cjsSpecifier, contents) {
572
536
  for (const name of namedExports) shim += `export var ${name} = __cjs_mod__["${name}"];\n`;
573
537
  return shim;
574
538
  }
575
- //#endregion
576
539
  export { MiniflareEnvRunner as t };
@@ -1,7 +1,5 @@
1
1
  import { u as WorkerHooks } from "./types.mjs";
2
2
  import { n as EnvRunnerData, t as BaseEnvRunner } from "./base-runner.mjs";
3
-
4
- //#region src/runners/node-worker/runner.d.ts
5
3
  declare class NodeWorkerEnvRunner extends BaseEnvRunner {
6
4
  #private;
7
5
  constructor(opts: {
@@ -15,5 +13,4 @@ declare class NodeWorkerEnvRunner extends BaseEnvRunner {
15
13
  protected _runtimeType(): string;
16
14
  protected _closeRuntime(): Promise<void>;
17
15
  }
18
- //#endregion
19
16
  export { NodeWorkerEnvRunner as t };
@@ -2,7 +2,6 @@ import { t as BaseEnvRunner } from "./base-runner.mjs";
2
2
  import { existsSync } from "node:fs";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { Worker } from "node:worker_threads";
5
- //#region src/runners/node-worker/runner.ts
6
5
  let _defaultEntry;
7
6
  var NodeWorkerEnvRunner = class extends BaseEnvRunner {
8
7
  #worker;
@@ -58,5 +57,4 @@ var NodeWorkerEnvRunner = class extends BaseEnvRunner {
58
57
  this.#worker = worker;
59
58
  }
60
59
  };
61
- //#endregion
62
60
  export { NodeWorkerEnvRunner as t };
@@ -1,8 +1,6 @@
1
1
  import { u as WorkerHooks } from "./types.mjs";
2
2
  import { n as EnvRunnerData } from "./base-runner.mjs";
3
3
  import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
4
-
5
- //#region src/runners/vercel/runner.d.ts
6
4
  declare class VercelEnvRunner extends NodeWorkerEnvRunner {
7
5
  constructor(opts: {
8
6
  name: string;
@@ -13,5 +11,4 @@ declare class VercelEnvRunner extends NodeWorkerEnvRunner {
13
11
  fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
14
12
  protected _runtimeType(): string;
15
13
  }
16
- //#endregion
17
14
  export { VercelEnvRunner as t };
@@ -1,7 +1,51 @@
1
1
  import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
2
2
  import { fileURLToPath } from "node:url";
3
- //#region src/runners/vercel/runner.ts
3
+ import { randomBytes } from "node:crypto";
4
+ let _warned = false;
5
+ function warnIfVercelOidcTokenInvalid(token) {
6
+ const result = _checkVercelOidcToken(token);
7
+ if (_warned) return result;
8
+ if (result.status === "missing") {
9
+ _warned = true;
10
+ console.warn("[env-runner:vercel] VERCEL_OIDC_TOKEN is not set. Vercel SDK features (e.g. @vercel/functions waitUntil, cache) may not work. Run `vercel env pull` to set it.");
11
+ } else if (result.status === "expired") {
12
+ _warned = true;
13
+ console.warn(`[env-runner:vercel] VERCEL_OIDC_TOKEN expired at ${result.expiresAt.toISOString()}. Vercel SDK authentication will fail. Run \`vercel env pull\` to refresh it.`);
14
+ } else if (result.status === "invalid") {
15
+ _warned = true;
16
+ console.warn("[env-runner:vercel] VERCEL_OIDC_TOKEN is malformed (not a valid JWT). Vercel SDK authentication will fail. Run `vercel env pull` to get a fresh token.");
17
+ }
18
+ return result;
19
+ }
20
+ function _checkVercelOidcToken(token = process.env.VERCEL_OIDC_TOKEN) {
21
+ if (!token) return { status: "missing" };
22
+ const parts = token.split(".");
23
+ if (parts.length !== 3) return { status: "invalid" };
24
+ let payload;
25
+ try {
26
+ const json = Buffer.from(parts[1], "base64url").toString("utf8");
27
+ payload = JSON.parse(json);
28
+ } catch {
29
+ return { status: "invalid" };
30
+ }
31
+ if (!payload || typeof payload !== "object") return { status: "invalid" };
32
+ const exp = payload.exp;
33
+ if (typeof exp !== "number" || !Number.isFinite(exp)) return { status: "invalid" };
34
+ const expiresAt = /* @__PURE__ */ new Date(exp * 1e3);
35
+ if (expiresAt.getTime() <= Date.now()) return {
36
+ status: "expired",
37
+ expiresAt
38
+ };
39
+ return {
40
+ status: "valid",
41
+ expiresAt
42
+ };
43
+ }
4
44
  let _defaultEntry;
45
+ const _podId = Math.random().toString(32).slice(-5);
46
+ function generateVercelId() {
47
+ return `dev1::${_podId}-${Date.now().toString(36)}-${randomBytes(6).toString("hex")}`;
48
+ }
5
49
  var VercelEnvRunner = class extends NodeWorkerEnvRunner {
6
50
  constructor(opts) {
7
51
  _defaultEntry ||= fileURLToPath(import.meta.resolve("env-runner/runners/vercel/worker"));
@@ -9,13 +53,16 @@ var VercelEnvRunner = class extends NodeWorkerEnvRunner {
9
53
  ...opts,
10
54
  workerEntry: opts.workerEntry || _defaultEntry
11
55
  });
56
+ warnIfVercelOidcTokenInvalid();
12
57
  }
13
58
  async fetch(input, init) {
14
59
  const headers = new Headers(input instanceof Request ? input.headers : init?.headers);
60
+ const requestId = generateVercelId();
15
61
  if (this._address && this._address.port != null && !headers.has("x-vercel-deployment-url")) {
16
62
  const host = this._address.host || "127.0.0.1";
17
63
  headers.set("x-vercel-deployment-url", `http://${host}:${this._address.port}`);
18
64
  }
65
+ if (!headers.has("x-vercel-id")) headers.set("x-vercel-id", requestId);
19
66
  const clientIp = headers.get("x-forwarded-for")?.split(",")[0]?.trim() || headers.get("x-real-ip") || "127.0.0.1";
20
67
  if (!headers.has("x-vercel-forwarded-for")) headers.set("x-vercel-forwarded-for", clientIp);
21
68
  if (!headers.has("x-forwarded-for")) headers.set("x-forwarded-for", clientIp);
@@ -25,18 +72,22 @@ var VercelEnvRunner = class extends NodeWorkerEnvRunner {
25
72
  if (!headers.has("x-forwarded-proto")) headers.set("x-forwarded-proto", url.protocol.replace(":", ""));
26
73
  if (!headers.has("x-forwarded-host")) headers.set("x-forwarded-host", headers.get("host") || url.host);
27
74
  } catch {}
28
- if (input instanceof Request) return super.fetch(new Request(input, {
29
- ...init,
30
- headers
31
- }));
32
- return super.fetch(input, {
75
+ const res = await super.fetch(input, {
33
76
  ...init,
34
77
  headers
35
78
  });
79
+ const resHeaders = new Headers(res.headers);
80
+ if (!resHeaders.has("server")) resHeaders.set("server", "Vercel");
81
+ if (!resHeaders.has("x-vercel-id")) resHeaders.set("x-vercel-id", requestId);
82
+ if (!resHeaders.has("x-vercel-cache")) resHeaders.set("x-vercel-cache", "MISS");
83
+ return new Response(res.body, {
84
+ status: res.status,
85
+ statusText: res.statusText,
86
+ headers: resHeaders
87
+ });
36
88
  }
37
89
  _runtimeType() {
38
90
  return "vercel";
39
91
  }
40
92
  };
41
- //#endregion
42
93
  export { VercelEnvRunner as t };
@@ -1,8 +1,6 @@
1
1
  import { u as WorkerHooks } from "./types.mjs";
2
2
  import { n as EnvRunnerData } from "./base-runner.mjs";
3
3
  import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
4
-
5
- //#region src/runners/netlify/runner.d.ts
6
4
  declare class NetlifyEnvRunner extends NodeWorkerEnvRunner {
7
5
  constructor(opts: {
8
6
  name: string;
@@ -13,5 +11,4 @@ declare class NetlifyEnvRunner extends NodeWorkerEnvRunner {
13
11
  fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
14
12
  protected _runtimeType(): string;
15
13
  }
16
- //#endregion
17
14
  export { NetlifyEnvRunner as t };
@@ -1,6 +1,5 @@
1
1
  import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
2
2
  import { fileURLToPath } from "node:url";
3
- //#region src/runners/netlify/runner.ts
4
3
  let _defaultEntry;
5
4
  var NetlifyEnvRunner = class extends NodeWorkerEnvRunner {
6
5
  constructor(opts) {
@@ -43,5 +42,4 @@ var NetlifyEnvRunner = class extends NodeWorkerEnvRunner {
43
42
  return "netlify";
44
43
  }
45
44
  };
46
- //#endregion
47
45
  export { NetlifyEnvRunner as t };
@@ -1,9 +1,4 @@
1
1
  import { watch } from "node:fs";
2
- //#region src/manager.ts
3
- /**
4
- * Manages an active `EnvRunner` instance, proxying all calls to it.
5
- * Supports hot-reload, auto-restart on unexpected exit, and message queueing.
6
- */
7
2
  var RunnerManager = class {
8
3
  _runner;
9
4
  _messageQueue = [];
@@ -21,7 +16,6 @@ var RunnerManager = class {
21
16
  get closed() {
22
17
  return this._closed;
23
18
  }
24
- /** Replace the active runner with a new one. Closes the previous runner. */
25
19
  async reload(runner) {
26
20
  this._reloading = true;
27
21
  const prev = this._runner;
@@ -167,8 +161,6 @@ var RunnerManager = class {
167
161
  for (const msg of queue) this._runner.sendMessage(msg);
168
162
  }
169
163
  };
170
- //#endregion
171
- //#region src/loader.ts
172
164
  const loaders = {
173
165
  "node-worker": () => import("env-runner/runners/node-worker").then((m) => m.NodeWorkerEnvRunner),
174
166
  "node-process": () => import("env-runner/runners/node-process").then((m) => m.NodeProcessEnvRunner),
@@ -182,19 +174,15 @@ const loaders = {
182
174
  async function loadRunner(runner, opts) {
183
175
  return new (await (loaders[runner]()))(opts);
184
176
  }
185
- //#endregion
186
- //#region src/server.ts
187
177
  var EnvServer = class extends RunnerManager {
188
178
  _opts;
189
179
  _watchers = [];
190
180
  _reloadTimeout;
191
181
  _reloadListeners = /* @__PURE__ */ new Set();
192
182
  runner = null;
193
- /** Register a listener called when the runner is reloaded due to a file change. */
194
183
  onReload(listener) {
195
184
  this._reloadListeners.add(listener);
196
185
  }
197
- /** Remove a previously registered reload listener. */
198
186
  offReload(listener) {
199
187
  this._reloadListeners.delete(listener);
200
188
  }
@@ -202,7 +190,6 @@ var EnvServer = class extends RunnerManager {
202
190
  super();
203
191
  this._opts = opts;
204
192
  }
205
- /** Start the server by loading and attaching the runner. */
206
193
  async start() {
207
194
  this.runner = await this._createRunner();
208
195
  await this.reload(this.runner);
@@ -251,5 +238,4 @@ var EnvServer = class extends RunnerManager {
251
238
  }, 100);
252
239
  }
253
240
  };
254
- //#endregion
255
241
  export { loadRunner as n, RunnerManager as r, EnvServer as t };
@@ -1,7 +1,5 @@
1
1
  import { IncomingMessage } from "node:http";
2
2
  import { Socket } from "node:net";
3
-
4
- //#region src/types.d.ts
5
3
  /** Handler for proxying HTTP requests to the worker. */
6
4
  type FetchHandler = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
7
5
  /** Callback for receiving messages from the worker. */
@@ -72,5 +70,4 @@ interface EnvRunner extends RunnerRPCHooks {
72
70
  /** Gracefully shut down the worker. */
73
71
  close(): Promise<void>;
74
72
  }
75
- //#endregion
76
73
  export { RunnerMessageListener as a, UpgradeHandler as c, RPCOptions as i, WorkerAddress as l, FetchHandler as n, RunnerRPCHooks as o, NodeUpgradeContext as r, UpgradeContext as s, EnvRunner as t, WorkerHooks as u };
@@ -1,7 +1,6 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { pathToFileURL } from "node:url";
3
3
  import { isAbsolute } from "node:path";
4
- //#region src/common/worker-utils.ts
5
4
  async function resolveEntry(entryPath) {
6
5
  const mod = await import(_toImportPath(entryPath));
7
6
  const entry = mod.default || mod;
@@ -15,10 +14,6 @@ function parseServerAddress(server) {
15
14
  port: Number(url.port)
16
15
  };
17
16
  }
18
- /**
19
- * Re-import the user entry module with cache busting.
20
- * Tears down old IPC hooks and re-initializes new ones.
21
- */
22
17
  async function reloadEntryModule(entryPath, currentEntry, sendMessage) {
23
18
  await currentEntry.ipc?.onClose?.();
24
19
  const newEntry = await _importFresh(entryPath);
@@ -39,5 +34,4 @@ async function _importFresh(entryPath) {
39
34
  if (typeof entry.fetch !== "function") throw new Error(`[env-runner] Entry module "${entryPath}" must export a \`fetch\` handler (export default { fetch(req) { ... } }).`);
40
35
  return entry;
41
36
  }
42
- //#endregion
43
37
  export { reloadEntryModule as n, resolveEntry as r, parseServerAddress as t };
package/dist/cli.mjs CHANGED
@@ -2,7 +2,6 @@ import { t as EnvServer } from "./_chunks/server.mjs";
2
2
  import { resolve } from "node:path";
3
3
  import { serve } from "srvx";
4
4
  import { parseArgs } from "node:util";
5
- //#region src/cli.ts
6
5
  const { values, positionals } = parseArgs({
7
6
  allowPositionals: true,
8
7
  options: {
@@ -67,5 +66,4 @@ for (const signal of ["SIGINT", "SIGTERM"]) process.once(signal, async () => {
67
66
  await server.close();
68
67
  process.exit(0);
69
68
  });
70
- //#endregion
71
69
  export {};
package/dist/index.d.mts CHANGED
@@ -6,8 +6,6 @@ import { t as VercelEnvRunner } from "./_chunks/runner4.mjs";
6
6
  import { t as NetlifyEnvRunner } from "./_chunks/runner5.mjs";
7
7
  import { ServerOptions } from "srvx";
8
8
  import { Hooks } from "crossws";
9
-
10
- //#region src/manager.d.ts
11
9
  /**
12
10
  * Manages an active `EnvRunner` instance, proxying all calls to it.
13
11
  * Supports hot-reload, auto-restart on unexpected exit, and message queueing.
@@ -46,8 +44,6 @@ declare class RunnerManager implements EnvRunner {
46
44
  private _waitForRunner;
47
45
  private _flushQueue;
48
46
  }
49
- //#endregion
50
- //#region src/loader.d.ts
51
47
  type RunnerName = "node-worker" | "node-process" | "bun-process" | "deno-process" | "self" | "miniflare" | "vercel" | "netlify";
52
48
  interface LoadRunnerOptions {
53
49
  name: string;
@@ -59,8 +55,6 @@ interface LoadRunnerOptions {
59
55
  [key: string]: unknown;
60
56
  }
61
57
  declare function loadRunner(runner: RunnerName, opts: LoadRunnerOptions): Promise<EnvRunner>;
62
- //#endregion
63
- //#region src/server.d.ts
64
58
  interface EnvServerOptions {
65
59
  /** Runner implementation to use. */
66
60
  runner: RunnerName;
@@ -98,8 +92,6 @@ declare class EnvServer extends RunnerManager {
98
92
  private _stopWatching;
99
93
  private _scheduleReload;
100
94
  }
101
- //#endregion
102
- //#region src/common/worker-utils.d.ts
103
95
  interface AppEntryIPCContext {
104
96
  sendMessage: (message: unknown) => void;
105
97
  }
@@ -116,5 +108,4 @@ interface AppEntry {
116
108
  plugins?: ServerOptions["plugins"];
117
109
  ipc?: AppEntryIPC;
118
110
  }
119
- //#endregion
120
111
  export { type AppEntry, type AppEntryIPC, type AppEntryIPCContext, BaseEnvRunner, DenoProcessEnvRunner, type EnvRunnerData as DenoProcessEnvRunnerData, type EnvRunnerData, type EnvRunner, EnvServer, type EnvServerOptions, type FetchHandler, type LoadRunnerOptions, MiniflareEnvRunner, type MiniflareEnvRunnerOptions, type MiniflareExportInfo, NetlifyEnvRunner, type NodeUpgradeContext, type RPCOptions, RunnerManager, type RunnerMessageListener, type RunnerName, type RunnerRPCHooks, type TransformResult, type UpgradeContext, type UpgradeHandler, VercelEnvRunner, type WorkerAddress, type WorkerHooks, loadRunner };
@@ -1,7 +1,5 @@
1
1
  import { u as WorkerHooks } from "../../_chunks/types.mjs";
2
2
  import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
3
-
4
- //#region src/runners/bun-process/runner.d.ts
5
3
  declare class BunProcessEnvRunner extends BaseEnvRunner {
6
4
  #private;
7
5
  constructor(opts: {
@@ -16,5 +14,4 @@ declare class BunProcessEnvRunner extends BaseEnvRunner {
16
14
  protected _runtimeType(): string;
17
15
  protected _closeRuntime(): Promise<void>;
18
16
  }
19
- //#endregion
20
17
  export { BunProcessEnvRunner, type EnvRunnerData as BunProcessEnvRunnerData };
@@ -4,7 +4,6 @@ import { execSync, spawn } from "node:child_process";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { join } from "node:path";
6
6
  import { homedir } from "node:os";
7
- //#region src/runners/bun-process/runner.ts
8
7
  let _defaultEntry;
9
8
  let _bunPath;
10
9
  const _isBun = typeof Bun !== "undefined";
@@ -126,5 +125,4 @@ var BunProcessEnvRunner = class extends BaseEnvRunner {
126
125
  this.#process = handle;
127
126
  }
128
127
  };
129
- //#endregion
130
128
  export { BunProcessEnvRunner };
@@ -1,7 +1,6 @@
1
1
  import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
2
2
  import { serve } from "srvx";
3
3
  import { plugin } from "crossws/server";
4
- //#region src/runners/bun-process/worker.ts
5
4
  const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
6
5
  let entry = await resolveEntry(data.entry);
7
6
  const sendMessage = (message) => process.send(message);
@@ -52,5 +51,4 @@ process.on("message", async (message) => {
52
51
  }
53
52
  entry.ipc?.onMessage?.(message);
54
53
  });
55
- //#endregion
56
54
  export {};
@@ -1,3 +1,3 @@
1
1
  import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
2
  import { t as DenoProcessEnvRunner } from "../../_chunks/runner.mjs";
3
- export { DenoProcessEnvRunner, EnvRunnerData as DenoProcessEnvRunnerData };
3
+ export { DenoProcessEnvRunner, type EnvRunnerData as DenoProcessEnvRunnerData };
@@ -1,7 +1,6 @@
1
1
  import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
2
2
  import { serve } from "srvx";
3
3
  import { plugin } from "crossws/server";
4
- //#region src/runners/deno-process/worker.ts
5
4
  const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
6
5
  let entry = await resolveEntry(data.entry);
7
6
  const _stdout = globalThis.Deno?.stdout ? { write: (s) => globalThis.Deno.stdout.writeSync(new TextEncoder().encode(s)) } : process.stdout;
@@ -75,5 +74,4 @@ async function handleMessage(message) {
75
74
  entry.ipc?.onMessage?.(message);
76
75
  }
77
76
  readMessages().catch(() => {});
78
- //#endregion
79
77
  export {};
@@ -1,3 +1,3 @@
1
1
  import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
2
  import { i as TransformResult, n as MiniflareEnvRunnerOptions, r as MiniflareExportInfo, t as MiniflareEnvRunner } from "../../_chunks/runner2.mjs";
3
- export { MiniflareEnvRunner, EnvRunnerData as MiniflareEnvRunnerData, MiniflareEnvRunnerOptions, MiniflareExportInfo, TransformResult };
3
+ export { MiniflareEnvRunner, type EnvRunnerData as MiniflareEnvRunnerData, MiniflareEnvRunnerOptions, MiniflareExportInfo, TransformResult };
@@ -1,3 +1,3 @@
1
1
  import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
2
  import { t as NetlifyEnvRunner } from "../../_chunks/runner5.mjs";
3
- export { EnvRunnerData, NetlifyEnvRunner };
3
+ export { type EnvRunnerData, NetlifyEnvRunner };
@@ -1,4 +1,3 @@
1
- //#region src/runners/netlify/worker.ts
2
1
  try {
3
2
  const { startRuntime } = await import("@netlify/runtime");
4
3
  startRuntime({
@@ -39,5 +38,4 @@ try {
39
38
  };
40
39
  }
41
40
  await import("../node-worker/worker.mjs");
42
- //#endregion
43
41
  export {};
@@ -1,7 +1,5 @@
1
1
  import { u as WorkerHooks } from "../../_chunks/types.mjs";
2
2
  import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
3
-
4
- //#region src/runners/node-process/runner.d.ts
5
3
  declare class NodeProcessEnvRunner extends BaseEnvRunner {
6
4
  #private;
7
5
  constructor(opts: {
@@ -16,5 +14,4 @@ declare class NodeProcessEnvRunner extends BaseEnvRunner {
16
14
  protected _runtimeType(): string;
17
15
  protected _closeRuntime(): Promise<void>;
18
16
  }
19
- //#endregion
20
17
  export { NodeProcessEnvRunner, type EnvRunnerData as ProcessEnvRunnerData };
@@ -2,7 +2,6 @@ import { t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
2
2
  import { existsSync } from "node:fs";
3
3
  import { fork } from "node:child_process";
4
4
  import { fileURLToPath } from "node:url";
5
- //#region src/runners/node-process/runner.ts
6
5
  let _defaultEntry;
7
6
  var NodeProcessEnvRunner = class extends BaseEnvRunner {
8
7
  #process;
@@ -63,5 +62,4 @@ var NodeProcessEnvRunner = class extends BaseEnvRunner {
63
62
  this.#process = child;
64
63
  }
65
64
  };
66
- //#endregion
67
65
  export { NodeProcessEnvRunner };
@@ -1,7 +1,6 @@
1
1
  import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
2
2
  import { serve } from "srvx";
3
3
  import { plugin } from "crossws/server/node";
4
- //#region src/runners/node-process/worker.ts
5
4
  const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
6
5
  let entry = await resolveEntry(data.entry);
7
6
  const sendMessage = (message) => process.send(message);
@@ -52,5 +51,4 @@ process.on("message", async (message) => {
52
51
  }
53
52
  entry.ipc?.onMessage?.(message);
54
53
  });
55
- //#endregion
56
54
  export {};
@@ -1,3 +1,3 @@
1
1
  import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
2
  import { t as NodeWorkerEnvRunner } from "../../_chunks/runner3.mjs";
3
- export { EnvRunnerData, NodeWorkerEnvRunner };
3
+ export { type EnvRunnerData, NodeWorkerEnvRunner };
@@ -2,7 +2,6 @@ import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } fr
2
2
  import { parentPort, workerData } from "node:worker_threads";
3
3
  import { serve } from "srvx";
4
4
  import { plugin } from "crossws/server/node";
5
- //#region src/runners/node-worker/worker.ts
6
5
  const data = workerData || {};
7
6
  let entry = await resolveEntry(data.entry);
8
7
  const sendMessage = (message) => parentPort?.postMessage(message);
@@ -53,5 +52,4 @@ parentPort?.on("message", async (message) => {
53
52
  }
54
53
  entry.ipc?.onMessage?.(message);
55
54
  });
56
- //#endregion
57
55
  export {};
@@ -1,9 +1,5 @@
1
1
  import { u as WorkerHooks } from "../../_chunks/types.mjs";
2
2
  import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
3
- import * as node_http0 from "node:http";
4
- import * as node_net0 from "node:net";
5
-
6
- //#region src/runners/self/runner.d.ts
7
3
  declare class SelfEnvRunner extends BaseEnvRunner {
8
4
  #private;
9
5
  constructor(opts: {
@@ -14,8 +10,8 @@ declare class SelfEnvRunner extends BaseEnvRunner {
14
10
  fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
15
11
  upgrade(context: {
16
12
  node: {
17
- req: node_http0.IncomingMessage;
18
- socket: node_net0.Socket;
13
+ req: import("node:http").IncomingMessage;
14
+ socket: import("node:net").Socket;
19
15
  head: any;
20
16
  };
21
17
  }): Promise<void>;
@@ -25,5 +21,4 @@ declare class SelfEnvRunner extends BaseEnvRunner {
25
21
  protected _runtimeType(): string;
26
22
  protected _closeRuntime(): Promise<void>;
27
23
  }
28
- //#endregion
29
24
  export { SelfEnvRunner, type EnvRunnerData as SelfEnvRunnerData };
@@ -1,6 +1,5 @@
1
1
  import { t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
2
2
  import { n as reloadEntryModule, r as resolveEntry } from "../../_chunks/worker-utils.mjs";
3
- //#region src/runners/self/runner.ts
4
3
  var SelfEnvRunner = class extends BaseEnvRunner {
5
4
  #active = false;
6
5
  #entry;
@@ -89,5 +88,4 @@ var SelfEnvRunner = class extends BaseEnvRunner {
89
88
  });
90
89
  }
91
90
  };
92
- //#endregion
93
91
  export { SelfEnvRunner };
@@ -0,0 +1,44 @@
1
+ import { MessageHandler, RetryHandler } from "@vercel/queue";
2
+ interface VercelQueueDevConsumer {
3
+ /** Topic name. Wildcard patterns (e.g. `"user-*"`) are supported. */
4
+ topic: string;
5
+ /** Function invoked with each delivered message. */
6
+ handler: MessageHandler;
7
+ /**
8
+ * Logical consumer identifier. Re-registering with the same group on the same
9
+ * topic replaces the previous handler (HMR-safe). Use distinct groups to fan
10
+ * a topic out to multiple coexisting handlers.
11
+ *
12
+ * @default "env-runner-vercel-dev"
13
+ */
14
+ consumerGroup?: string;
15
+ /**
16
+ * Lock duration for in-flight messages. Forwarded to the SDK's
17
+ * `coreHandleCallback`.
18
+ */
19
+ visibilityTimeoutSeconds?: number;
20
+ /**
21
+ * Convenience: rescheduled re-delivery delay applied when the handler throws.
22
+ * Equivalent to `retry: () => ({ afterSeconds })`. Ignored if `retry` is set.
23
+ */
24
+ retryAfterSeconds?: number;
25
+ /**
26
+ * Full retry handler. Receives the thrown error and message metadata; return
27
+ * `{ afterSeconds }` to reschedule, `{ acknowledge: true }` to drop, or
28
+ * `undefined` to let the error propagate.
29
+ */
30
+ retry?: RetryHandler;
31
+ }
32
+ /**
33
+ * Bind a handler to a topic. Resolves to an unregister function.
34
+ *
35
+ * The first call across the worker process lazily loads `@vercel/queue` and
36
+ * constructs a shared `QueueClient`. Re-registering with the same topic
37
+ * replaces the handler (HMR-safe; the SDK keys consumers by `consumerGroup`,
38
+ * so calling unregister on a replaced registration is a no-op).
39
+ *
40
+ * If `@vercel/queue` is not installed or does not expose `registerDevConsumer`,
41
+ * resolves to a no-op unregister and logs a one-time warning.
42
+ */
43
+ declare function registerVercelQueueConsumer(consumer: VercelQueueDevConsumer): Promise<() => void>;
44
+ export { VercelQueueDevConsumer, registerVercelQueueConsumer };
@@ -0,0 +1,36 @@
1
+ const DEFAULT_CONSUMER_GROUP = "env-runner-vercel-dev";
2
+ let sdkPromise;
3
+ let client;
4
+ const noop = () => {};
5
+ async function registerVercelQueueConsumer(consumer) {
6
+ const sdk = await ensureSdk();
7
+ if (!sdk || !client) return noop;
8
+ return sdk.registerDevConsumer({
9
+ topic: consumer.topic,
10
+ client,
11
+ handler: consumer.handler,
12
+ consumerGroup: consumer.consumerGroup ?? DEFAULT_CONSUMER_GROUP,
13
+ visibilityTimeoutSeconds: consumer.visibilityTimeoutSeconds,
14
+ retry: consumer.retry ?? (consumer.retryAfterSeconds === void 0 ? void 0 : () => ({ afterSeconds: consumer.retryAfterSeconds }))
15
+ });
16
+ }
17
+ function ensureSdk() {
18
+ if (sdkPromise) return sdkPromise;
19
+ sdkPromise = (async () => {
20
+ let mod;
21
+ try {
22
+ mod = await import("@vercel/queue");
23
+ } catch {
24
+ console.warn("[env-runner:vercel-queue] `@vercel/queue` is not installed. Local queue delivery is disabled.");
25
+ return null;
26
+ }
27
+ if (typeof mod.registerDevConsumer !== "function") {
28
+ console.warn("[env-runner:vercel-queue] Installed `@vercel/queue` does not export `registerDevConsumer`. Upgrade @vercel/queue@^0.2.0 to enable local queue delivery.");
29
+ return null;
30
+ }
31
+ client = new mod.QueueClient();
32
+ return mod;
33
+ })();
34
+ return sdkPromise;
35
+ }
36
+ export { registerVercelQueueConsumer };
@@ -1,3 +1,3 @@
1
1
  import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
2
  import { t as VercelEnvRunner } from "../../_chunks/runner4.mjs";
3
- export { EnvRunnerData, VercelEnvRunner };
3
+ export { type EnvRunnerData, VercelEnvRunner };
@@ -1,4 +1,6 @@
1
- //#region src/runners/vercel/worker.ts
1
+ process.env.VERCEL = process.env.VERCEL || "1";
2
+ process.env.VERCEL_ENV = process.env.VERCEL_ENV || "development";
3
+ process.env.NODE_ENV = process.env.NODE_ENV || "development";
2
4
  const SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
3
5
  const waitUntilPromises = /* @__PURE__ */ new Set();
4
6
  const cacheStore = /* @__PURE__ */ new Map();
@@ -46,5 +48,4 @@ globalThis[SYMBOL_FOR_REQ_CONTEXT] = { get: () => ({
46
48
  }
47
49
  }) };
48
50
  await import("../node-worker/worker.mjs");
49
- //#endregion
50
51
  export {};
package/dist/vite.d.mts CHANGED
@@ -1,6 +1,4 @@
1
1
  import { o as RunnerRPCHooks } from "./_chunks/types.mjs";
2
-
3
- //#region src/vite.d.ts
4
2
  /** Vite HotChannel-compatible interface (avoids hard dependency on vite types). */
5
3
  interface ViteHotChannel {
6
4
  send: (data: any) => void;
@@ -28,5 +26,4 @@ declare function createViteHotChannel(hooks: RunnerRPCHooks, envName: string): V
28
26
  * Filters messages by `envName` so multiple Vite environments can share one IPC channel.
29
27
  */
30
28
  declare function createViteTransport(sendMessage: (data: any) => void, onMessage: (listener: (value: any) => void) => void, envName: string): ViteTransport;
31
- //#endregion
32
29
  export { ViteHotChannel, ViteTransport, createViteHotChannel, createViteTransport };
package/dist/vite.mjs CHANGED
@@ -1,10 +1,3 @@
1
- //#region src/vite.ts
2
- /**
3
- * Create a Vite `HotChannel` from an env-runner's RPC hooks.
4
- *
5
- * Use on the **host side** to bridge env-runner IPC → Vite's DevEnvironment transport.
6
- * Messages are namespaced by `envName` so multiple Vite environments can share one runner.
7
- */
8
1
  function createViteHotChannel(hooks, envName) {
9
2
  const listeners = /* @__PURE__ */ new WeakMap();
10
3
  return {
@@ -33,12 +26,6 @@ function createViteHotChannel(hooks, envName) {
33
26
  }
34
27
  };
35
28
  }
36
- /**
37
- * Create a Vite `ModuleRunner` transport from worker-side IPC primitives.
38
- *
39
- * Use on the **worker side** to bridge worker IPC → Vite's `ModuleRunner` transport.
40
- * Filters messages by `envName` so multiple Vite environments can share one IPC channel.
41
- */
42
29
  function createViteTransport(sendMessage, onMessage, envName) {
43
30
  return {
44
31
  connect({ onMessage: onRunnerMessage }) {
@@ -54,5 +41,4 @@ function createViteTransport(sendMessage, onMessage, envName) {
54
41
  }
55
42
  };
56
43
  }
57
- //#endregion
58
44
  export { createViteHotChannel, createViteTransport };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "env-runner",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Generic environment runner for JavaScript runtimes.",
5
5
  "license": "MIT",
6
6
  "repository": "unjs/env-runner",
@@ -26,6 +26,7 @@
26
26
  "./runners/miniflare": "./dist/runners/miniflare/runner.mjs",
27
27
  "./runners/vercel": "./dist/runners/vercel/runner.mjs",
28
28
  "./runners/vercel/worker": "./dist/runners/vercel/worker.mjs",
29
+ "./runners/vercel/queue-dev": "./dist/runners/vercel/queue-dev.mjs",
29
30
  "./runners/netlify": "./dist/runners/netlify/runner.mjs",
30
31
  "./runners/netlify/worker": "./dist/runners/netlify/worker.mjs",
31
32
  "./vite": "./dist/vite.mjs"
@@ -42,30 +43,32 @@
42
43
  "typecheck": "tsgo --noEmit --skipLibCheck"
43
44
  },
44
45
  "dependencies": {
45
- "crossws": "^0.4.4",
46
+ "crossws": "^0.4.5",
46
47
  "exsolve": "^1.0.8",
47
- "httpxy": "^0.5.0",
48
- "srvx": "^0.11.13"
48
+ "httpxy": "^0.5.3",
49
+ "srvx": "^0.11.15"
49
50
  },
50
51
  "devDependencies": {
51
- "@netlify/runtime": "^4.1.20",
52
- "@types/node": "^25.5.0",
53
- "@typescript/native-preview": "^7.0.0-dev.20260327.2",
54
- "@vitest/coverage-v8": "^4.1.2",
52
+ "@netlify/runtime": "^4.1.24",
53
+ "@types/node": "^25.9.1",
54
+ "@typescript/native-preview": "7.0.0-dev.20260521.1",
55
+ "@vercel/queue": "^0.2.0",
56
+ "@vitest/coverage-v8": "^4.1.7",
55
57
  "automd": "^0.4.3",
56
58
  "changelogen": "^0.6.2",
57
59
  "cjs-module-lexer": "^2.2.0",
58
60
  "env-runner-fixture": "link:",
59
- "miniflare": "^4.20260317.3",
60
- "obuild": "^0.4.32",
61
- "oxfmt": "^0.42.0",
62
- "oxlint": "^1.57.0",
63
- "typescript": "^6.0.2",
64
- "vitest": "^4.1.2"
61
+ "miniflare": "^4.20260520.0",
62
+ "obuild": "^0.4.35",
63
+ "oxfmt": "^0.51.0",
64
+ "oxlint": "^1.66.0",
65
+ "typescript": "^6.0.3",
66
+ "vitest": "^4.1.7"
65
67
  },
66
68
  "peerDependencies": {
67
- "@netlify/runtime": "^4",
68
- "miniflare": "^4.20260317.3"
69
+ "@netlify/runtime": "^4.1.23",
70
+ "@vercel/queue": "^0.2.0",
71
+ "miniflare": "^4.20260515.0"
69
72
  },
70
73
  "peerDependenciesMeta": {
71
74
  "miniflare": {
@@ -73,7 +76,10 @@
73
76
  },
74
77
  "@netlify/runtime": {
75
78
  "optional": true
79
+ },
80
+ "@vercel/queue": {
81
+ "optional": true
76
82
  }
77
83
  },
78
- "packageManager": "pnpm@10.33.0"
84
+ "packageManager": "pnpm@11.2.2"
79
85
  }