From 80bc9dcd5a4ada2f82602030ae8495b4d8598fc9 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Fri, 24 Oct 2025 14:03:35 +0200 Subject: [PATCH 01/13] Add silent and sound property and method to Notification class --- src/Facades/Notification.php | 2 ++ src/Notification.php | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/Facades/Notification.php b/src/Facades/Notification.php index 2f2ae116..e71f51e2 100644 --- a/src/Facades/Notification.php +++ b/src/Facades/Notification.php @@ -7,6 +7,8 @@ /** * @method static static title(string $title) * @method static static event(string $event) + * @method static static sound(string $sound) + * @method static static silent(bool $silent = true) * @method static static message(string $body) * @method static static reference(string $reference) * @method static static hasReply(string $placeholder = '') diff --git a/src/Notification.php b/src/Notification.php index c46a387e..cf1d3e93 100644 --- a/src/Notification.php +++ b/src/Notification.php @@ -14,6 +14,10 @@ class Notification protected string $event = ''; + protected string $sound = ''; + + protected bool $silent = false; + private bool $hasReply = false; private string $replyPlaceholder = ''; @@ -51,6 +55,20 @@ public function event(string $event): self return $this; } + public function sound(string $sound): self + { + $this->sound = $sound; + + return $this; + } + + public function silent(bool $silent = true): self + { + $this->silent = $silent; + + return $this; + } + public function hasReply(string $placeholder = ''): self { $this->hasReply = true; @@ -80,6 +98,8 @@ public function show(): self 'title' => $this->title, 'body' => $this->body, 'event' => $this->event, + 'sound' => $this->sound, + 'silent' => $this->silent, 'hasReply' => $this->hasReply, 'replyPlaceholder' => $this->replyPlaceholder, 'actions' => array_map(fn (string $label) => [ From 8344b372537aef0800fa213fbe33543494aeded1 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Mon, 27 Oct 2025 11:26:30 +0100 Subject: [PATCH 02/13] feat: implement local sound playback for notifications --- .../dist/server/api/notification.js | 85 +- .../src/server/api/notification.ts | 80 +- resources/electron/package-lock.json | 31 + resources/electron/package.json | 1 + resources/electron/yarn.lock | 834 ++++++++++-------- 5 files changed, 672 insertions(+), 359 deletions(-) diff --git a/resources/electron/electron-plugin/dist/server/api/notification.js b/resources/electron/electron-plugin/dist/server/api/notification.js index aba8f4c5..9b8f80e2 100644 --- a/resources/electron/electron-plugin/dist/server/api/notification.js +++ b/resources/electron/electron-plugin/dist/server/api/notification.js @@ -1,26 +1,105 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; import express from 'express'; import { Notification } from 'electron'; import { notifyLaravel } from "../utils.js"; +import fs from 'fs'; +let player; +try { + player = require('play-sound')(); +} +catch (e) { + player = null; +} +const isLocalFile = (sound) => { + if (typeof sound !== 'string') + return false; + if (/^https?:\/\//i.test(sound)) + return false; + return sound.startsWith('/') || sound.startsWith('file:') || /^[a-zA-Z]:\\/.test(sound); +}; +const normalizePath = (raw) => { + if (raw.startsWith('file://')) + return raw.replace(/^file:\/\//, ''); + return raw; +}; +const playSound = (sound) => __awaiter(void 0, void 0, void 0, function* () { + const filePath = normalizePath(sound); + try { + yield fs.promises.access(filePath, fs.constants.R_OK); + } + catch (err) { + return Promise.reject(new Error(`sound file not accessible: ${filePath}`)); + } + return new Promise((resolve, reject) => { + if (player) { + player.play(filePath, (err) => { + if (err) + return reject(err); + resolve(); + }); + return; + } + const { exec } = require('child_process'); + exec(`afplay ${JSON.stringify(filePath)}`, (err) => { + if (err) + return reject(err); + resolve(); + }); + }); +}); const router = express.Router(); router.post('/', (req, res) => { const { title, body, subtitle, silent, icon, hasReply, timeoutType, replyPlaceholder, sound, urgency, actions, closeButtonText, toastXml, event: customEvent, reference, } = req.body; const eventName = customEvent !== null && customEvent !== void 0 ? customEvent : '\\Native\\Desktop\\Events\\Notifications\\NotificationClicked'; const notificationReference = reference !== null && reference !== void 0 ? reference : (Date.now() + '.' + Math.random().toString(36).slice(2, 9)); - const notification = new Notification({ + const usingLocalFile = isLocalFile(sound); + const createNotification = (opts) => { + try { + if (typeof Notification === 'function') { + return new Notification(opts); + } + } + catch (e) { + } + return { + show: () => { }, + on: (_, __) => { }, + }; + }; + const notification = createNotification({ title, body, subtitle, - silent, + silent: usingLocalFile ? true : silent, icon, hasReply, timeoutType, replyPlaceholder, - sound, + sound: usingLocalFile ? undefined : sound, urgency, actions, closeButtonText, toastXml }); + if (usingLocalFile && typeof sound === 'string') { + playSound(sound).catch((err) => { + notifyLaravel('events', { + event: '\\Native\\Desktop\\Events\\Notifications\\NotificationSoundFailed', + payload: { + reference: notificationReference, + error: String(err), + }, + }); + }); + } notification.on("click", (event) => { notifyLaravel('events', { event: eventName || '\\Native\\Desktop\\Events\\Notifications\\NotificationClicked', diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 4c56ca81..54a2868e 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -1,6 +1,51 @@ import express from 'express'; import { Notification } from 'electron'; import {notifyLaravel} from "../utils.js"; +import fs from 'fs'; +declare const require: any; + +let player: any; +try { + player = require('play-sound')(); +} catch (e) { + player = null; +} + +const isLocalFile = (sound: unknown) => { + if (typeof sound !== 'string') return false; + if (/^https?:\/\//i.test(sound)) return false; + return sound.startsWith('/') || sound.startsWith('file:') || /^[a-zA-Z]:\\/.test(sound); +}; + +const normalizePath = (raw: string) => { + if (raw.startsWith('file://')) return raw.replace(/^file:\/\//, ''); + return raw; +}; + +const playSound = async (sound: string) => { + const filePath = normalizePath(sound); + try { + await fs.promises.access(filePath, fs.constants.R_OK); + } catch (err) { + return Promise.reject(new Error(`sound file not accessible: ${filePath}`)); + } + + return new Promise((resolve, reject) => { + if (player) { + player.play(filePath, (err: any) => { + if (err) return reject(err); + resolve(); + }); + return; + } + + const { exec } = require('child_process'); + exec(`afplay ${JSON.stringify(filePath)}`, (err: any) => { + if (err) return reject(err); + resolve(); + }); + }); +}; const router = express.Router(); router.post('/', (req, res) => { @@ -26,22 +71,51 @@ router.post('/', (req, res) => { const notificationReference = reference ?? (Date.now() + '.' + Math.random().toString(36).slice(2, 9)); - const notification = new Notification({ + const usingLocalFile = isLocalFile(sound); + + const createNotification = (opts: any) => { + try { + if (typeof (Notification as any) === 'function') { + return new (Notification as any)(opts); + } + } catch (e) { + + } + + return { + show: () => {}, + on: (_: string, __: Function) => {}, + }; + }; + + const notification = createNotification({ title, body, subtitle, - silent, + silent: usingLocalFile ? true : silent, icon, hasReply, timeoutType, replyPlaceholder, - sound, + sound: usingLocalFile ? undefined : sound, urgency, actions, closeButtonText, toastXml }); + if (usingLocalFile && typeof sound === 'string') { + playSound(sound).catch((err) => { + notifyLaravel('events', { + event: '\\Native\\Desktop\\Events\\Notifications\\NotificationSoundFailed', + payload: { + reference: notificationReference, + error: String(err), + }, + }); + }); + } + notification.on("click", (event) => { notifyLaravel('events', { event: eventName || '\\Native\\Desktop\\Events\\Notifications\\NotificationClicked', diff --git a/resources/electron/package-lock.json b/resources/electron/package-lock.json index 77983340..58ea0924 100644 --- a/resources/electron/package-lock.json +++ b/resources/electron/package-lock.json @@ -23,6 +23,7 @@ "get-port": "^7.1.0", "kill-sync": "^1.0.3", "nodemon": "^3.1.9", + "play-sound": "^1.1.3", "ps-node": "^0.1.6", "tree-kill": "^1.2.2", "yauzl": "^3.2.0" @@ -7960,6 +7961,15 @@ "node": ">= 0.8" } }, + "node_modules/find-exec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/find-exec/-/find-exec-1.0.3.tgz", + "integrity": "sha512-gnG38zW90mS8hm5smNcrBnakPEt+cGJoiMkJwCU0IYnEb0H2NQk0NIljhNW+48oniCriFek/PH6QXbwsJo/qug==", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.8.1" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -10861,6 +10871,15 @@ "node": ">=6" } }, + "node_modules/play-sound": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/play-sound/-/play-sound-1.1.6.tgz", + "integrity": "sha512-09eO4QiXNFXJffJaOW5P6x6F5RLihpLUkXttvUZeWml0fU6x6Zp7AjG9zaeMpgH2ZNvq4GR1ytB22ddYcqJIZA==", + "license": "MIT", + "dependencies": { + "find-exec": "1.0.3" + } + }, "node_modules/plist": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", @@ -11950,6 +11969,18 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", diff --git a/resources/electron/package.json b/resources/electron/package.json index dd7b7321..e399a98d 100644 --- a/resources/electron/package.json +++ b/resources/electron/package.json @@ -52,6 +52,7 @@ "get-port": "^7.1.0", "kill-sync": "^1.0.3", "nodemon": "^3.1.9", + "play-sound": "^1.1.3", "ps-node": "^0.1.6", "tree-kill": "^1.2.2", "yauzl": "^3.2.0" diff --git a/resources/electron/yarn.lock b/resources/electron/yarn.lock index 9cc52188..5dab821b 100644 --- a/resources/electron/yarn.lock +++ b/resources/electron/yarn.lock @@ -888,28 +888,30 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@cacheable/memoize@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.1.tgz" - integrity sha512-WBLH37SynkCa39S6IrTSMQF3Wdv4/51WxuU5TuCNEqZcLgLGHme8NUxRTcDIO8ZZFXlslWbh9BD3DllixgPg6Q== +"@cacheable/memoize@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.3.tgz" + integrity sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw== dependencies: - "@cacheable/utils" "^2.0.1" + "@cacheable/utils" "^2.0.3" -"@cacheable/memory@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.1.tgz" - integrity sha512-Ufc7iQnRKFC8gjZVGOTOsMwM/vZtmsw3LafvctVXPm835ElgK3DpMe1U5i9sd6OieSkyJhXbAT2Q2FosXBBbAQ== +"@cacheable/memory@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.3.tgz" + integrity sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA== dependencies: - "@cacheable/memoize" "^2.0.1" - "@cacheable/utils" "^2.0.1" - "@keyv/bigmap" "^1.0.0" - hookified "^1.12.0" - keyv "^5.5.1" + "@cacheable/memoize" "^2.0.3" + "@cacheable/utils" "^2.0.3" + "@keyv/bigmap" "^1.0.2" + hookified "^1.12.1" + keyv "^5.5.3" -"@cacheable/utils@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@cacheable/utils/-/utils-2.0.1.tgz" - integrity sha512-sxHjO6wKn4/0wHCFYbh6tljj+ciP9BKgyBi09NLsor3sN+nu/Rt3FwLw6bYp7bp8usHpmcwUozrB/u4RuSw/eg== +"@cacheable/utils@^2.0.3", "@cacheable/utils@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@cacheable/utils/-/utils-2.1.0.tgz" + integrity sha512-ZdxfOiaarMqMj+H7qwlt5EBKWaeGihSYVHdQv5lUsbn8MJJOTW82OIwirQ39U5tMZkNvy3bQE+ryzC+xTAb9/g== + dependencies: + keyv "^5.5.3" "@cspotcode/source-map-support@^0.8.0": version "0.8.1" @@ -951,7 +953,7 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" -"@dual-bundle/import-meta-resolve@^4.1.0": +"@dual-bundle/import-meta-resolve@^4.2.1": version "4.2.1" resolved "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz" integrity sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg== @@ -1062,10 +1064,10 @@ resolved "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz" integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA== -"@esbuild/linux-x64@0.25.10": - version "0.25.10" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz" - integrity sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA== +"@esbuild/darwin-arm64@0.25.11": + version "0.25.11" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz" + integrity sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w== "@eslint-community/eslint-utils@^4.4.1", "@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": version "4.9.0" @@ -1079,24 +1081,26 @@ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/config-array@^0.21.0": - version "0.21.0" - resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz" - integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== +"@eslint/config-array@^0.21.1": + version "0.21.1" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz" + integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== dependencies: - "@eslint/object-schema" "^2.1.6" + "@eslint/object-schema" "^2.1.7" debug "^4.3.1" minimatch "^3.1.2" -"@eslint/config-helpers@^0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz" - integrity sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA== +"@eslint/config-helpers@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz" + integrity sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw== + dependencies: + "@eslint/core" "^0.16.0" -"@eslint/core@^0.15.2": - version "0.15.2" - resolved "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz" - integrity sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg== +"@eslint/core@^0.16.0": + version "0.16.0" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz" + integrity sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q== dependencies: "@types/json-schema" "^7.0.15" @@ -1115,22 +1119,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^9.17.0", "@eslint/js@9.36.0": - version "9.36.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz" - integrity sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw== +"@eslint/js@^9.17.0", "@eslint/js@9.38.0": + version "9.38.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz" + integrity sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A== -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== -"@eslint/plugin-kit@^0.3.5": - version "0.3.5" - resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz" - integrity sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w== +"@eslint/plugin-kit@^0.4.0": + version "0.4.0" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz" + integrity sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A== dependencies: - "@eslint/core" "^0.15.2" + "@eslint/core" "^0.16.0" levn "^0.4.1" "@gar/promisify@^1.1.3": @@ -1227,12 +1231,12 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@keyv/bigmap@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.0.1.tgz" - integrity sha512-dZ7TMshK6brpuGPPRoq4pHNzNH4KTWaxVPB7KEnPErlgJpc+jG1Oyx3sw6nBFiZ0OCKwC1zU6skMEG7H421f9g== +"@keyv/bigmap@^1.0.2": + version "1.1.0" + resolved "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.1.0.tgz" + integrity sha512-MX7XIUNwVRK+hjZcAbNJ0Z8DREo+Weu9vinBOjGU1thEi9F6vPhICzBbk4CCf3eEefKRz7n6TfZXwUFZTSgj8Q== dependencies: - hookified "^1.12.0" + hookified "^1.12.2" "@keyv/serialize@^1.1.1": version "1.1.1" @@ -1303,20 +1307,15 @@ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz" integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== -"@rollup/rollup-linux-x64-gnu@4.52.0": - version "4.52.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.0.tgz" - integrity sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA== - -"@rollup/rollup-linux-x64-musl@4.52.0": - version "4.52.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.0.tgz" - integrity sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ== +"@rollup/rollup-darwin-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz" + integrity sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA== "@rushstack/eslint-patch@^1.10.4": - version "1.12.0" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz" - integrity sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw== + version "1.14.0" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.14.0.tgz" + integrity sha512-WJFej426qe4RWOm9MMtP4V3CV4AucXolQty+GRgAWLgQXmpCuwzs7hEpxxhSc/znXUSxum9d/P/32MW0FlAAlA== "@sindresorhus/is@^4.0.0": version "4.6.0" @@ -1388,11 +1387,12 @@ "@types/responselike" "^1.0.0" "@types/chai@^5.2.2": - version "5.2.2" - resolved "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz" - integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== + version "5.2.3" + resolved "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== dependencies: "@types/deep-eql" "*" + assertion-error "^2.0.1" "@types/connect@*": version "3.4.38" @@ -1419,9 +1419,9 @@ integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/express-serve-static-core@^5.0.0": - version "5.0.7" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz" - integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ== + version "5.1.0" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz" + integrity sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1477,9 +1477,9 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*", "@types/node@^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node@^20.19.0 || >=22.12.0", "@types/node@^22.10.2", "@types/node@^22.7.7": - version "22.18.6" - resolved "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz" - integrity sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ== + version "22.18.12" + resolved "https://registry.npmjs.org/@types/node/-/node-22.18.12.tgz" + integrity sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog== dependencies: undici-types "~6.21.0" @@ -1488,6 +1488,14 @@ resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== +"@types/plist@^3.0.1": + version "3.0.5" + resolved "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz" + integrity sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + "@types/ps-node@^0.1.3": version "0.1.3" resolved "https://registry.npmjs.org/@types/ps-node/-/ps-node-0.1.3.tgz" @@ -1511,6 +1519,13 @@ "@types/node" "*" "@types/send@*": + version "1.2.0" + resolved "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz" + integrity sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ== + dependencies: + "@types/node" "*" + +"@types/send@<1": version "0.17.5" resolved "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz" integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== @@ -1519,13 +1534,18 @@ "@types/node" "*" "@types/serve-static@*": - version "1.15.8" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz" - integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== + version "1.15.9" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz" + integrity sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA== dependencies: "@types/http-errors" "*" "@types/node" "*" - "@types/send" "*" + "@types/send" "<1" + +"@types/verror@^1.10.3": + version "1.10.11" + resolved "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz" + integrity sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg== "@types/yauzl@^2.9.1": version "2.10.3" @@ -1534,79 +1554,79 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^8.18.1", "@typescript-eslint/eslint-plugin@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz" - integrity sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ== +"@typescript-eslint/eslint-plugin@^8.18.1", "@typescript-eslint/eslint-plugin@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz" + integrity sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.44.0" - "@typescript-eslint/type-utils" "8.44.0" - "@typescript-eslint/utils" "8.44.0" - "@typescript-eslint/visitor-keys" "8.44.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/type-utils" "8.46.2" + "@typescript-eslint/utils" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" graphemer "^1.4.0" ignore "^7.0.0" natural-compare "^1.4.0" ts-api-utils "^2.1.0" -"@typescript-eslint/parser@^8.18.1", "@typescript-eslint/parser@^8.44.0", "@typescript-eslint/parser@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz" - integrity sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw== +"@typescript-eslint/parser@^8.18.1", "@typescript-eslint/parser@^8.46.2", "@typescript-eslint/parser@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz" + integrity sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g== dependencies: - "@typescript-eslint/scope-manager" "8.44.0" - "@typescript-eslint/types" "8.44.0" - "@typescript-eslint/typescript-estree" "8.44.0" - "@typescript-eslint/visitor-keys" "8.44.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" debug "^4.3.4" -"@typescript-eslint/project-service@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz" - integrity sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA== +"@typescript-eslint/project-service@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz" + integrity sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.44.0" - "@typescript-eslint/types" "^8.44.0" + "@typescript-eslint/tsconfig-utils" "^8.46.2" + "@typescript-eslint/types" "^8.46.2" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz" - integrity sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA== +"@typescript-eslint/scope-manager@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz" + integrity sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA== dependencies: - "@typescript-eslint/types" "8.44.0" - "@typescript-eslint/visitor-keys" "8.44.0" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" -"@typescript-eslint/tsconfig-utils@^8.44.0", "@typescript-eslint/tsconfig-utils@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz" - integrity sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ== +"@typescript-eslint/tsconfig-utils@^8.46.2", "@typescript-eslint/tsconfig-utils@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz" + integrity sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag== -"@typescript-eslint/type-utils@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz" - integrity sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg== +"@typescript-eslint/type-utils@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz" + integrity sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA== dependencies: - "@typescript-eslint/types" "8.44.0" - "@typescript-eslint/typescript-estree" "8.44.0" - "@typescript-eslint/utils" "8.44.0" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/utils" "8.46.2" debug "^4.3.4" ts-api-utils "^2.1.0" -"@typescript-eslint/types@^8.44.0", "@typescript-eslint/types@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz" - integrity sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA== +"@typescript-eslint/types@^8.46.2", "@typescript-eslint/types@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz" + integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ== -"@typescript-eslint/typescript-estree@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz" - integrity sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw== +"@typescript-eslint/typescript-estree@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz" + integrity sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ== dependencies: - "@typescript-eslint/project-service" "8.44.0" - "@typescript-eslint/tsconfig-utils" "8.44.0" - "@typescript-eslint/types" "8.44.0" - "@typescript-eslint/visitor-keys" "8.44.0" + "@typescript-eslint/project-service" "8.46.2" + "@typescript-eslint/tsconfig-utils" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -1614,22 +1634,22 @@ semver "^7.6.0" ts-api-utils "^2.1.0" -"@typescript-eslint/utils@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz" - integrity sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg== +"@typescript-eslint/utils@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz" + integrity sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg== dependencies: "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.44.0" - "@typescript-eslint/types" "8.44.0" - "@typescript-eslint/typescript-estree" "8.44.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" -"@typescript-eslint/visitor-keys@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz" - integrity sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw== +"@typescript-eslint/visitor-keys@8.46.2": + version "8.46.2" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz" + integrity sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w== dependencies: - "@typescript-eslint/types" "8.44.0" + "@typescript-eslint/types" "8.46.2" eslint-visitor-keys "^4.2.1" "@vitest/expect@3.2.4": @@ -1787,7 +1807,7 @@ ajv-keywords@^3.4.1: resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.12.0, ajv@^6.12.4, ajv@^6.9.1: +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1978,6 +1998,11 @@ array-union@^2.1.0: resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + assertion-error@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" @@ -2064,10 +2089,10 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -baseline-browser-mapping@^2.8.3: - version "2.8.6" - resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz" - integrity sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw== +baseline-browser-mapping@^2.8.9: + version "2.8.19" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.19.tgz" + integrity sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ== binary-extensions@^2.0.0: version "2.3.0" @@ -2137,14 +2162,14 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.24.0, browserslist@^4.25.3, "browserslist@>= 4.21.0": - version "4.26.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz" - integrity sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A== +browserslist@^4.24.0, browserslist@^4.26.3, "browserslist@>= 4.21.0": + version "4.26.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz" + integrity sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w== dependencies: - baseline-browser-mapping "^2.8.3" - caniuse-lite "^1.0.30001741" - electron-to-chromium "^1.5.218" + baseline-browser-mapping "^2.8.9" + caniuse-lite "^1.0.30001746" + electron-to-chromium "^1.5.227" node-releases "^2.0.21" update-browserslist-db "^1.1.3" @@ -2158,7 +2183,7 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: +buffer@^5.1.0, buffer@^5.5.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2261,16 +2286,17 @@ cacheable-request@^7.0.2: normalize-url "^6.0.1" responselike "^2.0.0" -cacheable@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/cacheable/-/cacheable-2.0.1.tgz" - integrity sha512-MSKxcybpxB5kcWKpj+1tPBm2os4qKKGxDovsZmLhZmWIDYp8EgtC45C5zk1fLe1IC9PpI4ZE4eyryQH0N10PKA== +cacheable@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/cacheable/-/cacheable-2.1.1.tgz" + integrity sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg== dependencies: - "@cacheable/memoize" "^2.0.1" - "@cacheable/memory" "^2.0.1" - "@cacheable/utils" "^2.0.1" - hookified "^1.12.0" - keyv "^5.5.1" + "@cacheable/memoize" "^2.0.3" + "@cacheable/memory" "^2.0.3" + "@cacheable/utils" "^2.1.0" + hookified "^1.12.2" + keyv "^5.5.3" + qified "^0.5.0" call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" @@ -2293,10 +2319,10 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -caniuse-lite@^1.0.30001741: - version "1.0.30001743" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz" - integrity sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw== +caniuse-lite@^1.0.30001746: + version "1.0.30001751" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz" + integrity sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw== chai@^5.2.0: version "5.3.3" @@ -2353,9 +2379,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== ci-info@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz" - integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== + version "4.3.1" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz" + integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA== clean-regexp@^1.0.0: version "1.0.0" @@ -2381,6 +2407,14 @@ cli-spinners@^2.5.0: resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cli-truncate@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" @@ -2532,13 +2566,13 @@ copy-anything@^2.0.1: is-what "^3.14.1" core-js-compat@^3.40.0, core-js-compat@^3.43.0: - version "3.45.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz" - integrity sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA== + version "3.46.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz" + integrity sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law== dependencies: - browserslist "^4.25.3" + browserslist "^4.26.3" -core-util-is@~1.0.0: +core-util-is@~1.0.0, core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== @@ -2558,6 +2592,13 @@ crc-32@^1.2.0: resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + crc32-stream@^4.0.2: version "4.0.3" resolved "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz" @@ -2572,9 +2613,9 @@ create-require@^1.1.0: integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-env@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/cross-env/-/cross-env-10.0.0.tgz" - integrity sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q== + version "10.1.0" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz" + integrity sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw== dependencies: "@epic-web/invariant" "^1.0.0" cross-spawn "^7.0.6" @@ -2613,7 +2654,7 @@ debounce-fn@^6.0.0: dependencies: mimic-function "^5.0.0" -debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@4: +debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3, debug@4: version "4.4.3" resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -2683,9 +2724,9 @@ depd@^2.0.0, depd@2.0.0: integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== detect-libc@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz" - integrity sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg== + version "2.1.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== detect-node@^2.0.4: version "2.1.0" @@ -2726,6 +2767,20 @@ dmg-builder@25.1.8: optionalDependencies: dmg-license "^1.0.11" +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + dot-prop@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz" @@ -2798,9 +2853,9 @@ electron-builder@^25.1.8: yargs "^17.6.2" electron-chromedriver@^38.0.0: - version "38.1.2" - resolved "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-38.1.2.tgz" - integrity sha512-76J/JT4f0/E7GfG/hxPsweBMxhpVQ/ExnjY32yv42lZY5cmVP4Bhm1RU0R5tCKuUyO0oyBhubVR2hYngcl7Csw== + version "38.3.0" + resolved "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-38.3.0.tgz" + integrity sha512-eefQiD6EklcHg2nUSYtEq+rJgWnOcoBofKvCu/eb6ujKBdlqWp88GsdrExcpX/N/cN0lFjCNCBPPs0HQlcOK5w== dependencies: "@electron/get" "^2.0.1" extract-zip "^2.0.0" @@ -2849,10 +2904,10 @@ electron-store@^10.0.0: conf "^14.0.0" type-fest "^4.41.0" -electron-to-chromium@^1.5.218: - version "1.5.222" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz" - integrity sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w== +electron-to-chromium@^1.5.227: + version "1.5.237" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz" + integrity sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg== electron-updater@^6.3.9: version "6.6.2" @@ -2889,18 +2944,18 @@ electron-window-state@^5.0.3: mkdirp "^0.5.1" electron@^38.0.0, "electron@>= 13.0.0", electron@>=13.0.0: - version "38.1.2" - resolved "https://registry.npmjs.org/electron/-/electron-38.1.2.tgz" - integrity sha512-WXUcN3W8h8NTTZViA3KNX0rV2YBU0X0mEUM3ubupXTDY4QtIN7tmiqYVOKSKpR2LckTmBWGuEeY4D6xVoffwKQ== + version "38.3.0" + resolved "https://registry.npmjs.org/electron/-/electron-38.3.0.tgz" + integrity sha512-Wij4AzX4SAV0X/ktq+NrWrp5piTCSS8F6YWh1KAcG+QRtNzyns9XLKERP68nFHIwfprhxF2YCN2uj7nx9DaeJw== dependencies: "@electron/get" "^2.0.0" "@types/node" "^22.7.7" extract-zip "^2.0.1" emoji-regex@^10.3.0: - version "10.5.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz" - integrity sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg== + version "10.6.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== emoji-regex@^8.0.0: version "8.0.0" @@ -2998,36 +3053,36 @@ es6-error@^4.1.1: integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== esbuild@^0.25.0, esbuild@^0.25.5: - version "0.25.10" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz" - integrity sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ== + version "0.25.11" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz" + integrity sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.10" - "@esbuild/android-arm" "0.25.10" - "@esbuild/android-arm64" "0.25.10" - "@esbuild/android-x64" "0.25.10" - "@esbuild/darwin-arm64" "0.25.10" - "@esbuild/darwin-x64" "0.25.10" - "@esbuild/freebsd-arm64" "0.25.10" - "@esbuild/freebsd-x64" "0.25.10" - "@esbuild/linux-arm" "0.25.10" - "@esbuild/linux-arm64" "0.25.10" - "@esbuild/linux-ia32" "0.25.10" - "@esbuild/linux-loong64" "0.25.10" - "@esbuild/linux-mips64el" "0.25.10" - "@esbuild/linux-ppc64" "0.25.10" - "@esbuild/linux-riscv64" "0.25.10" - "@esbuild/linux-s390x" "0.25.10" - "@esbuild/linux-x64" "0.25.10" - "@esbuild/netbsd-arm64" "0.25.10" - "@esbuild/netbsd-x64" "0.25.10" - "@esbuild/openbsd-arm64" "0.25.10" - "@esbuild/openbsd-x64" "0.25.10" - "@esbuild/openharmony-arm64" "0.25.10" - "@esbuild/sunos-x64" "0.25.10" - "@esbuild/win32-arm64" "0.25.10" - "@esbuild/win32-ia32" "0.25.10" - "@esbuild/win32-x64" "0.25.10" + "@esbuild/aix-ppc64" "0.25.11" + "@esbuild/android-arm" "0.25.11" + "@esbuild/android-arm64" "0.25.11" + "@esbuild/android-x64" "0.25.11" + "@esbuild/darwin-arm64" "0.25.11" + "@esbuild/darwin-x64" "0.25.11" + "@esbuild/freebsd-arm64" "0.25.11" + "@esbuild/freebsd-x64" "0.25.11" + "@esbuild/linux-arm" "0.25.11" + "@esbuild/linux-arm64" "0.25.11" + "@esbuild/linux-ia32" "0.25.11" + "@esbuild/linux-loong64" "0.25.11" + "@esbuild/linux-mips64el" "0.25.11" + "@esbuild/linux-ppc64" "0.25.11" + "@esbuild/linux-riscv64" "0.25.11" + "@esbuild/linux-s390x" "0.25.11" + "@esbuild/linux-x64" "0.25.11" + "@esbuild/netbsd-arm64" "0.25.11" + "@esbuild/netbsd-x64" "0.25.11" + "@esbuild/openbsd-arm64" "0.25.11" + "@esbuild/openbsd-x64" "0.25.11" + "@esbuild/openharmony-arm64" "0.25.11" + "@esbuild/sunos-x64" "0.25.11" + "@esbuild/win32-arm64" "0.25.11" + "@esbuild/win32-ia32" "0.25.11" + "@esbuild/win32-x64" "0.25.11" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -3113,23 +3168,22 @@ eslint-visitor-keys@^4.2.1: integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9.17.0, "eslint@>= 8.21.0", eslint@>=7.0.0, eslint@>=8.0.0, eslint@>=9.20.0: - version "9.36.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz" - integrity sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ== + version "9.38.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz" + integrity sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.21.0" - "@eslint/config-helpers" "^0.3.1" - "@eslint/core" "^0.15.2" + "@eslint/config-array" "^0.21.1" + "@eslint/config-helpers" "^0.4.1" + "@eslint/core" "^0.16.0" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.36.0" - "@eslint/plugin-kit" "^0.3.5" + "@eslint/js" "9.38.0" + "@eslint/plugin-kit" "^0.4.0" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.6" @@ -3204,9 +3258,9 @@ expect-type@^1.2.1: integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== exponential-backoff@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz" - integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== + version "3.1.3" + resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz" + integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== express@^5.1.0: version "5.1.0" @@ -3267,6 +3321,11 @@ extract-zip@^2.0.0, extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -3367,6 +3426,13 @@ finalhandler@^2.1.0: parseurl "^1.3.3" statuses "^2.0.1" +find-exec@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/find-exec/-/find-exec-1.0.3.tgz" + integrity sha512-gnG38zW90mS8hm5smNcrBnakPEt+cGJoiMkJwCU0IYnEb0H2NQk0NIljhNW+48oniCriFek/PH6QXbwsJo/qug== + dependencies: + shell-quote "^1.8.1" + find-up-simple@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz" @@ -3389,11 +3455,11 @@ flat-cache@^4.0.0: keyv "^4.5.4" flat-cache@^6.1.13: - version "6.1.14" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.14.tgz" - integrity sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw== + version "6.1.18" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.18.tgz" + integrity sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ== dependencies: - cacheable "^2.0.1" + cacheable "^2.1.0" flatted "^3.3.3" hookified "^1.12.0" @@ -3509,6 +3575,11 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -3788,10 +3859,10 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" -hookified@^1.12.0: - version "1.12.1" - resolved "https://registry.npmjs.org/hookified/-/hookified-1.12.1.tgz" - integrity sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q== +hookified@^1.12.0, hookified@^1.12.1, hookified@^1.12.2: + version "1.12.2" + resolved "https://registry.npmjs.org/hookified/-/hookified-1.12.2.tgz" + integrity sha512-aokUX1VdTpI0DUsndvW+OiwmBpKCu/NgRsSSkuSY0zq8PY6Q6a+lmOfAFDXAAOtBqJELvcWY9L1EVtzjbQcMdg== hosted-git-info@^4.1.0: version "4.1.0" @@ -3876,6 +3947,14 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" @@ -3939,9 +4018,9 @@ indent-string@^5.0.0: integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== index-to-position@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz" - integrity sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg== + version "1.2.0" + resolved "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz" + integrity sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw== infer-owner@^1.0.4: version "1.0.4" @@ -4002,7 +4081,7 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" -is-core-module@^2.16.0: +is-core-module@^2.16.1: version "2.16.1" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== @@ -4133,7 +4212,7 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^3.0.2, jsesc@^3.1.0: +jsesc@^3.0.2, jsesc@^3.1.0, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== @@ -4206,10 +4285,10 @@ keyv@^4.0.0, keyv@^4.5.4: dependencies: json-buffer "3.0.1" -keyv@^5.5.1: - version "5.5.2" - resolved "https://registry.npmjs.org/keyv/-/keyv-5.5.2.tgz" - integrity sha512-TXcFHbmm/z7MGd1u9ASiCSfTS+ei6Z8B3a5JHzx3oPa/o7QzWVtPRpc4KGER5RR469IC+/nfg4U5YLIuDUua2g== +keyv@^5.5.3: + version "5.5.3" + resolved "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz" + integrity sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A== dependencies: "@keyv/serialize" "^1.1.1" @@ -4246,9 +4325,9 @@ lazystream@^1.0.0: readable-stream "^2.0.5" less@^4.0.0, less@^4.2.1: - version "4.4.1" - resolved "https://registry.npmjs.org/less/-/less-4.4.1.tgz" - integrity sha512-X9HKyiXPi0f/ed0XhgUlBeFfxrlDP3xR4M7768Zl+WXLUViuL9AOPPJP4nCV0tgRWvTYvpNmN0SFhZOQzy16PA== + version "4.4.2" + resolved "https://registry.npmjs.org/less/-/less-4.4.2.tgz" + integrity sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" @@ -4366,9 +4445,9 @@ lru-cache@^10.2.0: integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^11.0.0: - version "11.2.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz" - integrity sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ== + version "11.2.2" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz" + integrity sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg== lru-cache@^5.1.1: version "5.1.1" @@ -4728,12 +4807,17 @@ negotiator@^1.0.0: integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== node-abi@^3.45.0: - version "3.77.0" - resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz" - integrity sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ== + version "3.78.0" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.78.0.tgz" + integrity sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ== dependencies: semver "^7.3.5" +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + node-api-version@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz" @@ -4759,9 +4843,9 @@ node-gyp@^9.0.0: which "^2.0.2" node-releases@^2.0.21: - version "2.0.21" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz" - integrity sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== + version "2.0.26" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz" + integrity sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA== nodemon@^3.1.9: version "3.1.10" @@ -5036,7 +5120,14 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -plist@^3.0.5, plist@^3.1.0: +play-sound@^1.1.3: + version "1.1.6" + resolved "https://registry.npmjs.org/play-sound/-/play-sound-1.1.6.tgz" + integrity sha512-09eO4QiXNFXJffJaOW5P6x6F5RLihpLUkXttvUZeWml0fU6x6Zp7AjG9zaeMpgH2ZNvq4GR1ytB22ddYcqJIZA== + dependencies: + find-exec "1.0.3" + +plist@^3.0.4, plist@^3.0.5, plist@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz" integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== @@ -5190,6 +5281,13 @@ pupa@^3.1.0: dependencies: escape-goat "^4.0.0" +qified@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/qified/-/qified-0.5.1.tgz" + integrity sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w== + dependencies: + hookified "^1.12.2" + qs@^6.14.0: version "6.14.0" resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" @@ -5316,14 +5414,14 @@ regexp-tree@^0.1.27: integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== regexpu-core@^6.2.0: - version "6.3.1" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.3.1.tgz" - integrity sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ== + version "6.4.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz" + integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.2" regjsgen "^0.8.0" - regjsparser "^0.12.0" + regjsparser "^0.13.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.2.1" @@ -5339,6 +5437,13 @@ regjsparser@^0.12.0: dependencies: jsesc "~3.0.2" +regjsparser@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz" + integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== + dependencies: + jsesc "~3.1.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -5372,11 +5477,11 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.22.10: - version "1.22.10" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + version "1.22.11" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== dependencies: - is-core-module "^2.16.0" + is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -5433,34 +5538,34 @@ roarr@^2.15.3: sprintf-js "^1.1.2" rollup@^4.43.0: - version "4.52.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.52.0.tgz" - integrity sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g== + version "4.52.5" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz" + integrity sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw== dependencies: "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.52.0" - "@rollup/rollup-android-arm64" "4.52.0" - "@rollup/rollup-darwin-arm64" "4.52.0" - "@rollup/rollup-darwin-x64" "4.52.0" - "@rollup/rollup-freebsd-arm64" "4.52.0" - "@rollup/rollup-freebsd-x64" "4.52.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.52.0" - "@rollup/rollup-linux-arm-musleabihf" "4.52.0" - "@rollup/rollup-linux-arm64-gnu" "4.52.0" - "@rollup/rollup-linux-arm64-musl" "4.52.0" - "@rollup/rollup-linux-loong64-gnu" "4.52.0" - "@rollup/rollup-linux-ppc64-gnu" "4.52.0" - "@rollup/rollup-linux-riscv64-gnu" "4.52.0" - "@rollup/rollup-linux-riscv64-musl" "4.52.0" - "@rollup/rollup-linux-s390x-gnu" "4.52.0" - "@rollup/rollup-linux-x64-gnu" "4.52.0" - "@rollup/rollup-linux-x64-musl" "4.52.0" - "@rollup/rollup-openharmony-arm64" "4.52.0" - "@rollup/rollup-win32-arm64-msvc" "4.52.0" - "@rollup/rollup-win32-ia32-msvc" "4.52.0" - "@rollup/rollup-win32-x64-gnu" "4.52.0" - "@rollup/rollup-win32-x64-msvc" "4.52.0" + "@rollup/rollup-android-arm-eabi" "4.52.5" + "@rollup/rollup-android-arm64" "4.52.5" + "@rollup/rollup-darwin-arm64" "4.52.5" + "@rollup/rollup-darwin-x64" "4.52.5" + "@rollup/rollup-freebsd-arm64" "4.52.5" + "@rollup/rollup-freebsd-x64" "4.52.5" + "@rollup/rollup-linux-arm-gnueabihf" "4.52.5" + "@rollup/rollup-linux-arm-musleabihf" "4.52.5" + "@rollup/rollup-linux-arm64-gnu" "4.52.5" + "@rollup/rollup-linux-arm64-musl" "4.52.5" + "@rollup/rollup-linux-loong64-gnu" "4.52.5" + "@rollup/rollup-linux-ppc64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-musl" "4.52.5" + "@rollup/rollup-linux-s390x-gnu" "4.52.5" + "@rollup/rollup-linux-x64-gnu" "4.52.5" + "@rollup/rollup-linux-x64-musl" "4.52.5" + "@rollup/rollup-openharmony-arm64" "4.52.5" + "@rollup/rollup-win32-arm64-msvc" "4.52.5" + "@rollup/rollup-win32-ia32-msvc" "4.52.5" + "@rollup/rollup-win32-x64-gnu" "4.52.5" + "@rollup/rollup-win32-x64-msvc" "4.52.5" fsevents "~2.3.2" router@^2.2.0: @@ -5524,44 +5629,44 @@ semver@^6.2.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.2: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^7.3.5: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^7.3.8: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^7.5.3: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^7.6.0: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^7.6.3: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^7.7.1: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^7.7.2: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== send@^1.1.0, send@^1.2.0: version "1.2.0" @@ -5619,6 +5724,11 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.8.1: + version "1.8.3" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz" + integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== + side-channel-list@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" @@ -5686,6 +5796,15 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" @@ -5703,7 +5822,7 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -smart-buffer@^4.2.0: +smart-buffer@^4.0.2, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -5816,9 +5935,9 @@ statuses@2.0.1: integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== std-env@^3.9.0: - version "3.9.0" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz" - integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== + version "3.10.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== string_decoder@^1.1.1: version "1.3.0" @@ -5926,9 +6045,9 @@ strip-ansi@^7.1.0: ansi-regex "^6.0.1" strip-indent@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.0.tgz" - integrity sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w== + version "4.1.1" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz" + integrity sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA== strip-json-comments@^3.1.1: version "3.1.1" @@ -5936,9 +6055,9 @@ strip-json-comments@^3.1.1: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-literal@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz" - integrity sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA== + version "3.1.0" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz" + integrity sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg== dependencies: js-tokens "^9.0.1" @@ -5981,21 +6100,21 @@ stylelint-scss@^6.2.1: postcss-value-parser "^4.2.0" stylelint@^16.0.2, stylelint@^16.1.0, stylelint@^16.12.0, stylelint@^16.16.0, stylelint@^16.8.0: - version "16.24.0" - resolved "https://registry.npmjs.org/stylelint/-/stylelint-16.24.0.tgz" - integrity sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ== + version "16.25.0" + resolved "https://registry.npmjs.org/stylelint/-/stylelint-16.25.0.tgz" + integrity sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ== dependencies: "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" "@csstools/media-query-list-parser" "^4.0.3" "@csstools/selector-specificity" "^5.0.0" - "@dual-bundle/import-meta-resolve" "^4.1.0" + "@dual-bundle/import-meta-resolve" "^4.2.1" balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^9.0.0" css-functions-list "^3.2.3" css-tree "^3.1.0" - debug "^4.4.1" + debug "^4.4.3" fast-glob "^3.3.3" fastest-levenshtein "^1.0.16" file-entry-cache "^10.1.4" @@ -6254,19 +6373,19 @@ type-is@^2.0.0, type-is@^2.0.1: mime-types "^3.0.0" typescript-eslint@^8.18.1: - version "8.44.0" - resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.0.tgz" - integrity sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw== + version "8.46.2" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz" + integrity sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg== dependencies: - "@typescript-eslint/eslint-plugin" "8.44.0" - "@typescript-eslint/parser" "8.44.0" - "@typescript-eslint/typescript-estree" "8.44.0" - "@typescript-eslint/utils" "8.44.0" + "@typescript-eslint/eslint-plugin" "8.46.2" + "@typescript-eslint/parser" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/utils" "8.46.2" typescript@^5.4.3, typescript@^5.7.2, typescript@>=2.7, typescript@>=4.8.4, "typescript@>=4.8.4 <6.0.0", typescript@>=4.9.5: - version "5.9.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz" - integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== + version "5.9.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== uint8array-extras@^1.4.0: version "1.5.0" @@ -6391,6 +6510,15 @@ vary@^1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vite-node@3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz" @@ -6403,9 +6531,9 @@ vite-node@3.2.4: vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" "vite@^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^5.0.0 || ^6.0.0 || ^7.0.0-0", vite@^7.0.5: - version "7.1.6" - resolved "https://registry.npmjs.org/vite/-/vite-7.1.6.tgz" - integrity sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ== + version "7.1.11" + resolved "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz" + integrity sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg== dependencies: esbuild "^0.25.0" fdir "^6.5.0" @@ -6536,7 +6664,7 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -xmlbuilder@^15.1.1: +xmlbuilder@^15.1.1, xmlbuilder@>=11.0.1: version "15.1.1" resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== From e2d005783192bbdb2e873437ecac35747ce846c8 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Tue, 28 Oct 2025 15:29:21 +0100 Subject: [PATCH 03/13] Remove Error Catching Just Fail Silently --- .../electron-plugin/src/server/api/notification.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 54a2868e..6ad525e7 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -105,15 +105,7 @@ router.post('/', (req, res) => { }); if (usingLocalFile && typeof sound === 'string') { - playSound(sound).catch((err) => { - notifyLaravel('events', { - event: '\\Native\\Desktop\\Events\\Notifications\\NotificationSoundFailed', - payload: { - reference: notificationReference, - error: String(err), - }, - }); - }); + playSound(sound); } notification.on("click", (event) => { From ec11f603b9c6368bf5028e64af2e8b8e8a05943b Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Tue, 28 Oct 2025 15:31:09 +0100 Subject: [PATCH 04/13] Remove Factory --- .../src/server/api/notification.ts | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 6ad525e7..7295b6e7 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -73,22 +73,7 @@ router.post('/', (req, res) => { const usingLocalFile = isLocalFile(sound); - const createNotification = (opts: any) => { - try { - if (typeof (Notification as any) === 'function') { - return new (Notification as any)(opts); - } - } catch (e) { - - } - - return { - show: () => {}, - on: (_: string, __: Function) => {}, - }; - }; - - const notification = createNotification({ + const notification = new Notification({ title, body, subtitle, From 02f3cce431394e75b65b89e1b13d0024d0481726 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Tue, 28 Oct 2025 15:36:45 +0100 Subject: [PATCH 05/13] Catch any error to make sure it fails silently --- .../electron/electron-plugin/src/server/api/notification.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 7295b6e7..524ed703 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -90,7 +90,7 @@ router.post('/', (req, res) => { }); if (usingLocalFile && typeof sound === 'string') { - playSound(sound); + playSound(sound).catch(() => {}); } notification.on("click", (event) => { From 808877730ff15ad88ea7369349dd500a7082ca36 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Tue, 28 Oct 2025 15:38:47 +0100 Subject: [PATCH 06/13] Changed player to just an import --- .../electron-plugin/src/server/api/notification.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 524ed703..f56923bc 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -3,13 +3,7 @@ import { Notification } from 'electron'; import {notifyLaravel} from "../utils.js"; import fs from 'fs'; declare const require: any; - -let player: any; -try { - player = require('play-sound')(); -} catch (e) { - player = null; -} +import playSoundLib from 'play-sound'; const isLocalFile = (sound: unknown) => { if (typeof sound !== 'string') return false; From 34af4e9a2bae89e1fe8cb3c0dcf9feffb500f33e Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Tue, 28 Oct 2025 15:39:14 +0100 Subject: [PATCH 07/13] Removed over complicated function --- .../src/server/api/notification.ts | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index f56923bc..b87f64fc 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -1,7 +1,6 @@ import express from 'express'; import { Notification } from 'electron'; import {notifyLaravel} from "../utils.js"; -import fs from 'fs'; declare const require: any; import playSoundLib from 'play-sound'; @@ -15,31 +14,6 @@ const normalizePath = (raw: string) => { if (raw.startsWith('file://')) return raw.replace(/^file:\/\//, ''); return raw; }; - -const playSound = async (sound: string) => { - const filePath = normalizePath(sound); - try { - await fs.promises.access(filePath, fs.constants.R_OK); - } catch (err) { - return Promise.reject(new Error(`sound file not accessible: ${filePath}`)); - } - - return new Promise((resolve, reject) => { - if (player) { - player.play(filePath, (err: any) => { - if (err) return reject(err); - resolve(); - }); - return; - } - - const { exec } = require('child_process'); - exec(`afplay ${JSON.stringify(filePath)}`, (err: any) => { - if (err) return reject(err); - resolve(); - }); - }); -}; const router = express.Router(); router.post('/', (req, res) => { @@ -84,7 +58,13 @@ router.post('/', (req, res) => { }); if (usingLocalFile && typeof sound === 'string') { - playSound(sound).catch(() => {}); + const filePath = normalizePath(sound); + try { + playSoundLib().play(filePath, () => {}); + } catch (e) { + const { exec } = require('child_process'); + exec(`afplay "${filePath}"`, () => {}); + } } notification.on("click", (event) => { From a00afd40c69fb20a19a94540a1fdc0a6b3a307c6 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Tue, 28 Oct 2025 15:52:25 +0100 Subject: [PATCH 08/13] Build the js file --- .../dist/server/api/notification.js | 75 +++---------------- 1 file changed, 10 insertions(+), 65 deletions(-) diff --git a/resources/electron/electron-plugin/dist/server/api/notification.js b/resources/electron/electron-plugin/dist/server/api/notification.js index 9b8f80e2..a573fed5 100644 --- a/resources/electron/electron-plugin/dist/server/api/notification.js +++ b/resources/electron/electron-plugin/dist/server/api/notification.js @@ -1,23 +1,7 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; import express from 'express'; import { Notification } from 'electron'; import { notifyLaravel } from "../utils.js"; -import fs from 'fs'; -let player; -try { - player = require('play-sound')(); -} -catch (e) { - player = null; -} +import playSoundLib from 'play-sound'; const isLocalFile = (sound) => { if (typeof sound !== 'string') return false; @@ -30,51 +14,13 @@ const normalizePath = (raw) => { return raw.replace(/^file:\/\//, ''); return raw; }; -const playSound = (sound) => __awaiter(void 0, void 0, void 0, function* () { - const filePath = normalizePath(sound); - try { - yield fs.promises.access(filePath, fs.constants.R_OK); - } - catch (err) { - return Promise.reject(new Error(`sound file not accessible: ${filePath}`)); - } - return new Promise((resolve, reject) => { - if (player) { - player.play(filePath, (err) => { - if (err) - return reject(err); - resolve(); - }); - return; - } - const { exec } = require('child_process'); - exec(`afplay ${JSON.stringify(filePath)}`, (err) => { - if (err) - return reject(err); - resolve(); - }); - }); -}); const router = express.Router(); router.post('/', (req, res) => { const { title, body, subtitle, silent, icon, hasReply, timeoutType, replyPlaceholder, sound, urgency, actions, closeButtonText, toastXml, event: customEvent, reference, } = req.body; const eventName = customEvent !== null && customEvent !== void 0 ? customEvent : '\\Native\\Desktop\\Events\\Notifications\\NotificationClicked'; const notificationReference = reference !== null && reference !== void 0 ? reference : (Date.now() + '.' + Math.random().toString(36).slice(2, 9)); const usingLocalFile = isLocalFile(sound); - const createNotification = (opts) => { - try { - if (typeof Notification === 'function') { - return new Notification(opts); - } - } - catch (e) { - } - return { - show: () => { }, - on: (_, __) => { }, - }; - }; - const notification = createNotification({ + const notification = new Notification({ title, body, subtitle, @@ -90,15 +36,14 @@ router.post('/', (req, res) => { toastXml }); if (usingLocalFile && typeof sound === 'string') { - playSound(sound).catch((err) => { - notifyLaravel('events', { - event: '\\Native\\Desktop\\Events\\Notifications\\NotificationSoundFailed', - payload: { - reference: notificationReference, - error: String(err), - }, - }); - }); + const filePath = normalizePath(sound); + try { + playSoundLib().play(filePath, () => { }); + } + catch (e) { + const { exec } = require('child_process'); + exec(`afplay "${filePath}"`, () => { }); + } } notification.on("click", (event) => { notifyLaravel('events', { From e646a579e2569026926bca39e5abf67783b17898 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Tue, 28 Oct 2025 17:37:22 +0100 Subject: [PATCH 09/13] Remove file:// and add automatic detecting of local files. --- .../electron-plugin/dist/server/api/notification.js | 12 +++--------- .../electron-plugin/src/server/api/notification.ts | 13 ++++--------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/resources/electron/electron-plugin/dist/server/api/notification.js b/resources/electron/electron-plugin/dist/server/api/notification.js index a573fed5..02e6f23c 100644 --- a/resources/electron/electron-plugin/dist/server/api/notification.js +++ b/resources/electron/electron-plugin/dist/server/api/notification.js @@ -7,12 +7,7 @@ const isLocalFile = (sound) => { return false; if (/^https?:\/\//i.test(sound)) return false; - return sound.startsWith('/') || sound.startsWith('file:') || /^[a-zA-Z]:\\/.test(sound); -}; -const normalizePath = (raw) => { - if (raw.startsWith('file://')) - return raw.replace(/^file:\/\//, ''); - return raw; + return sound.includes('/') || sound.includes('\\'); }; const router = express.Router(); router.post('/', (req, res) => { @@ -36,13 +31,12 @@ router.post('/', (req, res) => { toastXml }); if (usingLocalFile && typeof sound === 'string') { - const filePath = normalizePath(sound); try { - playSoundLib().play(filePath, () => { }); + playSoundLib().play(sound, () => { }); } catch (e) { const { exec } = require('child_process'); - exec(`afplay "${filePath}"`, () => { }); + exec(`afplay "${sound}"`, () => { }); } } notification.on("click", (event) => { diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index b87f64fc..229e5012 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -7,12 +7,8 @@ import playSoundLib from 'play-sound'; const isLocalFile = (sound: unknown) => { if (typeof sound !== 'string') return false; if (/^https?:\/\//i.test(sound)) return false; - return sound.startsWith('/') || sound.startsWith('file:') || /^[a-zA-Z]:\\/.test(sound); -}; - -const normalizePath = (raw: string) => { - if (raw.startsWith('file://')) return raw.replace(/^file:\/\//, ''); - return raw; + // Treat any string containing path separators as a local file + return sound.includes('/') || sound.includes('\\'); }; const router = express.Router(); @@ -58,12 +54,11 @@ router.post('/', (req, res) => { }); if (usingLocalFile && typeof sound === 'string') { - const filePath = normalizePath(sound); try { - playSoundLib().play(filePath, () => {}); + playSoundLib().play(sound, () => {}); } catch (e) { const { exec } = require('child_process'); - exec(`afplay "${filePath}"`, () => {}); + exec(`afplay "${sound}"`, () => {}); } } From 87946da6f3c6e245f421b3ea6a104a496b45022b Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Wed, 29 Oct 2025 09:34:49 +0100 Subject: [PATCH 10/13] Add file checking before running playSoundLib().play and remove platform specific afplay command since playSoundLib already does this --- .../electron-plugin/src/server/api/notification.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 229e5012..61e0dd11 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -3,6 +3,7 @@ import { Notification } from 'electron'; import {notifyLaravel} from "../utils.js"; declare const require: any; import playSoundLib from 'play-sound'; +import fs from 'fs'; const isLocalFile = (sound: unknown) => { if (typeof sound !== 'string') return false; @@ -54,12 +55,13 @@ router.post('/', (req, res) => { }); if (usingLocalFile && typeof sound === 'string') { - try { + fs.access(sound, fs.constants.F_OK, (err) => { + if (err) { + return; + } + playSoundLib().play(sound, () => {}); - } catch (e) { - const { exec } = require('child_process'); - exec(`afplay "${sound}"`, () => {}); - } + }); } notification.on("click", (event) => { From 48406b22c9329e9ff2473f9ff730e5de36794d07 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Wed, 29 Oct 2025 09:35:18 +0100 Subject: [PATCH 11/13] Remove redundant if case --- .../electron/electron-plugin/src/server/api/notification.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 61e0dd11..6a0d9777 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -54,7 +54,7 @@ router.post('/', (req, res) => { toastXml }); - if (usingLocalFile && typeof sound === 'string') { + if (usingLocalFile) { fs.access(sound, fs.constants.F_OK, (err) => { if (err) { return; From 8ab48e6aadd26fc6fd47d4fba803a49158d189a9 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Wed, 29 Oct 2025 09:36:43 +0100 Subject: [PATCH 12/13] Add not silent check to play audio --- .../electron/electron-plugin/src/server/api/notification.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/electron/electron-plugin/src/server/api/notification.ts b/resources/electron/electron-plugin/src/server/api/notification.ts index 6a0d9777..4cba9a19 100644 --- a/resources/electron/electron-plugin/src/server/api/notification.ts +++ b/resources/electron/electron-plugin/src/server/api/notification.ts @@ -54,7 +54,7 @@ router.post('/', (req, res) => { toastXml }); - if (usingLocalFile) { + if (usingLocalFile && !silent) { fs.access(sound, fs.constants.F_OK, (err) => { if (err) { return; From 983ae066c3e0e48eb49a9bed77a2c74edd188d05 Mon Sep 17 00:00:00 2001 From: Jibbe Winands Date: Wed, 29 Oct 2025 09:43:36 +0100 Subject: [PATCH 13/13] Build new electron version --- .../dist/server/api/notification.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/electron/electron-plugin/dist/server/api/notification.js b/resources/electron/electron-plugin/dist/server/api/notification.js index 02e6f23c..a72cad5d 100644 --- a/resources/electron/electron-plugin/dist/server/api/notification.js +++ b/resources/electron/electron-plugin/dist/server/api/notification.js @@ -2,6 +2,7 @@ import express from 'express'; import { Notification } from 'electron'; import { notifyLaravel } from "../utils.js"; import playSoundLib from 'play-sound'; +import fs from 'fs'; const isLocalFile = (sound) => { if (typeof sound !== 'string') return false; @@ -30,14 +31,13 @@ router.post('/', (req, res) => { closeButtonText, toastXml }); - if (usingLocalFile && typeof sound === 'string') { - try { + if (usingLocalFile && !silent) { + fs.access(sound, fs.constants.F_OK, (err) => { + if (err) { + return; + } playSoundLib().play(sound, () => { }); - } - catch (e) { - const { exec } = require('child_process'); - exec(`afplay "${sound}"`, () => { }); - } + }); } notification.on("click", (event) => { notifyLaravel('events', {