diff --git a/js/app.js b/js/app.js index bd3f81d25f..c295687906 100644 --- a/js/app.js +++ b/js/app.js @@ -113,38 +113,30 @@ function App() { moduleFolder = `${__dirname}/../modules/default/${module}`; } - const helperPath = `${moduleFolder}/node_helper.js`; - - let loadHelper = true; - try { - fs.accessSync(helperPath, fs.R_OK); - } catch (e) { - loadHelper = false; - Log.log(`No helper found for module: ${moduleName}.`); - } - - if (loadHelper) { - const Module = require(helperPath); - let m = new Module(); - - if (m.requiresVersion) { - Log.log(`Check MagicMirror² version for node helper '${moduleName}' - Minimum version: ${m.requiresVersion} - Current version: ${global.version}`); - if (cmpVersions(global.version, m.requiresVersion) >= 0) { - Log.log("Version is ok!"); - } else { - Log.warn(`Version is incorrect. Skip module: '${moduleName}'`); - return; + resolveHelperLoader(moduleFolder) + .then(function (ModuleHelper) { + let m = new ModuleHelper(); + + if (m.requiresVersion) { + Log.log(`Check MagicMirror² version for node helper '${moduleName}' - Minimum version: ${m.requiresVersion} - Current version: ${global.version}`); + if (cmpVersions(global.version, m.requiresVersion) >= 0) { + Log.log("Version is ok!"); + } else { + Log.warn(`Version is incorrect. Skip module: '${moduleName}'`); + return; + } } - } - m.setName(moduleName); - m.setPath(path.resolve(moduleFolder)); - nodeHelpers.push(m); + m.setName(moduleName); + m.setPath(path.resolve(moduleFolder)); + nodeHelpers.push(m); - m.loaded(callback); - } else { - callback(); - } + m.loaded(callback); + }) + .catch(function (err) { + Log.log(`No helper found for module: ${moduleName}.`); + callback(); + }); } /** @@ -200,6 +192,42 @@ function App() { return segmentsA.length - segmentsB.length; } + /** + * Resolves a loader for the node_helper using either CommonJS or ESM depending on the file extension + * + * @param {string} moduleFolder the folder that should contain the node_helper + * @returns {Promise} a promise that contains the loaded module + */ + function resolveHelperLoader(moduleFolder) { + const loaders = { + js: commonJSHelperLoader, + mjs: ESMHelperLoader + }; + + for (const extension in loaders) { + const helperPath = `${moduleFolder}/node_helper.${extension}`; + + try { + fs.accessSync(helperPath, fs.R_OK); + + return loaders[extension](helperPath); + } catch (e) { + // The current extension may not have been found, try the next instead + } + } + + return Promise.reject(); + } + + async function commonJSHelperLoader(helperPath) { + return require(helperPath); + } + + async function ESMHelperLoader(helperPath) { + let module = await import(helperPath); + return module.default; + } + /** * Start the core app. *