diff --git a/CHANGELOG.md b/CHANGELOG.md index dc440d5b..321c505d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Thanks to: @dathbe. - [clock] Add CSS to prevent line breaking of sunset/sunrise time display (#3816) - [core] Enhance system information logging format and include additional env and RAM details (#3839, #3843) - [refactor] Add new file `js/module_functions.js` to move code used in several modules to one place (#3837) +- [refactor] Use global.root_path where possible (#3883) - [tests] refactor: simplify jest config file (#3844) - [tests] refactor: extract constants for weather electron tests (#3845) - [tests] refactor: add `setupDOMEnvironment` helper function to eliminate repetitive JSDOM setup code (#3860) diff --git a/js/app.js b/js/app.js index 5e7989aa..c0677c71 100644 --- a/js/app.js +++ b/js/app.js @@ -6,9 +6,13 @@ const path = require("node:path"); const envsub = require("envsub"); const Log = require("logger"); +// global absolute root path +global.root_path = path.resolve(`${__dirname}/../`); + const Server = require(`${__dirname}/server`); const Utils = require(`${__dirname}/utils`); -const defaultModules = require(`${__dirname}/../modules/default/defaultmodules`); + +const defaultModules = require(`${global.root_path}/modules/default/defaultmodules`); // used to control fetch timeout for node_helpers const { setGlobalDispatcher, Agent } = require("undici"); const { getEnvVarsAsObj } = require("#server_functions"); @@ -16,16 +20,13 @@ const { getEnvVarsAsObj } = require("#server_functions"); const fetch_timeout = process.env.mmFetchTimeout !== undefined ? process.env.mmFetchTimeout : 30000; // Get version number. -global.version = require(`${__dirname}/../package.json`).version; +global.version = require(`${global.root_path}/package.json`).version; global.mmTestMode = process.env.mmTestMode === "true"; Log.log(`Starting MagicMirror: v${global.version}`); // Log system information. Utils.logSystemInformation(global.version); -// global absolute root path -global.root_path = path.resolve(`${__dirname}/../`); - if (process.env.MM_CONFIG_FILE) { global.configuration_file = process.env.MM_CONFIG_FILE.replace(`${global.root_path}/`, ""); } @@ -180,10 +181,10 @@ function App () { const elements = module.split("/"); const moduleName = elements[elements.length - 1]; const env = getEnvVarsAsObj(); - let moduleFolder = path.resolve(`${__dirname}/../${env.modulesDir}`, module); + let moduleFolder = path.resolve(`${global.root_path}/${env.modulesDir}`, module); if (defaultModules.includes(moduleName)) { - const defaultModuleFolder = path.resolve(`${__dirname}/../modules/default/`, module); + const defaultModuleFolder = path.resolve(`${global.root_path}/modules/default/`, module); if (process.env.JEST_WORKER_ID === undefined) { moduleFolder = defaultModuleFolder; } else { diff --git a/js/check_config.js b/js/check_config.js index 628c3747..bd35b3e2 100644 --- a/js/check_config.js +++ b/js/check_config.js @@ -5,9 +5,8 @@ const Ajv = require("ajv"); const globals = require("globals"); const { Linter } = require("eslint"); -const rootPath = path.resolve(`${__dirname}/../`); -const Log = require(`${rootPath}/js/logger.js`); -const Utils = require(`${rootPath}/js/utils.js`); +const Log = require(`${global.root_path}/js/logger.js`); +const Utils = require(`${global.root_path}/js/utils.js`); const linter = new Linter({ configType: "flat" }); const ajv = new Ajv(); @@ -19,7 +18,7 @@ const ajv = new Ajv(); */ function getConfigFile () { // FIXME: This function should be in core. Do you want refactor me ;) ?, be good! - return path.resolve(process.env.MM_CONFIG_FILE || `${rootPath}/config/config.js`); + return path.resolve(process.env.MM_CONFIG_FILE || `${global.root_path}/config/config.js`); } /** diff --git a/js/utils.js b/js/utils.js index d20d6cf6..2e312218 100644 --- a/js/utils.js +++ b/js/utils.js @@ -1,7 +1,4 @@ -const path = require("node:path"); - -const rootPath = path.resolve(`${__dirname}/../`); -const Log = require(`${rootPath}/js/logger.js`); +const Log = require(`${global.root_path}/js/logger.js`); const os = require("node:os"); const fs = require("node:fs"); const si = require("systeminformation"); diff --git a/modules/default/calendar/calendarfetcherutils.js b/modules/default/calendar/calendarfetcherutils.js index 7a4f228b..729f121c 100644 --- a/modules/default/calendar/calendarfetcherutils.js +++ b/modules/default/calendar/calendarfetcherutils.js @@ -3,7 +3,7 @@ */ const moment = require("moment-timezone"); -const Log = require("../../../js/logger"); +const Log = require("logger"); const CalendarFetcherUtils = { diff --git a/modules/default/calendar/debug.js b/modules/default/calendar/debug.js index 2ab01e67..3acfc311 100644 --- a/modules/default/calendar/debug.js +++ b/modules/default/calendar/debug.js @@ -5,7 +5,7 @@ */ // Alias modules mentioned in package.js under _moduleAliases. require("module-alias/register"); -const Log = require("../../../js/logger"); +const Log = require("logger"); const CalendarFetcher = require("./calendarfetcher"); diff --git a/modules/default/updatenotification/git_helper.js b/modules/default/updatenotification/git_helper.js index 4fb8c189..52161ee9 100644 --- a/modules/default/updatenotification/git_helper.js +++ b/modules/default/updatenotification/git_helper.js @@ -4,8 +4,6 @@ const fs = require("node:fs"); const path = require("node:path"); const Log = require("logger"); -const BASE_DIR = path.normalize(`${__dirname}/../../../`); - class GitHelper { constructor () { this.gitRepos = []; @@ -35,10 +33,10 @@ class GitHelper { } async add (moduleName) { - let moduleFolder = BASE_DIR; + let moduleFolder = `${global.root_path}`; if (moduleName !== "MagicMirror") { - moduleFolder = `${moduleFolder}modules/${moduleName}`; + moduleFolder = `${moduleFolder}/modules/${moduleName}`; } try { diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js index 88264f7c..b5c5fbd1 100644 --- a/modules/default/updatenotification/node_helper.js +++ b/modules/default/updatenotification/node_helper.js @@ -1,7 +1,8 @@ const fs = require("node:fs"); const path = require("node:path"); const NodeHelper = require("node_helper"); -const defaultModules = require("../defaultmodules"); + +const defaultModules = require(`${global.root_path}/modules/default/defaultmodules`); const GitHelper = require("./git_helper"); const UpdateHelper = require("./update_helper"); @@ -21,7 +22,7 @@ module.exports = NodeHelper.create({ return modules; } else { // get modules from modules-directory - const moduleDir = path.normalize(`${__dirname}/../../`); + const moduleDir = path.normalize(`${global.root_path}/modules`); const getDirectories = (source) => { return fs.readdirSync(source, { withFileTypes: true }) .filter((dirent) => dirent.isDirectory() && dirent.name !== "default") diff --git a/tests/e2e/fonts_spec.js b/tests/e2e/fonts_spec.js index e09f745a..07ed1a5f 100644 --- a/tests/e2e/fonts_spec.js +++ b/tests/e2e/fonts_spec.js @@ -3,7 +3,7 @@ const helpers = require("./helpers/global-setup"); describe("All font files from roboto.css should be downloadable", () => { const fontFiles = []; // Statements below filters out all 'url' lines in the CSS file - const fileContent = require("node:fs").readFileSync(`${__dirname}/../../css/roboto.css`, "utf8"); + const fileContent = require("node:fs").readFileSync(`${global.root_path}/css/roboto.css`, "utf8"); const regex = /\burl\(['"]([^'"]+)['"]\)/g; let match = regex.exec(fileContent); while (match !== null) { diff --git a/tests/e2e/helpers/basic-auth.js b/tests/e2e/helpers/basic-auth.js index c10e0f3c..865a69ff 100644 --- a/tests/e2e/helpers/basic-auth.js +++ b/tests/e2e/helpers/basic-auth.js @@ -13,10 +13,9 @@ app.use(basicAuth); // Set available directories const directories = ["/tests/configs", "/tests/mocks"]; -const rootPath = path.resolve(`${__dirname}/../../../`); for (let directory of directories) { - app.use(directory, express.static(path.resolve(rootPath + directory))); + app.use(directory, express.static(path.resolve(`${global.root_path}/${directory}`))); } let server; diff --git a/tests/e2e/helpers/global-setup.js b/tests/e2e/helpers/global-setup.js index 17b2005a..67b597ea 100644 --- a/tests/e2e/helpers/global-setup.js +++ b/tests/e2e/helpers/global-setup.js @@ -1,9 +1,13 @@ +const path = require("node:path"); const os = require("node:os"); const fs = require("node:fs"); const jsdom = require("jsdom"); -const indexFile = `${__dirname}/../../../index.html`; -const cssFile = `${__dirname}/../../../css/custom.css`; +// global absolute root path +global.root_path = path.resolve(`${__dirname}/../../../`); + +const indexFile = `${global.root_path}/index.html`; +const cssFile = `${global.root_path}/css/custom.css`; const sampleCss = [ ".region.row3 {", " top: 0;", @@ -29,7 +33,7 @@ exports.startApplication = async (configFilename, exec) => { process.env.mmTestMode = "true"; process.setMaxListeners(0); if (exec) exec; - global.app = require("../../../js/app"); + global.app = require(`${global.root_path}/js/app`); return global.app.start(); }; diff --git a/tests/e2e/modules/newsfeed_spec.js b/tests/e2e/modules/newsfeed_spec.js index f93e3ca7..dc317c91 100644 --- a/tests/e2e/modules/newsfeed_spec.js +++ b/tests/e2e/modules/newsfeed_spec.js @@ -83,8 +83,7 @@ describe("Newsfeed module", () => { describe("Newsfeed module located in config directory", () => { beforeAll(() => { - const baseDir = `${__dirname}/../../..`; - fs.cpSync(`${baseDir}/modules/default/newsfeed`, `${baseDir}/config/newsfeed`, { recursive: true }); + fs.cpSync(`${global.root_path}/modules/default/newsfeed`, `${global.root_path}/config/newsfeed`, { recursive: true }); process.env.MM_MODULES_DIR = "config"; }); diff --git a/tests/e2e/serveronly_spec.js b/tests/e2e/serveronly_spec.js index 70db4aaa..b46a48da 100644 --- a/tests/e2e/serveronly_spec.js +++ b/tests/e2e/serveronly_spec.js @@ -6,7 +6,7 @@ describe("App environment", () => { let serverProcess; beforeAll(async () => { process.env.MM_CONFIG_FILE = "tests/configs/default.js"; - serverProcess = await require("node:child_process").spawn("npm", ["run", "server"], { env: process.env, detached: true }); + serverProcess = await require("node:child_process").spawn("node", ["--run", "server"], { env: process.env, detached: true }); // we have to wait until the server is started await delay(2000); }); diff --git a/tests/e2e/vendor_spec.js b/tests/e2e/vendor_spec.js index bd4407ed..5d669287 100644 --- a/tests/e2e/vendor_spec.js +++ b/tests/e2e/vendor_spec.js @@ -9,7 +9,7 @@ describe("Vendors", () => { }); describe("Get list vendors", () => { - const vendors = require(`${__dirname}/../../js/vendor.js`); + const vendors = require(`${global.root_path}/js/vendor.js`); Object.keys(vendors).forEach((vendor) => { it(`should return 200 HTTP code for vendor "${vendor}"`, async () => { diff --git a/tests/unit/global_vars/defaults_modules_spec.js b/tests/unit/global_vars/defaults_modules_spec.js index 7fcdf253..465e2232 100644 --- a/tests/unit/global_vars/defaults_modules_spec.js +++ b/tests/unit/global_vars/defaults_modules_spec.js @@ -4,7 +4,7 @@ const path = require("node:path"); const root_path = path.join(__dirname, "../../.."); describe("Default modules set in modules/default/defaultmodules.js", () => { - const expectedDefaultModules = require("../../../modules/default/defaultmodules"); + const expectedDefaultModules = require(`${root_path}/modules/default/defaultmodules`); for (const defaultModule of expectedDefaultModules) { it(`contains a folder for modules/default/${defaultModule}"`, () => { diff --git a/tests/unit/global_vars/root_path_spec.js b/tests/unit/global_vars/root_path_spec.js index 32bcc74b..dcba2bf5 100644 --- a/tests/unit/global_vars/root_path_spec.js +++ b/tests/unit/global_vars/root_path_spec.js @@ -2,7 +2,7 @@ const fs = require("node:fs"); const path = require("node:path"); const root_path = path.join(__dirname, "../../.."); -const version = require(`${__dirname}/../../../package.json`).version; +const version = require(`${root_path}/package.json`).version; describe("'global.root_path' set in js/app.js", () => { const expectedSubPaths = ["modules", "serveronly", "js", "js/app.js", "js/main.js", "js/electron.js", "config"];