Commit Graph

492 Commits

Author SHA1 Message Date
Veeck
b542f33a0a Update deps, unpin parse5 (#3934)
seems we dont need the parse5 pin as long as jsdom is fixed to v27.0.0.

not sure if there is anything else we can do to the deps?

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: veeck <gitkraken@veeck.de>
2025-11-01 22:29:40 +01:00
Jboucly
961b3c96d6 feat(core): add server:watch script with automatic restart on file changes (#3920)
## Description

This PR adds a new `server:watch` script that runs MagicMirror² in
server-only mode with automatic restart and browser reload capabilities.

Particularly helpful for:
- **Developers** who need to see changes immediately without manual
restarts.
- **Users setting up their mirror** who make many changes to `config.js`
or `custom.css` and need quick feedback.

### What it does

When you run `npm run server:watch`, the watcher monitors files you
specify in `config.watchTargets`. Whenever a monitored file changes:

1. The server automatically restarts
2. Waits for the port to become available
3. Sends a reload notification to all connected browsers via Socket.io
4. Browsers automatically refresh to show the changes

This creates a seamless development experience where you can edit code,
save, and see the results within seconds.

### Implementation highlights

**Zero dependencies:** Uses only Node.js built-ins (`fs.watch`,
`child_process.spawn`, `net`, `http`) - no nodemon or external watchers
needed.

**Smart file watching:** Monitors parent directories instead of files
directly to handle atomic writes from modern editors (VSCode, etc.) that
create temporary files during save operations.

**Port management:** Waits for the old server instance to fully release
the port before starting a new one, preventing "port already in use"
errors.

### Configuration

Users explicitly define which files to monitor in their `config.js`:

```js
let config = {
  watchTargets: [
    "config/config.js",
    "css/custom.css",
    "modules/MMM-MyModule/MMM-MyModule.js",
    "modules/MMM-MyModule/node_helper.js"
  ],
  // ... rest of config
};
```

This explicit approach keeps the implementation simple (~260 lines)
while giving users full control over what triggers restarts. If
`watchTargets` is empty or undefined, the watcher starts but monitors
nothing, logging a clear warning message.

---

**Note:** This PR description has been updated to reflect the final
implementation. During the review process, we refined the approach
multiple times based on feedback.

---------

Co-authored-by: Jboucly <contact@jboucly.fr>
Co-authored-by: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com>
2025-10-28 19:14:51 +01:00
Veeck
f1c0c38c86 [core] Update deps and pin jsdom to v27.0.0 (#3925) 2025-10-20 19:12:42 +02:00
Kristjan ESPERANTO
64f78ea2f2 chore: update dependencies (#3921)
Normally, I wouldn't update the dependencies again so soon, but
`node-ical` underwent some major changes (see
https://github.com/jens-maus/node-ical/pull/404) with the last release,
and I'd like to use it here as early as possible to see if there are any
problems with it.
2025-10-19 23:58:59 +02:00
Kristjan ESPERANTO
37d1a3ae8f refactor: replace express-ipfilter with lightweight custom middleware (#3917)
This fixes security issue
[CVE-2023-42282](https://github.com/advisories/GHSA-78xj-cgh5-2h22),
which is not very likely to be exploitable in MagicMirror² setups, but
still should be fixed.

The [express-ipfilter](https://www.npmjs.com/package/express-ipfilter)
package depends on the obviously unmaintained
[ip](https://github.com/indutny/node-ip) package, which has known
security vulnerabilities. Since no fix is available, this commit
replaces both dependencies with a custom middleware using the better
maintained [ipaddr.js](https://www.npmjs.com/package/ipaddr.js) library.

Changes:
- Add new `js/ip_access_control.js` with lightweight middleware
- Remove `express-ipfilter` dependency, add `ipaddr.js`
- Update `js/server.js` to use new middleware
- In addition, I have formulated the descriptions of the corresponding
tests a little more clearly.
2025-10-18 19:56:55 +02:00
Karsten Hassel
9ff716f4ab update deps, exclude node v23 (#3916) 2025-10-16 23:47:06 +02:00
Veeck
b09a27a83b chore: bump dependencies into october (#3909) 2025-10-01 19:13:54 +02:00
Kristjan ESPERANTO
787cc6bd1f refactor: replace module-alias dependency with internal alias resolver (#3893)
- removes the external unmaintained `module-alias` dependency ->
reducing complexity and risk
- introduces a small internal alias mechanism for `logger` and
`node_helper`
- preserves backward compatibility for existing 3rd‑party modules
- should simplify a future ESM migration of MagicMirror

I'm confident that it shouldn't cause any problems, but we could also
consider including it in the release after next. What do you think?

This PR is inspired by PR #2934 - so thanks to @thesebas! 🙇 😃
2025-09-30 20:12:58 +02:00
Kristjan ESPERANTO
b1a189b238 Prepare 2.34.0-develop 2025-09-30 18:14:08 +02:00
Kristjan ESPERANTO
593a4b95d6 Prepare Release 2.33.0 (#3902) 2025-09-30 16:15:50 +02:00
Karsten Hassel
1f2d1b92b5 update jsdoc and other deps (#3896)
other cosmetic code changes because of new `eslint-plugin-jsdoc` version
v60
2025-09-23 06:27:29 +02:00
Kristjan ESPERANTO
777b49c566 chore: update dependencies (#3891)
Since receiving a security warning about `axios` in `node-ical`
(https://github.com/MagicMirrorOrg/MagicMirror/security/dependabot/70),
I've created [a pull request to remove `axios` from
`node-ical`](https://github.com/jens-maus/node-ical/pull/397) — it was
accepted and we now have a new version 🙂
2025-09-15 23:58:55 +02:00
Kristjan ESPERANTO
d81386f3d9 chore: use prettier --write --ignore-unknown in lint-staged to avoid errors on unsupported files (#3888)
This prevents `prettier` from failing when `lint-staged` passes
unknown/binary files, making the pre-commit hook more robust.

In concrete terms this could happen, when we, for example, add a new PNG
file. Since we rarely do this, it has not been noticed so far.

This is recommended when using asterisk:
https://github.com/lint-staged/lint-staged#automatically-fix-code-style-with-prettier-for-any-format-prettier-supports

## before

```bash
$ npx lint-staged <-- after staging a new PNG file
✔ Backed up original state in git stash (c3247d4b)
✔ Hiding unstaged changes to partially staged files...
⚠ Running tasks for staged files...
  ❯ package.json — 2 files
    ❯ * — 2 files
      ✖ prettier --write [FAILED]
    ↓ *.js — no files
    ↓ *.css — no files
↓ Skipped because of errors from tasks.
↓ Skipped because of errors from tasks.
✔ Reverting to original state because of errors...
✔ Cleaning up temporary files...

✖ prettier --write:
[error] No parser could be inferred for file "~/MagicMirror/test.png".
...
```

## after

```bash
$ npx lint-staged <-- after staging a new PNG file
✔ Backed up original state in git stash (0c3fe285)
✔ Running tasks for staged files...
✔ Applying modifications from tasks...
✔ Cleaning up temporary files...
```
2025-09-11 18:34:08 +02:00
Veeck
08d29c3083 Add Prettier plugin for Nunjuck templates (#3887) 2025-09-11 13:10:53 +02:00
Veeck
d277a276e7 Bump github actions and dependencies (#3882)
as suggested by dependabot
[here](https://github.com/MagicMirrorOrg/MagicMirror/pull/3880) and
[here](https://github.com/MagicMirrorOrg/MagicMirror/pull/3881)
also bumped the dependencies while at it

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: veeck <gitkraken@veeck.de>
2025-09-08 14:29:06 +02:00
Karsten Hassel
be957af6a6 bump minimal node version to v22.18.0 (#3877)
electron uses node v22.18 in its [current
releases](https://releases.electronjs.org/), so we should go hand in
hand and use that as the minimal node version
2025-09-04 07:07:15 +02:00
Karsten Hassel
93d5df8d04 update electron to v38 (#3876) 2025-09-03 23:59:54 +02:00
Veeck
6f4eab9535 [core] bump dependencies into september (#3872)
nothing fancy in these though

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: veeck <gitkraken@veeck.de>
2025-09-01 21:23:24 +02:00
Kristjan ESPERANTO
4c0a4689c3 [tests] refactor translation tests (#3866)
- Remove `sinon` dependency in favor of Jest native mocking
  - Unify test helper functions across translation test suites
- Rename `setupDOMEnvironment` to `createTranslationTestEnvironment` for
consistency
  - Simplify DOM setup by removing unnecessary Promise/async patterns
- Avoid potential port conflicts by using port 3001 for translator unit
tests
  - Improve test reliability and maintainability
2025-08-28 21:26:50 +02:00
sam detweiler
483d3cd4e6 Fix limitdays regression (#3863)
fixes #3840 

this is a rewrite

---------

Co-authored-by: veeck <gitkraken@veeck.de>
2025-08-28 16:13:29 +02:00
Marcel
76da0aa55e Make User-Agent configurable (#3255)
Fixes #3253 

Adds a configuration option to overwrite the default `User-Agent` header
that is send at least by the calendar and news module. Allows other
modules to use the individual user agent as well.

The configuration accepts either a string or a function:
```
var config =
	{
		...
		userAgent: 'Mozilla/5.0 (My User Agent)',
		...
	}
```
or
```
var config =
	{
		...
		userAgent: () => 'Mozilla/5.0 (My User Agent)',
		...
	}
```

---------

Co-authored-by: Veeck <github@veeck.de>
Co-authored-by: veeck <gitkraken@veeck.de>
Co-authored-by: Karsten Hassel <hassel@gmx.de>
Co-authored-by: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com>
2025-08-27 13:50:37 +02:00
Veeck
839d074df1 Update dependencies (#3857)
Just some normal maintainance after the holidays

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: veeck <gitkraken@veeck.de>
2025-08-11 12:49:03 +02:00
Karsten Hassel
e34ef0cb6e update dependencies (#3849) 2025-07-22 22:09:29 +02:00
Karsten Hassel
a05eb23306 refactor default modules: move scheduleTimer to one place (#3837)
see #3819

---------

Co-authored-by: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com>
Co-authored-by: Veeck <github@veeck.de>
2025-07-10 08:12:09 +02:00
Veeck
e4ec8c3589 Fix missing icons in clock module (#3834)
Fixes #3818

---------

Co-authored-by: veeck <gitkraken@veeck.de>
2025-07-05 22:47:38 +02:00
Karsten Hassel
855b1d7cbf update dependencies incl. electron to v37, remove one failing unit test (#3831)
- see title and #3820
- remove failing unit calendar test until solved, see
https://github.com/MagicMirrorOrg/MagicMirror/issues/3830
2025-07-01 22:38:40 +02:00
Karsten Hassel
106b505f2c Prepare 2.33.0-develop 2025-07-01 00:22:16 +02:00
Karsten Hassel
26809725e5 Prepare Release 2.32.0 (#3825) 2025-06-30 23:52:58 +02:00
Karsten Hassel
5e506ea856 last dependency update before release (#3823) 2025-06-29 19:47:21 +02:00
Karsten Hassel
d2d4d7b37f update jest to v30 (#3815)
e2e:
- needed window.close(), otherwise the objects are not destroyed
- add missing `await` in clock test
- set maxListeners for all tests

remaining todo (comes with another PR if I find the problem):
- calendar e2e is now the only test which still needs `--forceExit`
2025-06-21 13:40:10 +02:00
Bugsounet - Cédric
9a3f4f098b Update package type to commonjs (#3814)
related to #3804 

added type to `commonjs` in package.json
2025-06-20 14:26:33 +02:00
Karsten Hassel
ee874836fe update deps and fix animateCSS_spec test (#3811)
- animateCSS_spec test did throw errors at least with newest
dependencies (running locally or on gitlab)
- dependency updates: New jest v30 breaks our tests so we have to stay
with v29 until fixed (will take a look)
2025-06-19 07:35:42 +02:00
Karsten Hassel
052ec1ca26 remove existing folders fonts and vendor from local installations (#3805)
see discussions
[here](https://github.com/MagicMirrorOrg/MagicMirror/pull/3795#issuecomment-2927804743).

The used command should work under windows too. I'm open to better
solutions.

Co-authored-by: Veeck <github@veeck.de>
2025-06-07 13:20:01 +02:00
Karsten Hassel
975ee9c97d update dependencies (#3804)
and add now required "type" to `package.json`
2025-06-01 17:51:31 +02:00
Karsten Hassel
c8625ff506 simplify install and maintaining dependencies (#3795)
I was always unhappy when maintaining dependency updates to have 3
`package.json` files.

This PR moves all deps into the main `package.json` and removes the
folders `fonts` and `vendor`.

If accepted I will update the docs too.

---------

Co-authored-by: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com>
2025-06-01 17:03:11 +02:00
Kristjan ESPERANTO
e26aed927d [refactor] Replace ansis with built-in function util.styleText (#3793)
> What does the pull request accomplish?

One external dependency less.
2025-05-27 22:36:02 +02:00
Karsten Hassel
d07912d4b2 update dependencies incl. electron to v36 (#3788) 2025-05-23 06:52:28 +02:00
Kristjan ESPERANTO
965e935881 [linter] Review linter setup (#3783)
- [2b395b9f] Fix command to lint markdown in `CONTRIBUTING.md`
- [fed4c86c] Re-activate JSDoc ESLint plugin and fix linting issues (As
far as I remember, we deactivated it when we upgraded to ESLint 9
because it was not compatible with it. But its now.)
- [a3d2064b] Refactor ESLint config to use `defineConfig` and
`globalIgnores` ([these are like new
defaults](https://eslint.org/blog/2025/03/flat-config-extends-define-config-global-ignores/))
- [a3d2064b] Replace `eslint-plugin-import` with
`eslint-plugin-import-x`
(https://github.com/es-tooling/module-replacements/blob/main/docs/modules/eslint-plugin-import.md)
- [86a185b6] Switch Stylelint config to flat format and simplify
Stylelint scripts (like we already did for ESLint and prettier)
  - [f5a2c541] Fix some typos
2025-05-12 23:40:05 +02:00
dependabot[bot]
ed419ce5b3 Bump pm2 from 5.4.3 to 6.0.5 (#3776)
Bumps [pm2](https://github.com/Unitech/pm2) from 5.4.3 to 6.0.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Unitech/pm2/releases">pm2's
releases</a>.</em></p>
<blockquote>
<h2>v6.0.5</h2>
<h1>6.0.5</h1>
<ul>
<li>Bun support - Fixes <a
href="https://redirect.github.com/Unitech/pm2/issues/5893">#5893</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5774">#5774</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5682">#5682</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5675">#5675</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5777">#5777</a></li>
<li>Disable git parsing by default <a
href="https://redirect.github.com/Unitech/pm2/issues/5909">#5909</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/2182">#2182</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5801">#5801</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5051">#5051</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5696">#5696</a></li>
<li>Add WEBP content type for pm2 serve <a
href="https://redirect.github.com/Unitech/pm2/issues/5900">#5900</a> <a
href="https://github.com/tbo47"><code>@​tbo47</code></a></li>
<li>Enable PM2 module update from tarball <a
href="https://redirect.github.com/Unitech/pm2/issues/5906">#5906</a> <a
href="https://github.com/AYOKINYA"><code>@​AYOKINYA</code></a></li>
<li>Fix treekil on FreeBSD <a
href="https://redirect.github.com/Unitech/pm2/issues/5896">#5896</a> <a
href="https://github.com/skeyby"><code>@​skeyby</code></a></li>
<li>fix allowing to update namespaced pm2 NPM module
(<code>@​org/module-name</code>) <a
href="https://redirect.github.com/Unitech/pm2/issues/5915">#5915</a> <a
href="https://github.com/endelendel"><code>@​endelendel</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Unitech/pm2/blob/master/CHANGELOG.md">pm2's
changelog</a>.</em></p>
<blockquote>
<h2>6.0.5</h2>
<ul>
<li>Bun support - Fixes <a
href="https://redirect.github.com/Unitech/pm2/issues/5893">#5893</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5774">#5774</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5682">#5682</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5675">#5675</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5777">#5777</a></li>
<li>Disable git parsing by default <a
href="https://redirect.github.com/Unitech/pm2/issues/5909">#5909</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/2182">#2182</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5801">#5801</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5051">#5051</a> <a
href="https://redirect.github.com/Unitech/pm2/issues/5696">#5696</a></li>
<li>Add WEBP content type for pm2 serve <a
href="https://redirect.github.com/Unitech/pm2/issues/5900">#5900</a> <a
href="https://github.com/tbo47"><code>@​tbo47</code></a></li>
<li>Enable PM2 module update from tarball <a
href="https://redirect.github.com/Unitech/pm2/issues/5906">#5906</a> <a
href="https://github.com/AYOKINYA"><code>@​AYOKINYA</code></a></li>
<li>Fix treekil on FreeBSD <a
href="https://redirect.github.com/Unitech/pm2/issues/5896">#5896</a> <a
href="https://github.com/skeyby"><code>@​skeyby</code></a></li>
<li>fix allowing to update namespaced pm2 NPM module
(<code>@​org/module-name</code>) <a
href="https://redirect.github.com/Unitech/pm2/issues/5915">#5915</a> <a
href="https://github.com/endelendel"><code>@​endelendel</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/Unitech/pm2/commits/v6.0.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pm2&package-manager=npm_and_yarn&previous-version=5.4.3&new-version=6.0.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 22:47:20 +02:00
Karsten Hassel
53bff7243d update dependencies (#3774) 2025-05-09 22:35:09 +02:00
Kristjan ESPERANTO
7b4d363b07 [fix] Fix start:dev script (#3773)
This will fix #3772 caused by #3764.

Since I work with `start:wayland:dev` instead of `start:dev`, I didn't
notice this, sorry.
2025-05-07 16:06:09 +02:00
Kristjan ESPERANTO
b9d63d7252 Use "node --run" instead of "npm run" (#3764)
This has the advantage that the package manager is no longer involved
after the installation process.

However, previous start commands such as `npm run start` continue to
work. So we don't even have to adapt the documentation.
2025-05-06 20:33:42 +02:00
veeck
86934c8375 Prepare v2.32.0-develop 2025-04-01 21:54:00 +02:00
Veeck
01fd41c191 Prepare 2.31.0 release (#3757)
updated CHANGELOG and release process documentation

---------

Co-authored-by: veeck <gitkraken@veeck.de>
2025-04-01 18:47:56 +02:00
Veeck
f80b1f1321 Update deps before release (#3756)
Co-authored-by: veeck <gitkraken@veeck.de>
2025-04-01 08:33:31 +02:00
Karsten Hassel
2e57d785ac update dependencies (#3754) 2025-03-28 07:31:36 +01:00
Karsten Hassel
46d64abb4b update required node version and dependencies (#3747)
see discussion in
https://github.com/MagicMirrorOrg/MagicMirror/pull/3746

As [electron v35 requires node js
v22.14.0](https://www.electronjs.org/blog/electron-35-0) we should
update this here too.
2025-03-21 12:30:08 +01:00
Kristjan ESPERANTO
68ec696c25 Update ESLint and prettier (#3746)
This will fix #3745.
2025-03-18 22:30:20 +01:00
Karsten Hassel
1fcc028e49 update dependencies incl. electron to v35 (#3733) 2025-03-05 12:28:25 +01:00
Veeck
4a398f03eb Fix empty part-of-day logic (#3726)
Fixes #3727

---------

Co-authored-by: veeck <gitkraken@veeck.de>
2025-02-27 19:31:00 +01:00