env-runner 0.1.9 → 0.1.11

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 (45) hide show
  1. package/README.md +130 -16
  2. package/dist/THIRD-PARTY-LICENSES.md +19 -0
  3. package/dist/_chunks/base-runner.d.mts +80 -3
  4. package/dist/_chunks/base-runner.mjs +108 -44
  5. package/dist/_chunks/libs/cjs-module-lexer.mjs +1 -1
  6. package/dist/_chunks/libs/es-module-lexer.mjs +83 -0
  7. package/dist/_chunks/runner.d.mts +3 -3
  8. package/dist/_chunks/runner.mjs +6 -3
  9. package/dist/_chunks/runner2.d.mts +15 -3
  10. package/dist/_chunks/runner2.mjs +145 -56
  11. package/dist/_chunks/runner3.d.mts +3 -3
  12. package/dist/_chunks/runner3.mjs +3 -3
  13. package/dist/_chunks/runner4.d.mts +4 -4
  14. package/dist/_chunks/runner4.mjs +3 -2
  15. package/dist/_chunks/runner5.d.mts +4 -4
  16. package/dist/_chunks/runner5.mjs +3 -2
  17. package/dist/_chunks/server.mjs +60 -17
  18. package/dist/_chunks/types.d.mts +15 -3
  19. package/dist/_chunks/virtual-loader.mjs +63 -0
  20. package/dist/_chunks/worker-utils.mjs +123 -9
  21. package/dist/cli.mjs +1 -1
  22. package/dist/index.d.mts +52 -14
  23. package/dist/index.mjs +6 -6
  24. package/dist/runners/bun-process/runner.d.mts +2 -2
  25. package/dist/runners/bun-process/runner.mjs +12 -2
  26. package/dist/runners/bun-process/worker.mjs +23 -3
  27. package/dist/runners/deno-process/runner.d.mts +2 -2
  28. package/dist/runners/deno-process/runner.mjs +1 -1
  29. package/dist/runners/deno-process/worker.mjs +22 -3
  30. package/dist/runners/miniflare/runner.d.mts +2 -2
  31. package/dist/runners/miniflare/runner.mjs +1 -1
  32. package/dist/runners/netlify/runner.d.mts +2 -2
  33. package/dist/runners/netlify/runner.mjs +1 -1
  34. package/dist/runners/node-process/runner.d.mts +2 -2
  35. package/dist/runners/node-process/runner.mjs +4 -2
  36. package/dist/runners/node-process/worker.mjs +23 -3
  37. package/dist/runners/node-worker/runner.d.mts +2 -2
  38. package/dist/runners/node-worker/runner.mjs +1 -1
  39. package/dist/runners/node-worker/worker.mjs +22 -3
  40. package/dist/runners/self/runner.d.mts +3 -2
  41. package/dist/runners/self/runner.mjs +6 -3
  42. package/dist/runners/vercel/runner.d.mts +2 -2
  43. package/dist/runners/vercel/runner.mjs +1 -1
  44. package/dist/vite.d.mts +1 -1
  45. package/package.json +12 -11
@@ -1,11 +1,25 @@
1
- import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
1
+ import { handleInvalidateModule, isVirtualSpecifier, parseServerAddress, registerVirtualModules, reloadEntryModule, resolveEntry } from "../../_chunks/worker-utils.mjs";
2
2
  import { serve } from "srvx";
3
3
  import { plugin } from "crossws/server";
4
4
  const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
5
- let entry = await resolveEntry(data.entry);
6
5
  const _stdout = globalThis.Deno?.stdout ? { write: (s) => globalThis.Deno.stdout.writeSync(new TextEncoder().encode(s)) } : process.stdout;
7
6
  const sendMessage = (message) => _stdout.write(JSON.stringify(message) + "\n");
8
7
  const _stdin = globalThis.Deno?.stdin?.readable || process.stdin;
