diff --git a/.gitignore b/.gitignore
index ea15d0ba2d..027400d386 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,9 +54,8 @@ Temporary Items
.directory
.Trash-*
-# Ignore all modules except the default modules.
+# Ignore all modules
/modules/*
-!/modules/default
# Ignore changes to the custom css files but keep the sample and main.
/css/*
diff --git a/cspell.config.json b/cspell.config.json
index ec3afdc3f6..33ff5bcb04 100644
--- a/cspell.config.json
+++ b/cspell.config.json
@@ -343,11 +343,11 @@
"ignorePaths": [
"css/roboto.css",
"node_modules/**",
- "modules/!(default)/**",
- "modules/default/**/translations/!(en).json",
- "modules/default/calendar/windowsZones.json",
- "modules/default/clock/faces/*.svg",
- "modules/default/weather/providers/yr.js",
+ "modules/**",
+ "defaultmodules/**/translations/!(en).json",
+ "defaultmodules/calendar/windowsZones.json",
+ "defaultmodules/clock/faces/*.svg",
+ "defaultmodules/weather/providers/yr.js",
"tests/mocks/**",
"tests/e2e/modules/clock_es_spec.js",
"translations/**"
diff --git a/modules/default/alert/README.md b/defaultmodules/alert/README.md
similarity index 100%
rename from modules/default/alert/README.md
rename to defaultmodules/alert/README.md
diff --git a/modules/default/alert/alert.js b/defaultmodules/alert/alert.js
similarity index 100%
rename from modules/default/alert/alert.js
rename to defaultmodules/alert/alert.js
diff --git a/modules/default/alert/notificationFx.js b/defaultmodules/alert/notificationFx.js
similarity index 100%
rename from modules/default/alert/notificationFx.js
rename to defaultmodules/alert/notificationFx.js
diff --git a/modules/default/alert/styles/center.css b/defaultmodules/alert/styles/center.css
similarity index 100%
rename from modules/default/alert/styles/center.css
rename to defaultmodules/alert/styles/center.css
diff --git a/modules/default/alert/styles/left.css b/defaultmodules/alert/styles/left.css
similarity index 100%
rename from modules/default/alert/styles/left.css
rename to defaultmodules/alert/styles/left.css
diff --git a/modules/default/alert/styles/notificationFx.css b/defaultmodules/alert/styles/notificationFx.css
similarity index 100%
rename from modules/default/alert/styles/notificationFx.css
rename to defaultmodules/alert/styles/notificationFx.css
diff --git a/modules/default/alert/styles/right.css b/defaultmodules/alert/styles/right.css
similarity index 100%
rename from modules/default/alert/styles/right.css
rename to defaultmodules/alert/styles/right.css
diff --git a/modules/default/alert/templates/alert.njk b/defaultmodules/alert/templates/alert.njk
similarity index 100%
rename from modules/default/alert/templates/alert.njk
rename to defaultmodules/alert/templates/alert.njk
diff --git a/modules/default/alert/templates/notification.njk b/defaultmodules/alert/templates/notification.njk
similarity index 100%
rename from modules/default/alert/templates/notification.njk
rename to defaultmodules/alert/templates/notification.njk
diff --git a/modules/default/alert/translations/bg.json b/defaultmodules/alert/translations/bg.json
similarity index 100%
rename from modules/default/alert/translations/bg.json
rename to defaultmodules/alert/translations/bg.json
diff --git a/modules/default/alert/translations/da.json b/defaultmodules/alert/translations/da.json
similarity index 100%
rename from modules/default/alert/translations/da.json
rename to defaultmodules/alert/translations/da.json
diff --git a/modules/default/alert/translations/de.json b/defaultmodules/alert/translations/de.json
similarity index 100%
rename from modules/default/alert/translations/de.json
rename to defaultmodules/alert/translations/de.json
diff --git a/modules/default/alert/translations/el.json b/defaultmodules/alert/translations/el.json
similarity index 100%
rename from modules/default/alert/translations/el.json
rename to defaultmodules/alert/translations/el.json
diff --git a/modules/default/alert/translations/en.json b/defaultmodules/alert/translations/en.json
similarity index 100%
rename from modules/default/alert/translations/en.json
rename to defaultmodules/alert/translations/en.json
diff --git a/modules/default/alert/translations/eo.json b/defaultmodules/alert/translations/eo.json
similarity index 100%
rename from modules/default/alert/translations/eo.json
rename to defaultmodules/alert/translations/eo.json
diff --git a/modules/default/alert/translations/es.json b/defaultmodules/alert/translations/es.json
similarity index 100%
rename from modules/default/alert/translations/es.json
rename to defaultmodules/alert/translations/es.json
diff --git a/modules/default/alert/translations/fr.json b/defaultmodules/alert/translations/fr.json
similarity index 100%
rename from modules/default/alert/translations/fr.json
rename to defaultmodules/alert/translations/fr.json
diff --git a/modules/default/alert/translations/hu.json b/defaultmodules/alert/translations/hu.json
similarity index 100%
rename from modules/default/alert/translations/hu.json
rename to defaultmodules/alert/translations/hu.json
diff --git a/modules/default/alert/translations/nl.json b/defaultmodules/alert/translations/nl.json
similarity index 100%
rename from modules/default/alert/translations/nl.json
rename to defaultmodules/alert/translations/nl.json
diff --git a/modules/default/alert/translations/pt-br.json b/defaultmodules/alert/translations/pt-br.json
similarity index 100%
rename from modules/default/alert/translations/pt-br.json
rename to defaultmodules/alert/translations/pt-br.json
diff --git a/modules/default/alert/translations/pt.json b/defaultmodules/alert/translations/pt.json
similarity index 100%
rename from modules/default/alert/translations/pt.json
rename to defaultmodules/alert/translations/pt.json
diff --git a/modules/default/alert/translations/ru.json b/defaultmodules/alert/translations/ru.json
similarity index 100%
rename from modules/default/alert/translations/ru.json
rename to defaultmodules/alert/translations/ru.json
diff --git a/modules/default/alert/translations/th.json b/defaultmodules/alert/translations/th.json
similarity index 100%
rename from modules/default/alert/translations/th.json
rename to defaultmodules/alert/translations/th.json
diff --git a/modules/default/calendar/README.md b/defaultmodules/calendar/README.md
similarity index 100%
rename from modules/default/calendar/README.md
rename to defaultmodules/calendar/README.md
diff --git a/modules/default/calendar/calendar.css b/defaultmodules/calendar/calendar.css
similarity index 100%
rename from modules/default/calendar/calendar.css
rename to defaultmodules/calendar/calendar.css
diff --git a/modules/default/calendar/calendar.js b/defaultmodules/calendar/calendar.js
similarity index 100%
rename from modules/default/calendar/calendar.js
rename to defaultmodules/calendar/calendar.js
diff --git a/modules/default/calendar/calendarfetcher.js b/defaultmodules/calendar/calendarfetcher.js
similarity index 100%
rename from modules/default/calendar/calendarfetcher.js
rename to defaultmodules/calendar/calendarfetcher.js
diff --git a/modules/default/calendar/calendarfetcherutils.js b/defaultmodules/calendar/calendarfetcherutils.js
similarity index 100%
rename from modules/default/calendar/calendarfetcherutils.js
rename to defaultmodules/calendar/calendarfetcherutils.js
diff --git a/modules/default/calendar/calendarutils.js b/defaultmodules/calendar/calendarutils.js
similarity index 100%
rename from modules/default/calendar/calendarutils.js
rename to defaultmodules/calendar/calendarutils.js
diff --git a/modules/default/calendar/debug.js b/defaultmodules/calendar/debug.js
similarity index 96%
rename from modules/default/calendar/debug.js
rename to defaultmodules/calendar/debug.js
index 53a0d78046..87f2b788f2 100644
--- a/modules/default/calendar/debug.js
+++ b/defaultmodules/calendar/debug.js
@@ -4,7 +4,7 @@
* of starting the MagicMirror² core. Adjust the values below to your desire.
*/
// Load internal alias resolver
-require("../../../js/alias-resolver");
+require("../../js/alias-resolver");
const Log = require("logger");
const CalendarFetcher = require("./calendarfetcher");
diff --git a/modules/default/calendar/node_helper.js b/defaultmodules/calendar/node_helper.js
similarity index 100%
rename from modules/default/calendar/node_helper.js
rename to defaultmodules/calendar/node_helper.js
diff --git a/modules/default/calendar/windowsZones.json b/defaultmodules/calendar/windowsZones.json
similarity index 100%
rename from modules/default/calendar/windowsZones.json
rename to defaultmodules/calendar/windowsZones.json
diff --git a/modules/default/clock/README.md b/defaultmodules/clock/README.md
similarity index 100%
rename from modules/default/clock/README.md
rename to defaultmodules/clock/README.md
diff --git a/modules/default/clock/clock.js b/defaultmodules/clock/clock.js
similarity index 100%
rename from modules/default/clock/clock.js
rename to defaultmodules/clock/clock.js
diff --git a/modules/default/clock/clock_styles.css b/defaultmodules/clock/clock_styles.css
similarity index 100%
rename from modules/default/clock/clock_styles.css
rename to defaultmodules/clock/clock_styles.css
diff --git a/modules/default/clock/faces/face-001.svg b/defaultmodules/clock/faces/face-001.svg
similarity index 100%
rename from modules/default/clock/faces/face-001.svg
rename to defaultmodules/clock/faces/face-001.svg
diff --git a/modules/default/clock/faces/face-002.svg b/defaultmodules/clock/faces/face-002.svg
similarity index 100%
rename from modules/default/clock/faces/face-002.svg
rename to defaultmodules/clock/faces/face-002.svg
diff --git a/modules/default/clock/faces/face-003.svg b/defaultmodules/clock/faces/face-003.svg
similarity index 100%
rename from modules/default/clock/faces/face-003.svg
rename to defaultmodules/clock/faces/face-003.svg
diff --git a/modules/default/clock/faces/face-004.svg b/defaultmodules/clock/faces/face-004.svg
similarity index 100%
rename from modules/default/clock/faces/face-004.svg
rename to defaultmodules/clock/faces/face-004.svg
diff --git a/modules/default/clock/faces/face-005.svg b/defaultmodules/clock/faces/face-005.svg
similarity index 100%
rename from modules/default/clock/faces/face-005.svg
rename to defaultmodules/clock/faces/face-005.svg
diff --git a/modules/default/clock/faces/face-006.svg b/defaultmodules/clock/faces/face-006.svg
similarity index 100%
rename from modules/default/clock/faces/face-006.svg
rename to defaultmodules/clock/faces/face-006.svg
diff --git a/modules/default/clock/faces/face-007.svg b/defaultmodules/clock/faces/face-007.svg
similarity index 100%
rename from modules/default/clock/faces/face-007.svg
rename to defaultmodules/clock/faces/face-007.svg
diff --git a/modules/default/clock/faces/face-008.svg b/defaultmodules/clock/faces/face-008.svg
similarity index 100%
rename from modules/default/clock/faces/face-008.svg
rename to defaultmodules/clock/faces/face-008.svg
diff --git a/modules/default/clock/faces/face-009.svg b/defaultmodules/clock/faces/face-009.svg
similarity index 100%
rename from modules/default/clock/faces/face-009.svg
rename to defaultmodules/clock/faces/face-009.svg
diff --git a/modules/default/clock/faces/face-010.svg b/defaultmodules/clock/faces/face-010.svg
similarity index 100%
rename from modules/default/clock/faces/face-010.svg
rename to defaultmodules/clock/faces/face-010.svg
diff --git a/modules/default/clock/faces/face-011.svg b/defaultmodules/clock/faces/face-011.svg
similarity index 100%
rename from modules/default/clock/faces/face-011.svg
rename to defaultmodules/clock/faces/face-011.svg
diff --git a/modules/default/clock/faces/face-012.svg b/defaultmodules/clock/faces/face-012.svg
similarity index 100%
rename from modules/default/clock/faces/face-012.svg
rename to defaultmodules/clock/faces/face-012.svg
diff --git a/modules/default/compliments/README.md b/defaultmodules/compliments/README.md
similarity index 100%
rename from modules/default/compliments/README.md
rename to defaultmodules/compliments/README.md
diff --git a/modules/default/compliments/compliments.js b/defaultmodules/compliments/compliments.js
similarity index 100%
rename from modules/default/compliments/compliments.js
rename to defaultmodules/compliments/compliments.js
diff --git a/modules/default/defaultmodules.js b/defaultmodules/defaultmodules.js
similarity index 100%
rename from modules/default/defaultmodules.js
rename to defaultmodules/defaultmodules.js
diff --git a/modules/default/helloworld/README.md b/defaultmodules/helloworld/README.md
similarity index 100%
rename from modules/default/helloworld/README.md
rename to defaultmodules/helloworld/README.md
diff --git a/modules/default/helloworld/helloworld.js b/defaultmodules/helloworld/helloworld.js
similarity index 100%
rename from modules/default/helloworld/helloworld.js
rename to defaultmodules/helloworld/helloworld.js
diff --git a/modules/default/helloworld/helloworld.njk b/defaultmodules/helloworld/helloworld.njk
similarity index 100%
rename from modules/default/helloworld/helloworld.njk
rename to defaultmodules/helloworld/helloworld.njk
diff --git a/modules/default/newsfeed/README.md b/defaultmodules/newsfeed/README.md
similarity index 100%
rename from modules/default/newsfeed/README.md
rename to defaultmodules/newsfeed/README.md
diff --git a/modules/default/newsfeed/fullarticle.njk b/defaultmodules/newsfeed/fullarticle.njk
similarity index 100%
rename from modules/default/newsfeed/fullarticle.njk
rename to defaultmodules/newsfeed/fullarticle.njk
diff --git a/modules/default/newsfeed/newsfeed.css b/defaultmodules/newsfeed/newsfeed.css
similarity index 100%
rename from modules/default/newsfeed/newsfeed.css
rename to defaultmodules/newsfeed/newsfeed.css
diff --git a/modules/default/newsfeed/newsfeed.js b/defaultmodules/newsfeed/newsfeed.js
similarity index 100%
rename from modules/default/newsfeed/newsfeed.js
rename to defaultmodules/newsfeed/newsfeed.js
diff --git a/modules/default/newsfeed/newsfeed.njk b/defaultmodules/newsfeed/newsfeed.njk
similarity index 100%
rename from modules/default/newsfeed/newsfeed.njk
rename to defaultmodules/newsfeed/newsfeed.njk
diff --git a/modules/default/newsfeed/newsfeedfetcher.js b/defaultmodules/newsfeed/newsfeedfetcher.js
similarity index 100%
rename from modules/default/newsfeed/newsfeedfetcher.js
rename to defaultmodules/newsfeed/newsfeedfetcher.js
diff --git a/modules/default/newsfeed/node_helper.js b/defaultmodules/newsfeed/node_helper.js
similarity index 100%
rename from modules/default/newsfeed/node_helper.js
rename to defaultmodules/newsfeed/node_helper.js
diff --git a/modules/default/newsfeed/oldconfig.njk b/defaultmodules/newsfeed/oldconfig.njk
similarity index 100%
rename from modules/default/newsfeed/oldconfig.njk
rename to defaultmodules/newsfeed/oldconfig.njk
diff --git a/modules/default/updatenotification/README.md b/defaultmodules/updatenotification/README.md
similarity index 100%
rename from modules/default/updatenotification/README.md
rename to defaultmodules/updatenotification/README.md
diff --git a/modules/default/updatenotification/git_helper.js b/defaultmodules/updatenotification/git_helper.js
similarity index 100%
rename from modules/default/updatenotification/git_helper.js
rename to defaultmodules/updatenotification/git_helper.js
diff --git a/modules/default/updatenotification/node_helper.js b/defaultmodules/updatenotification/node_helper.js
similarity index 96%
rename from modules/default/updatenotification/node_helper.js
rename to defaultmodules/updatenotification/node_helper.js
index b5c5fbd113..a80c09b800 100644
--- a/modules/default/updatenotification/node_helper.js
+++ b/defaultmodules/updatenotification/node_helper.js
@@ -2,7 +2,7 @@ const fs = require("node:fs");
const path = require("node:path");
const NodeHelper = require("node_helper");
-const defaultModules = require(`${global.root_path}/modules/default/defaultmodules`);
+const defaultModules = require(`${global.root_path}/${global.defaultModulesDir}/defaultmodules`);
const GitHelper = require("./git_helper");
const UpdateHelper = require("./update_helper");
diff --git a/modules/default/updatenotification/update_helper.js b/defaultmodules/updatenotification/update_helper.js
similarity index 100%
rename from modules/default/updatenotification/update_helper.js
rename to defaultmodules/updatenotification/update_helper.js
diff --git a/modules/default/updatenotification/updatenotification.css b/defaultmodules/updatenotification/updatenotification.css
similarity index 100%
rename from modules/default/updatenotification/updatenotification.css
rename to defaultmodules/updatenotification/updatenotification.css
diff --git a/modules/default/updatenotification/updatenotification.js b/defaultmodules/updatenotification/updatenotification.js
similarity index 100%
rename from modules/default/updatenotification/updatenotification.js
rename to defaultmodules/updatenotification/updatenotification.js
diff --git a/modules/default/updatenotification/updatenotification.njk b/defaultmodules/updatenotification/updatenotification.njk
similarity index 100%
rename from modules/default/updatenotification/updatenotification.njk
rename to defaultmodules/updatenotification/updatenotification.njk
diff --git a/modules/default/utils.js b/defaultmodules/utils.js
similarity index 100%
rename from modules/default/utils.js
rename to defaultmodules/utils.js
diff --git a/modules/default/weather/README.md b/defaultmodules/weather/README.md
similarity index 100%
rename from modules/default/weather/README.md
rename to defaultmodules/weather/README.md
diff --git a/modules/default/weather/current.njk b/defaultmodules/weather/current.njk
similarity index 100%
rename from modules/default/weather/current.njk
rename to defaultmodules/weather/current.njk
diff --git a/modules/default/weather/forecast.njk b/defaultmodules/weather/forecast.njk
similarity index 100%
rename from modules/default/weather/forecast.njk
rename to defaultmodules/weather/forecast.njk
diff --git a/modules/default/weather/hourly.njk b/defaultmodules/weather/hourly.njk
similarity index 100%
rename from modules/default/weather/hourly.njk
rename to defaultmodules/weather/hourly.njk
diff --git a/modules/default/weather/providers/README.md b/defaultmodules/weather/providers/README.md
similarity index 100%
rename from modules/default/weather/providers/README.md
rename to defaultmodules/weather/providers/README.md
diff --git a/modules/default/weather/providers/envcanada.js b/defaultmodules/weather/providers/envcanada.js
similarity index 100%
rename from modules/default/weather/providers/envcanada.js
rename to defaultmodules/weather/providers/envcanada.js
diff --git a/modules/default/weather/providers/openmeteo.js b/defaultmodules/weather/providers/openmeteo.js
similarity index 100%
rename from modules/default/weather/providers/openmeteo.js
rename to defaultmodules/weather/providers/openmeteo.js
diff --git a/modules/default/weather/providers/openweathermap.js b/defaultmodules/weather/providers/openweathermap.js
similarity index 100%
rename from modules/default/weather/providers/openweathermap.js
rename to defaultmodules/weather/providers/openweathermap.js
diff --git a/modules/default/weather/providers/overrideWrapper.js b/defaultmodules/weather/providers/overrideWrapper.js
similarity index 100%
rename from modules/default/weather/providers/overrideWrapper.js
rename to defaultmodules/weather/providers/overrideWrapper.js
diff --git a/modules/default/weather/providers/pirateweather.js b/defaultmodules/weather/providers/pirateweather.js
similarity index 100%
rename from modules/default/weather/providers/pirateweather.js
rename to defaultmodules/weather/providers/pirateweather.js
diff --git a/modules/default/weather/providers/smhi.js b/defaultmodules/weather/providers/smhi.js
similarity index 100%
rename from modules/default/weather/providers/smhi.js
rename to defaultmodules/weather/providers/smhi.js
diff --git a/modules/default/weather/providers/ukmetofficedatahub.js b/defaultmodules/weather/providers/ukmetofficedatahub.js
similarity index 100%
rename from modules/default/weather/providers/ukmetofficedatahub.js
rename to defaultmodules/weather/providers/ukmetofficedatahub.js
diff --git a/modules/default/weather/providers/weatherbit.js b/defaultmodules/weather/providers/weatherbit.js
similarity index 100%
rename from modules/default/weather/providers/weatherbit.js
rename to defaultmodules/weather/providers/weatherbit.js
diff --git a/modules/default/weather/providers/weatherflow.js b/defaultmodules/weather/providers/weatherflow.js
similarity index 100%
rename from modules/default/weather/providers/weatherflow.js
rename to defaultmodules/weather/providers/weatherflow.js
diff --git a/modules/default/weather/providers/weathergov.js b/defaultmodules/weather/providers/weathergov.js
similarity index 100%
rename from modules/default/weather/providers/weathergov.js
rename to defaultmodules/weather/providers/weathergov.js
diff --git a/modules/default/weather/providers/yr.js b/defaultmodules/weather/providers/yr.js
similarity index 100%
rename from modules/default/weather/providers/yr.js
rename to defaultmodules/weather/providers/yr.js
diff --git a/modules/default/weather/weather.css b/defaultmodules/weather/weather.css
similarity index 100%
rename from modules/default/weather/weather.css
rename to defaultmodules/weather/weather.css
diff --git a/modules/default/weather/weather.js b/defaultmodules/weather/weather.js
similarity index 100%
rename from modules/default/weather/weather.js
rename to defaultmodules/weather/weather.js
diff --git a/modules/default/weather/weatherobject.js b/defaultmodules/weather/weatherobject.js
similarity index 100%
rename from modules/default/weather/weatherobject.js
rename to defaultmodules/weather/weatherobject.js
diff --git a/modules/default/weather/weatherprovider.js b/defaultmodules/weather/weatherprovider.js
similarity index 100%
rename from modules/default/weather/weatherprovider.js
rename to defaultmodules/weather/weatherprovider.js
diff --git a/modules/default/weather/weatherutils.js b/defaultmodules/weather/weatherutils.js
similarity index 100%
rename from modules/default/weather/weatherutils.js
rename to defaultmodules/weather/weatherutils.js
diff --git a/eslint.config.mjs b/eslint.config.mjs
index b15ba037e0..d6cdcdc311 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -9,7 +9,7 @@ import stylistic from "@stylistic/eslint-plugin";
import vitest from "@vitest/eslint-plugin";
export default defineConfig([
- globalIgnores(["config/**", "modules/**/*", "!modules/default/**", "js/positions.js"]),
+ globalIgnores(["config/**", "modules/**/*", "js/positions.js"]),
{
files: ["**/*.js"],
languageOptions: {
diff --git a/index.html b/index.html
index e3fb8497a5..dcd354b776 100644
--- a/index.html
+++ b/index.html
@@ -46,8 +46,8 @@
-
-
+
+
diff --git a/jest.config.js b/jest.config.js
index ee51664fc9..bb4942cf4b 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -31,7 +31,7 @@ const config = {
collectCoverageFrom: [
"/clientonly/**/*.js",
"/js/**/*.js",
- "/modules/default/**/*.js",
+ "/defaultmodules/**/*.js",
"/serveronly/**/*.js"
],
coverageReporters: ["lcov", "text"],
diff --git a/js/app.js b/js/app.js
index 85baed381f..a67bf1b8cd 100644
--- a/js/app.js
+++ b/js/app.js
@@ -13,7 +13,6 @@ global.root_path = path.resolve(`${__dirname}/../`);
const Server = require(`${__dirname}/server`);
const Utils = require(`${__dirname}/utils`);
-const defaultModules = require(`${global.root_path}/modules/default/defaultmodules`);
// used to control fetch timeout for node_helpers
const { setGlobalDispatcher, Agent } = require("undici");
const { getEnvVarsAsObj, getConfigFilePath } = require("#server_functions");
@@ -57,6 +56,7 @@ process.on("uncaughtException", function (err) {
function App () {
let nodeHelpers = [];
let httpServer;
+ let defaultModules;
/**
* Loads the config file. Combines it with the defaults and returns the config
@@ -185,7 +185,7 @@ function App () {
let moduleFolder = path.resolve(`${global.root_path}/${env.modulesDir}`, module);
if (defaultModules.includes(moduleName)) {
- const defaultModuleFolder = path.resolve(`${global.root_path}/modules/default/`, module);
+ const defaultModuleFolder = path.resolve(`${global.root_path}/${global.defaultModulesDir}/`, module);
if (!global.mmTestMode) {
moduleFolder = defaultModuleFolder;
} else {
@@ -291,6 +291,9 @@ function App () {
this.start = async function () {
config = await loadConfig();
+ global.defaultModulesDir = config.defaultModulesDir;
+ defaultModules = require(`${global.root_path}/${global.defaultModulesDir}/defaultmodules`);
+
Log.setLogLevel(config.logLevel);
// get the used module positions
diff --git a/js/defaults.js b/js/defaults.js
index 469a172b37..88a706d7e4 100644
--- a/js/defaults.js
+++ b/js/defaults.js
@@ -20,6 +20,7 @@ const defaults = {
zoom: 1,
customCss: "css/custom.css",
foreignModulesDir: "modules",
+ defaultModulesDir: "defaultmodules",
// httpHeaders used by helmet, see https://helmetjs.github.io/. You can add other/more object values by overriding this in config.js,
// e.g. you need to add `frameguard: false` for embedding MagicMirror in another website, see https://github.com/MagicMirrorOrg/MagicMirror/issues/2847
httpHeaders: { contentSecurityPolicy: false, crossOriginOpenerPolicy: false, crossOriginEmbedderPolicy: false, crossOriginResourcePolicy: false, originAgentCluster: false },
diff --git a/js/loader.js b/js/loader.js
index b3cfd71910..dac0b5f56b 100644
--- a/js/loader.js
+++ b/js/loader.js
@@ -17,6 +17,7 @@ const Loader = (function () {
const getEnvVarsFromConfig = function () {
return {
modulesDir: config.foreignModulesDir || "modules",
+ defaultModulesDir: config.defaultModulesDir || "defaultmodules",
customCss: config.customCss || "css/custom.css"
};
};
@@ -103,7 +104,7 @@ const Loader = (function () {
let moduleFolder = `${envVars.modulesDir}/${module}`;
if (defaultModules.indexOf(moduleName) !== -1) {
- const defaultModuleFolder = `modules/default/${module}`;
+ const defaultModuleFolder = `${envVars.defaultModulesDir}/${module}`;
if (window.name !== "jsdom") {
moduleFolder = defaultModuleFolder;
} else {
diff --git a/js/server.js b/js/server.js
index 2caaad60f7..e96a6cc862 100644
--- a/js/server.js
+++ b/js/server.js
@@ -89,7 +89,7 @@ function Server (config) {
app.use(helmet(config.httpHeaders));
app.use("/js", express.static(__dirname));
- let directories = ["/config", "/css", "/favicon.svg", "/modules", "/node_modules/animate.css", "/node_modules/@fontsource", "/node_modules/@fortawesome", "/translations", "/tests/configs", "/tests/mocks"];
+ let directories = ["/config", "/css", "/favicon.svg", "/defaultmodules", "/modules", "/node_modules/animate.css", "/node_modules/@fontsource", "/node_modules/@fortawesome", "/translations", "/tests/configs", "/tests/mocks"];
for (const [key, value] of Object.entries(vendor)) {
const dirArr = value.split("/");
if (dirArr[0] === "node_modules") directories.push(`/${dirArr[0]}/${dirArr[1]}`);
diff --git a/js/server_functions.js b/js/server_functions.js
index a7eba8c358..aedf6fa43c 100644
--- a/js/server_functions.js
+++ b/js/server_functions.js
@@ -162,7 +162,7 @@ function getUserAgent () {
* @returns {object} environment variables key: values
*/
function getEnvVarsAsObj () {
- const obj = { modulesDir: `${config.foreignModulesDir}`, customCss: `${config.customCss}` };
+ const obj = { modulesDir: `${config.foreignModulesDir}`, defaultModulesDir: `${config.defaultModulesDir}`, customCss: `${config.customCss}` };
if (process.env.MM_MODULES_DIR) {
obj.modulesDir = process.env.MM_MODULES_DIR.replace(`${global.root_path}/`, "");
}
diff --git a/modules/.gitkeep b/modules/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/package.json b/package.json
index e2eaa69597..9af69d78f2 100644
--- a/package.json
+++ b/package.json
@@ -40,10 +40,10 @@
"main": "js/electron.js",
"scripts": {
"config:check": "node js/check_config.js",
- "postinstall": "git clean -df fonts vendor",
+ "postinstall": "git clean -df fonts vendor modules/default",
"install-mm": "npm install --no-audit --no-fund --no-update-notifier --only=prod --omit=dev",
"install-mm:dev": "npm install --no-audit --no-fund --no-update-notifier && npx playwright install chromium",
- "lint:css": "stylelint 'css/main.css' 'css/roboto.css' 'css/font-awesome.css' 'modules/default/**/*.css' --fix",
+ "lint:css": "stylelint 'css/main.css' 'css/roboto.css' 'css/font-awesome.css' 'defaultmodules/**/*.css' --fix",
"lint:js": "eslint --fix",
"lint:markdown": "markdownlint-cli2 . --fix",
"lint:prettier": "prettier . --write",
@@ -59,9 +59,9 @@
"start:x11": "DISPLAY=\"${DISPLAY:=:0}\" ./node_modules/.bin/electron js/electron.js",
"start:x11:dev": "node --run start:x11 -- dev",
"test": "vitest run",
- "test:calendar": "node ./modules/default/calendar/debug.js",
+ "test:calendar": "node ./defaultmodules/calendar/debug.js",
"test:coverage": "vitest run --coverage",
- "test:css": "stylelint 'css/main.css' 'css/roboto.css' 'css/font-awesome.css' 'modules/default/**/*.css'",
+ "test:css": "stylelint 'css/main.css' 'css/roboto.css' 'css/font-awesome.css' 'defaultmodules/**/*.css'",
"test:e2e": "vitest run tests/e2e",
"test:electron": "vitest run tests/electron",
"test:js": "eslint",
diff --git a/tests/e2e/modules/newsfeed_spec.js b/tests/e2e/modules/newsfeed_spec.js
index 4cee4a75b4..4a86d4af24 100644
--- a/tests/e2e/modules/newsfeed_spec.js
+++ b/tests/e2e/modules/newsfeed_spec.js
@@ -80,7 +80,7 @@ describe("Newsfeed module", () => {
describe("Newsfeed module located in config directory", () => {
beforeAll(() => {
- fs.cpSync(`${global.root_path}/modules/default/newsfeed`, `${global.root_path}/config/newsfeed`, { recursive: true });
+ fs.cpSync(`${global.root_path}/${global.defaultModulesDir}/newsfeed`, `${global.root_path}/config/newsfeed`, { recursive: true });
process.env.MM_MODULES_DIR = "config";
});
diff --git a/tests/unit/functions/updatenotification_spec.js b/tests/unit/functions/updatenotification_spec.js
index ebf7580b81..09b39b18cb 100644
--- a/tests/unit/functions/updatenotification_spec.js
+++ b/tests/unit/functions/updatenotification_spec.js
@@ -19,7 +19,8 @@ async function createGitHelper (fsStatSyncMockRef, loggerMockRef, execShellSpyRe
vi.doMock("logger", () => loggerMockRef.current);
- const gitHelperModule = await import("../../../modules/default/updatenotification/git_helper");
+ const defaults = await import("../../../js/defaults");
+ const gitHelperModule = await import(`../../../${defaults.defaultModulesDir}/updatenotification/git_helper`);
const GitHelper = gitHelperModule.default || gitHelperModule;
const instance = new GitHelper();
execShellSpyRef.current = vi.spyOn(instance, "execShell");
diff --git a/tests/unit/global_vars/defaults_modules_spec.js b/tests/unit/global_vars/defaults_modules_spec.js
index 465e2232d0..993dcb63ee 100644
--- a/tests/unit/global_vars/defaults_modules_spec.js
+++ b/tests/unit/global_vars/defaults_modules_spec.js
@@ -1,14 +1,15 @@
const fs = require("node:fs");
const path = require("node:path");
+const defaults = require("../../../js/defaults");
const root_path = path.join(__dirname, "../../..");
-describe("Default modules set in modules/default/defaultmodules.js", () => {
- const expectedDefaultModules = require(`${root_path}/modules/default/defaultmodules`);
+describe("Default modules set in defaultmodules/defaultmodules.js", () => {
+ const expectedDefaultModules = require(`${root_path}/${defaults.defaultModulesDir}/defaultmodules`);
for (const defaultModule of expectedDefaultModules) {
- it(`contains a folder for modules/default/${defaultModule}"`, () => {
- expect(fs.existsSync(path.join(root_path, "modules/default", defaultModule))).toBe(true);
+ it(`contains a folder for defaultmodules/${defaultModule}"`, () => {
+ expect(fs.existsSync(path.join(root_path, "defaultmodules", defaultModule))).toBe(true);
});
}
});
diff --git a/tests/unit/modules/default/calendar/calendar_fetcher_utils_bad_rrule.js b/tests/unit/modules/default/calendar/calendar_fetcher_utils_bad_rrule.js
index 4475c65c26..6b4a8dc651 100644
--- a/tests/unit/modules/default/calendar/calendar_fetcher_utils_bad_rrule.js
+++ b/tests/unit/modules/default/calendar/calendar_fetcher_utils_bad_rrule.js
@@ -1,6 +1,8 @@
global.moment = require("moment-timezone");
-const CalendarFetcherUtils = require("../../../../../modules/default/calendar/calendarfetcherutils");
+const defaults = require("../../../js/defaults");
+
+const CalendarFetcherUtils = require(`../../../../../${defaults.defaultModulesDir}/calendar/calendarfetcherutils`);
describe("Calendar fetcher utils test", () => {
const defaultConfig = {
diff --git a/tests/unit/modules/default/calendar/calendar_fetcher_utils_spec.js b/tests/unit/modules/default/calendar/calendar_fetcher_utils_spec.js
index 8f5ab5bc67..31a179a520 100644
--- a/tests/unit/modules/default/calendar/calendar_fetcher_utils_spec.js
+++ b/tests/unit/modules/default/calendar/calendar_fetcher_utils_spec.js
@@ -2,7 +2,9 @@ global.moment = require("moment-timezone");
const ical = require("node-ical");
const moment = require("moment-timezone");
-const CalendarFetcherUtils = require("../../../../../modules/default/calendar/calendarfetcherutils");
+const defaults = require("../../../../../js/defaults");
+
+const CalendarFetcherUtils = require(`../../../../../${defaults.defaultModulesDir}/calendar/calendarfetcherutils`);
describe("Calendar fetcher utils test", () => {
const defaultConfig = {
diff --git a/tests/unit/modules/default/calendar/calendar_utils_spec.js b/tests/unit/modules/default/calendar/calendar_utils_spec.js
index ff37299fe9..77d358ddfa 100644
--- a/tests/unit/modules/default/calendar/calendar_utils_spec.js
+++ b/tests/unit/modules/default/calendar/calendar_utils_spec.js
@@ -1,6 +1,8 @@
global.moment = require("moment");
-const CalendarUtils = require("../../../../../modules/default/calendar/calendarutils");
+const defaults = require("../../../../../js/defaults");
+
+const CalendarUtils = require(`../../../../../${defaults.defaultModulesDir}/calendar/calendarutils`);
describe("Calendar utils tests", () => {
describe("capFirst", () => {
diff --git a/tests/unit/modules/default/compliments/compliments_spec.js b/tests/unit/modules/default/compliments/compliments_spec.js
index 8d3aef3011..c1b76fcc09 100644
--- a/tests/unit/modules/default/compliments/compliments_spec.js
+++ b/tests/unit/modules/default/compliments/compliments_spec.js
@@ -16,12 +16,13 @@ describe("Compliments module", () => {
global.Cron = vi.fn();
// Load the module
- require("../../../../../modules/default/compliments/compliments");
+ const defaults = require("../../../../../js/defaults");
+ require(`../../../../../${defaults.defaultModulesDir}/compliments/compliments`);
// Setup module instance
complimentsModule.config = { ...complimentsModule.defaults };
complimentsModule.name = "compliments";
- complimentsModule.file = vi.fn((path) => `http://localhost:8080/modules/default/compliments/${path}`);
+ complimentsModule.file = vi.fn((path) => `http://localhost:8080/${defaults.defaultModulesDir}/compliments/${path}`);
});
afterEach(() => {
@@ -144,7 +145,7 @@ describe("Compliments module", () => {
await complimentsModule.loadComplimentFile();
const calledUrl = fetch.mock.calls[0][0];
- expect(calledUrl).toBe("http://localhost:8080/modules/default/compliments/compliments.json");
+ expect(calledUrl).toBe("http://localhost:8080/defaultmodules/compliments/compliments.json");
expect(calledUrl).not.toContain("dummy=");
});
});
diff --git a/tests/unit/modules/default/utils_spec.js b/tests/unit/modules/default/utils_spec.js
index 9677f3df20..4af7db6765 100644
--- a/tests/unit/modules/default/utils_spec.js
+++ b/tests/unit/modules/default/utils_spec.js
@@ -1,5 +1,7 @@
global.moment = require("moment-timezone");
-const { performWebRequest, formatTime } = require("../../../../modules/default/utils");
+const defaults = require("../../../../js/defaults");
+
+const { performWebRequest, formatTime } = require(`../../../../${defaults.defaultModulesDir}/utils`);
describe("Default modules utils tests", () => {
describe("performWebRequest", () => {
diff --git a/tests/unit/modules/default/weather/weather_object_spec.js b/tests/unit/modules/default/weather/weather_object_spec.js
index 2bc87d78e3..cef65bfe4e 100644
--- a/tests/unit/modules/default/weather/weather_object_spec.js
+++ b/tests/unit/modules/default/weather/weather_object_spec.js
@@ -1,4 +1,6 @@
-const WeatherObject = require("../../../../../modules/default/weather/weatherobject");
+const defaults = require("../../../../../js/defaults");
+
+const WeatherObject = require(`../../../../../${defaults.defaultModulesDir}/weather/weatherobject`);
global.moment = require("moment-timezone");
global.SunCalc = require("suncalc");
diff --git a/tests/unit/modules/default/weather/weather_utils_spec.js b/tests/unit/modules/default/weather/weather_utils_spec.js
index da3979cdb7..5f21121994 100644
--- a/tests/unit/modules/default/weather/weather_utils_spec.js
+++ b/tests/unit/modules/default/weather/weather_utils_spec.js
@@ -1,5 +1,7 @@
-const weather = require("../../../../../modules/default/weather/weatherutils");
-const WeatherUtils = require("../../../../../modules/default/weather/weatherutils");
+const defaults = require("../../../../../js/defaults");
+
+const weather = require(`../../../../../${defaults.defaultModulesDir}/weather/weatherutils`);
+const WeatherUtils = require(`../../../../../${defaults.defaultModulesDir}/weather/weatherutils`);
describe("Weather utils tests", () => {
describe("temperature conversion to imperial", () => {
diff --git a/vitest.config.mjs b/vitest.config.mjs
index 83d857ccf0..75808c82fc 100644
--- a/vitest.config.mjs
+++ b/vitest.config.mjs
@@ -45,7 +45,7 @@ export default defineConfig({
setupFiles: ["./tests/utils/vitest-setup.js"],
include: [
"tests/unit/**/*_spec.js",
- "tests/unit/modules/default/calendar/calendar_fetcher_utils_bad_rrule.js"
+ "tests/unit/defaultmodules/calendar/calendar_fetcher_utils_bad_rrule.js"
],
testTimeout: 20000,
hookTimeout: 10000
@@ -82,7 +82,7 @@ export default defineConfig({
include: [
"clientonly/**/*.js",
"js/**/*.js",
- "modules/default/**/*.js",
+ "defaultmodules/**/*.js",
"serveronly/**/*.js"
],
exclude: [