1import module from 'node:module';
2
3/** @type {string} */
4let GET_BUILTIN;
5export function initialize(data) {
6  GET_BUILTIN = data.GET_BUILTIN;
7}
8
9export async function resolve(specifier, context, next) {
10  const def = await next(specifier, context);
11
12  if (def.url.startsWith('node:')) {
13    return {
14      shortCircuit: true,
15      url: `custom-${def.url}`,
16      importAttributes: context.importAttributes,
17    };
18  }
19  return def;
20}
21
22export function load(url, context, next) {
23  if (url.startsWith('custom-node:')) {
24    const urlObj = new URL(url);
25    return {
26      shortCircuit: true,
27      source: generateBuiltinModule(urlObj.pathname),
28      format: 'module',
29    };
30  }
31  return next(url);
32}
33
34function generateBuiltinModule(builtinName) {
35  const builtinInstance = module._load(builtinName);
36  const builtinExports = [
37    ...Object.keys(builtinInstance),
38  ];
39  return `\
40const $builtinInstance = ${GET_BUILTIN}(${JSON.stringify(builtinName)});
41
42export const __fromLoader = true;
43
44export default $builtinInstance;
45
46${
47  builtinExports
48    .map(name => `export const ${name} = $builtinInstance.${name};`)
49    .join('\n')
50}
51`;
52}
53