feat: add ext/node for require support (#15362)

This commit adds "ext/node" extension that implementes CommonJS module system.

In the future this extension might be extended to actually contain implementation of
Node compatibility layer in favor of "deno_std/node".

Currently this functionality is not publicly exposed, it is available via "Deno[Deno.internal].require"
namespace and is meant to be used by other functionality to be landed soon.

This is a minimal first pass, things that still don't work:

support for dynamic imports in CJS
conditional exports
This commit is contained in:
Bartek Iwańczuk 2022-08-09 21:06:01 +02:00 committed by GitHub
parent af618e3b8f
commit 1f54d87789
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 1648 additions and 0 deletions

17
cli/tests/testdata/commonjs/init.js vendored Normal file
View file

@ -0,0 +1,17 @@
import { fromFileUrl } from "../../../../test_util/std/path/mod.ts";
const DENO_NODE_COMPAT_URL = Deno.env.get("DENO_NODE_COMPAT_URL");
const moduleAllUrl = `${DENO_NODE_COMPAT_URL}node/module_all.ts`;
const processUrl = `${DENO_NODE_COMPAT_URL}node/process.ts`;
let moduleName = import.meta.resolve(Deno.args[0]);
moduleName = fromFileUrl(moduleName);
const [moduleAll, processModule] = await Promise.all([
import(moduleAllUrl),
import(processUrl),
]);
Deno[Deno.internal].require.initializeCommonJs(
moduleAll.default,
processModule.default,
);
Deno[Deno.internal].require.Module._load(moduleName, null, true);