mirror of
https://github.com/MichMich/MagicMirror.git
synced 2025-04-25 06:58:30 -04:00
## [2.25.0] - 2023-10-01 Thanks to: @bugsounet, @dgoth, @dependabot, @kenzal, @Knapoc, @KristjanESPERANTO, @martingron, @NolanKingdon, @Paranoid93, @TeddyStarinvest and @Ybbet. Special thanks to @khassel, @rejas and @sdetweil for taking over most (if not all) of the work on this release as project collaborators. This version would not be there without their effort. Thank you guys! You are awesome! > ⚠️ This release needs nodejs version >= `v18`, older releases have reached end of life and will not work! ### Added - Added UV Index support to OpenWeatherMap - Added 'hideDuplicates' flag to the calendar module - Added `allowOverrideNotification` to weather module to enable sending current weather objects with the `CURRENT_WEATHER_OVERRIDE` notification to supplement/replace the current weather displayed - Added optional AnimateCSS animate for `hide()`, `show()`, `updateDom()` - Added AnimateIn and animateOut in module config definition - Apply AnimateIn rules on the first start - Added automatic client page reload when server was restarted by setting `reloadAfterServerRestart: true` in `config.js`, per default `false` (#3105) - Added eventClass option for customEvents on the default calendar - Added AnimateCSS integration in tests suite (#3206) - Added npm dependabot [Reserved to developer] (#3210) - Added improved logging for calendar (#3110) ### Removed - **Breaking Change**: Removed `digest` authentication method from calendar module (which was already broken since release `2.15.0`) ### Updated - Update roboto fonts to version v5 - Update issue template - Update dev/dependencies incl. electron to v26 - Replace pretty-quick by lint-staged (<https://github.com/azz/pretty-quick/issues/164>) - Update engine node >=18. v16 reached it's end of life. (#3170) - Update typescript definition for modules - Cleaned up nunjuck templates - Replace `node-fetch` with internal fetch (#2649) and remove `digest-fetch` - Update the French translation according to the English file. - Update dependabot incl. vendor/fonts (monthly check) - Renew `package-lock.json` for release ### Fixed - Fix engine check on npm install (#3135) - Fix undefined formatTime method in clock module (#3143) - Fix clientonly startup fails after async added (#3151) - Fix electron width/heigth when using xrandr under bullseye - Fix time issue with certain recurring events in calendar module - Fix ipWhiteList test (#3179) - Fix newsfeed: Convert HTML entities, codes and tag in description (#3191) - Respect width/height (no fullscreen) if set in electronOptions (together with `fullscreen: false`) in `config.js` (#3174) - Fix: AnimateCSS merge hide() and show() animated css class when we do multiple call - Fix `Uncaught SyntaxError: Identifier 'getCorsUrl' has already been declared (at utils.js:1:1)` when using `clock` and `weather` module (#3204) - Fix overriding `config.js` when running tests (#3201) - Fix issue in weathergov provider with probability of precipitation not showing up on hourly or daily forecast --------- Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Karsten Hassel <hassel@gmx.de> Co-authored-by: Malte Hallström <46646495+SkySails@users.noreply.github.com> Co-authored-by: Veeck <github@veeck.de> Co-authored-by: veeck <michael@veeck.de> Co-authored-by: dWoolridge <dwoolridge@charter.net> Co-authored-by: Johan <jojjepersson@yahoo.se> Co-authored-by: Dario Mratovich <dario_mratovich@hotmail.com> Co-authored-by: Dario Mratovich <dario.mratovich@outlook.com> Co-authored-by: Magnus <34011212+MagMar94@users.noreply.github.com> Co-authored-by: Naveen <172697+naveensrinivasan@users.noreply.github.com> Co-authored-by: buxxi <buxxi@omfilm.net> Co-authored-by: Thomas Hirschberger <47733292+Tom-Hirschberger@users.noreply.github.com> Co-authored-by: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Co-authored-by: Andrés Vanegas Jiménez <142350+angeldeejay@users.noreply.github.com> Co-authored-by: Dave Child <dave@addedbytes.com> Co-authored-by: grenagit <46225780+grenagit@users.noreply.github.com> Co-authored-by: Grena <grena@grenabox.fr> Co-authored-by: Magnus Marthinsen <magmar@online.no> Co-authored-by: Patrick <psieg@users.noreply.github.com> Co-authored-by: Piotr Rajnisz <56397164+rajniszp@users.noreply.github.com> Co-authored-by: Suthep Yonphimai <tomzt@users.noreply.github.com> Co-authored-by: CarJem Generations (Carter Wallace) <cwallacecs@gmail.com> Co-authored-by: Nicholas Fogal <nfogal.misc@gmail.com> Co-authored-by: JakeBinney <126349119+JakeBinney@users.noreply.github.com> Co-authored-by: OWL4C <124401812+OWL4C@users.noreply.github.com> Co-authored-by: Oscar Björkman <17575446+oscarb@users.noreply.github.com> Co-authored-by: Ismar Slomic <ismar@slomic.no> Co-authored-by: Jørgen Veum-Wahlberg <jorgen.wahlberg@amedia.no> Co-authored-by: Eddie Hung <6740044+eddiehung@users.noreply.github.com> Co-authored-by: Bugsounet - Cédric <github@bugsounet.fr> Co-authored-by: bugsounet <bugsounet@bugsounet.fr> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Knapoc <Knapoc@users.noreply.github.com> Co-authored-by: sam detweiler <sdetweil@gmail.com> Co-authored-by: veeck <michael.veeck@nebenan.de> Co-authored-by: Paranoid93 <6515818+Paranoid93@users.noreply.github.com> Co-authored-by: NolanKingdon <27908974+NolanKingdon@users.noreply.github.com> Co-authored-by: J. Kenzal Hunter <kenzal.hunter@gmail.com> Co-authored-by: Teddy <teddy.payet@gmail.com> Co-authored-by: TeddyStarinvest <teddy.payet@starinvest.com> Co-authored-by: martingron <61826403+martingron@users.noreply.github.com> Co-authored-by: dgoth <132394363+dgoth@users.noreply.github.com>
197 lines
5.8 KiB
JavaScript
197 lines
5.8 KiB
JavaScript
"use strict";
|
|
|
|
const electron = require("electron");
|
|
const core = require("./app");
|
|
const Log = require("./logger");
|
|
|
|
// Config
|
|
let config = process.env.config ? JSON.parse(process.env.config) : {};
|
|
// Module to control application life.
|
|
const app = electron.app;
|
|
// If ELECTRON_DISABLE_GPU is set electron is started with --disable-gpu flag.
|
|
// See https://www.electronjs.org/docs/latest/tutorial/offscreen-rendering for more info.
|
|
if (process.env.ELECTRON_DISABLE_GPU !== undefined) {
|
|
app.disableHardwareAcceleration();
|
|
}
|
|
|
|
// Module to create native browser window.
|
|
const BrowserWindow = electron.BrowserWindow;
|
|
|
|
// Keep a global reference of the window object, if you don't, the window will
|
|
// be closed automatically when the JavaScript object is garbage collected.
|
|
let mainWindow;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
function createWindow() {
|
|
// see https://www.electronjs.org/docs/latest/api/screen
|
|
// Create a window that fills the screen's available work area.
|
|
let electronSize = (800, 600);
|
|
try {
|
|
electronSize = electron.screen.getPrimaryDisplay().workAreaSize;
|
|
} catch {
|
|
Log.warn("Could not get display size, using defaults ...");
|
|
}
|
|
|
|
let electronSwitchesDefaults = ["autoplay-policy", "no-user-gesture-required"];
|
|
app.commandLine.appendSwitch(...new Set(electronSwitchesDefaults, config.electronSwitches));
|
|
let electronOptionsDefaults = {
|
|
width: electronSize.width,
|
|
height: electronSize.height,
|
|
x: 0,
|
|
y: 0,
|
|
darkTheme: true,
|
|
webPreferences: {
|
|
contextIsolation: true,
|
|
nodeIntegration: false,
|
|
zoomFactor: config.zoom
|
|
},
|
|
backgroundColor: "#000000"
|
|
};
|
|
|
|
// DEPRECATED: "kioskmode" backwards compatibility, to be removed
|
|
// settings these options directly instead provides cleaner interface
|
|
if (config.kioskmode) {
|
|
electronOptionsDefaults.kiosk = true;
|
|
} else {
|
|
electronOptionsDefaults.show = false;
|
|
electronOptionsDefaults.frame = false;
|
|
electronOptionsDefaults.transparent = true;
|
|
electronOptionsDefaults.hasShadow = false;
|
|
electronOptionsDefaults.fullscreen = true;
|
|
}
|
|
|
|
const electronOptions = Object.assign({}, electronOptionsDefaults, config.electronOptions);
|
|
|
|
// Create the browser window.
|
|
mainWindow = new BrowserWindow(electronOptions);
|
|
|
|
// and load the index.html of the app.
|
|
// If config.address is not defined or is an empty string (listening on all interfaces), connect to localhost
|
|
|
|
let prefix;
|
|
if ((config["tls"] !== null && config["tls"]) || config.useHttps) {
|
|
prefix = "https://";
|
|
} else {
|
|
prefix = "http://";
|
|
}
|
|
|
|
let address = (config.address === void 0) | (config.address === "") ? (config.address = "localhost") : config.address;
|
|
mainWindow.loadURL(`${prefix}${address}:${config.port}`);
|
|
|
|
// Open the DevTools if run with "npm start dev"
|
|
if (process.argv.includes("dev")) {
|
|
if (process.env.JEST_WORKER_ID !== undefined) {
|
|
// if we are running with jest
|
|
const devtools = new BrowserWindow(electronOptions);
|
|
mainWindow.webContents.setDevToolsWebContents(devtools.webContents);
|
|
}
|
|
mainWindow.webContents.openDevTools();
|
|
}
|
|
|
|
// simulate mouse move to hide black cursor on start
|
|
mainWindow.webContents.on("dom-ready", (event) => {
|
|
mainWindow.webContents.sendInputEvent({ type: "mouseMove", x: 0, y: 0 });
|
|
});
|
|
|
|
// Set responders for window events.
|
|
mainWindow.on("closed", function () {
|
|
mainWindow = null;
|
|
});
|
|
|
|
if (config.kioskmode) {
|
|
mainWindow.on("blur", function () {
|
|
mainWindow.focus();
|
|
});
|
|
|
|
mainWindow.on("leave-full-screen", function () {
|
|
mainWindow.setFullScreen(true);
|
|
});
|
|
|
|
mainWindow.on("resize", function () {
|
|
setTimeout(function () {
|
|
mainWindow.reload();
|
|
}, 1000);
|
|
});
|
|
}
|
|
|
|
//remove response headers that prevent sites of being embedded into iframes if configured
|
|
mainWindow.webContents.session.webRequest.onHeadersReceived((details, callback) => {
|
|
let curHeaders = details.responseHeaders;
|
|
if (config["ignoreXOriginHeader"] || false) {
|
|
curHeaders = Object.fromEntries(Object.entries(curHeaders).filter((header) => !/x-frame-options/i.test(header[0])));
|
|
}
|
|
|
|
if (config["ignoreContentSecurityPolicy"] || false) {
|
|
curHeaders = Object.fromEntries(Object.entries(curHeaders).filter((header) => !/content-security-policy/i.test(header[0])));
|
|
}
|
|
|
|
callback({ responseHeaders: curHeaders });
|
|
});
|
|
|
|
mainWindow.once("ready-to-show", () => {
|
|
mainWindow.show();
|
|
});
|
|
}
|
|
|
|
// Quit when all windows are closed.
|
|
app.on("window-all-closed", function () {
|
|
if (process.env.JEST_WORKER_ID !== undefined) {
|
|
// if we are running with jest
|
|
app.quit();
|
|
} else {
|
|
createWindow();
|
|
}
|
|
});
|
|
|
|
app.on("activate", function () {
|
|
// On OS X it's common to re-create a window in the app when the
|
|
// dock icon is clicked and there are no other windows open.
|
|
if (mainWindow === null) {
|
|
createWindow();
|
|
}
|
|
});
|
|
|
|
/* This method will be called when SIGINT is received and will call
|
|
* each node_helper's stop function if it exists. Added to fix #1056
|
|
*
|
|
* Note: this is only used if running Electron. Otherwise
|
|
* core.stop() is called by process.on("SIGINT"... in `app.js`
|
|
*/
|
|
app.on("before-quit", async (event) => {
|
|
Log.log("Shutting down server...");
|
|
event.preventDefault();
|
|
setTimeout(() => {
|
|
process.exit(0);
|
|
}, 3000); // Force-quit after 3 seconds.
|
|
await core.stop();
|
|
process.exit(0);
|
|
});
|
|
|
|
/**
|
|
* Handle errors from self-signed certificates
|
|
*/
|
|
app.on("certificate-error", (event, webContents, url, error, certificate, callback) => {
|
|
event.preventDefault();
|
|
callback(true);
|
|
});
|
|
|
|
if (process.env.clientonly) {
|
|
app.whenReady().then(() => {
|
|
Log.log("Launching client viewer application.");
|
|
createWindow();
|
|
});
|
|
}
|
|
|
|
// Start the core application if server is run on localhost
|
|
// This starts all node helpers and starts the webserver.
|
|
if (["localhost", "127.0.0.1", "::1", "::ffff:127.0.0.1", undefined].includes(config.address)) {
|
|
core.start().then((c) => {
|
|
config = c;
|
|
app.whenReady().then(() => {
|
|
Log.log("Launching application.");
|
|
createWindow();
|
|
});
|
|
});
|
|
}
|