qinglong/shell/preload/esm-loader.mjs
2026-06-13 21:08:25 +08:00

42 lines
1.2 KiB
JavaScript

import { existsSync } from 'node:fs';
import { join } from 'node:path';
const builtinModules = [
'assert', 'buffer', 'child_process', 'cluster', 'crypto', 'dgram', 'dns',
'events', 'fs', 'http', 'https', 'net', 'os', 'path', 'process', 'querystring',
'readline', 'stream', 'string_decoder', 'timers', 'tls', 'tty', 'url', 'util',
'v8', 'zlib',
];
function isBareSpecifier(specifier) {
return !specifier.startsWith('.') &&
!specifier.startsWith('/') &&
!specifier.startsWith('file:') &&
!specifier.startsWith('node:') &&
!builtinModules.includes(specifier) &&
!builtinModules.includes(specifier.split('/')[0]);
}
export function resolve(specifier, context, nextResolve) {
if (!isBareSpecifier(specifier)) {
return nextResolve(specifier, context);
}
// 解析优先级:全局 pnpm > 系统全局
const bases = [
process.env.QL_NODE_GLOBAL_PATH,
'/usr/local/lib/node_modules',
].filter(Boolean);
for (const base of bases) {
if (existsSync(join(base, specifier))) {
return nextResolve(specifier, {
...context,
parentURL: new URL(`${join(base, specifier)}/`, 'file://').href,
});
}
}
return nextResolve(specifier, context);
}