• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import module from 'module';
2
3const GET_BUILTIN = `$__get_builtin_hole_${Date.now()}`;
4
5export function globalPreload() {
6  return `Object.defineProperty(globalThis, ${JSON.stringify(GET_BUILTIN)}, {
7  value: (builtinName) => {
8    return getBuiltin(builtinName);
9  },
10  enumerable: false,
11  configurable: false,
12});
13`;
14}
15
16export async function resolve(specifier, context, next) {
17  const def = await next(specifier, context);
18
19  if (def.url.startsWith('node:')) {
20    return {
21      shortCircuit: true,
22      url: `custom-${def.url}`,
23      importAssertions: context.importAssertions,
24    };
25  }
26  return def;
27}
28
29export function load(url, context, next) {
30  if (url.startsWith('custom-node:')) {
31    const urlObj = new URL(url);
32    return {
33      shortCircuit: true,
34      source: generateBuiltinModule(urlObj.pathname),
35      format: 'module',
36    };
37  }
38  return next(url);
39}
40
41function generateBuiltinModule(builtinName) {
42  const builtinInstance = module._load(builtinName);
43  const builtinExports = [
44    ...Object.keys(builtinInstance),
45  ];
46  return `\
47const $builtinInstance = ${GET_BUILTIN}(${JSON.stringify(builtinName)});
48
49export const __fromLoader = true;
50
51export default $builtinInstance;
52
53${
54  builtinExports
55    .map(name => `export const ${name} = $builtinInstance.${name};`)
56    .join('\n')
57}
58`;
59}
60