Files

61 lines
1.6 KiB
JavaScript

const path = require('path');
const { pathToFileURL } = require('url');
async function loadScriptModule(scriptPath) {
const resolvedPath = path.resolve(String(scriptPath || ''));
if (!resolvedPath) {
throw new Error('scriptPath is required');
}
let requiredModule = null;
let requireError = null;
try {
requiredModule = require(resolvedPath);
} catch (error) {
requireError = error;
}
const imported = async () => {
const moduleURL = pathToFileURL(resolvedPath).href;
return await import(`${moduleURL}?t=${Date.now()}`);
};
if (requiredModule && typeof requiredModule.run === 'function') {
return requiredModule;
}
if (typeof requiredModule === 'function') {
return { run: requiredModule };
}
if (requiredModule && requiredModule.default && typeof requiredModule.default.run === 'function') {
return requiredModule.default;
}
try {
const importedModule = await imported();
if (importedModule && typeof importedModule.run === 'function') {
return importedModule;
}
if (importedModule && typeof importedModule.default === 'function') {
return { run: importedModule.default };
}
if (
importedModule &&
importedModule.default &&
typeof importedModule.default.run === 'function'
) {
return importedModule.default;
}
} catch (importError) {
if (requireError) {
throw requireError;
}
throw importError;
}
if (requireError) {
throw requireError;
}
throw new Error('script must export run()');
}
module.exports = { loadScriptModule };