diff --git a/index.js b/index.js index 8c106e7..92191b6 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,9 @@ -import process from "node:process"; - export const isBun = globalThis.Bun !== undefined; export const isDeno = globalThis.Deno !== undefined; -export const isNode = process.versions?.node !== undefined && !isBun && !isDeno; +export const isNode = + globalThis.process?.versions?.node !== undefined && !isBun && !isDeno; export const isEdgeLight = globalThis.EdgeRuntime === undefined diff --git a/regression.test.js b/regression.test.js new file mode 100644 index 0000000..78f3136 --- /dev/null +++ b/regression.test.js @@ -0,0 +1,46 @@ +import { execFile } from "node:child_process"; +import process from "node:process"; +import { promisify } from "node:util"; +import test from "ava"; + +const execute = promisify(execFile); + +test("loads the unmodified module in runtimes without Node built-ins", async (t) => { + const script = ` + import {readFile} from 'node:fs/promises'; + import {createContext, SourceTextModule} from 'node:vm'; + const source = await readFile(new URL(${JSON.stringify(new URL("./index.js", import.meta.url).href)}), 'utf8'); + const environments = [ + {window: {}, document: {}}, + {EdgeRuntime: 'edge-runtime'}, + {caches: {}, HTMLRewriter: class {}}, + {Bun: {}}, + {Deno: {}}, + {}, + {process: {versions: {node: '22.0.0'}}}, + ]; + const results = []; + for (const globals of environments) { + const module = new SourceTextModule(source, {context: createContext(globals)}); + await module.link((specifier) => {throw new Error('Unavailable built-in: ' + specifier);}); + await module.evaluate(); + results.push(module.namespace.default()); + } + console.log(JSON.stringify(results)); + `; + const { stdout } = await execute(process.execPath, [ + "--experimental-vm-modules", + "--input-type=module", + "--eval", + script, + ]); + t.deepEqual(JSON.parse(stdout), [ + "browser", + "edge-light", + "cloudflare-workers", + "bun", + "deno", + "unknown", + "node", + ]); +});