seo-generator-server/tests/_helpers/path.js
2025-09-03 15:29:19 +08:00

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 };
}