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