refactor: use global.root_path instead relative paths (#3883)

This commit is contained in:
Karsten Hassel
2025-09-09 08:09:45 +02:00
committed by GitHub
parent 31bafc3297
commit b1865d8115
16 changed files with 34 additions and 35 deletions

View File

@@ -24,6 +24,7 @@ Thanks to: @dathbe.
- [clock] Add CSS to prevent line breaking of sunset/sunrise time display (#3816) - [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) - [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] 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: simplify jest config file (#3844)
- [tests] refactor: extract constants for weather electron tests (#3845) - [tests] refactor: extract constants for weather electron tests (#3845)
- [tests] refactor: add `setupDOMEnvironment` helper function to eliminate repetitive JSDOM setup code (#3860) - [tests] refactor: add `setupDOMEnvironment` helper function to eliminate repetitive JSDOM setup code (#3860)

View File

@@ -6,9 +6,13 @@ const path = require("node:path");
const envsub = require("envsub"); const envsub = require("envsub");
const Log = require("logger"); const Log = require("logger");
// global absolute root path
global.root_path = path.resolve(`${__dirname}/../`);
const Server = require(`${__dirname}/server`); const Server = require(`${__dirname}/server`);
const Utils = require(`${__dirname}/utils`); 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 // used to control fetch timeout for node_helpers
const { setGlobalDispatcher, Agent } = require("undici"); const { setGlobalDispatcher, Agent } = require("undici");
const { getEnvVarsAsObj } = require("#server_functions"); 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; const fetch_timeout = process.env.mmFetchTimeout !== undefined ? process.env.mmFetchTimeout : 30000;
// Get version number. // 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"; global.mmTestMode = process.env.mmTestMode === "true";
Log.log(`Starting MagicMirror: v${global.version}`); Log.log(`Starting MagicMirror: v${global.version}`);
// Log system information. // Log system information.
Utils.logSystemInformation(global.version); Utils.logSystemInformation(global.version);
// global absolute root path
global.root_path = path.resolve(`${__dirname}/../`);
if (process.env.MM_CONFIG_FILE) { if (process.env.MM_CONFIG_FILE) {
global.configuration_file = process.env.MM_CONFIG_FILE.replace(`${global.root_path}/`, ""); global.configuration_file = process.env.MM_CONFIG_FILE.replace(`${global.root_path}/`, "");
} }
@@ -180,10 +181,10 @@ function App () {
const elements = module.split("/"); const elements = module.split("/");
const moduleName = elements[elements.length - 1]; const moduleName = elements[elements.length - 1];
const env = getEnvVarsAsObj(); 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)) { 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) { if (process.env.JEST_WORKER_ID === undefined) {
moduleFolder = defaultModuleFolder; moduleFolder = defaultModuleFolder;
} else { } else {

View File

@@ -5,9 +5,8 @@ const Ajv = require("ajv");
const globals = require("globals"); const globals = require("globals");
const { Linter } = require("eslint"); const { Linter } = require("eslint");
const rootPath = path.resolve(`${__dirname}/../`); const Log = require(`${global.root_path}/js/logger.js`);
const Log = require(`${rootPath}/js/logger.js`); const Utils = require(`${global.root_path}/js/utils.js`);
const Utils = require(`${rootPath}/js/utils.js`);
const linter = new Linter({ configType: "flat" }); const linter = new Linter({ configType: "flat" });
const ajv = new Ajv(); const ajv = new Ajv();
@@ -19,7 +18,7 @@ const ajv = new Ajv();
*/ */
function getConfigFile () { function getConfigFile () {
// FIXME: This function should be in core. Do you want refactor me ;) ?, be good! // 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`);
} }
/** /**

View File

@@ -1,7 +1,4 @@
const path = require("node:path"); const Log = require(`${global.root_path}/js/logger.js`);
const rootPath = path.resolve(`${__dirname}/../`);
const Log = require(`${rootPath}/js/logger.js`);
const os = require("node:os"); const os = require("node:os");
const fs = require("node:fs"); const fs = require("node:fs");
const si = require("systeminformation"); const si = require("systeminformation");

View File

@@ -3,7 +3,7 @@
*/ */
const moment = require("moment-timezone"); const moment = require("moment-timezone");
const Log = require("../../../js/logger"); const Log = require("logger");
const CalendarFetcherUtils = { const CalendarFetcherUtils = {

View File

@@ -5,7 +5,7 @@
*/ */
// Alias modules mentioned in package.js under _moduleAliases. // Alias modules mentioned in package.js under _moduleAliases.
require("module-alias/register"); require("module-alias/register");
const Log = require("../../../js/logger"); const Log = require("logger");
const CalendarFetcher = require("./calendarfetcher"); const CalendarFetcher = require("./calendarfetcher");

View File

@@ -4,8 +4,6 @@ const fs = require("node:fs");
const path = require("node:path"); const path = require("node:path");
const Log = require("logger"); const Log = require("logger");
const BASE_DIR = path.normalize(`${__dirname}/../../../`);
class GitHelper { class GitHelper {
constructor () { constructor () {
this.gitRepos = []; this.gitRepos = [];
@@ -35,10 +33,10 @@ class GitHelper {
} }
async add (moduleName) { async add (moduleName) {
let moduleFolder = BASE_DIR; let moduleFolder = `${global.root_path}`;
if (moduleName !== "MagicMirror") { if (moduleName !== "MagicMirror") {
moduleFolder = `${moduleFolder}modules/${moduleName}`; moduleFolder = `${moduleFolder}/modules/${moduleName}`;
} }
try { try {

View File

@@ -1,7 +1,8 @@
const fs = require("node:fs"); const fs = require("node:fs");
const path = require("node:path"); const path = require("node:path");
const NodeHelper = require("node_helper"); const NodeHelper = require("node_helper");
const defaultModules = require("../defaultmodules");
const defaultModules = require(`${global.root_path}/modules/default/defaultmodules`);
const GitHelper = require("./git_helper"); const GitHelper = require("./git_helper");
const UpdateHelper = require("./update_helper"); const UpdateHelper = require("./update_helper");
@@ -21,7 +22,7 @@ module.exports = NodeHelper.create({
return modules; return modules;
} else { } else {
// get modules from modules-directory // get modules from modules-directory
const moduleDir = path.normalize(`${__dirname}/../../`); const moduleDir = path.normalize(`${global.root_path}/modules`);
const getDirectories = (source) => { const getDirectories = (source) => {
return fs.readdirSync(source, { withFileTypes: true }) return fs.readdirSync(source, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory() && dirent.name !== "default") .filter((dirent) => dirent.isDirectory() && dirent.name !== "default")

View File

@@ -3,7 +3,7 @@ const helpers = require("./helpers/global-setup");
describe("All font files from roboto.css should be downloadable", () => { describe("All font files from roboto.css should be downloadable", () => {
const fontFiles = []; const fontFiles = [];
// Statements below filters out all 'url' lines in the CSS file // 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; const regex = /\burl\(['"]([^'"]+)['"]\)/g;
let match = regex.exec(fileContent); let match = regex.exec(fileContent);
while (match !== null) { while (match !== null) {

View File

@@ -13,10 +13,9 @@ app.use(basicAuth);
// Set available directories // Set available directories
const directories = ["/tests/configs", "/tests/mocks"]; const directories = ["/tests/configs", "/tests/mocks"];
const rootPath = path.resolve(`${__dirname}/../../../`);
for (let directory of directories) { 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; let server;

View File

@@ -1,9 +1,13 @@
const path = require("node:path");
const os = require("node:os"); const os = require("node:os");
const fs = require("node:fs"); const fs = require("node:fs");
const jsdom = require("jsdom"); const jsdom = require("jsdom");
const indexFile = `${__dirname}/../../../index.html`; // global absolute root path
const cssFile = `${__dirname}/../../../css/custom.css`; global.root_path = path.resolve(`${__dirname}/../../../`);
const indexFile = `${global.root_path}/index.html`;
const cssFile = `${global.root_path}/css/custom.css`;
const sampleCss = [ const sampleCss = [
".region.row3 {", ".region.row3 {",
" top: 0;", " top: 0;",
@@ -29,7 +33,7 @@ exports.startApplication = async (configFilename, exec) => {
process.env.mmTestMode = "true"; process.env.mmTestMode = "true";
process.setMaxListeners(0); process.setMaxListeners(0);
if (exec) exec; if (exec) exec;
global.app = require("../../../js/app"); global.app = require(`${global.root_path}/js/app`);
return global.app.start(); return global.app.start();
}; };

View File

@@ -83,8 +83,7 @@ describe("Newsfeed module", () => {
describe("Newsfeed module located in config directory", () => { describe("Newsfeed module located in config directory", () => {
beforeAll(() => { beforeAll(() => {
const baseDir = `${__dirname}/../../..`; fs.cpSync(`${global.root_path}/modules/default/newsfeed`, `${global.root_path}/config/newsfeed`, { recursive: true });
fs.cpSync(`${baseDir}/modules/default/newsfeed`, `${baseDir}/config/newsfeed`, { recursive: true });
process.env.MM_MODULES_DIR = "config"; process.env.MM_MODULES_DIR = "config";
}); });

View File

@@ -6,7 +6,7 @@ describe("App environment", () => {
let serverProcess; let serverProcess;
beforeAll(async () => { beforeAll(async () => {
process.env.MM_CONFIG_FILE = "tests/configs/default.js"; 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 // we have to wait until the server is started
await delay(2000); await delay(2000);
}); });

View File

@@ -9,7 +9,7 @@ describe("Vendors", () => {
}); });
describe("Get list 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) => { Object.keys(vendors).forEach((vendor) => {
it(`should return 200 HTTP code for vendor "${vendor}"`, async () => { it(`should return 200 HTTP code for vendor "${vendor}"`, async () => {

View File

@@ -4,7 +4,7 @@ const path = require("node:path");
const root_path = path.join(__dirname, "../../.."); const root_path = path.join(__dirname, "../../..");
describe("Default modules set in modules/default/defaultmodules.js", () => { 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) { for (const defaultModule of expectedDefaultModules) {
it(`contains a folder for modules/default/${defaultModule}"`, () => { it(`contains a folder for modules/default/${defaultModule}"`, () => {

View File

@@ -2,7 +2,7 @@ const fs = require("node:fs");
const path = require("node:path"); const path = require("node:path");
const root_path = path.join(__dirname, "../../.."); 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", () => { describe("'global.root_path' set in js/app.js", () => {
const expectedSubPaths = ["modules", "serveronly", "js", "js/app.js", "js/main.js", "js/electron.js", "config"]; const expectedSubPaths = ["modules", "serveronly", "js", "js/app.js", "js/main.js", "js/electron.js", "config"];