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