8
+ const virtualEntry = isVirtualSpecifier(data.entry, data.virtual);
9
+ let unregisterVirtualModules;
10
+ let entry;
11
+ try {
12
+ unregisterVirtualModules = await registerVirtualModules(data.virtual);
13
+ entry = await resolveEntry(data.entry, virtualEntry);
14
+ } catch (error) {
15
+ const message = error?.message || String(error);
16
+ sendMessage({
17
+ event: "init-error",
18
+ error: message
19
+ });
20
+ console.error(`[env-runner] worker init failed: ${message}`);
21
+ process.exit(1);
22
+ }
9
23
  const server = serve({
10
24
  port: 0,
11
25
  hostname: "127.0.0.1",
@@ -48,13 +62,14 @@ async function readMessages() {
48
62
  async function handleMessage(message) {
49
63
  if (message?.event === "shutdown") {
50
64
  Promise.resolve(entry.ipc?.onClose?.()).then(() => server.close()).then(() => {
65
+ unregisterVirtualModules();
51
66
  sendMessage({ event: "exit" });
52
67
  });
53
68
  return;
54
69
  }
55
70
  if (message?.event === "reload-module") {
56
71
  try {
57
- entry = await reloadEntryModule(data.entry, entry, sendMessage);
72
+ entry = await reloadEntryModule(data.entry, entry, sendMessage, virtualEntry);
58
73
  sendMessage({ event: "module-reloaded" });
59
74
  } catch (error) {
60
75
  sendMessage({
@@ -64,6 +79,10 @@ async function handleMessage(message) {
64
79
  }
65
80
  return;
66
81
  }
82
+ if (message?.event === "invalidate-module") {
83
+ handleInvalidateModule(message, sendMessage);
84
+ return;
85
+ }
67
86
  if (message?.type === "ping") {
68
87
  sendMessage({
69
88
  type: "pong",
@@ -1,3 +1,3 @@
1
- import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
- import { i as TransformResult, n as MiniflareEnvRunnerOptions, r as MiniflareExportInfo, t as MiniflareEnvRunner } from "../../_chunks/runner2.mjs";
1
+ import { EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
+ import { MiniflareEnvRunner, MiniflareEnvRunnerOptions, MiniflareExportInfo, TransformResult } from "../../_chunks/runner2.mjs";
3
3
  export { MiniflareEnvRunner, type EnvRunnerData as MiniflareEnvRunnerData, MiniflareEnvRunnerOptions, MiniflareExportInfo, TransformResult };
@@ -1,2 +1,2 @@
1
- import { t as MiniflareEnvRunner } from "../../_chunks/runner2.mjs";
1
+ import { MiniflareEnvRunner } from "../../_chunks/runner2.mjs";
2
2
  export { MiniflareEnvRunner };
@@ -1,3 +1,3 @@
1
- import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
- import { t as NetlifyEnvRunner } from "../../_chunks/runner5.mjs";
1
+ import { EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
+ import { NetlifyEnvRunner } from "../../_chunks/runner5.mjs";
3
3
  export { type EnvRunnerData, NetlifyEnvRunner };
@@ -1,2 +1,2 @@
1
- import { t as NetlifyEnvRunner } from "../../_chunks/runner5.mjs";
1
+ import { NetlifyEnvRunner } from "../../_chunks/runner5.mjs";
2
2
  export { NetlifyEnvRunner };
@@ -1,5 +1,5 @@
1
- import { u as WorkerHooks } from "../../_chunks/types.mjs";
2
- import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
1
+ import { WorkerHooks } from "../../_chunks/types.mjs";
2
+ import { BaseEnvRunner, EnvRunnerData } from "../../_chunks/base-runner.mjs";
3
3
  declare class NodeProcessEnvRunner extends BaseEnvRunner {
4
4
  #private;
5
5
  constructor(opts: {
@@ -1,4 +1,4 @@
1
- import { t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
1
+ import { 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";
@@ -11,7 +11,7 @@ var NodeProcessEnvRunner = class extends BaseEnvRunner {
11
11
  ...opts,
12
12
  workerEntry: opts.workerEntry || _defaultEntry
13
13
  });
14
- this.#initProcess(opts.execArgv);
14
+ this._initWithVirtualData(() => this.#initProcess(opts.execArgv));
15
15
  }
16
16
  sendMessage(message) {
17
17
  if (!this.#process) throw new Error("Node env process should be initialized before sending messages.");
@@ -59,6 +59,8 @@ var NodeProcessEnvRunner = class extends BaseEnvRunner {
59
59
  child.on("message", (message) => {
60
60
  this._handleMessage(message);
61
61
  });
62
+ child.stdout?.pipe(process.stdout);
63
+ child.stderr?.pipe(process.stderr);
62
64
  this.#process = child;
63
65
  }
64
66
  };
@@ -1,9 +1,24 @@
1
- import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
1
+ import { handleInvalidateModule, isVirtualSpecifier, parseServerAddress, registerVirtualModules, reloadEntryModule, resolveEntry } from "../../_chunks/worker-utils.mjs";
2
2
  import { serve } from "srvx";
3
3
  import { plugin } from "crossws/server/node";
4
+ process.on("disconnect", () => process.exit(0));
4
5
  const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
5
- let entry = await resolveEntry(data.entry);
6
6
  const sendMessage = (message) => process.send(message);
7
+ const virtualEntry = isVirtualSpecifier(data.entry, data.virtual);
8
+ let unregisterVirtualModules;
9
+ let entry;
10
+ try {
11
+ unregisterVirtualModules = await registerVirtualModules(data.virtual);
12
+ entry = await resolveEntry(data.entry, virtualEntry);
13
+ } catch (error) {
14
+ const message = error?.message || String(error);
15
+ sendMessage({
16
+ event: "init-error",
17
+ error: message
18
+ });
19
+ console.error(`[env-runner] worker init failed: ${message}`);
20
+ process.exit(1);
21
+ }
7
22
  const server = serve({
8
23
  port: 0,
9
24
  hostname: "127.0.0.1",
@@ -26,13 +41,14 @@ process.send({ address: parseServerAddress(server) });
26
41
  process.on("message", async (message) => {
27
42
  if (message?.event === "shutdown") {
28
43
  Promise.resolve(entry.ipc?.onClose?.()).then(() => server.close()).then(() => {
44
+ unregisterVirtualModules();
29
45
  process.send({ event: "exit" });
30
46
  });
31
47
  return;
32
48
  }
33
49
  if (message?.event === "reload-module") {
34
50
  try {
35
- entry = await reloadEntryModule(data.entry, entry, sendMessage);
51
+ entry = await reloadEntryModule(data.entry, entry, sendMessage, virtualEntry);
36
52
  process.send({ event: "module-reloaded" });
37
53
  } catch (error) {
38
54
  process.send({
@@ -42,6 +58,10 @@ process.on("message", async (message) => {
42
58
  }
43
59
  return;
44
60
  }
61
+ if (message?.event === "invalidate-module") {
62
+ handleInvalidateModule(message, sendMessage);
63
+ return;
64
+ }
45
65
  if (message?.type === "ping") {
46
66
  process.send({
47
67
  type: "pong",
@@ -1,3 +1,3 @@
1
- import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
- import { t as NodeWorkerEnvRunner } from "../../_chunks/runner3.mjs";
1
+ import { EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
+ import { NodeWorkerEnvRunner } from "../../_chunks/runner3.mjs";
3
3
  export { type EnvRunnerData, NodeWorkerEnvRunner };
@@ -1,2 +1,2 @@
1
- import { t as NodeWorkerEnvRunner } from "../../_chunks/runner3.mjs";
1
+ import { NodeWorkerEnvRunner } from "../../_chunks/runner3.mjs";
2
2
  export { NodeWorkerEnvRunner };
@@ -1,10 +1,24 @@
1
- import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
1
+ import { handleInvalidateModule, isVirtualSpecifier, parseServerAddress, registerVirtualModules, reloadEntryModule, resolveEntry } from "../../_chunks/worker-utils.mjs";
2
2
  import { parentPort, workerData } from "node:worker_threads";
3
3
  import { serve } from "srvx";
4
4
  import { plugin } from "crossws/server/node";
5
5
  const data = workerData || {};
6
- let entry = await resolveEntry(data.entry);
7
6
  const sendMessage = (message) => parentPort?.postMessage(message);
7
+ const virtualEntry = isVirtualSpecifier(data.entry, data.virtual);
8
+ let unregisterVirtualModules;
9
+ let entry;
10
+ try {
11
+ unregisterVirtualModules = await registerVirtualModules(data.virtual);
12
+ entry = await resolveEntry(data.entry, virtualEntry);
13
+ } catch (error) {
14
+ const message = error?.message || String(error);
15
+ sendMessage({
16
+ event: "init-error",
17
+ error: message
18
+ });
19
+ console.error(`[env-runner] worker init failed: ${message}`);
20
+ process.exit(1);
21
+ }
8
22
  const server = serve({
9
23
  port: 0,
10
24
  hostname: "127.0.0.1",
@@ -27,13 +41,14 @@ parentPort?.postMessage({ address: parseServerAddress(server) });
27
41
  parentPort?.on("message", async (message) => {
28
42
  if (message?.event === "shutdown") {
29
43
  Promise.resolve(entry.ipc?.onClose?.()).then(() => server.close()).then(() => {
44
+ unregisterVirtualModules();
30
45
  parentPort?.postMessage({ event: "exit" });
31
46
  });
32
47
  return;
33
48
  }
34
49
  if (message?.event === "reload-module") {
35
50
  try {
36
- entry = await reloadEntryModule(data.entry, entry, sendMessage);
51
+ entry = await reloadEntryModule(data.entry, entry, sendMessage, virtualEntry);
37
52
  parentPort?.postMessage({ event: "module-reloaded" });
38
53
  } catch (error) {
39
54
  parentPort?.postMessage({
@@ -43,6 +58,10 @@ parentPort?.on("message", async (message) => {
43
58
  }
44
59
  return;
45
60
  }
61
+ if (message?.event === "invalidate-module") {
62
+ handleInvalidateModule(message, sendMessage);
63
+ return;
64
+ }
46
65
  if (message?.type === "ping") {
47
66
  parentPort?.postMessage({
48
67
  type: "pong",
@@ -1,5 +1,5 @@
1
- import { u as WorkerHooks } from "../../_chunks/types.mjs";
2
- import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
1
+ import { WorkerHooks } from "../../_chunks/types.mjs";
2
+ import { BaseEnvRunner, EnvRunnerData } from "../../_chunks/base-runner.mjs";
3
3
  declare class SelfEnvRunner extends BaseEnvRunner {
4
4
  #private;
5
5
  constructor(opts: {
@@ -16,6 +16,7 @@ declare class SelfEnvRunner extends BaseEnvRunner {
16
16
  };
17
17
  }): Promise<void>;
18
18
  sendMessage(message: unknown): void;
19
+ invalidateModule(specifier: string): Promise<void>;
19
20
  reloadModule(): Promise<void>;
20
21
  protected _hasRuntime(): boolean;
21
22
  protected _runtimeType(): string;
@@ -1,5 +1,5 @@
1
- import { t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
2
- import { n as reloadEntryModule, r as resolveEntry } from "../../_chunks/worker-utils.mjs";
1
+ import { BaseEnvRunner } from "../../_chunks/base-runner.mjs";
2
+ import { reloadEntryModule, resolveEntry } from "../../_chunks/worker-utils.mjs";
3
3
  var SelfEnvRunner = class extends BaseEnvRunner {
4
4
  #active = false;
5
5
  #entry;
@@ -13,7 +13,7 @@ var SelfEnvRunner = class extends BaseEnvRunner {
13
13
  }
14
14
  async fetch(input, init) {
15
15
  if (!this.#entry || this.closed) return new Response("self env runner is unavailable", { status: 503 });
16
- const request = input instanceof Request ? input : new Request(input, init);
16
+ const request = input instanceof Request ? input : new Request(this._resolveFetchInput(input), init);
17
17
  return this.#entry.fetch(request);
18
18
  }
19
19
  async upgrade(context) {
@@ -35,6 +35,9 @@ var SelfEnvRunner = class extends BaseEnvRunner {
35
35
  }
36
36
  this.#entry?.ipc?.onMessage?.(message);
37
37
  }
38
+ async invalidateModule(specifier) {
39
+ throw new Error(`Cannot invalidate "${specifier}": the self runner does not support virtual modules`);
40
+ }
38
41
  async reloadModule() {
39
42
  const entryPath = this._data?.entry;
40
43
  if (!entryPath || !this.#entry) throw new Error("Cannot reload: no entry loaded");
@@ -1,3 +1,3 @@
1
- import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
- import { t as VercelEnvRunner } from "../../_chunks/runner4.mjs";
1
+ import { EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
+ import { VercelEnvRunner } from "../../_chunks/runner4.mjs";
3
3
  export { type EnvRunnerData, VercelEnvRunner };
@@ -1,2 +1,2 @@
1
- import { t as VercelEnvRunner } from "../../_chunks/runner4.mjs";
1
+ import { VercelEnvRunner } from "../../_chunks/runner4.mjs";
2
2
  export { VercelEnvRunner };
package/dist/vite.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { o as RunnerRPCHooks } from "./_chunks/types.mjs";
1
+ import { RunnerRPCHooks } from "./_chunks/types.mjs";
2
2
  /** Vite HotChannel-compatible interface (avoids hard dependency on vite types). */
3
3
  interface ViteHotChannel {
4
4
  send: (data: any) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "env-runner",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Generic environment runner for JavaScript runtimes.",
5
5
  "license": "MIT",
6
6
  "repository": "unjs/env-runner",
@@ -46,24 +46,25 @@
46
46
  "crossws": "^0.4.5",
47
47
  "exsolve": "^1.0.8",
48
48
  "httpxy": "^0.5.3",
49
- "srvx": "^0.11.15"
49
+ "srvx": "^0.11.16"
50
50
  },
51
51
  "devDependencies": {
52
- "@netlify/runtime": "^4.1.24",
53
- "@types/node": "^25.9.1",
52
+ "@netlify/runtime": "^4.1.25",
53
+ "@types/node": "^25.9.2",
54
54
  "@typescript/native-preview": "7.0.0-dev.20260521.1",
55
- "@vercel/queue": "^0.2.0",
56
- "@vitest/coverage-v8": "^4.1.7",
55
+ "@vercel/queue": "^0.2.1",
56
+ "@vitest/coverage-v8": "^4.1.8",
57
57
  "automd": "^0.4.3",
58
58
  "changelogen": "^0.6.2",
59
59
  "cjs-module-lexer": "^2.2.0",
60
60
  "env-runner-fixture": "link:",
61
- "miniflare": "^4.20260520.0",
62
- "obuild": "^0.4.35",
61
+ "es-module-lexer": "^2.1.0",
62
+ "miniflare": "^4.20260603.0",
63
+ "obuild": "^0.4.36",
63
64
  "oxfmt": "^0.51.0",
64
- "oxlint": "^1.66.0",
65
+ "oxlint": "^1.69.0",
65
66
  "typescript": "^6.0.3",
66
- "vitest": "^4.1.7"
67
+ "vitest": "^4.1.8"
67
68
  },
68
69
  "peerDependencies": {
69
70
  "@netlify/runtime": "^4.1.23",
@@ -81,5 +82,5 @@
81
82
  "optional": true
82
83
  }
83
84
  },
84
- "packageManager": "pnpm@11.2.2"
85
+ "packageManager": "pnpm@11.5.2"
85
86
  }