39 lines
1.0 KiB
JavaScript
39 lines
1.0 KiB
JavaScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import { pathToFileURL } from 'url';
|
|
import { createRequire } from 'module';
|
|
|
|
const ROOT = process.cwd();
|
|
const CANDIDATES = ['', 'lib', 'src', '.'];
|
|
const req = createRequire(import.meta.url);
|
|
|
|
export function resolveModule(name) {
|
|
for (const base of CANDIDATES) {
|
|
const p = path.join(ROOT, base, `${name}.js`);
|
|
if (fs.existsSync(p)) return p;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export async function safeImport(name) {
|
|
const p = resolveModule(name);
|
|
if (!p) return { ok:false, reason:`Module not found: ${name}` };
|
|
try {
|
|
const mod = await import(pathToFileURL(p).href);
|
|
return normalize(mod, p);
|
|
} catch (e1) {
|
|
try {
|
|
const mod = req(p);
|
|
return normalize(mod, p);
|
|
} catch (e2) {
|
|
return { ok:false, reason:`Failed to load ${name}: ${e1.message} | ${e2.message}` };
|
|
}
|
|
}
|
|
}
|
|
function normalize(mod, p) {
|
|
const m = mod?.default && typeof mod.default === 'object'
|
|
? { ...mod.default, ...mod }
|
|
: mod;
|
|
return { ok:true, mod:m, path:p };
|
|
}
|