From 1eb79bcfa7f3eb9bbd0dbae27e98c4b85cb301e7 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Sun, 8 Sep 2024 21:59:04 +0100
Subject: [PATCH 01/52] test: add nested function exec test

---
 e2e/api.spec.ts | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/e2e/api.spec.ts b/e2e/api.spec.ts
index c9dbad50..0b87b67e 100644
--- a/e2e/api.spec.ts
+++ b/e2e/api.spec.ts
@@ -280,6 +280,15 @@ describe('execute', () => {
   it('should execute a string-based function in the electron main process', async () => {
     await expect(browser.electron.execute('return 1 + 2 + 3')).resolves.toEqual(6);
   });
+
+  it('should handle executing a function which declares a function', async () => {
+    expect(
+      await browser.execute(() => {
+        const newFunc = () => 'boom!';
+        return newFunc();
+      }),
+    ).toEqual('boom!');
+  });
 });
 
 describe('mock object functionality', () => {

From 76c97be3a87cd8d66f84d7bc0e313e864f5d2446 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Sun, 8 Sep 2024 22:03:57 +0100
Subject: [PATCH 02/52] chore: update deps

---
 apps/builder-cjs/package.json               |   18 +-
 apps/builder-esm/package.json               |   18 +-
 apps/forge-cjs/package.json                 |   16 +-
 apps/forge-esm/package.json                 |   16 +-
 apps/no-binary-cjs/package.json             |   16 +-
 apps/no-binary-esm/package.json             |   16 +-
 e2e/package.json                            |   16 +-
 package.json                                |   23 +-
 packages/@wdio_electron-types/package.json  |   10 +-
 packages/@wdio_electron-utils/package.json  |    4 +-
 packages/wdio-electron-service/package.json |   18 +-
 pnpm-lock.yaml                              | 1710 +++++++++----------
 12 files changed, 939 insertions(+), 942 deletions(-)

diff --git a/apps/builder-cjs/package.json b/apps/builder-cjs/package.json
index fd620ce9..6dfddc81 100644
--- a/apps/builder-cjs/package.json
+++ b/apps/builder-cjs/package.json
@@ -19,20 +19,20 @@
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
-    "@wdio/cli": "^9.0.7",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/local-runner": "^9.0.7",
-    "@wdio/mocha-framework": "^9.0.6",
+    "@wdio/cli": "^9.0.9",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/local-runner": "^9.0.9",
+    "@wdio/mocha-framework": "^9.0.8",
     "cross-env": "^7.0.3",
-    "electron": "^32.0.1",
-    "electron-builder": "^25.0.1",
+    "electron": "^32.0.2",
+    "electron-builder": "^25.0.5",
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
-    "rollup": "^4.21.0",
+    "rollup": "^4.21.2",
     "ts-loader": "^9.4.4",
-    "tsx": "^4.17.0",
+    "tsx": "^4.19.0",
     "typescript": "^5.5.4",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "peerDependencies": {
     "typescript": "5.2.2"
diff --git a/apps/builder-esm/package.json b/apps/builder-esm/package.json
index d0549eb0..c4cd6056 100644
--- a/apps/builder-esm/package.json
+++ b/apps/builder-esm/package.json
@@ -22,20 +22,20 @@
     "@rollup/plugin-json": "^6.1.0",
     "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
-    "@wdio/cli": "^9.0.7",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/local-runner": "^9.0.7",
-    "@wdio/mocha-framework": "^9.0.6",
+    "@wdio/cli": "^9.0.9",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/local-runner": "^9.0.9",
+    "@wdio/mocha-framework": "^9.0.8",
     "cross-env": "^7.0.3",
-    "electron": "^32.0.1",
-    "electron-builder": "^25.0.1",
+    "electron": "^32.0.2",
+    "electron-builder": "^25.0.5",
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
-    "rollup": "^4.21.0",
+    "rollup": "^4.21.2",
     "ts-loader": "^9.4.4",
-    "tsx": "^4.17.0",
+    "tsx": "^4.19.0",
     "typescript": "^5.5.4",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "peerDependencies": {
     "typescript": "5.2.2"
diff --git a/apps/forge-cjs/package.json b/apps/forge-cjs/package.json
index f851bd56..0e56eac5 100644
--- a/apps/forge-cjs/package.json
+++ b/apps/forge-cjs/package.json
@@ -21,19 +21,19 @@
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
-    "@wdio/cli": "^9.0.7",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/local-runner": "^9.0.7",
-    "@wdio/mocha-framework": "^9.0.6",
+    "@wdio/cli": "^9.0.9",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/local-runner": "^9.0.9",
+    "@wdio/mocha-framework": "^9.0.8",
     "cross-env": "^7.0.3",
-    "electron": "^32.0.1",
+    "electron": "^32.0.2",
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
-    "rollup": "^4.21.0",
+    "rollup": "^4.21.2",
     "ts-loader": "^9.4.4",
-    "tsx": "^4.17.0",
+    "tsx": "^4.19.0",
     "typescript": "^5.5.4",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "peerDependencies": {
     "typescript": "5.2.2"
diff --git a/apps/forge-esm/package.json b/apps/forge-esm/package.json
index fb41cf24..9c42e3b5 100644
--- a/apps/forge-esm/package.json
+++ b/apps/forge-esm/package.json
@@ -22,19 +22,19 @@
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
-    "@wdio/cli": "^9.0.7",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/local-runner": "^9.0.7",
-    "@wdio/mocha-framework": "^9.0.6",
+    "@wdio/cli": "^9.0.9",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/local-runner": "^9.0.9",
+    "@wdio/mocha-framework": "^9.0.8",
     "cross-env": "^7.0.3",
-    "electron": "^32.0.1",
+    "electron": "^32.0.2",
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
-    "rollup": "^4.21.0",
+    "rollup": "^4.21.2",
     "ts-loader": "^9.4.4",
-    "tsx": "^4.17.0",
+    "tsx": "^4.19.0",
     "typescript": "^5.5.4",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "peerDependencies": {
     "typescript": "5.2.2"
diff --git a/apps/no-binary-cjs/package.json b/apps/no-binary-cjs/package.json
index 7b812e2a..59b3d489 100644
--- a/apps/no-binary-cjs/package.json
+++ b/apps/no-binary-cjs/package.json
@@ -15,19 +15,19 @@
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
-    "@wdio/cli": "^9.0.7",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/local-runner": "^9.0.7",
-    "@wdio/mocha-framework": "^9.0.6",
+    "@wdio/cli": "^9.0.9",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/local-runner": "^9.0.9",
+    "@wdio/mocha-framework": "^9.0.8",
     "cross-env": "^7.0.3",
-    "electron": "^32.0.1",
+    "electron": "^32.0.2",
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
-    "rollup": "^4.21.0",
+    "rollup": "^4.21.2",
     "ts-loader": "^9.4.4",
-    "tsx": "^4.17.0",
+    "tsx": "^4.19.0",
     "typescript": "^5.5.4",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "peerDependencies": {
     "typescript": "5.2.2"
diff --git a/apps/no-binary-esm/package.json b/apps/no-binary-esm/package.json
index 64476130..037251c9 100644
--- a/apps/no-binary-esm/package.json
+++ b/apps/no-binary-esm/package.json
@@ -17,19 +17,19 @@
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
-    "@wdio/cli": "^9.0.7",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/local-runner": "^9.0.7",
-    "@wdio/mocha-framework": "^9.0.6",
+    "@wdio/cli": "^9.0.9",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/local-runner": "^9.0.9",
+    "@wdio/mocha-framework": "^9.0.8",
     "cross-env": "^7.0.3",
-    "electron": "^32.0.1",
+    "electron": "^32.0.2",
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
-    "rollup": "^4.21.0",
+    "rollup": "^4.21.2",
     "ts-loader": "^9.4.4",
-    "tsx": "^4.17.0",
+    "tsx": "^4.19.0",
     "typescript": "^5.5.4",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "peerDependencies": {
     "typescript": "5.2.2"
diff --git a/e2e/package.json b/e2e/package.json
index f2685d53..1ee34093 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -29,15 +29,15 @@
   },
   "dependencies": {
     "@testing-library/webdriverio": "^3.2.1",
-    "@wdio/cli": "^9.0.7",
+    "@wdio/cli": "^9.0.9",
     "@wdio/electron-utils": "workspace:*",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/local-runner": "^9.0.7",
-    "@wdio/mocha-framework": "^9.0.6",
-    "electron": "^32.0.1",
-    "tsx": "^4.17.0",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/local-runner": "^9.0.9",
+    "@wdio/mocha-framework": "^9.0.8",
+    "electron": "^32.0.2",
+    "tsx": "^4.19.0",
     "wdio-electron-service": "workspace:*",
-    "webdriverio": "^9.0.7",
+    "webdriverio": "^9.0.9",
     "xvfb-maybe": "^0.2.1"
   },
   "devDependencies": {
@@ -45,7 +45,7 @@
     "@types/mocha": "^10.0.6",
     "@types/node": "^20.16.1",
     "@vitest/spy": "^2.0.5",
-    "@wdio/types": "^9.0.4",
+    "@wdio/types": "^9.0.8",
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
     "read-package-up": "^11.0.0",
diff --git a/package.json b/package.json
index 17333dec..05663944 100644
--- a/package.json
+++ b/package.json
@@ -45,29 +45,30 @@
     "update:all": "pnpm up -iLr"
   },
   "devDependencies": {
-    "@eslint/js": "^9.9.0",
+    "@eslint/js": "^9.10.0",
     "@types/eslint-config-prettier": "^6.11.2",
     "@types/node": "^20.16.1",
     "@types/shelljs": "^0.8.15",
-    "@typescript-eslint/eslint-plugin": "^8.2.0",
-    "@typescript-eslint/parser": "^8.2.0",
-    "@vitest/eslint-plugin": "^1.0.3",
+    "@typescript-eslint/eslint-plugin": "^8.4.0",
+    "@typescript-eslint/parser": "^8.4.0",
+    "@vitest/eslint-plugin": "^1.1.0",
     "cross-env": "^7.0.3",
-    "eslint": "^9.9.0",
+    "eslint": "^9.10.0",
     "eslint-config-prettier": "^9.1.0",
-    "eslint-plugin-import-x": "^3.1.0",
-    "eslint-plugin-wdio": "^9.0.5",
+    "eslint-import-resolver-typescript": "^3.6.3",
+    "eslint-plugin-import-x": "^4.2.1",
+    "eslint-plugin-wdio": "^9.0.8",
     "globals": "^15.9.0",
     "husky": "^9.1.5",
     "jsdom": "^24.1.1",
-    "lint-staged": "^15.2.9",
+    "lint-staged": "^15.2.10",
     "prettier": "^3.3.3",
     "read-package-up": "^11.0.0",
     "release-it": "^17.6.0",
     "shelljs": "^0.8.5",
     "shx": "^0.3.4",
-    "tsx": "^4.17.0",
-    "turbo": "^2.0.14"
+    "tsx": "^4.19.0",
+    "turbo": "^2.1.1"
   },
   "pnpm": {
     "overrides": {
@@ -79,7 +80,7 @@
       "prettier --write"
     ]
   },
-  "packageManager": "pnpm@9.8.0+sha512.8e4c3550fb500e808dbc30bb0ce4dd1eb614e30b1c55245f211591ec2cdf9c611cabd34e1364b42f564bd54b3945ed0f49d61d1bbf2ec9bd74b866fcdc723276",
+  "packageManager": "pnpm@9.9.0+sha512.60c18acd138bff695d339be6ad13f7e936eea6745660d4cc4a776d5247c540d0edee1a563695c183a66eb917ef88f2b4feb1fc25f32a7adcadc7aaf3438e99c1",
   "release-it": {
     "git": {
       "commitMessage": "chore: release v${version}",
diff --git a/packages/@wdio_electron-types/package.json b/packages/@wdio_electron-types/package.json
index 11ad20c1..acabb9ff 100644
--- a/packages/@wdio_electron-types/package.json
+++ b/packages/@wdio_electron-types/package.json
@@ -20,14 +20,14 @@
   "devDependencies": {
     "@electron-forge/shared-types": "^7.4.0",
     "@electron/packager": "^18.3.4",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/types": "^9.0.4",
-    "builder-util": "25.0.0-alpha.10",
-    "electron": "^32.0.1",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/types": "^9.0.8",
+    "builder-util": "25.0.3",
+    "electron": "^32.0.2",
     "read-package-up": "^11.0.0",
     "release-it": "^17.6.0",
     "typescript": "^5.5.4",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "files": [
     "dist/*"
diff --git a/packages/@wdio_electron-utils/package.json b/packages/@wdio_electron-utils/package.json
index 2b2cc2f4..a103c94b 100644
--- a/packages/@wdio_electron-utils/package.json
+++ b/packages/@wdio_electron-utils/package.json
@@ -40,8 +40,8 @@
   },
   "dependencies": {
     "@electron/packager": "^18.3.4",
-    "@wdio/logger": "^9.0.4",
-    "debug": "^4.3.6",
+    "@wdio/logger": "^9.0.8",
+    "debug": "^4.3.7",
     "find-versions": "^6.0.0",
     "read-package-up": "^11.0.0"
   },
diff --git a/packages/wdio-electron-service/package.json b/packages/wdio-electron-service/package.json
index 4c44689a..ec6379f8 100644
--- a/packages/wdio-electron-service/package.json
+++ b/packages/wdio-electron-service/package.json
@@ -80,15 +80,15 @@
     "@vitest/spy": "^2.0.5",
     "@wdio/electron-types": "workspace:*",
     "@wdio/electron-utils": "workspace:*",
-    "@wdio/globals": "^9.0.7",
-    "@wdio/logger": "^9.0.4",
+    "@wdio/globals": "^9.0.9",
+    "@wdio/logger": "^9.0.8",
     "compare-versions": "^6.1.1",
-    "debug": "^4.3.6",
-    "electron-to-chromium": "^1.5.13",
+    "debug": "^4.3.7",
+    "electron-to-chromium": "^1.5.18",
     "fast-copy": "^3.0.1",
     "read-package-up": "^11.0.0",
     "tinyspy": "^3.0.0",
-    "webdriverio": "^9.0.7"
+    "webdriverio": "^9.0.9"
   },
   "devDependencies": {
     "@electron-forge/shared-types": "^7.4.0",
@@ -97,13 +97,13 @@
     "@types/debug": "^4.1.12",
     "@types/node": "^20.16.1",
     "@vitest/coverage-v8": "^2.0.5",
-    "@wdio/types": "^9.0.4",
-    "builder-util": "25.0.0-alpha.10",
-    "electron": "^32.0.1",
+    "@wdio/types": "^9.0.8",
+    "builder-util": "25.0.3",
+    "electron": "^32.0.2",
     "jsdom": "^24.1.1",
     "nock": "^14.0.0-beta.11",
     "release-it": "^17.6.0",
-    "rollup": "^4.21.0",
+    "rollup": "^4.21.2",
     "shx": "^0.3.4",
     "typescript": "^5.5.4",
     "vitest": "^2.0.5"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 74e4cbc0..1458d97f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,8 +12,8 @@ importers:
   .:
     devDependencies:
       '@eslint/js':
-        specifier: ^9.9.0
-        version: 9.9.0
+        specifier: ^9.10.0
+        version: 9.10.0
       '@types/eslint-config-prettier':
         specifier: ^6.11.2
         version: 6.11.3
@@ -24,29 +24,32 @@ importers:
         specifier: ^0.8.15
         version: 0.8.15
       '@typescript-eslint/eslint-plugin':
-        specifier: ^8.2.0
-        version: 8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4)
+        specifier: ^8.4.0
+        version: 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)
       '@typescript-eslint/parser':
-        specifier: ^8.2.0
-        version: 8.2.0(eslint@9.9.0)(typescript@5.5.4)
+        specifier: ^8.4.0
+        version: 8.4.0(eslint@9.10.0)(typescript@5.5.4)
       '@vitest/eslint-plugin':
-        specifier: ^1.0.3
-        version: 1.0.3(@typescript-eslint/utils@8.2.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))
+        specifier: ^1.1.0
+        version: 1.1.0(@typescript-eslint/utils@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       eslint:
-        specifier: ^9.9.0
-        version: 9.9.0
+        specifier: ^9.10.0
+        version: 9.10.0
       eslint-config-prettier:
         specifier: ^9.1.0
-        version: 9.1.0(eslint@9.9.0)
+        version: 9.1.0(eslint@9.10.0)
+      eslint-import-resolver-typescript:
+        specifier: ^3.6.3
+        version: 3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)
       eslint-plugin-import-x:
-        specifier: ^3.1.0
-        version: 3.1.0(eslint@9.9.0)(typescript@5.5.4)
+        specifier: ^4.2.1
+        version: 4.2.1(eslint@9.10.0)(typescript@5.5.4)
       eslint-plugin-wdio:
-        specifier: ^9.0.5
-        version: 9.0.5
+        specifier: ^9.0.8
+        version: 9.0.8
       globals:
         specifier: ^15.9.0
         version: 15.9.0
@@ -57,8 +60,8 @@ importers:
         specifier: ^24.1.1
         version: 24.1.1
       lint-staged:
-        specifier: ^15.2.9
-        version: 15.2.9
+        specifier: ^15.2.10
+        version: 15.2.10
       prettier:
         specifier: ^3.3.3
         version: 3.3.3
@@ -75,11 +78,11 @@ importers:
         specifier: ^0.3.4
         version: 0.3.4
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       turbo:
-        specifier: ^2.0.14
-        version: 2.0.14
+        specifier: ^2.1.1
+        version: 2.1.1
 
   apps/builder-cjs:
     dependencies:
@@ -89,34 +92,34 @@ importers:
     devDependencies:
       '@rollup/plugin-commonjs':
         specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.0)
+        version: 26.0.1(rollup@4.21.2)
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.0)
+        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
       '@wdio/cli':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/local-runner':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/mocha-framework':
-        specifier: ^9.0.6
-        version: 9.0.6
+        specifier: ^9.0.8
+        version: 9.0.8
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       electron-builder:
-        specifier: ^25.0.1
-        version: 25.0.4(electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4))
+        specifier: ^25.0.5
+        version: 25.0.5(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5))
       global-jsdom:
         specifier: ^24.0.0
         version: 24.0.0(jsdom@24.1.1)
@@ -124,20 +127,20 @@ importers:
         specifier: ^24.1.1
         version: 24.1.1
       rollup:
-        specifier: ^4.21.0
-        version: 4.21.0
+        specifier: ^4.21.2
+        version: 4.21.2
       ts-loader:
         specifier: ^9.4.4
         version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       typescript:
         specifier: ^5.5.4
         version: 5.5.4
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
 
   apps/builder-esm:
     dependencies:
@@ -147,37 +150,37 @@ importers:
     devDependencies:
       '@rollup/plugin-commonjs':
         specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.0)
+        version: 26.0.1(rollup@4.21.2)
       '@rollup/plugin-json':
         specifier: ^6.1.0
-        version: 6.1.0(rollup@4.21.0)
+        version: 6.1.0(rollup@4.21.2)
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.0)
+        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
       '@wdio/cli':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/local-runner':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/mocha-framework':
-        specifier: ^9.0.6
-        version: 9.0.6
+        specifier: ^9.0.8
+        version: 9.0.8
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       electron-builder:
-        specifier: ^25.0.1
-        version: 25.0.4(electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4))
+        specifier: ^25.0.5
+        version: 25.0.5(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5))
       global-jsdom:
         specifier: ^24.0.0
         version: 24.0.0(jsdom@24.1.1)
@@ -185,20 +188,20 @@ importers:
         specifier: ^24.1.1
         version: 24.1.1
       rollup:
-        specifier: ^4.21.0
-        version: 4.21.0
+        specifier: ^4.21.2
+        version: 4.21.2
       ts-loader:
         specifier: ^9.4.4
         version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       typescript:
         specifier: ^5.5.4
         version: 5.5.4
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
 
   apps/forge-cjs:
     dependencies:
@@ -211,31 +214,31 @@ importers:
         version: 7.4.0(encoding@0.1.13)
       '@rollup/plugin-commonjs':
         specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.0)
+        version: 26.0.1(rollup@4.21.2)
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.0)
+        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
       '@wdio/cli':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/local-runner':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/mocha-framework':
-        specifier: ^9.0.6
-        version: 9.0.6
+        specifier: ^9.0.8
+        version: 9.0.8
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       global-jsdom:
         specifier: ^24.0.0
         version: 24.0.0(jsdom@24.1.1)
@@ -243,20 +246,20 @@ importers:
         specifier: ^24.1.1
         version: 24.1.1
       rollup:
-        specifier: ^4.21.0
-        version: 4.21.0
+        specifier: ^4.21.2
+        version: 4.21.2
       ts-loader:
         specifier: ^9.4.4
         version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       typescript:
         specifier: ^5.5.4
         version: 5.5.4
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
 
   apps/forge-esm:
     dependencies:
@@ -269,31 +272,31 @@ importers:
         version: 7.4.0(encoding@0.1.13)
       '@rollup/plugin-commonjs':
         specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.0)
+        version: 26.0.1(rollup@4.21.2)
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.0)
+        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
       '@wdio/cli':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/local-runner':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/mocha-framework':
-        specifier: ^9.0.6
-        version: 9.0.6
+        specifier: ^9.0.8
+        version: 9.0.8
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       global-jsdom:
         specifier: ^24.0.0
         version: 24.0.0(jsdom@24.1.1)
@@ -301,20 +304,20 @@ importers:
         specifier: ^24.1.1
         version: 24.1.1
       rollup:
-        specifier: ^4.21.0
-        version: 4.21.0
+        specifier: ^4.21.2
+        version: 4.21.2
       ts-loader:
         specifier: ^9.4.4
         version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       typescript:
         specifier: ^5.5.4
         version: 5.5.4
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
 
   apps/no-binary-cjs:
     dependencies:
@@ -324,31 +327,31 @@ importers:
     devDependencies:
       '@rollup/plugin-commonjs':
         specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.0)
+        version: 26.0.1(rollup@4.21.2)
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.0)
+        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
       '@wdio/cli':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/local-runner':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/mocha-framework':
-        specifier: ^9.0.6
-        version: 9.0.6
+        specifier: ^9.0.8
+        version: 9.0.8
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       global-jsdom:
         specifier: ^24.0.0
         version: 24.0.0(jsdom@24.1.1)
@@ -356,20 +359,20 @@ importers:
         specifier: ^24.1.1
         version: 24.1.1
       rollup:
-        specifier: ^4.21.0
-        version: 4.21.0
+        specifier: ^4.21.2
+        version: 4.21.2
       ts-loader:
         specifier: ^9.4.4
         version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       typescript:
         specifier: ^5.5.4
         version: 5.5.4
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
 
   apps/no-binary-esm:
     dependencies:
@@ -379,31 +382,31 @@ importers:
     devDependencies:
       '@rollup/plugin-commonjs':
         specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.0)
+        version: 26.0.1(rollup@4.21.2)
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.0)
+        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
       '@wdio/cli':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/local-runner':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/mocha-framework':
-        specifier: ^9.0.6
-        version: 9.0.6
+        specifier: ^9.0.8
+        version: 9.0.8
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       global-jsdom:
         specifier: ^24.0.0
         version: 24.0.0(jsdom@24.1.1)
@@ -411,53 +414,53 @@ importers:
         specifier: ^24.1.1
         version: 24.1.1
       rollup:
-        specifier: ^4.21.0
-        version: 4.21.0
+        specifier: ^4.21.2
+        version: 4.21.2
       ts-loader:
         specifier: ^9.4.4
         version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       typescript:
         specifier: ^5.5.4
         version: 5.5.4
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
 
   e2e:
     dependencies:
       '@testing-library/webdriverio':
         specifier: ^3.2.1
-        version: 3.2.1(webdriverio@9.0.7)
+        version: 3.2.1(webdriverio@9.0.9)
       '@wdio/cli':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/electron-utils':
         specifier: workspace:*
         version: link:../packages/@wdio_electron-utils
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/local-runner':
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       '@wdio/mocha-framework':
-        specifier: ^9.0.6
-        version: 9.0.6
+        specifier: ^9.0.8
+        version: 9.0.8
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       tsx:
-        specifier: ^4.17.0
-        version: 4.17.0
+        specifier: ^4.19.0
+        version: 4.19.0
       wdio-electron-service:
         specifier: workspace:*
         version: link:../packages/wdio-electron-service
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
       xvfb-maybe:
         specifier: ^0.2.1
         version: 0.2.1
@@ -475,8 +478,8 @@ importers:
         specifier: ^2.0.5
         version: 2.0.5
       '@wdio/types':
-        specifier: ^9.0.4
-        version: 9.0.4
+        specifier: ^9.0.8
+        version: 9.0.8
       global-jsdom:
         specifier: ^24.0.0
         version: 24.0.0(jsdom@24.1.1)
@@ -506,17 +509,17 @@ importers:
         specifier: ^18.3.4
         version: 18.3.4
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/types':
-        specifier: ^9.0.4
-        version: 9.0.4
+        specifier: ^9.0.8
+        version: 9.0.8
       builder-util:
-        specifier: 25.0.0-alpha.10
-        version: 25.0.0-alpha.10
+        specifier: 25.0.3
+        version: 25.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       read-package-up:
         specifier: ^11.0.0
         version: 11.0.0
@@ -527,8 +530,8 @@ importers:
         specifier: ^5.5.4
         version: 5.5.4
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
 
   packages/@wdio_electron-utils:
     dependencies:
@@ -536,11 +539,11 @@ importers:
         specifier: ^18.3.4
         version: 18.3.4
       '@wdio/logger':
-        specifier: ^9.0.4
-        version: 9.0.4
+        specifier: ^9.0.8
+        version: 9.0.8
       debug:
-        specifier: ^4.3.6
-        version: 4.3.6(supports-color@8.1.1)
+        specifier: ^4.3.7
+        version: 4.3.7(supports-color@8.1.1)
       find-versions:
         specifier: ^6.0.0
         version: 6.0.0
@@ -588,20 +591,20 @@ importers:
         specifier: workspace:*
         version: link:../@wdio_electron-utils
       '@wdio/globals':
-        specifier: ^9.0.7
-        version: 9.0.7(@wdio/logger@9.0.4)
+        specifier: ^9.0.9
+        version: 9.0.9(@wdio/logger@9.0.8)
       '@wdio/logger':
-        specifier: ^9.0.4
-        version: 9.0.4
+        specifier: ^9.0.8
+        version: 9.0.8
       compare-versions:
         specifier: ^6.1.1
         version: 6.1.1
       debug:
-        specifier: ^4.3.6
-        version: 4.3.6(supports-color@8.1.1)
+        specifier: ^4.3.7
+        version: 4.3.7(supports-color@8.1.1)
       electron-to-chromium:
-        specifier: ^1.5.13
-        version: 1.5.13
+        specifier: ^1.5.18
+        version: 1.5.18
       fast-copy:
         specifier: ^3.0.1
         version: 3.0.2
@@ -612,18 +615,18 @@ importers:
         specifier: ^3.0.0
         version: 3.0.0
       webdriverio:
-        specifier: ^9.0.7
-        version: 9.0.7
+        specifier: ^9.0.9
+        version: 9.0.9
     devDependencies:
       '@electron-forge/shared-types':
         specifier: ^7.4.0
         version: 7.4.0
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.0)
+        version: 15.2.3(rollup@4.21.2)
       '@testing-library/webdriverio':
         specifier: ^3.2.1
-        version: 3.2.1(webdriverio@9.0.7)
+        version: 3.2.1(webdriverio@9.0.9)
       '@types/debug':
         specifier: ^4.1.12
         version: 4.1.12
@@ -634,14 +637,14 @@ importers:
         specifier: ^2.0.5
         version: 2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))
       '@wdio/types':
-        specifier: ^9.0.4
-        version: 9.0.4
+        specifier: ^9.0.8
+        version: 9.0.8
       builder-util:
-        specifier: 25.0.0-alpha.10
-        version: 25.0.0-alpha.10
+        specifier: 25.0.3
+        version: 25.0.3
       electron:
-        specifier: ^32.0.1
-        version: 32.0.1
+        specifier: ^32.0.2
+        version: 32.0.2
       jsdom:
         specifier: ^24.1.1
         version: 24.1.1
@@ -652,8 +655,8 @@ importers:
         specifier: ^17.6.0
         version: 17.6.0(typescript@5.5.4)
       rollup:
-        specifier: ^4.21.0
-        version: 4.21.0
+        specifier: ^4.21.2
+        version: 4.21.2
       shx:
         specifier: ^0.3.4
         version: 0.3.4
@@ -1099,22 +1102,26 @@ packages:
     resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
 
-  '@eslint/config-array@0.17.1':
-    resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==}
+  '@eslint/config-array@0.18.0':
+    resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@eslint/eslintrc@3.1.0':
     resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@eslint/js@9.9.0':
-    resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==}
+  '@eslint/js@9.10.0':
+    resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@eslint/object-schema@2.1.4':
     resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@eslint/plugin-kit@0.1.0':
+    resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@gar/promisify@1.1.3':
     resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
 
@@ -1129,60 +1136,60 @@ packages:
   '@iarna/toml@2.2.5':
     resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==}
 
-  '@inquirer/checkbox@2.4.7':
-    resolution: {integrity: sha512-5YwCySyV1UEgqzz34gNsC38eKxRBtlRDpJLlKcRtTjlYA/yDKuc1rfw+hjw+2WJxbAZtaDPsRl5Zk7J14SBoBw==}
+  '@inquirer/checkbox@2.5.0':
+    resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==}
     engines: {node: '>=18'}
 
-  '@inquirer/confirm@3.1.22':
-    resolution: {integrity: sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==}
+  '@inquirer/confirm@3.2.0':
+    resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==}
     engines: {node: '>=18'}
 
-  '@inquirer/core@9.0.10':
-    resolution: {integrity: sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==}
+  '@inquirer/core@9.1.0':
+    resolution: {integrity: sha512-RZVfH//2ytTjmaBIzeKT1zefcQZzuruwkpTwwbe/i2jTl4o9M+iML5ChULzz6iw1Ok8iUBBsRCjY2IEbD8Ft4w==}
     engines: {node: '>=18'}
 
-  '@inquirer/editor@2.1.22':
-    resolution: {integrity: sha512-K1QwTu7GCK+nKOVRBp5HY9jt3DXOfPGPr6WRDrPImkcJRelG9UTx2cAtK1liXmibRrzJlTWOwqgWT3k2XnS62w==}
+  '@inquirer/editor@2.2.0':
+    resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==}
     engines: {node: '>=18'}
 
-  '@inquirer/expand@2.1.22':
-    resolution: {integrity: sha512-wTZOBkzH+ItPuZ3ZPa9lynBsdMp6kQ9zbjVPYEtSBG7UulGjg2kQiAnUjgyG4SlntpTce5bOmXAPvE4sguXjpA==}
+  '@inquirer/expand@2.3.0':
+    resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==}
     engines: {node: '>=18'}
 
   '@inquirer/figures@1.0.5':
     resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==}
     engines: {node: '>=18'}
 
-  '@inquirer/input@2.2.9':
-    resolution: {integrity: sha512-7Z6N+uzkWM7+xsE+3rJdhdG/+mQgejOVqspoW+w0AbSZnL6nq5tGMEVASaYVWbkoSzecABWwmludO2evU3d31g==}
+  '@inquirer/input@2.3.0':
+    resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==}
     engines: {node: '>=18'}
 
-  '@inquirer/number@1.0.10':
-    resolution: {integrity: sha512-kWTxRF8zHjQOn2TJs+XttLioBih6bdc5CcosXIzZsrTY383PXI35DuhIllZKu7CdXFi2rz2BWPN9l0dPsvrQOA==}
+  '@inquirer/number@1.1.0':
+    resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==}
     engines: {node: '>=18'}
 
-  '@inquirer/password@2.1.22':
-    resolution: {integrity: sha512-5Fxt1L9vh3rAKqjYwqsjU4DZsEvY/2Gll+QkqR4yEpy6wvzLxdSgFhUcxfDAOtO4BEoTreWoznC0phagwLU5Kw==}
+  '@inquirer/password@2.2.0':
+    resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==}
     engines: {node: '>=18'}
 
-  '@inquirer/prompts@5.3.8':
-    resolution: {integrity: sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==}
+  '@inquirer/prompts@5.5.0':
+    resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==}
     engines: {node: '>=18'}
 
-  '@inquirer/rawlist@2.2.4':
-    resolution: {integrity: sha512-pb6w9pWrm7EfnYDgQObOurh2d2YH07+eDo3xQBsNAM2GRhliz6wFXGi1thKQ4bN6B0xDd6C3tBsjdr3obsCl3Q==}
+  '@inquirer/rawlist@2.3.0':
+    resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==}
     engines: {node: '>=18'}
 
-  '@inquirer/search@1.0.7':
-    resolution: {integrity: sha512-p1wpV+3gd1eST/o5N3yQpYEdFNCzSP0Klrl+5bfD3cTTz8BGG6nf4Z07aBW0xjlKIj1Rp0y3x/X4cZYi6TfcLw==}
+  '@inquirer/search@1.1.0':
+    resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==}
     engines: {node: '>=18'}
 
-  '@inquirer/select@2.4.7':
-    resolution: {integrity: sha512-JH7XqPEkBpNWp3gPCqWqY8ECbyMoFcCZANlL6pV9hf59qK6dGmkOlx1ydyhY+KZ0c5X74+W6Mtp+nm2QX0/MAQ==}
+  '@inquirer/select@2.5.0':
+    resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==}
     engines: {node: '>=18'}
 
-  '@inquirer/type@1.5.2':
-    resolution: {integrity: sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==}
+  '@inquirer/type@1.5.3':
+    resolution: {integrity: sha512-xUQ14WQGR/HK5ei+2CvgcwoH9fQ4PgPGmVFSN0pc1+fVyDL3MREhyAY7nxEErSu6CkllBM3D7e3e+kOvtu+eIg==}
     engines: {node: '>=18'}
 
   '@isaacs/cliui@8.0.2':
@@ -1250,6 +1257,10 @@ packages:
     resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
     engines: {node: '>= 8'}
 
+  '@nolyfill/is-core-module@1.0.39':
+    resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+    engines: {node: '>=12.4.0'}
+
   '@npmcli/fs@2.1.2':
     resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==}
     engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -1336,11 +1347,11 @@ packages:
     resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==}
     engines: {node: '>=12'}
 
-  '@promptbook/utils@0.67.0-1':
-    resolution: {integrity: sha512-3+wYtiuLPY3Nabaql9Xp9JG0uI/enE29TKtJda2KlACxt6Wp2ZHo+0f0QtF2xegC+cBP5nkrSEMswFuHJoFbng==}
+  '@promptbook/utils@0.70.0-1':
+    resolution: {integrity: sha512-qd2lLRRN+sE6UuNMi2tEeUUeb4zmXnxY5EMdfHVXNE+bqBDpUC7/aEfXgA3jnUXEr+xFjQ8PTFQgWvBMaKvw0g==}
 
-  '@puppeteer/browsers@2.3.1':
-    resolution: {integrity: sha512-uK7o3hHkK+naEobMSJ+2ySYyXtQkBxIH8Gn4MK9ciePjNV+Pf+PgY/W7iPzn2MTjl3stcYB5AlcTmPYw7AXDwA==}
+  '@puppeteer/browsers@2.4.0':
+    resolution: {integrity: sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -1380,83 +1391,83 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/rollup-android-arm-eabi@4.21.0':
-    resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==}
+  '@rollup/rollup-android-arm-eabi@4.21.2':
+    resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==}
     cpu: [arm]
     os: [android]
 
-  '@rollup/rollup-android-arm64@4.21.0':
-    resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==}
+  '@rollup/rollup-android-arm64@4.21.2':
+    resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==}
     cpu: [arm64]
     os: [android]
 
-  '@rollup/rollup-darwin-arm64@4.21.0':
-    resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==}
+  '@rollup/rollup-darwin-arm64@4.21.2':
+    resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==}
     cpu: [arm64]
     os: [darwin]
 
-  '@rollup/rollup-darwin-x64@4.21.0':
-    resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==}
+  '@rollup/rollup-darwin-x64@4.21.2':
+    resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==}
     cpu: [x64]
     os: [darwin]
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.21.0':
-    resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==}
+  '@rollup/rollup-linux-arm-gnueabihf@4.21.2':
+    resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm-musleabihf@4.21.0':
-    resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==}
+  '@rollup/rollup-linux-arm-musleabihf@4.21.2':
+    resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==}
     cpu: [arm]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-gnu@4.21.0':
-    resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==}
+  '@rollup/rollup-linux-arm64-gnu@4.21.2':
+    resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-arm64-musl@4.21.0':
-    resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==}
+  '@rollup/rollup-linux-arm64-musl@4.21.2':
+    resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==}
     cpu: [arm64]
     os: [linux]
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.21.0':
-    resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==}
+  '@rollup/rollup-linux-powerpc64le-gnu@4.21.2':
+    resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==}
     cpu: [ppc64]
     os: [linux]
 
-  '@rollup/rollup-linux-riscv64-gnu@4.21.0':
-    resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==}
+  '@rollup/rollup-linux-riscv64-gnu@4.21.2':
+    resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==}
     cpu: [riscv64]
     os: [linux]
 
-  '@rollup/rollup-linux-s390x-gnu@4.21.0':
-    resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==}
+  '@rollup/rollup-linux-s390x-gnu@4.21.2':
+    resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==}
     cpu: [s390x]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-gnu@4.21.0':
-    resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==}
+  '@rollup/rollup-linux-x64-gnu@4.21.2':
+    resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-linux-x64-musl@4.21.0':
-    resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==}
+  '@rollup/rollup-linux-x64-musl@4.21.2':
+    resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==}
     cpu: [x64]
     os: [linux]
 
-  '@rollup/rollup-win32-arm64-msvc@4.21.0':
-    resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==}
+  '@rollup/rollup-win32-arm64-msvc@4.21.2':
+    resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==}
     cpu: [arm64]
     os: [win32]
 
-  '@rollup/rollup-win32-ia32-msvc@4.21.0':
-    resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==}
+  '@rollup/rollup-win32-ia32-msvc@4.21.2':
+    resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==}
     cpu: [ia32]
     os: [win32]
 
-  '@rollup/rollup-win32-x64-msvc@4.21.0':
-    resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==}
+  '@rollup/rollup-win32-x64-msvc@4.21.2':
+    resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==}
     cpu: [x64]
     os: [win32]
 
@@ -1560,8 +1571,11 @@ packages:
   '@types/node@20.16.1':
     resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==}
 
-  '@types/node@22.5.0':
-    resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==}
+  '@types/node@20.16.5':
+    resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==}
+
+  '@types/node@22.5.4':
+    resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==}
 
   '@types/normalize-package-data@2.4.4':
     resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -1605,8 +1619,8 @@ packages:
   '@types/yauzl@2.10.3':
     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
 
-  '@typescript-eslint/eslint-plugin@8.2.0':
-    resolution: {integrity: sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==}
+  '@typescript-eslint/eslint-plugin@8.4.0':
+    resolution: {integrity: sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@@ -1616,8 +1630,8 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/parser@8.2.0':
-    resolution: {integrity: sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==}
+  '@typescript-eslint/parser@8.4.0':
+    resolution: {integrity: sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -1626,16 +1640,12 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/scope-manager@7.18.0':
-    resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
-    engines: {node: ^18.18.0 || >=20.0.0}
-
-  '@typescript-eslint/scope-manager@8.2.0':
-    resolution: {integrity: sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==}
+  '@typescript-eslint/scope-manager@8.4.0':
+    resolution: {integrity: sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/type-utils@8.2.0':
-    resolution: {integrity: sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==}
+  '@typescript-eslint/type-utils@8.4.0':
+    resolution: {integrity: sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '*'
@@ -1643,25 +1653,12 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/types@7.18.0':
-    resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
-    engines: {node: ^18.18.0 || >=20.0.0}
-
-  '@typescript-eslint/types@8.2.0':
-    resolution: {integrity: sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==}
+  '@typescript-eslint/types@8.4.0':
+    resolution: {integrity: sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/typescript-estree@7.18.0':
-    resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
-    engines: {node: ^18.18.0 || >=20.0.0}
-    peerDependencies:
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-
-  '@typescript-eslint/typescript-estree@8.2.0':
-    resolution: {integrity: sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==}
+  '@typescript-eslint/typescript-estree@8.4.0':
+    resolution: {integrity: sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '*'
@@ -1669,24 +1666,14 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/utils@7.18.0':
-    resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==}
-    engines: {node: ^18.18.0 || >=20.0.0}
-    peerDependencies:
-      eslint: ^8.56.0
-
-  '@typescript-eslint/utils@8.2.0':
-    resolution: {integrity: sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==}
+  '@typescript-eslint/utils@8.4.0':
+    resolution: {integrity: sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
 
-  '@typescript-eslint/visitor-keys@7.18.0':
-    resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
-    engines: {node: ^18.18.0 || >=20.0.0}
-
-  '@typescript-eslint/visitor-keys@8.2.0':
-    resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==}
+  '@typescript-eslint/visitor-keys@8.4.0':
+    resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@vitest/coverage-v8@2.0.5':
@@ -1694,8 +1681,8 @@ packages:
     peerDependencies:
       vitest: 2.0.5
 
-  '@vitest/eslint-plugin@1.0.3':
-    resolution: {integrity: sha512-7hTONh+lqN+TEimHy2aWVdHVqYohcxLGD4yYBwSVvhyiti/j9CqBNMQvOa6xLoVcEtaWAoCCDbYgvxwNqA4lsA==}
+  '@vitest/eslint-plugin@1.1.0':
+    resolution: {integrity: sha512-Ur80Y27Wbw8gFHJ3cv6vypcjXmrx6QHfw+q435h6Q2L+tf+h4Xf5pJTCL4YU/Jps9EVeggQxS85OcUZU7sdXRw==}
     peerDependencies:
       '@typescript-eslint/utils': '>= 8.0'
       eslint: '>= 8.57.0'
@@ -1730,53 +1717,53 @@ packages:
   '@vitest/utils@2.0.5':
     resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
 
-  '@wdio/cli@9.0.7':
-    resolution: {integrity: sha512-2f4gI5v+Xz3Bzed4OTeV9apLO0wQONWp/TTPOmNJ1I0I87fF/eDy7lQp6p6Cohw1Ytis+ItGDXdZQ1NOF+vatw==}
-    engines: {node: '>=18'}
+  '@wdio/cli@9.0.9':
+    resolution: {integrity: sha512-/sY0pMpLhsnhWpWovG81F/PqYmC7EluskrUhQ8/7BW1XDcNkUminCsd685HgAqPE3nX6Npx1oRhCbNDL/7Z7pw==}
+    engines: {node: '>=18.20.0'}
     hasBin: true
 
-  '@wdio/config@9.0.6':
-    resolution: {integrity: sha512-WsACM5QjT3ZsoPVqHroYt8pOkZx4/6PTdNKm45VL8NHhQe5w9IFbl1fKxFHQ7ZkPI3F+EFvFvubO8puJ0OcSmQ==}
-    engines: {node: '>=18'}
+  '@wdio/config@9.0.8':
+    resolution: {integrity: sha512-37L+hd+A1Nyehd/pgfTrLC6w+Ngbu0CIoFh9Vv6v8Cgu5Hih0TLofvlg+J1BNbcTd5eQ2tFKZBDeFMhQaIiTpg==}
+    engines: {node: '>=18.20.0'}
 
-  '@wdio/globals@9.0.7':
-    resolution: {integrity: sha512-3p/xKmK+TVN9k6zSULLP3GvlaF3Rl5Y5Ts/+ch1z7ZbKNDyXLnUTn0KxT78aIGmIASOxO/8Cby5Vd4K5byPzbA==}
-    engines: {node: '>=18'}
+  '@wdio/globals@9.0.9':
+    resolution: {integrity: sha512-Lmzf82NoNK+i+Z6slt/Ueu0iOfHMLMNxxWnvoC+en3g8A1xj2JxAinC4ymrc0iFC3uvG0SxMWlpVmGTk78wp2Q==}
+    engines: {node: '>=18.20.0'}
 
-  '@wdio/local-runner@9.0.7':
-    resolution: {integrity: sha512-0ptiSVE6sm+ct5sblX6b4Fah2AA7VSLslkVdxeSmYUbAGxalq9H9/fw2FKO07xDfFJDM8eolJAphHNnICX+5Uw==}
-    engines: {node: '>=18'}
+  '@wdio/local-runner@9.0.9':
+    resolution: {integrity: sha512-cqhCqHHO9PnH51+buvXd0ck3FB0HCnqPQLe/SLZuGI5tzywK1X7wFKlcAHkmqCPyu3xdV2mh8QZTEL4k8ayzsw==}
+    engines: {node: '>=18.20.0'}
 
   '@wdio/logger@8.38.0':
     resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==}
     engines: {node: ^16.13 || >=18}
 
-  '@wdio/logger@9.0.4':
-    resolution: {integrity: sha512-b6gcu0PTVb3fgK4kyAH/k5UUWN5FOUdAfhA4PAY/IZvxZTMFYMqnrZb0WRWWWqL6nu9pcrOVtCOdPBvj0cb+Nw==}
-    engines: {node: '>=18'}
+  '@wdio/logger@9.0.8':
+    resolution: {integrity: sha512-uIyYIDBwLczmsp9JE5hN3ME8Xg+9WNBfSNXD69ICHrY9WPTzFf94UeTuavK7kwSKF3ro2eJbmNZItYOfnoovnw==}
+    engines: {node: '>=18.20.0'}
 
-  '@wdio/mocha-framework@9.0.6':
-    resolution: {integrity: sha512-V9VNRPlPOsnlU63CWmGFSSw2QcZii1YuXw//vlst4Adl91FMAmqr6ikZ7flmX/bYunQokJxcpow7irnSYYevGQ==}
-    engines: {node: '>=18'}
+  '@wdio/mocha-framework@9.0.8':
+    resolution: {integrity: sha512-0zwnyybxN8zxeOaFsjCpqdcvZIyzb8QglZorQ17VH9GR0/giMtcRbC4usYJgh4W37e1FCwvyvQyij93JYSSkNA==}
+    engines: {node: '>=18.20.0'}
 
-  '@wdio/protocols@9.0.4':
-    resolution: {integrity: sha512-T9v8Jkp94NxLLil5J7uJ/+YHk5/7fhOggzGcN+LvuCHS6jbJFZ/11c4SUEuXw27Yqk01fFXPBbF6TwcTTOuW/Q==}
+  '@wdio/protocols@9.0.8':
+    resolution: {integrity: sha512-xRH54byFf623/w/KW62xkf/C2mGyigSfMm+UT3tNEAd5ZA9X2VAWQWQBPzdcrsck7Fxk4zlQX8Kb34RSs7Cy4Q==}
 
-  '@wdio/repl@9.0.4':
-    resolution: {integrity: sha512-5Bc5ARjWA7t6MZNnVJ9WvO1iDsy6iOsrSDWiP7APWAdaF/SJCP3SFE2c+PdQJpJWhr2Kk0fRGuyDM+GdsmZhwg==}
-    engines: {node: '>=18'}
+  '@wdio/repl@9.0.8':
+    resolution: {integrity: sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==}
+    engines: {node: '>=18.20.0'}
 
-  '@wdio/runner@9.0.7':
-    resolution: {integrity: sha512-jIRY3GRJHMJ6cl/0ws9Nz1kq5YN/29+BpvHUTc2yNZz8KjEiz59hwFk+gzSj9HZDyYrhFV5O01BXEMxxgwJXeQ==}
-    engines: {node: '>=18'}
+  '@wdio/runner@9.0.9':
+    resolution: {integrity: sha512-DIyFSt/mF7EVyFvgKztVAzf7lfunXsMxfYm3Hqjxgh0IQXJfjvOFKmT+R/T61tTHyzHHsx0JBQTu12WqHkNQtA==}
+    engines: {node: '>=18.20.0'}
 
-  '@wdio/types@9.0.4':
-    resolution: {integrity: sha512-MN7O4Uk3zPWvkN8d6SNdIjd7qHUlTxS7j0QfRPu6TdlYbHu6BJJ8Rr84y7GcUzCnTAJ1nOIpvUyR8MY3hOaVKg==}
-    engines: {node: '>=18'}
+  '@wdio/types@9.0.8':
+    resolution: {integrity: sha512-pmz2iRWddTanrv8JC7v3wUGm17KRv2WyyJhQfklMSANn9V1ep6pw1RJG2WJnKq4NojMvH1nVv1sMZxXrYPhpYw==}
+    engines: {node: '>=18.20.0'}
 
-  '@wdio/utils@9.0.6':
-    resolution: {integrity: sha512-cnPXeW/sfqyKFuRRmADRZDNvFwEBMr7j7wwWLO6q5opoW++dwOdJW4WV0wDZbPcXTtGFCSrGCDLLdGcTAWMb3A==}
-    engines: {node: '>=18'}
+  '@wdio/utils@9.0.8':
+    resolution: {integrity: sha512-p3EgOdkhCvMxJFd3WTtSChqYFQu2mz69/5tOsljDaL+4QYwnRR7O8M9wFsL3/9XMVcHdnC4Ija2VRxQ/lb+hHQ==}
+    engines: {node: '>=18.20.0'}
 
   '@webassemblyjs/ast@1.12.1':
     resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==}
@@ -1833,8 +1820,8 @@ packages:
   '@xtuc/long@4.2.2':
     resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
 
-  '@zip.js/zip.js@2.7.51':
-    resolution: {integrity: sha512-RKHaebzZZgQkUuzb49/qweN69e8Np9AUZ9QygydDIrbG1njypSAKwkeqIVeuf2JVGBDyB7Z9HKvzPgYrSlv9gw==}
+  '@zip.js/zip.js@2.7.52':
+    resolution: {integrity: sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==}
     engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'}
 
   abbrev@1.1.1:
@@ -1930,18 +1917,15 @@ packages:
     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
     engines: {node: '>= 8'}
 
-  app-builder-bin@5.0.0-alpha.4:
-    resolution: {integrity: sha512-4MitKmOtfTdMONrtRoiaqJ6HtlVZXgrNX1PNdEzEHSAoXU85x7s+mo0IhAS9K9qgjyTVuLrM1E/HAMp5qGyoOA==}
-
   app-builder-bin@5.0.0-alpha.7:
     resolution: {integrity: sha512-ww2mK4ITUvqisnqOuUWAeHzokpPidyZ7a0ZkwW+V7sF5/Pdi2OldkRjAWqEzn6Xtmj3SLVT84as4wB59A6jJ4g==}
 
-  app-builder-lib@25.0.4:
-    resolution: {integrity: sha512-dPskHgKtvg5Z9flycOY81Sjyn7Nmc3t8nKk4t1JsRxBwjGKTYVpXsJ/x/U86TACMQ9xJS0HsJLGYnHoJvR1vMw==}
+  app-builder-lib@25.0.5:
+    resolution: {integrity: sha512-rxgxMx1f7I4ZAP0jA5+5iB7X6x6MJvGF7GauRzQBnIVihwXX2HOiAE7yenyY9Ry5YAiH47MnCxdq413Wq6XOcQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
-      dmg-builder: 25.0.4
-      electron-builder-squirrel-windows: 25.0.4
+      dmg-builder: 25.0.5
+      electron-builder-squirrel-windows: 25.0.5
 
   aproba@2.0.0:
     resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
@@ -1984,10 +1968,6 @@ packages:
     resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
     engines: {node: '>= 0.4'}
 
-  array-union@2.1.0:
-    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
-    engines: {node: '>=8'}
-
   assert-plus@1.0.0:
     resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
     engines: {node: '>=0.8'}
@@ -2038,17 +2018,17 @@ packages:
   bare-events@2.4.2:
     resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==}
 
-  bare-fs@2.3.1:
-    resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==}
+  bare-fs@2.3.3:
+    resolution: {integrity: sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==}
 
-  bare-os@2.4.0:
-    resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==}
+  bare-os@2.4.2:
+    resolution: {integrity: sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg==}
 
   bare-path@2.1.3:
     resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==}
 
-  bare-stream@2.1.3:
-    resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==}
+  bare-stream@2.2.1:
+    resolution: {integrity: sha512-YTB47kHwBW9zSG8LD77MIBAAQXjU2WjAkMHeeb7hUplVs6+IoM5I7uEVQNPMB7lj9r8I76UMdoMkGnCodHOLqg==}
 
   base64-js@1.5.1:
     resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -2121,13 +2101,6 @@ packages:
     resolution: {integrity: sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==}
     engines: {node: '>=12.0.0'}
 
-  builder-util-runtime@9.2.5-alpha.3:
-    resolution: {integrity: sha512-ugXSJSbYBpaYeXpk2Rxa2QZdT67oRz3FFu3Lud4XK0Ijqe+OXwyAyCM4pGXJEO3VSdUn43AOJ5bUZ3gsCdQAIw==}
-    engines: {node: '>=12.0.0'}
-
-  builder-util@25.0.0-alpha.10:
-    resolution: {integrity: sha512-SrlawYIKu6UZOPWCGlbzVqbgv81jkeUPlrZbbdGb8ERIHuGR9HjnnQs7FV1QR2TKMjRsg/47I8UDtudj16qldg==}
-
   builder-util@25.0.3:
     resolution: {integrity: sha512-eH5c1ukdY2xjtFQWQ6jlzEuXuqcuAVc3UQ6V6fdYu9Kg3CkDbCR82Mox42uaJDmee9WXSbP/88cOworFdOHPhw==}
 
@@ -2179,8 +2152,8 @@ packages:
     resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
     engines: {node: '>=14.16'}
 
-  caniuse-lite@1.0.30001651:
-    resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==}
+  caniuse-lite@1.0.30001658:
+    resolution: {integrity: sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==}
 
   chai@5.1.1:
     resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
@@ -2255,8 +2228,8 @@ packages:
     resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
     engines: {node: '>=6'}
 
-  cli-spinners@3.1.0:
-    resolution: {integrity: sha512-2MH0N34TpDAs9ROPVkZJfBWFoYfv4zfkJF14PBHY4v/qRY75SLcm4WaEKNCLScsXieosa/tY/+slJ+BDswJxHQ==}
+  cli-spinners@3.2.0:
+    resolution: {integrity: sha512-pXftdQloMZzjCr3pCTIRniDcys6dDzgpgVhAHHk6TKBDbRuP1MkuetTF5KSv4YUutbOPa7+7ZrAJ2kVtbMqyXA==}
     engines: {node: '>=18.20'}
 
   cli-truncate@2.1.0:
@@ -2475,6 +2448,15 @@ packages:
       supports-color:
         optional: true
 
+  debug@4.3.7:
+    resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
   decamelize@4.0.0:
     resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
     engines: {node: '>=10'}
@@ -2576,12 +2558,8 @@ packages:
   dir-compare@4.2.0:
     resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==}
 
-  dir-glob@3.0.1:
-    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
-    engines: {node: '>=8'}
-
-  dmg-builder@25.0.4:
-    resolution: {integrity: sha512-BqQDX4vUEDlxEX+uD4CfNPLswXzMA1JPORU99oHGdyDU9j8+RsRf44WzkHp5KbI5FNwynlZbfCPdDCLubRPkeA==}
+  dmg-builder@25.0.5:
+    resolution: {integrity: sha512-ocnZV44ZqInoSFaY54fF7BlCtw+WtbrjyPrkBhaB+Ztn7GPKjmFgRbIKytifJ8h9Cib8jdFRMgjCUtkU45Y6DA==}
 
   dmg-license@1.0.11:
     resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==}
@@ -2637,22 +2615,22 @@ packages:
     engines: {node: '>=0.10.0'}
     hasBin: true
 
-  electron-builder-squirrel-windows@25.0.4:
-    resolution: {integrity: sha512-WKHq4iOGq+W4s/r+edbdO/tpkRuPXlsanEL0vl76kLLqW2aT7TIC09OoeCcfsFWRZLX3kpHOX/VycGJbsSCeGQ==}
+  electron-builder-squirrel-windows@25.0.5:
+    resolution: {integrity: sha512-N2U7LGSdt4hmEhjEeIV2XJbjj2YIrTL6enfsGKfOhGTpL6GEejUmT3gjdKUqKBS5+NBx0GWhnEwD3MpO2P6Nfg==}
 
-  electron-builder@25.0.4:
-    resolution: {integrity: sha512-+F3qRL0NpAH5WbFB6BHEo+/KZLS0M/t9awfUf7YqD64yZrWUAojvPtjERG3x/8loihuHEo407ak7RsN64LC4zA==}
+  electron-builder@25.0.5:
+    resolution: {integrity: sha512-Uj5LFRbUqNiVajsgqcwlKe+CHtwubK3hcoJsW5C2YiWodej2mmxM+LrTqga0rrWWHVMNmrcmGcS/WHpKwy6KEw==}
     engines: {node: '>=14.0.0'}
     hasBin: true
 
   electron-publish@25.0.3:
     resolution: {integrity: sha512-wSGm+TFK2lArswIFBPLuIRHbo945s3MCvG5y1xVC57zL/PsrElUkaGH2ERtRrcKNpaDNq77rDA9JnMJhAFJjUg==}
 
-  electron-to-chromium@1.5.13:
-    resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==}
+  electron-to-chromium@1.5.18:
+    resolution: {integrity: sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==}
 
-  electron@32.0.1:
-    resolution: {integrity: sha512-5Hd5Jaf9niYVR2hZxoRd3gOrcxPOxQV1XPV5WaoSfT9jLJHFadhlKtuSDIk3U6rQZke+aC7GqPPAv55nWFCMsA==}
+  electron@32.0.2:
+    resolution: {integrity: sha512-nmZblq8wW3HZ17MAyaUuiMI9Mb0Cgc7UR3To85h/rVopbfyF5s34NxtK4gvyRfYPxpDGP4k+HoQIPniPPrdE3w==}
     engines: {node: '>= 12.20.55'}
     hasBin: true
 
@@ -2723,8 +2701,8 @@ packages:
     engines: {node: '>=18'}
     hasBin: true
 
-  escalade@3.1.2:
-    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+  escalade@3.2.0:
+    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
     engines: {node: '>=6'}
 
   escape-goat@4.0.0:
@@ -2757,15 +2735,49 @@ packages:
   eslint-import-resolver-node@0.3.9:
     resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
 
-  eslint-plugin-import-x@3.1.0:
-    resolution: {integrity: sha512-/UbPA+bYY7nIxcjL3kpcDY3UNdoLHFhyBFzHox2M0ypcUoueTn6woZUUmzzi5et/dXChksasYYFeKE2wshOrhg==}
-    engines: {node: '>=16'}
+  eslint-import-resolver-typescript@3.6.3:
+    resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==}
+    engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
-      eslint: ^8.56.0 || ^9.0.0-0
+      eslint: '*'
+      eslint-plugin-import: '*'
+      eslint-plugin-import-x: '*'
+    peerDependenciesMeta:
+      eslint-plugin-import:
+        optional: true
+      eslint-plugin-import-x:
+        optional: true
 
-  eslint-plugin-wdio@9.0.5:
-    resolution: {integrity: sha512-bt7DD7N6PlKs0O5keoKkSLiP/hP0RMh03J2b9k5SKyTs+9+QPaJ5PgYIkWSgW3tMln5CvEJrKRXzNSHHTWWwyA==}
-    engines: {node: '>=18'}
+  eslint-module-utils@2.11.0:
+    resolution: {integrity: sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: '*'
+      eslint-import-resolver-node: '*'
+      eslint-import-resolver-typescript: '*'
+      eslint-import-resolver-webpack: '*'
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+      eslint:
+        optional: true
+      eslint-import-resolver-node:
+        optional: true
+      eslint-import-resolver-typescript:
+        optional: true
+      eslint-import-resolver-webpack:
+        optional: true
+
+  eslint-plugin-import-x@4.2.1:
+    resolution: {integrity: sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+
+  eslint-plugin-wdio@9.0.8:
+    resolution: {integrity: sha512-aCWjI3p1H+AFpiJhcybGMSXqtBUkoVbpZcYhDawb4JWFhHAF8J8bdyanPYvDLoyOKVN4zJ3AFb8G4qxKXq8qXA==}
+    engines: {node: '>=18.20.0'}
 
   eslint-scope@5.1.1:
     resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
@@ -2783,8 +2795,8 @@ packages:
     resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  eslint@9.9.0:
-    resolution: {integrity: sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==}
+  eslint@9.10.0:
+    resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     hasBin: true
     peerDependencies:
@@ -2859,13 +2871,13 @@ packages:
     resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
     engines: {node: '>=0.10.0'}
 
-  expect-webdriverio@5.0.1:
-    resolution: {integrity: sha512-tYJaXtu5qQr/oEXzDKoVzyA/g2wyeE1YsuVJQC8/bKnp1lX3I4NQ2Yb9u1rJ9vdpFha6pki8PzHlTk5PVZBQWQ==}
+  expect-webdriverio@5.0.2:
+    resolution: {integrity: sha512-vkUwoUvURH25pRClX1I5oCIObju8cT9kN5jQH4RN5QxKXK7hdowYd8dbDXD5JKOE/OutdYx67YtCl8vpZq/uSg==}
     engines: {node: '>=18 || >=20 || >=22'}
     peerDependencies:
-      '@wdio/globals': ^9.0.0-alpha.350
-      '@wdio/logger': ^9.0.0-alpha.350
-      webdriverio: ^9.0.0-alpha.350
+      '@wdio/globals': ^9.0.0
+      '@wdio/logger': ^9.0.0
+      webdriverio: ^9.0.0
 
   expect@29.7.0:
     resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
@@ -2909,8 +2921,8 @@ packages:
   fast-levenshtein@2.0.6:
     resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
 
-  fast-xml-parser@4.4.1:
-    resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==}
+  fast-xml-parser@4.5.0:
+    resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==}
     hasBin: true
 
   fastq@1.17.1:
@@ -3058,8 +3070,8 @@ packages:
     resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==}
     engines: {node: '>= 4.0.0'}
 
-  geckodriver@4.4.3:
-    resolution: {integrity: sha512-79rvaq8pvKVUtuM9XBjQApb04kOVkl3TFRX+zTt1wlmL+wqpt85ocWCdqiENU/3zIzg2Me21eClUcnE7F1kL2w==}
+  geckodriver@4.4.4:
+    resolution: {integrity: sha512-0zaw19tcmWeluqx7+Y559JGBtidu1D0Lb8ElYKiNEQu8r3sCfrLUf5V10xypl8u29ZLbgRV7WflxCJVTCkCMFA==}
     engines: {node: ^16.13 || >=18 || >=20}
     hasBin: true
 
@@ -3109,8 +3121,8 @@ packages:
     resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
     engines: {node: '>=18'}
 
-  get-tsconfig@4.7.6:
-    resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==}
+  get-tsconfig@4.8.0:
+    resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==}
 
   get-uri@6.0.3:
     resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==}
@@ -3184,10 +3196,6 @@ packages:
     resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
     engines: {node: '>= 0.4'}
 
-  globby@11.1.0:
-    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
-    engines: {node: '>=10'}
-
   globby@14.0.2:
     resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==}
     engines: {node: '>=18'}
@@ -3394,8 +3402,8 @@ packages:
     resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
 
-  inquirer@10.1.8:
-    resolution: {integrity: sha512-syxGpOzLyqVeZi1KDBjRTnCn5PiGWySGHP0BbqXbqsEK0ckkZk3egAepEWslUjZXj0rhkUapVXM/IpADWe4D6w==}
+  inquirer@10.2.2:
+    resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==}
     engines: {node: '>=18'}
 
   inquirer@9.3.2:
@@ -3444,6 +3452,9 @@ packages:
     resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
     engines: {node: '>=6'}
 
+  is-bun-module@1.2.1:
+    resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==}
+
   is-callable@1.2.7:
     resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
     engines: {node: '>= 0.4'}
@@ -3793,8 +3804,8 @@ packages:
     resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
-  lint-staged@15.2.9:
-    resolution: {integrity: sha512-BZAt8Lk3sEnxw7tfxM7jeZlPRuT4M68O0/CwZhhaw6eeWu0Lz5eERE3m386InivXB64fp/mDID452h48tvKlRQ==}
+  lint-staged@15.2.10:
+    resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==}
     engines: {node: '>=18.12.0'}
     hasBin: true
 
@@ -3814,8 +3825,8 @@ packages:
     resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
     engines: {node: '>=6.11.5'}
 
-  locate-app@2.4.29:
-    resolution: {integrity: sha512-L5qRv+/CTfoIdcEuM4yogtkEVwrXgFBL9B5OLFaMOfXtwOcn5A4Q7CBBE7xolxEaNWJeW1W2ks0XuAcs+wv0/A==}
+  locate-app@2.4.39:
+    resolution: {integrity: sha512-hl7NwJrpGKLlmVgNrMRxFLRJTjve6IIav08bnv4MQSjahFRUPPVp+R02PSYpll6wY/YZqMrha68uScTmRJeMeA==}
 
   locate-path@2.0.0:
     resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
@@ -3915,8 +3926,8 @@ packages:
   loglevel-plugin-prefix@0.8.4:
     resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==}
 
-  loglevel@1.9.1:
-    resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==}
+  loglevel@1.9.2:
+    resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==}
     engines: {node: '>= 0.6.0'}
 
   loupe@3.1.1:
@@ -3986,6 +3997,10 @@ packages:
     resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
     engines: {node: '>=8.6'}
 
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
   mime-db@1.52.0:
     resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
     engines: {node: '>= 0.6'}
@@ -4441,10 +4456,6 @@ packages:
     resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==}
     engines: {node: '>=4'}
 
-  path-type@4.0.0:
-    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
-    engines: {node: '>=8'}
-
   path-type@5.0.0:
     resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==}
     engines: {node: '>=12'}
@@ -4470,6 +4481,9 @@ packages:
   picocolors@1.0.1:
     resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
 
+  picocolors@1.1.0:
+    resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+
   picomatch@2.3.1:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
     engines: {node: '>=8.6'}
@@ -4776,8 +4790,8 @@ packages:
     resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
     engines: {node: '>=8.0'}
 
-  rollup@4.21.0:
-    resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==}
+  rollup@4.21.2:
+    resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
@@ -5034,8 +5048,8 @@ packages:
     resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==}
     engines: {node: '>= 0.10.0'}
 
-  streamx@2.19.0:
-    resolution: {integrity: sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==}
+  streamx@2.20.0:
+    resolution: {integrity: sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==}
 
   strict-event-emitter@0.5.1:
     resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
@@ -5262,43 +5276,46 @@ packages:
   tslib@2.6.3:
     resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
 
-  tsx@4.17.0:
-    resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==}
+  tslib@2.7.0:
+    resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+
+  tsx@4.19.0:
+    resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==}
     engines: {node: '>=18.0.0'}
     hasBin: true
 
-  turbo-darwin-64@2.0.14:
-    resolution: {integrity: sha512-kwfDmjNwlNfvtrvT29+ZBg5n1Wvxl891bFHchMJyzMoR0HOE9N1NSNdSZb9wG3e7sYNIu4uDkNk+VBEqJW0HzQ==}
+  turbo-darwin-64@2.1.1:
+    resolution: {integrity: sha512-aYNuJpZlCoi0Htd79fl/2DywpewGKijdXeOfg9KzNuPVKzSMYlAXuAlNGh0MKjiOcyqxQGL7Mq9LFhwA0VpDpQ==}
     cpu: [x64]
     os: [darwin]
 
-  turbo-darwin-arm64@2.0.14:
-    resolution: {integrity: sha512-m3LXYEshCx3wc4ZClM6gb01KYpFmtjQ9IBF3A7ofjb6ahux3xlYZJZ3uFCLAGHuvGLuJ3htfiPbwlDPTdknqqw==}
+  turbo-darwin-arm64@2.1.1:
+    resolution: {integrity: sha512-tifJKD8yHY48rHXPMcM8o1jI/Jk2KCaXiNjTKvvy9Zsim61BZksNVLelIbrRoCGwAN6PUBZO2lGU5iL/TQJ5Pw==}
     cpu: [arm64]
     os: [darwin]
 
-  turbo-linux-64@2.0.14:
-    resolution: {integrity: sha512-7vBzCPdoTtR92SNn2JMgj1FlMmyonGmpMaQdgAB1OVYtuQ6NVGoh7/lODfaILqXjpvmFSVbpBIDrKOT6EvcprQ==}
+  turbo-linux-64@2.1.1:
+    resolution: {integrity: sha512-Js6d/bSQe9DuV9c7ITXYpsU/ADzFHABdz1UIHa7Oqjj9VOEbFeA9WpAn0c+mdJrVD+IXJFbbDZUjN7VYssmtcg==}
     cpu: [x64]
     os: [linux]
 
-  turbo-linux-arm64@2.0.14:
-    resolution: {integrity: sha512-jwH+c0bfjpBf26K/tdEFatmnYyXwGROjbr6bZmNcL8R+IkGAc/cglL+OToqJnQZTgZvH7uDGbeSyUo7IsHyjuA==}
+  turbo-linux-arm64@2.1.1:
+    resolution: {integrity: sha512-LidzTCq0yvQ+N8w8Qub9FmhQ/mmEIeoqFi7DSupekEV2EjvE9jw/zYc9Pk67X+g7dHVfgOnvVzmrjChdxpFePw==}
     cpu: [arm64]
     os: [linux]
 
-  turbo-windows-64@2.0.14:
-    resolution: {integrity: sha512-w9/XwkHSzvLjmioo6cl3S1yRfI6swxsV1j1eJwtl66JM4/pn0H2rBa855R0n7hZnmI6H5ywLt/nLt6Ae8RTDmw==}
+  turbo-windows-64@2.1.1:
+    resolution: {integrity: sha512-GKc9ZywKwy4xLDhwXd6H07yzl0TB52HjXMrFLyHGhCVnf/w0oq4sLJv2sjbvuarPjsyx4xnCBJ3m3oyL2XmFtA==}
     cpu: [x64]
     os: [win32]
 
-  turbo-windows-arm64@2.0.14:
-    resolution: {integrity: sha512-XaQlyYk+Rf4xS5XWCo8XCMIpssgGGy8blzLfolN6YBp4baElIWMlkLZHDbGyiFmCbNf9I9gJI64XGRG+LVyyjA==}
+  turbo-windows-arm64@2.1.1:
+    resolution: {integrity: sha512-oFKkMj11KKUv3xSK9/fhAEQTxLUp1Ol1EOktwc32+SFtEU0uls7kosAz0b+qe8k3pJGEMFdDPdqoEjyJidbxtQ==}
     cpu: [arm64]
     os: [win32]
 
-  turbo@2.0.14:
-    resolution: {integrity: sha512-00JjdCMD/cpsjP0Izkjcm8Oaor5yUCfDwODtaLb+WyblyadkaDEisGhy3Dbd5az9n+5iLSPiUgf+WjPbns6MRg==}
+  turbo@2.1.1:
+    resolution: {integrity: sha512-u9gUDkmR9dFS8b5kAYqIETK4OnzsS4l2ragJ0+soSMHh6VEeNHjTfSjk1tKxCqLyziCrPogadxP680J+v6yGHw==}
     hasBin: true
 
   type-check@0.4.0:
@@ -5333,6 +5350,10 @@ packages:
     resolution: {integrity: sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==}
     engines: {node: '>=16'}
 
+  type-fest@4.26.1:
+    resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==}
+    engines: {node: '>=16'}
+
   typedarray-to-buffer@3.1.5:
     resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
 
@@ -5507,13 +5528,13 @@ packages:
     resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
     engines: {node: '>= 8'}
 
-  webdriver@9.0.7:
-    resolution: {integrity: sha512-0PN4omqCGlgi3RG0LyrQXr0RUmlDCenNtpN+dfzikfYoV+CHiCw2GMnZp2XCuYUnU01MaCKgRQxLuGobyZov+A==}
-    engines: {node: '>=18'}
+  webdriver@9.0.8:
+    resolution: {integrity: sha512-UnV0ANriSTUgypGk0pz8lApeQuHt+72WEDQG5hFwkkSvggtKLyWdT7+PQkNoXvDajTmiLIqUOq8XPI/Pm71rtw==}
+    engines: {node: '>=18.20.0'}
 
-  webdriverio@9.0.7:
-    resolution: {integrity: sha512-/6CvJkKpUWYbX/59PNJCHXGLPwulQ/bXZwlIUrsF6MWKdf8Eb6yTaXkMJBaBy5x496b50PQcXkbe+qpfsnqXsg==}
-    engines: {node: '>=18'}
+  webdriverio@9.0.9:
+    resolution: {integrity: sha512-IwvKzhcJ9NjOL55xwj27uTTKkfxsg77dmAfqoKFSP5dQ70JzU+NgxiALEjjWQDybtt1yGIkHk7wjjxjboMU1uw==}
+    engines: {node: '>=18.20.0'}
     peerDependencies:
       puppeteer-core: ^22.3.0
     peerDependenciesMeta:
@@ -5667,8 +5688,8 @@ packages:
   yallist@4.0.0:
     resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
 
-  yaml@2.5.0:
-    resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==}
+  yaml@2.5.1:
+    resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
     engines: {node: '>= 14'}
     hasBin: true
 
@@ -5777,7 +5798,7 @@ snapshots:
       '@electron/get': 3.1.0
       chalk: 4.1.2
       commander: 4.1.1
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       fs-extra: 10.1.0
       listr2: 7.0.2
       semver: 7.6.3
@@ -5792,7 +5813,7 @@ snapshots:
       '@electron/rebuild': 3.6.0
       '@malept/cross-spawn-promise': 2.0.0
       chalk: 4.1.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       find-up: 5.0.0
       fs-extra: 10.1.0
       log-symbols: 4.1.0
@@ -5820,7 +5841,7 @@ snapshots:
       '@electron/rebuild': 3.6.0
       '@malept/cross-spawn-promise': 2.0.0
       chalk: 4.1.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       fast-glob: 3.3.2
       filenamify: 4.3.0
       find-up: 5.0.0
@@ -5881,7 +5902,7 @@ snapshots:
     dependencies:
       '@electron-forge/shared-types': 7.4.0
       '@malept/cross-spawn-promise': 2.0.0
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 10.1.0
       username: 5.1.0
     transitivePeerDependencies:
@@ -5936,7 +5957,7 @@ snapshots:
 
   '@electron/get@2.0.3':
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       env-paths: 2.2.1
       fs-extra: 8.1.0
       got: 11.8.6
@@ -5950,7 +5971,7 @@ snapshots:
 
   '@electron/get@3.1.0':
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       env-paths: 2.2.1
       fs-extra: 8.1.0
       got: 11.8.6
@@ -5964,7 +5985,7 @@ snapshots:
 
   '@electron/notarize@2.3.2':
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 9.1.0
       promise-retry: 2.0.1
     transitivePeerDependencies:
@@ -5972,7 +5993,7 @@ snapshots:
 
   '@electron/notarize@2.4.0':
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       fs-extra: 9.1.0
       promise-retry: 2.0.1
     transitivePeerDependencies:
@@ -5981,7 +6002,7 @@ snapshots:
   '@electron/osx-sign@1.3.1':
     dependencies:
       compare-version: 0.1.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       fs-extra: 10.1.0
       isbinaryfile: 4.0.10
       minimist: 1.2.8
@@ -5997,7 +6018,7 @@ snapshots:
       '@electron/osx-sign': 1.3.1
       '@electron/universal': 2.0.1
       '@electron/windows-sign': 1.1.3
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       extract-zip: 2.0.1
       filenamify: 4.3.0
       fs-extra: 11.2.0
@@ -6017,7 +6038,7 @@ snapshots:
     dependencies:
       '@malept/cross-spawn-promise': 2.0.0
       chalk: 4.1.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       detect-libc: 2.0.3
       fs-extra: 10.1.0
       got: 11.8.6
@@ -6037,7 +6058,7 @@ snapshots:
     dependencies:
       '@electron/asar': 3.2.10
       '@malept/cross-spawn-promise': 2.0.0
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       dir-compare: 4.2.0
       fs-extra: 11.2.0
       minimatch: 9.0.5
@@ -6048,7 +6069,7 @@ snapshots:
   '@electron/windows-sign@1.1.3':
     dependencies:
       cross-dirname: 0.1.0
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       fs-extra: 11.2.0
       minimist: 1.2.8
       postject: 1.0.0-alpha.6
@@ -6196,17 +6217,17 @@ snapshots:
   '@esbuild/win32-x64@0.23.1':
     optional: true
 
-  '@eslint-community/eslint-utils@4.4.0(eslint@9.9.0)':
+  '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0)':
     dependencies:
-      eslint: 9.9.0
+      eslint: 9.10.0
       eslint-visitor-keys: 3.4.3
 
   '@eslint-community/regexpp@4.11.0': {}
 
-  '@eslint/config-array@0.17.1':
+  '@eslint/config-array@0.18.0':
     dependencies:
       '@eslint/object-schema': 2.1.4
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       minimatch: 3.1.2
     transitivePeerDependencies:
       - supports-color
@@ -6214,7 +6235,7 @@ snapshots:
   '@eslint/eslintrc@3.1.0':
     dependencies:
       ajv: 6.12.6
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       espree: 10.1.0
       globals: 14.0.0
       ignore: 5.3.2
@@ -6225,10 +6246,14 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@eslint/js@9.9.0': {}
+  '@eslint/js@9.10.0': {}
 
   '@eslint/object-schema@2.1.4': {}
 
+  '@eslint/plugin-kit@0.1.0':
+    dependencies:
+      levn: 0.4.1
+
   '@gar/promisify@1.1.3': {}
 
   '@humanwhocodes/module-importer@1.0.1': {}
@@ -6237,25 +6262,25 @@ snapshots:
 
   '@iarna/toml@2.2.5': {}
 
-  '@inquirer/checkbox@2.4.7':
+  '@inquirer/checkbox@2.5.0':
     dependencies:
-      '@inquirer/core': 9.0.10
+      '@inquirer/core': 9.1.0
       '@inquirer/figures': 1.0.5
-      '@inquirer/type': 1.5.2
+      '@inquirer/type': 1.5.3
       ansi-escapes: 4.3.2
       yoctocolors-cjs: 2.1.2
 
-  '@inquirer/confirm@3.1.22':
+  '@inquirer/confirm@3.2.0':
     dependencies:
-      '@inquirer/core': 9.0.10
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/type': 1.5.3
 
-  '@inquirer/core@9.0.10':
+  '@inquirer/core@9.1.0':
     dependencies:
       '@inquirer/figures': 1.0.5
-      '@inquirer/type': 1.5.2
+      '@inquirer/type': 1.5.3
       '@types/mute-stream': 0.0.4
-      '@types/node': 22.5.0
+      '@types/node': 22.5.4
       '@types/wrap-ansi': 3.0.0
       ansi-escapes: 4.3.2
       cli-spinners: 2.9.2
@@ -6266,71 +6291,71 @@ snapshots:
       wrap-ansi: 6.2.0
       yoctocolors-cjs: 2.1.2
 
-  '@inquirer/editor@2.1.22':
+  '@inquirer/editor@2.2.0':
     dependencies:
-      '@inquirer/core': 9.0.10
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/type': 1.5.3
       external-editor: 3.1.0
 
-  '@inquirer/expand@2.1.22':
+  '@inquirer/expand@2.3.0':
     dependencies:
-      '@inquirer/core': 9.0.10
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/type': 1.5.3
       yoctocolors-cjs: 2.1.2
 
   '@inquirer/figures@1.0.5': {}
 
-  '@inquirer/input@2.2.9':
+  '@inquirer/input@2.3.0':
     dependencies:
-      '@inquirer/core': 9.0.10
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/type': 1.5.3
 
-  '@inquirer/number@1.0.10':
+  '@inquirer/number@1.1.0':
     dependencies:
-      '@inquirer/core': 9.0.10
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/type': 1.5.3
 
-  '@inquirer/password@2.1.22':
+  '@inquirer/password@2.2.0':
     dependencies:
-      '@inquirer/core': 9.0.10
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/type': 1.5.3
       ansi-escapes: 4.3.2
 
-  '@inquirer/prompts@5.3.8':
+  '@inquirer/prompts@5.5.0':
     dependencies:
-      '@inquirer/checkbox': 2.4.7
-      '@inquirer/confirm': 3.1.22
-      '@inquirer/editor': 2.1.22
-      '@inquirer/expand': 2.1.22
-      '@inquirer/input': 2.2.9
-      '@inquirer/number': 1.0.10
-      '@inquirer/password': 2.1.22
-      '@inquirer/rawlist': 2.2.4
-      '@inquirer/search': 1.0.7
-      '@inquirer/select': 2.4.7
+      '@inquirer/checkbox': 2.5.0
+      '@inquirer/confirm': 3.2.0
+      '@inquirer/editor': 2.2.0
+      '@inquirer/expand': 2.3.0
+      '@inquirer/input': 2.3.0
+      '@inquirer/number': 1.1.0
+      '@inquirer/password': 2.2.0
+      '@inquirer/rawlist': 2.3.0
+      '@inquirer/search': 1.1.0
+      '@inquirer/select': 2.5.0
 
-  '@inquirer/rawlist@2.2.4':
+  '@inquirer/rawlist@2.3.0':
     dependencies:
-      '@inquirer/core': 9.0.10
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/type': 1.5.3
       yoctocolors-cjs: 2.1.2
 
-  '@inquirer/search@1.0.7':
+  '@inquirer/search@1.1.0':
     dependencies:
-      '@inquirer/core': 9.0.10
+      '@inquirer/core': 9.1.0
       '@inquirer/figures': 1.0.5
-      '@inquirer/type': 1.5.2
+      '@inquirer/type': 1.5.3
       yoctocolors-cjs: 2.1.2
 
-  '@inquirer/select@2.4.7':
+  '@inquirer/select@2.5.0':
     dependencies:
-      '@inquirer/core': 9.0.10
+      '@inquirer/core': 9.1.0
       '@inquirer/figures': 1.0.5
-      '@inquirer/type': 1.5.2
+      '@inquirer/type': 1.5.3
       ansi-escapes: 4.3.2
       yoctocolors-cjs: 2.1.2
 
-  '@inquirer/type@1.5.2':
+  '@inquirer/type@1.5.3':
     dependencies:
       mute-stream: 1.0.0
 
@@ -6390,7 +6415,7 @@ snapshots:
 
   '@malept/flatpak-bundler@0.4.0':
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 9.1.0
       lodash: 4.17.21
       tmp-promise: 3.0.3
@@ -6418,6 +6443,8 @@ snapshots:
       '@nodelib/fs.scandir': 2.1.5
       fastq: 1.17.1
 
+  '@nolyfill/is-core-module@1.0.39': {}
+
   '@npmcli/fs@2.1.2':
     dependencies:
       '@gar/promisify': 1.1.3
@@ -6515,13 +6542,13 @@ snapshots:
       '@pnpm/network.ca-file': 1.0.2
       config-chain: 1.1.13
 
-  '@promptbook/utils@0.67.0-1':
+  '@promptbook/utils@0.70.0-1':
     dependencies:
       spacetrim: 0.11.39
 
-  '@puppeteer/browsers@2.3.1':
+  '@puppeteer/browsers@2.4.0':
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       extract-zip: 2.0.1
       progress: 2.0.3
       proxy-agent: 6.4.0
@@ -6532,88 +6559,88 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@rollup/plugin-commonjs@26.0.1(rollup@4.21.0)':
+  '@rollup/plugin-commonjs@26.0.1(rollup@4.21.2)':
     dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
+      '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
       commondir: 1.0.1
       estree-walker: 2.0.2
       glob: 10.4.5
       is-reference: 1.2.1
       magic-string: 0.30.11
     optionalDependencies:
-      rollup: 4.21.0
+      rollup: 4.21.2
 
-  '@rollup/plugin-json@6.1.0(rollup@4.21.0)':
+  '@rollup/plugin-json@6.1.0(rollup@4.21.2)':
     dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
+      '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
     optionalDependencies:
-      rollup: 4.21.0
+      rollup: 4.21.2
 
-  '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.0)':
+  '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.2)':
     dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
+      '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
       '@types/resolve': 1.20.2
       deepmerge: 4.3.1
       is-builtin-module: 3.2.1
       is-module: 1.0.0
       resolve: 1.22.8
     optionalDependencies:
-      rollup: 4.21.0
+      rollup: 4.21.2
 
-  '@rollup/pluginutils@5.1.0(rollup@4.21.0)':
+  '@rollup/pluginutils@5.1.0(rollup@4.21.2)':
     dependencies:
       '@types/estree': 1.0.5
       estree-walker: 2.0.2
       picomatch: 2.3.1
     optionalDependencies:
-      rollup: 4.21.0
+      rollup: 4.21.2
 
-  '@rollup/rollup-android-arm-eabi@4.21.0':
+  '@rollup/rollup-android-arm-eabi@4.21.2':
     optional: true
 
-  '@rollup/rollup-android-arm64@4.21.0':
+  '@rollup/rollup-android-arm64@4.21.2':
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.21.0':
+  '@rollup/rollup-darwin-arm64@4.21.2':
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.21.0':
+  '@rollup/rollup-darwin-x64@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.21.0':
+  '@rollup/rollup-linux-arm-gnueabihf@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.21.0':
+  '@rollup/rollup-linux-arm-musleabihf@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.21.0':
+  '@rollup/rollup-linux-arm64-gnu@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.21.0':
+  '@rollup/rollup-linux-arm64-musl@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.21.0':
+  '@rollup/rollup-linux-powerpc64le-gnu@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.21.0':
+  '@rollup/rollup-linux-riscv64-gnu@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.21.0':
+  '@rollup/rollup-linux-s390x-gnu@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.21.0':
+  '@rollup/rollup-linux-x64-gnu@4.21.2':
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.21.0':
+  '@rollup/rollup-linux-x64-musl@4.21.2':
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.21.0':
+  '@rollup/rollup-win32-arm64-msvc@4.21.2':
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.21.0':
+  '@rollup/rollup-win32-ia32-msvc@4.21.2':
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.21.0':
+  '@rollup/rollup-win32-x64-msvc@4.21.2':
     optional: true
 
   '@sec-ant/readable-stream@0.4.1': {}
@@ -6647,12 +6674,12 @@ snapshots:
       lz-string: 1.5.0
       pretty-format: 27.5.1
 
-  '@testing-library/webdriverio@3.2.1(webdriverio@9.0.7)':
+  '@testing-library/webdriverio@3.2.1(webdriverio@9.0.9)':
     dependencies:
       '@babel/runtime': 7.25.4
       '@testing-library/dom': 8.20.1
       simmerjs: 0.5.6
-      webdriverio: 9.0.7
+      webdriverio: 9.0.9
 
   '@tootallnate/once@2.0.0': {}
 
@@ -6716,7 +6743,11 @@ snapshots:
     dependencies:
       undici-types: 6.19.8
 
-  '@types/node@22.5.0':
+  '@types/node@20.16.5':
+    dependencies:
+      undici-types: 6.19.8
+
+  '@types/node@22.5.4':
     dependencies:
       undici-types: 6.19.8
 
@@ -6765,15 +6796,15 @@ snapshots:
       '@types/node': 20.16.1
     optional: true
 
-  '@typescript-eslint/eslint-plugin@8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4)':
+  '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)':
     dependencies:
       '@eslint-community/regexpp': 4.11.0
-      '@typescript-eslint/parser': 8.2.0(eslint@9.9.0)(typescript@5.5.4)
-      '@typescript-eslint/scope-manager': 8.2.0
-      '@typescript-eslint/type-utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4)
-      '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4)
-      '@typescript-eslint/visitor-keys': 8.2.0
-      eslint: 9.9.0
+      '@typescript-eslint/parser': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      '@typescript-eslint/scope-manager': 8.4.0
+      '@typescript-eslint/type-utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      '@typescript-eslint/visitor-keys': 8.4.0
+      eslint: 9.10.0
       graphemer: 1.4.0
       ignore: 5.3.2
       natural-compare: 1.4.0
@@ -6783,34 +6814,29 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.2.0(eslint@9.9.0)(typescript@5.5.4)':
+  '@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.2.0
-      '@typescript-eslint/types': 8.2.0
-      '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4)
-      '@typescript-eslint/visitor-keys': 8.2.0
-      debug: 4.3.6(supports-color@8.1.1)
-      eslint: 9.9.0
+      '@typescript-eslint/scope-manager': 8.4.0
+      '@typescript-eslint/types': 8.4.0
+      '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4)
+      '@typescript-eslint/visitor-keys': 8.4.0
+      debug: 4.3.7(supports-color@8.1.1)
+      eslint: 9.10.0
     optionalDependencies:
       typescript: 5.5.4
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@7.18.0':
+  '@typescript-eslint/scope-manager@8.4.0':
     dependencies:
-      '@typescript-eslint/types': 7.18.0
-      '@typescript-eslint/visitor-keys': 7.18.0
+      '@typescript-eslint/types': 8.4.0
+      '@typescript-eslint/visitor-keys': 8.4.0
 
-  '@typescript-eslint/scope-manager@8.2.0':
+  '@typescript-eslint/type-utils@8.4.0(eslint@9.10.0)(typescript@5.5.4)':
     dependencies:
-      '@typescript-eslint/types': 8.2.0
-      '@typescript-eslint/visitor-keys': 8.2.0
-
-  '@typescript-eslint/type-utils@8.2.0(eslint@9.9.0)(typescript@5.5.4)':
-    dependencies:
-      '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4)
-      '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4)
-      debug: 4.3.6(supports-color@8.1.1)
+      '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4)
+      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      debug: 4.3.7(supports-color@8.1.1)
       ts-api-utils: 1.3.0(typescript@5.5.4)
     optionalDependencies:
       typescript: 5.5.4
@@ -6818,31 +6844,14 @@ snapshots:
       - eslint
       - supports-color
 
-  '@typescript-eslint/types@7.18.0': {}
-
-  '@typescript-eslint/types@8.2.0': {}
+  '@typescript-eslint/types@8.4.0': {}
 
-  '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)':
+  '@typescript-eslint/typescript-estree@8.4.0(typescript@5.5.4)':
     dependencies:
-      '@typescript-eslint/types': 7.18.0
-      '@typescript-eslint/visitor-keys': 7.18.0
-      debug: 4.3.6(supports-color@8.1.1)
-      globby: 11.1.0
-      is-glob: 4.0.3
-      minimatch: 9.0.5
-      semver: 7.6.3
-      ts-api-utils: 1.3.0(typescript@5.5.4)
-    optionalDependencies:
-      typescript: 5.5.4
-    transitivePeerDependencies:
-      - supports-color
-
-  '@typescript-eslint/typescript-estree@8.2.0(typescript@5.5.4)':
-    dependencies:
-      '@typescript-eslint/types': 8.2.0
-      '@typescript-eslint/visitor-keys': 8.2.0
-      debug: 4.3.6(supports-color@8.1.1)
-      globby: 11.1.0
+      '@typescript-eslint/types': 8.4.0
+      '@typescript-eslint/visitor-keys': 8.4.0
+      debug: 4.3.7(supports-color@8.1.1)
+      fast-glob: 3.3.2
       is-glob: 4.0.3
       minimatch: 9.0.5
       semver: 7.6.3
@@ -6852,43 +6861,27 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@7.18.0(eslint@9.9.0)(typescript@5.5.4)':
-    dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0)
-      '@typescript-eslint/scope-manager': 7.18.0
-      '@typescript-eslint/types': 7.18.0
-      '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4)
-      eslint: 9.9.0
-    transitivePeerDependencies:
-      - supports-color
-      - typescript
-
-  '@typescript-eslint/utils@8.2.0(eslint@9.9.0)(typescript@5.5.4)':
+  '@typescript-eslint/utils@8.4.0(eslint@9.10.0)(typescript@5.5.4)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0)
-      '@typescript-eslint/scope-manager': 8.2.0
-      '@typescript-eslint/types': 8.2.0
-      '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4)
-      eslint: 9.9.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0)
+      '@typescript-eslint/scope-manager': 8.4.0
+      '@typescript-eslint/types': 8.4.0
+      '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4)
+      eslint: 9.10.0
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  '@typescript-eslint/visitor-keys@7.18.0':
+  '@typescript-eslint/visitor-keys@8.4.0':
     dependencies:
-      '@typescript-eslint/types': 7.18.0
-      eslint-visitor-keys: 3.4.3
-
-  '@typescript-eslint/visitor-keys@8.2.0':
-    dependencies:
-      '@typescript-eslint/types': 8.2.0
+      '@typescript-eslint/types': 8.4.0
       eslint-visitor-keys: 3.4.3
 
   '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 0.2.3
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       istanbul-lib-coverage: 3.2.2
       istanbul-lib-report: 3.0.1
       istanbul-lib-source-maps: 5.0.6
@@ -6902,11 +6895,11 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/eslint-plugin@1.0.3(@typescript-eslint/utils@8.2.0(eslint@9.9.0)(typescript@5.5.4))(eslint@9.9.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))':
+  '@vitest/eslint-plugin@1.1.0(@typescript-eslint/utils@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))':
     dependencies:
-      eslint: 9.9.0
+      eslint: 9.10.0
     optionalDependencies:
-      '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4)
+      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
       typescript: 5.5.4
       vitest: 2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6)
 
@@ -6949,32 +6942,32 @@ snapshots:
       loupe: 3.1.1
       tinyrainbow: 1.2.0
 
-  '@wdio/cli@9.0.7':
+  '@wdio/cli@9.0.9':
     dependencies:
       '@types/node': 20.16.1
       '@vitest/snapshot': 1.6.0
-      '@wdio/config': 9.0.6
-      '@wdio/globals': 9.0.7(@wdio/logger@9.0.4)
-      '@wdio/logger': 9.0.4
-      '@wdio/protocols': 9.0.4
-      '@wdio/types': 9.0.4
-      '@wdio/utils': 9.0.6
+      '@wdio/config': 9.0.8
+      '@wdio/globals': 9.0.9(@wdio/logger@9.0.8)
+      '@wdio/logger': 9.0.8
+      '@wdio/protocols': 9.0.8
+      '@wdio/types': 9.0.8
+      '@wdio/utils': 9.0.8
       async-exit-hook: 2.0.1
       chalk: 5.3.0
       chokidar: 3.6.0
-      cli-spinners: 3.1.0
+      cli-spinners: 3.2.0
       dotenv: 16.4.5
       ejs: 3.1.10
       execa: 9.3.1
       import-meta-resolve: 4.1.0
-      inquirer: 10.1.8
+      inquirer: 10.2.2
       lodash.flattendeep: 4.4.0
       lodash.pickby: 4.6.0
       lodash.union: 4.6.0
       read-pkg-up: 10.1.0
       recursive-readdir: 2.2.3
-      tsx: 4.17.0
-      webdriverio: 9.0.7
+      tsx: 4.19.0
+      webdriverio: 9.0.9
       yargs: 17.7.2
     transitivePeerDependencies:
       - bufferutil
@@ -6982,11 +6975,11 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  '@wdio/config@9.0.6':
+  '@wdio/config@9.0.8':
     dependencies:
-      '@wdio/logger': 9.0.4
-      '@wdio/types': 9.0.4
-      '@wdio/utils': 9.0.6
+      '@wdio/logger': 9.0.8
+      '@wdio/types': 9.0.8
+      '@wdio/utils': 9.0.8
       decamelize: 6.0.0
       deepmerge-ts: 7.1.0
       glob: 10.4.5
@@ -6994,10 +6987,10 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@wdio/globals@9.0.7(@wdio/logger@9.0.4)':
+  '@wdio/globals@9.0.9(@wdio/logger@9.0.8)':
     optionalDependencies:
-      expect-webdriverio: 5.0.1(@wdio/globals@9.0.7(@wdio/logger@9.0.4))(@wdio/logger@9.0.4)(webdriverio@9.0.7)
-      webdriverio: 9.0.7
+      expect-webdriverio: 5.0.2(@wdio/globals@9.0.9(@wdio/logger@9.0.8))(@wdio/logger@9.0.8)(webdriverio@9.0.9)
+      webdriverio: 9.0.9
     transitivePeerDependencies:
       - '@wdio/logger'
       - bufferutil
@@ -7005,13 +6998,13 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  '@wdio/local-runner@9.0.7':
+  '@wdio/local-runner@9.0.9':
     dependencies:
       '@types/node': 20.16.1
-      '@wdio/logger': 9.0.4
-      '@wdio/repl': 9.0.4
-      '@wdio/runner': 9.0.7
-      '@wdio/types': 9.0.4
+      '@wdio/logger': 9.0.8
+      '@wdio/repl': 9.0.8
+      '@wdio/runner': 9.0.9
+      '@wdio/types': 9.0.8
       async-exit-hook: 2.0.1
       split2: 4.2.0
       stream-buffers: 3.0.3
@@ -7024,69 +7017,69 @@ snapshots:
   '@wdio/logger@8.38.0':
     dependencies:
       chalk: 5.3.0
-      loglevel: 1.9.1
+      loglevel: 1.9.2
       loglevel-plugin-prefix: 0.8.4
       strip-ansi: 7.1.0
 
-  '@wdio/logger@9.0.4':
+  '@wdio/logger@9.0.8':
     dependencies:
       chalk: 5.3.0
-      loglevel: 1.9.1
+      loglevel: 1.9.2
       loglevel-plugin-prefix: 0.8.4
       strip-ansi: 7.1.0
 
-  '@wdio/mocha-framework@9.0.6':
+  '@wdio/mocha-framework@9.0.8':
     dependencies:
       '@types/mocha': 10.0.7
       '@types/node': 20.16.1
-      '@wdio/logger': 9.0.4
-      '@wdio/types': 9.0.4
-      '@wdio/utils': 9.0.6
+      '@wdio/logger': 9.0.8
+      '@wdio/types': 9.0.8
+      '@wdio/utils': 9.0.8
       mocha: 10.7.3
     transitivePeerDependencies:
       - supports-color
 
-  '@wdio/protocols@9.0.4': {}
+  '@wdio/protocols@9.0.8': {}
 
-  '@wdio/repl@9.0.4':
+  '@wdio/repl@9.0.8':
     dependencies:
       '@types/node': 20.16.1
 
-  '@wdio/runner@9.0.7':
+  '@wdio/runner@9.0.9':
     dependencies:
       '@types/node': 20.16.1
-      '@wdio/config': 9.0.6
-      '@wdio/globals': 9.0.7(@wdio/logger@9.0.4)
-      '@wdio/logger': 9.0.4
-      '@wdio/types': 9.0.4
-      '@wdio/utils': 9.0.6
+      '@wdio/config': 9.0.8
+      '@wdio/globals': 9.0.9(@wdio/logger@9.0.8)
+      '@wdio/logger': 9.0.8
+      '@wdio/types': 9.0.8
+      '@wdio/utils': 9.0.8
       deepmerge-ts: 7.1.0
-      expect-webdriverio: 5.0.1(@wdio/globals@9.0.7(@wdio/logger@9.0.4))(@wdio/logger@9.0.4)(webdriverio@9.0.7)
+      expect-webdriverio: 5.0.2(@wdio/globals@9.0.9(@wdio/logger@9.0.8))(@wdio/logger@9.0.8)(webdriverio@9.0.9)
       gaze: 1.1.3
-      webdriver: 9.0.7
-      webdriverio: 9.0.7
+      webdriver: 9.0.8
+      webdriverio: 9.0.9
     transitivePeerDependencies:
       - bufferutil
       - puppeteer-core
       - supports-color
       - utf-8-validate
 
-  '@wdio/types@9.0.4':
+  '@wdio/types@9.0.8':
     dependencies:
       '@types/node': 20.16.1
 
-  '@wdio/utils@9.0.6':
+  '@wdio/utils@9.0.8':
     dependencies:
-      '@puppeteer/browsers': 2.3.1
-      '@wdio/logger': 9.0.4
-      '@wdio/types': 9.0.4
+      '@puppeteer/browsers': 2.4.0
+      '@wdio/logger': 9.0.8
+      '@wdio/types': 9.0.8
       decamelize: 6.0.0
       deepmerge-ts: 7.1.0
       edgedriver: 5.6.1
-      geckodriver: 4.4.3
+      geckodriver: 4.4.4
       get-port: 7.1.0
       import-meta-resolve: 4.1.0
-      locate-app: 2.4.29
+      locate-app: 2.4.39
       safaridriver: 0.1.2
       split2: 4.2.0
       wait-port: 1.1.0
@@ -7175,7 +7168,7 @@ snapshots:
 
   '@xtuc/long@4.2.2': {}
 
-  '@zip.js/zip.js@2.7.51': {}
+  '@zip.js/zip.js@2.7.52': {}
 
   abbrev@1.1.1: {}
 
@@ -7195,13 +7188,13 @@ snapshots:
 
   agent-base@6.0.2:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
   agent-base@7.1.1:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -7264,11 +7257,9 @@ snapshots:
       normalize-path: 3.0.0
       picomatch: 2.3.1
 
-  app-builder-bin@5.0.0-alpha.4: {}
-
   app-builder-bin@5.0.0-alpha.7: {}
 
-  app-builder-lib@25.0.4(dmg-builder@25.0.4(electron-builder-squirrel-windows@25.0.4))(electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4)):
+  app-builder-lib@25.0.5(dmg-builder@25.0.5(electron-builder-squirrel-windows@25.0.5))(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5)):
     dependencies:
       '@develar/schema-utils': 2.6.5
       '@electron/notarize': 2.3.2
@@ -7282,10 +7273,10 @@ snapshots:
       builder-util: 25.0.3
       builder-util-runtime: 9.2.5
       chromium-pickle-js: 0.2.0
-      debug: 4.3.6(supports-color@8.1.1)
-      dmg-builder: 25.0.4(electron-builder-squirrel-windows@25.0.4)
+      debug: 4.3.7(supports-color@8.1.1)
+      dmg-builder: 25.0.5(electron-builder-squirrel-windows@25.0.5)
       ejs: 3.1.10
-      electron-builder-squirrel-windows: 25.0.4(dmg-builder@25.0.4)
+      electron-builder-squirrel-windows: 25.0.5(dmg-builder@25.0.5)
       electron-publish: 25.0.3
       form-data: 4.0.0
       fs-extra: 10.1.0
@@ -7383,8 +7374,6 @@ snapshots:
       call-bind: 1.0.7
       is-array-buffer: 3.0.4
 
-  array-union@2.1.0: {}
-
   assert-plus@1.0.0:
     optional: true
 
@@ -7392,7 +7381,7 @@ snapshots:
 
   ast-types@0.13.4:
     dependencies:
-      tslib: 2.6.3
+      tslib: 2.7.0
 
   astral-regex@2.0.0:
     optional: true
@@ -7422,24 +7411,25 @@ snapshots:
   bare-events@2.4.2:
     optional: true
 
-  bare-fs@2.3.1:
+  bare-fs@2.3.3:
     dependencies:
       bare-events: 2.4.2
       bare-path: 2.1.3
-      bare-stream: 2.1.3
+      bare-stream: 2.2.1
     optional: true
 
-  bare-os@2.4.0:
+  bare-os@2.4.2:
     optional: true
 
   bare-path@2.1.3:
     dependencies:
-      bare-os: 2.4.0
+      bare-os: 2.4.2
     optional: true
 
-  bare-stream@2.1.3:
+  bare-stream@2.2.1:
     dependencies:
-      streamx: 2.19.0
+      b4a: 1.6.6
+      streamx: 2.20.0
     optional: true
 
   base64-js@1.5.1: {}
@@ -7495,8 +7485,8 @@ snapshots:
 
   browserslist@4.23.3:
     dependencies:
-      caniuse-lite: 1.0.30001651
-      electron-to-chromium: 1.5.13
+      caniuse-lite: 1.0.30001658
+      electron-to-chromium: 1.5.18
       node-releases: 2.0.18
       update-browserslist-db: 1.1.0(browserslist@4.23.3)
 
@@ -7518,39 +7508,11 @@ snapshots:
 
   builder-util-runtime@9.2.5:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
-      sax: 1.4.1
-    transitivePeerDependencies:
-      - supports-color
-
-  builder-util-runtime@9.2.5-alpha.3:
-    dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       sax: 1.4.1
     transitivePeerDependencies:
       - supports-color
 
-  builder-util@25.0.0-alpha.10:
-    dependencies:
-      7zip-bin: 5.2.0
-      '@types/debug': 4.1.12
-      app-builder-bin: 5.0.0-alpha.4
-      bluebird-lst: 1.0.9
-      builder-util-runtime: 9.2.5-alpha.3
-      chalk: 4.1.2
-      cross-spawn: 7.0.3
-      debug: 4.3.6(supports-color@8.1.1)
-      fs-extra: 10.1.0
-      http-proxy-agent: 5.0.0
-      https-proxy-agent: 5.0.1
-      is-ci: 3.0.1
-      js-yaml: 4.1.0
-      source-map-support: 0.5.21
-      stat-mode: 1.0.0
-      temp-file: 3.4.0
-    transitivePeerDependencies:
-      - supports-color
-
   builder-util@25.0.3:
     dependencies:
       7zip-bin: 5.2.0
@@ -7560,7 +7522,7 @@ snapshots:
       builder-util-runtime: 9.2.5
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 10.1.0
       http-proxy-agent: 5.0.0
       https-proxy-agent: 5.0.1
@@ -7641,7 +7603,7 @@ snapshots:
 
   camelcase@7.0.1: {}
 
-  caniuse-lite@1.0.30001651: {}
+  caniuse-lite@1.0.30001658: {}
 
   chai@5.1.1:
     dependencies:
@@ -7729,7 +7691,7 @@ snapshots:
 
   cli-spinners@2.9.2: {}
 
-  cli-spinners@3.1.0: {}
+  cli-spinners@3.2.0: {}
 
   cli-truncate@2.1.0:
     dependencies:
@@ -7932,9 +7894,13 @@ snapshots:
     dependencies:
       ms: 2.1.3
 
-  debug@4.3.6(supports-color@8.1.1):
+  debug@4.3.6:
     dependencies:
       ms: 2.1.2
+
+  debug@4.3.7(supports-color@8.1.1):
+    dependencies:
+      ms: 2.1.3
     optionalDependencies:
       supports-color: 8.1.1
 
@@ -8034,13 +8000,9 @@ snapshots:
       minimatch: 3.1.2
       p-limit: 3.1.0
 
-  dir-glob@3.0.1:
+  dmg-builder@25.0.5(electron-builder-squirrel-windows@25.0.5):
     dependencies:
-      path-type: 4.0.0
-
-  dmg-builder@25.0.4(electron-builder-squirrel-windows@25.0.4):
-    dependencies:
-      app-builder-lib: 25.0.4(dmg-builder@25.0.4(electron-builder-squirrel-windows@25.0.4))(electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4))
+      app-builder-lib: 25.0.5(dmg-builder@25.0.5(electron-builder-squirrel-windows@25.0.5))(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5))
       builder-util: 25.0.3
       builder-util-runtime: 9.2.5
       fs-extra: 10.1.0
@@ -8109,10 +8071,10 @@ snapshots:
   edgedriver@5.6.1:
     dependencies:
       '@wdio/logger': 8.38.0
-      '@zip.js/zip.js': 2.7.51
+      '@zip.js/zip.js': 2.7.52
       decamelize: 6.0.0
       edge-paths: 3.0.5
-      fast-xml-parser: 4.4.1
+      fast-xml-parser: 4.5.0
       node-fetch: 3.3.2
       which: 4.0.0
 
@@ -8120,9 +8082,9 @@ snapshots:
     dependencies:
       jake: 10.9.2
 
-  electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4):
+  electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5):
     dependencies:
-      app-builder-lib: 25.0.4(dmg-builder@25.0.4(electron-builder-squirrel-windows@25.0.4))(electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4))
+      app-builder-lib: 25.0.5(dmg-builder@25.0.5(electron-builder-squirrel-windows@25.0.5))(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5))
       archiver: 5.3.2
       builder-util: 25.0.3
       fs-extra: 10.1.0
@@ -8131,13 +8093,13 @@ snapshots:
       - dmg-builder
       - supports-color
 
-  electron-builder@25.0.4(electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4)):
+  electron-builder@25.0.5(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5)):
     dependencies:
-      app-builder-lib: 25.0.4(dmg-builder@25.0.4(electron-builder-squirrel-windows@25.0.4))(electron-builder-squirrel-windows@25.0.4(dmg-builder@25.0.4))
+      app-builder-lib: 25.0.5(dmg-builder@25.0.5(electron-builder-squirrel-windows@25.0.5))(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5))
       builder-util: 25.0.3
       builder-util-runtime: 9.2.5
       chalk: 4.1.2
-      dmg-builder: 25.0.4(electron-builder-squirrel-windows@25.0.4)
+      dmg-builder: 25.0.5(electron-builder-squirrel-windows@25.0.5)
       fs-extra: 10.1.0
       is-ci: 3.0.1
       lazy-val: 1.0.5
@@ -8161,9 +8123,9 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  electron-to-chromium@1.5.13: {}
+  electron-to-chromium@1.5.18: {}
 
-  electron@32.0.1:
+  electron@32.0.2:
     dependencies:
       '@electron/get': 2.0.3
       '@types/node': 20.16.1
@@ -8284,7 +8246,7 @@ snapshots:
       '@esbuild/win32-ia32': 0.23.1
       '@esbuild/win32-x64': 0.23.1
 
-  escalade@3.1.2: {}
+  escalade@3.2.0: {}
 
   escape-goat@4.0.0: {}
 
@@ -8302,9 +8264,9 @@ snapshots:
     optionalDependencies:
       source-map: 0.6.1
 
-  eslint-config-prettier@9.1.0(eslint@9.9.0):
+  eslint-config-prettier@9.1.0(eslint@9.10.0):
     dependencies:
-      eslint: 9.9.0
+      eslint: 9.10.0
 
   eslint-import-resolver-node@0.3.9:
     dependencies:
@@ -8314,24 +8276,53 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-import-x@3.1.0(eslint@9.9.0)(typescript@5.5.4):
+  eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0):
+    dependencies:
+      '@nolyfill/is-core-module': 1.0.39
+      debug: 4.3.7(supports-color@8.1.1)
+      enhanced-resolve: 5.17.1
+      eslint: 9.10.0
+      eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0))(eslint@9.10.0)
+      fast-glob: 3.3.2
+      get-tsconfig: 4.8.0
+      is-bun-module: 1.2.1
+      is-glob: 4.0.3
+    optionalDependencies:
+      eslint-plugin-import-x: 4.2.1(eslint@9.10.0)(typescript@5.5.4)
+    transitivePeerDependencies:
+      - '@typescript-eslint/parser'
+      - eslint-import-resolver-node
+      - eslint-import-resolver-webpack
+      - supports-color
+
+  eslint-module-utils@2.11.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0))(eslint@9.10.0):
+    dependencies:
+      debug: 3.2.7
+    optionalDependencies:
+      '@typescript-eslint/parser': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      eslint: 9.10.0
+      eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4):
     dependencies:
-      '@typescript-eslint/utils': 7.18.0(eslint@9.9.0)(typescript@5.5.4)
-      debug: 4.3.6(supports-color@8.1.1)
+      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      debug: 4.3.7(supports-color@8.1.1)
       doctrine: 3.0.0
-      eslint: 9.9.0
+      eslint: 9.10.0
       eslint-import-resolver-node: 0.3.9
-      get-tsconfig: 4.7.6
+      get-tsconfig: 4.8.0
       is-glob: 4.0.3
       minimatch: 9.0.5
       semver: 7.6.3
       stable-hash: 0.0.4
-      tslib: 2.6.3
+      tslib: 2.7.0
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  eslint-plugin-wdio@9.0.5: {}
+  eslint-plugin-wdio@9.0.8: {}
 
   eslint-scope@5.1.1:
     dependencies:
@@ -8347,20 +8338,21 @@ snapshots:
 
   eslint-visitor-keys@4.0.0: {}
 
-  eslint@9.9.0:
+  eslint@9.10.0:
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0)
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0)
       '@eslint-community/regexpp': 4.11.0
-      '@eslint/config-array': 0.17.1
+      '@eslint/config-array': 0.18.0
       '@eslint/eslintrc': 3.1.0
-      '@eslint/js': 9.9.0
+      '@eslint/js': 9.10.0
+      '@eslint/plugin-kit': 0.1.0
       '@humanwhocodes/module-importer': 1.0.1
       '@humanwhocodes/retry': 0.3.0
       '@nodelib/fs.walk': 1.2.8
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       escape-string-regexp: 4.0.0
       eslint-scope: 8.0.2
       eslint-visitor-keys: 4.0.0
@@ -8376,7 +8368,6 @@ snapshots:
       is-glob: 4.0.3
       is-path-inside: 3.0.3
       json-stable-stringify-without-jsonify: 1.0.1
-      levn: 0.4.1
       lodash.merge: 4.6.2
       minimatch: 3.1.2
       natural-compare: 1.4.0
@@ -8473,15 +8464,15 @@ snapshots:
     dependencies:
       homedir-polyfill: 1.0.3
 
-  expect-webdriverio@5.0.1(@wdio/globals@9.0.7(@wdio/logger@9.0.4))(@wdio/logger@9.0.4)(webdriverio@9.0.7):
+  expect-webdriverio@5.0.2(@wdio/globals@9.0.9(@wdio/logger@9.0.8))(@wdio/logger@9.0.8)(webdriverio@9.0.9):
     dependencies:
       '@vitest/snapshot': 2.0.5
-      '@wdio/globals': 9.0.7(@wdio/logger@9.0.4)
-      '@wdio/logger': 9.0.4
+      '@wdio/globals': 9.0.9(@wdio/logger@9.0.8)
+      '@wdio/logger': 9.0.8
       expect: 29.7.0
       jest-matcher-utils: 29.7.0
       lodash.isequal: 4.5.0
-      webdriverio: 9.0.7
+      webdriverio: 9.0.9
 
   expect@29.7.0:
     dependencies:
@@ -8501,7 +8492,7 @@ snapshots:
 
   extract-zip@2.0.1:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
@@ -8526,13 +8517,13 @@ snapshots:
       '@nodelib/fs.walk': 1.2.8
       glob-parent: 5.1.2
       merge2: 1.4.1
-      micromatch: 4.0.7
+      micromatch: 4.0.8
 
   fast-json-stable-stringify@2.1.0: {}
 
   fast-levenshtein@2.0.6: {}
 
-  fast-xml-parser@4.4.1:
+  fast-xml-parser@4.5.0:
     dependencies:
       strnum: 1.0.5
 
@@ -8610,7 +8601,7 @@ snapshots:
 
   flora-colossus@2.0.0:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 10.1.0
     transitivePeerDependencies:
       - supports-color
@@ -8680,7 +8671,7 @@ snapshots:
 
   galactus@1.0.0:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.6
       flora-colossus: 2.0.0
       fs-extra: 10.1.0
     transitivePeerDependencies:
@@ -8701,10 +8692,10 @@ snapshots:
     dependencies:
       globule: 1.3.4
 
-  geckodriver@4.4.3:
+  geckodriver@4.4.4:
     dependencies:
-      '@wdio/logger': 9.0.4
-      '@zip.js/zip.js': 2.7.51
+      '@wdio/logger': 9.0.8
+      '@zip.js/zip.js': 2.7.52
       decamelize: 6.0.0
       http-proxy-agent: 7.0.2
       https-proxy-agent: 7.0.5
@@ -8760,7 +8751,7 @@ snapshots:
       '@sec-ant/readable-stream': 0.4.1
       is-stream: 4.0.1
 
-  get-tsconfig@4.7.6:
+  get-tsconfig@4.8.0:
     dependencies:
       resolve-pkg-maps: 1.0.0
 
@@ -8768,7 +8759,7 @@ snapshots:
     dependencies:
       basic-ftp: 5.0.5
       data-uri-to-buffer: 6.0.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 11.2.0
     transitivePeerDependencies:
       - supports-color
@@ -8869,15 +8860,6 @@ snapshots:
       gopd: 1.0.1
     optional: true
 
-  globby@11.1.0:
-    dependencies:
-      array-union: 2.1.0
-      dir-glob: 3.0.1
-      fast-glob: 3.3.2
-      ignore: 5.3.2
-      merge2: 1.4.1
-      slash: 3.0.0
-
   globby@14.0.2:
     dependencies:
       '@sindresorhus/merge-streams': 2.3.0
@@ -8994,14 +8976,14 @@ snapshots:
     dependencies:
       '@tootallnate/once': 2.0.0
       agent-base: 6.0.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
   http-proxy-agent@7.0.2:
     dependencies:
       agent-base: 7.1.1
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -9018,14 +9000,14 @@ snapshots:
   https-proxy-agent@5.0.1:
     dependencies:
       agent-base: 6.0.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
   https-proxy-agent@7.0.5:
     dependencies:
       agent-base: 7.1.1
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -9089,10 +9071,11 @@ snapshots:
 
   ini@4.1.1: {}
 
-  inquirer@10.1.8:
+  inquirer@10.2.2:
     dependencies:
-      '@inquirer/prompts': 5.3.8
-      '@inquirer/type': 1.5.2
+      '@inquirer/core': 9.1.0
+      '@inquirer/prompts': 5.5.0
+      '@inquirer/type': 1.5.3
       '@types/mute-stream': 0.0.4
       ansi-escapes: 4.3.2
       mute-stream: 1.0.0
@@ -9158,6 +9141,10 @@ snapshots:
     dependencies:
       builtin-modules: 3.3.0
 
+  is-bun-module@1.2.1:
+    dependencies:
+      semver: 7.6.3
+
   is-callable@1.2.7: {}
 
   is-ci@3.0.1:
@@ -9318,7 +9305,7 @@ snapshots:
   istanbul-lib-source-maps@5.0.6:
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       istanbul-lib-coverage: 3.2.2
     transitivePeerDependencies:
       - supports-color
@@ -9364,7 +9351,7 @@ snapshots:
       '@types/stack-utils': 2.0.3
       chalk: 4.1.2
       graceful-fs: 4.2.11
-      micromatch: 4.0.7
+      micromatch: 4.0.8
       pretty-format: 29.7.0
       slash: 3.0.0
       stack-utils: 2.0.6
@@ -9380,7 +9367,7 @@ snapshots:
 
   jest-worker@27.5.1:
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
@@ -9484,18 +9471,18 @@ snapshots:
 
   lines-and-columns@2.0.4: {}
 
-  lint-staged@15.2.9:
+  lint-staged@15.2.10:
     dependencies:
       chalk: 5.3.0
       commander: 12.1.0
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       execa: 8.0.1
       lilconfig: 3.1.2
       listr2: 8.2.4
-      micromatch: 4.0.7
+      micromatch: 4.0.8
       pidtree: 0.6.0
       string-argv: 0.3.2
-      yaml: 2.5.0
+      yaml: 2.5.1
     transitivePeerDependencies:
       - supports-color
 
@@ -9526,9 +9513,9 @@ snapshots:
 
   loader-runner@4.3.0: {}
 
-  locate-app@2.4.29:
+  locate-app@2.4.39:
     dependencies:
-      '@promptbook/utils': 0.67.0-1
+      '@promptbook/utils': 0.70.0-1
       type-fest: 2.13.0
       userhome: 1.0.0
 
@@ -9619,7 +9606,7 @@ snapshots:
 
   loglevel-plugin-prefix@0.8.4: {}
 
-  loglevel@1.9.1: {}
+  loglevel@1.9.2: {}
 
   loupe@3.1.1:
     dependencies:
@@ -9701,6 +9688,11 @@ snapshots:
       braces: 3.0.3
       picomatch: 2.3.1
 
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
   mime-db@1.52.0: {}
 
   mime-types@2.1.35:
@@ -9787,7 +9779,7 @@ snapshots:
       ansi-colors: 4.1.3
       browser-stdout: 1.3.1
       chokidar: 3.6.0
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       diff: 5.2.0
       escape-string-regexp: 4.0.0
       find-up: 5.0.0
@@ -10062,7 +10054,7 @@ snapshots:
     dependencies:
       '@tootallnate/quickjs-emscripten': 0.23.0
       agent-base: 7.1.1
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       get-uri: 6.0.3
       http-proxy-agent: 7.0.2
       https-proxy-agent: 7.0.5
@@ -10083,7 +10075,7 @@ snapshots:
       ky: 1.7.1
       registry-auth-token: 5.0.2
       registry-url: 6.0.1
-      semver: 7.6.2
+      semver: 7.6.3
 
   pako@1.0.11: {}
 
@@ -10170,8 +10162,6 @@ snapshots:
     dependencies:
       pify: 2.3.0
 
-  path-type@4.0.0: {}
-
   path-type@5.0.0: {}
 
   pathe@1.1.2: {}
@@ -10186,6 +10176,8 @@ snapshots:
 
   picocolors@1.0.1: {}
 
+  picocolors@1.1.0: {}
+
   picomatch@2.3.1: {}
 
   pidtree@0.6.0: {}
@@ -10256,7 +10248,7 @@ snapshots:
   proxy-agent@6.4.0:
     dependencies:
       agent-base: 7.1.1
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       http-proxy-agent: 7.0.2
       https-proxy-agent: 7.0.5
       lru-cache: 7.18.3
@@ -10308,7 +10300,7 @@ snapshots:
 
   read-binary-file-arch@1.0.6:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -10331,7 +10323,7 @@ snapshots:
     dependencies:
       find-up: 6.3.0
       read-pkg: 8.1.0
-      type-fest: 4.25.0
+      type-fest: 4.26.1
 
   read-pkg-up@2.0.0:
     dependencies:
@@ -10349,7 +10341,7 @@ snapshots:
       '@types/normalize-package-data': 2.4.4
       normalize-package-data: 6.0.2
       parse-json: 7.1.1
-      type-fest: 4.25.0
+      type-fest: 4.26.1
 
   read-pkg@9.0.1:
     dependencies:
@@ -10536,26 +10528,26 @@ snapshots:
       sprintf-js: 1.1.3
     optional: true
 
-  rollup@4.21.0:
+  rollup@4.21.2:
     dependencies:
       '@types/estree': 1.0.5
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.21.0
-      '@rollup/rollup-android-arm64': 4.21.0
-      '@rollup/rollup-darwin-arm64': 4.21.0
-      '@rollup/rollup-darwin-x64': 4.21.0
-      '@rollup/rollup-linux-arm-gnueabihf': 4.21.0
-      '@rollup/rollup-linux-arm-musleabihf': 4.21.0
-      '@rollup/rollup-linux-arm64-gnu': 4.21.0
-      '@rollup/rollup-linux-arm64-musl': 4.21.0
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0
-      '@rollup/rollup-linux-riscv64-gnu': 4.21.0
-      '@rollup/rollup-linux-s390x-gnu': 4.21.0
-      '@rollup/rollup-linux-x64-gnu': 4.21.0
-      '@rollup/rollup-linux-x64-musl': 4.21.0
-      '@rollup/rollup-win32-arm64-msvc': 4.21.0
-      '@rollup/rollup-win32-ia32-msvc': 4.21.0
-      '@rollup/rollup-win32-x64-msvc': 4.21.0
+      '@rollup/rollup-android-arm-eabi': 4.21.2
+      '@rollup/rollup-android-arm64': 4.21.2
+      '@rollup/rollup-darwin-arm64': 4.21.2
+      '@rollup/rollup-darwin-x64': 4.21.2
+      '@rollup/rollup-linux-arm-gnueabihf': 4.21.2
+      '@rollup/rollup-linux-arm-musleabihf': 4.21.2
+      '@rollup/rollup-linux-arm64-gnu': 4.21.2
+      '@rollup/rollup-linux-arm64-musl': 4.21.2
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2
+      '@rollup/rollup-linux-riscv64-gnu': 4.21.2
+      '@rollup/rollup-linux-s390x-gnu': 4.21.2
+      '@rollup/rollup-linux-x64-gnu': 4.21.2
+      '@rollup/rollup-linux-x64-musl': 4.21.2
+      '@rollup/rollup-win32-arm64-msvc': 4.21.2
+      '@rollup/rollup-win32-ia32-msvc': 4.21.2
+      '@rollup/rollup-win32-x64-msvc': 4.21.2
       fsevents: 2.3.3
 
   rrweb-cssom@0.6.0: {}
@@ -10722,7 +10714,7 @@ snapshots:
   socks-proxy-agent@7.0.0:
     dependencies:
       agent-base: 6.0.2
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       socks: 2.8.3
     transitivePeerDependencies:
       - supports-color
@@ -10730,7 +10722,7 @@ snapshots:
   socks-proxy-agent@8.0.4:
     dependencies:
       agent-base: 7.1.1
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       socks: 2.8.3
     transitivePeerDependencies:
       - supports-color
@@ -10795,7 +10787,7 @@ snapshots:
 
   stream-buffers@3.0.3: {}
 
-  streamx@2.19.0:
+  streamx@2.20.0:
     dependencies:
       fast-fifo: 1.3.2
       queue-tick: 1.0.1
@@ -10865,7 +10857,7 @@ snapshots:
 
   sumchecker@3.0.1:
     dependencies:
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -10897,7 +10889,7 @@ snapshots:
       pump: 3.0.0
       tar-stream: 3.1.7
     optionalDependencies:
-      bare-fs: 2.3.1
+      bare-fs: 2.3.3
       bare-path: 2.1.3
 
   tar-stream@2.2.0:
@@ -10912,7 +10904,7 @@ snapshots:
     dependencies:
       b4a: 1.6.6
       fast-fifo: 1.3.2
-      streamx: 2.19.0
+      streamx: 2.20.0
 
   tar@6.2.1:
     dependencies:
@@ -11023,39 +11015,41 @@ snapshots:
 
   tslib@2.6.3: {}
 
-  tsx@4.17.0:
+  tslib@2.7.0: {}
+
+  tsx@4.19.0:
     dependencies:
       esbuild: 0.23.1
-      get-tsconfig: 4.7.6
+      get-tsconfig: 4.8.0
     optionalDependencies:
       fsevents: 2.3.3
 
-  turbo-darwin-64@2.0.14:
+  turbo-darwin-64@2.1.1:
     optional: true
 
-  turbo-darwin-arm64@2.0.14:
+  turbo-darwin-arm64@2.1.1:
     optional: true
 
-  turbo-linux-64@2.0.14:
+  turbo-linux-64@2.1.1:
     optional: true
 
-  turbo-linux-arm64@2.0.14:
+  turbo-linux-arm64@2.1.1:
     optional: true
 
-  turbo-windows-64@2.0.14:
+  turbo-windows-64@2.1.1:
     optional: true
 
-  turbo-windows-arm64@2.0.14:
+  turbo-windows-arm64@2.1.1:
     optional: true
 
-  turbo@2.0.14:
+  turbo@2.1.1:
     optionalDependencies:
-      turbo-darwin-64: 2.0.14
-      turbo-darwin-arm64: 2.0.14
-      turbo-linux-64: 2.0.14
-      turbo-linux-arm64: 2.0.14
-      turbo-windows-64: 2.0.14
-      turbo-windows-arm64: 2.0.14
+      turbo-darwin-64: 2.1.1
+      turbo-darwin-arm64: 2.1.1
+      turbo-linux-64: 2.1.1
+      turbo-linux-arm64: 2.1.1
+      turbo-windows-64: 2.1.1
+      turbo-windows-arm64: 2.1.1
 
   type-check@0.4.0:
     dependencies:
@@ -11076,6 +11070,8 @@ snapshots:
 
   type-fest@4.25.0: {}
 
+  type-fest@4.26.1: {}
+
   typedarray-to-buffer@3.1.5:
     dependencies:
       is-typedarray: 1.0.0
@@ -11116,8 +11112,8 @@ snapshots:
   update-browserslist-db@1.1.0(browserslist@4.23.3):
     dependencies:
       browserslist: 4.23.3
-      escalade: 3.1.2
-      picocolors: 1.0.1
+      escalade: 3.2.0
+      picocolors: 1.1.0
 
   update-notifier@7.1.0:
     dependencies:
@@ -11173,7 +11169,7 @@ snapshots:
   vite-node@2.0.5(@types/node@20.16.1)(terser@5.31.6):
     dependencies:
       cac: 6.7.14
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       pathe: 1.1.2
       tinyrainbow: 1.2.0
       vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
@@ -11192,7 +11188,7 @@ snapshots:
     dependencies:
       esbuild: 0.21.5
       postcss: 8.4.41
-      rollup: 4.21.0
+      rollup: 4.21.2
     optionalDependencies:
       '@types/node': 20.16.1
       fsevents: 2.3.3
@@ -11208,7 +11204,7 @@ snapshots:
       '@vitest/spy': 2.0.5
       '@vitest/utils': 2.0.5
       chai: 5.1.1
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
       execa: 8.0.1
       magic-string: 0.30.11
       pathe: 1.1.2
@@ -11240,7 +11236,7 @@ snapshots:
     dependencies:
       chalk: 4.1.2
       commander: 9.5.0
-      debug: 4.3.6(supports-color@8.1.1)
+      debug: 4.3.7(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -11255,15 +11251,15 @@ snapshots:
 
   web-streams-polyfill@3.3.3: {}
 
-  webdriver@9.0.7:
+  webdriver@9.0.8:
     dependencies:
       '@types/node': 20.16.1
       '@types/ws': 8.5.12
-      '@wdio/config': 9.0.6
-      '@wdio/logger': 9.0.4
-      '@wdio/protocols': 9.0.4
-      '@wdio/types': 9.0.4
-      '@wdio/utils': 9.0.6
+      '@wdio/config': 9.0.8
+      '@wdio/logger': 9.0.8
+      '@wdio/protocols': 9.0.8
+      '@wdio/types': 9.0.8
+      '@wdio/utils': 9.0.8
       deepmerge-ts: 7.1.0
       ws: 8.18.0
     transitivePeerDependencies:
@@ -11271,16 +11267,16 @@ snapshots:
       - supports-color
       - utf-8-validate
 
-  webdriverio@9.0.7:
+  webdriverio@9.0.9:
     dependencies:
       '@types/node': 20.16.1
       '@types/sinonjs__fake-timers': 8.1.5
-      '@wdio/config': 9.0.6
-      '@wdio/logger': 9.0.4
-      '@wdio/protocols': 9.0.4
-      '@wdio/repl': 9.0.4
-      '@wdio/types': 9.0.4
-      '@wdio/utils': 9.0.6
+      '@wdio/config': 9.0.8
+      '@wdio/logger': 9.0.8
+      '@wdio/protocols': 9.0.8
+      '@wdio/repl': 9.0.8
+      '@wdio/types': 9.0.8
+      '@wdio/utils': 9.0.8
       archiver: 7.0.1
       aria-query: 5.3.0
       cheerio: 1.0.0
@@ -11299,7 +11295,7 @@ snapshots:
       rgb2hex: 0.2.5
       serialize-error: 11.0.3
       urlpattern-polyfill: 10.0.0
-      webdriver: 9.0.7
+      webdriver: 9.0.8
     transitivePeerDependencies:
       - bufferutil
       - supports-color
@@ -11469,7 +11465,7 @@ snapshots:
 
   yallist@4.0.0: {}
 
-  yaml@2.5.0: {}
+  yaml@2.5.1: {}
 
   yargs-parser@20.2.9: {}
 
@@ -11485,7 +11481,7 @@ snapshots:
   yargs@16.2.0:
     dependencies:
       cliui: 7.0.4
-      escalade: 3.1.2
+      escalade: 3.2.0
       get-caller-file: 2.0.5
       require-directory: 2.1.1
       string-width: 4.2.3
@@ -11495,7 +11491,7 @@ snapshots:
   yargs@17.7.2:
     dependencies:
       cliui: 8.0.1
-      escalade: 3.1.2
+      escalade: 3.2.0
       get-caller-file: 2.0.5
       require-directory: 2.1.1
       string-width: 4.2.3

From df0f5d7db9e81124fc813af64e670655a0859208 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Sun, 8 Sep 2024 23:17:29 +0100
Subject: [PATCH 03/52] test: add regular func test

---
 e2e/api.spec.ts | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/e2e/api.spec.ts b/e2e/api.spec.ts
index 0b87b67e..cd31ee96 100644
--- a/e2e/api.spec.ts
+++ b/e2e/api.spec.ts
@@ -282,6 +282,17 @@ describe('execute', () => {
   });
 
   it('should handle executing a function which declares a function', async () => {
+    expect(
+      await browser.execute(() => {
+        function newFunc() {
+          return 'boom!';
+        }
+        return newFunc();
+      }),
+    ).toEqual('boom!');
+  });
+
+  it('should handle executing a function which declares a fat arrow function', async () => {
     expect(
       await browser.execute(() => {
         const newFunc = () => 'boom!';

From 45f62708d7bbdc6ab2eb6c54f3a1a2a62e124e6c Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Sun, 8 Sep 2024 23:22:59 +0100
Subject: [PATCH 04/52] chore: delete override

---
 package.json   | 5 -----
 pnpm-lock.yaml | 3 ---
 2 files changed, 8 deletions(-)

diff --git a/package.json b/package.json
index 05663944..d2ca13d3 100644
--- a/package.json
+++ b/package.json
@@ -70,11 +70,6 @@
     "tsx": "^4.19.0",
     "turbo": "^2.1.1"
   },
-  "pnpm": {
-    "overrides": {
-      "expect-webdriverio": "^5.0.1"
-    }
-  },
   "lint-staged": {
     "**/*.{yml,json,md,ts,js}": [
       "prettier --write"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1458d97f..858cb58b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4,9 +4,6 @@ settings:
   autoInstallPeers: true
   excludeLinksFromLockfile: false
 
-overrides:
-  expect-webdriverio: ^5.0.1
-
 importers:
 
   .:

From 8876f0f38b4158f99aa44b923de920186481aa7c Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 00:02:18 +0100
Subject: [PATCH 05/52] chore(linting): fix import-x issues

---
 eslint.config.js                              | 10 +++++-----
 packages/@wdio_electron-utils/src/index.ts    |  2 +-
 packages/wdio-electron-service/src/index.ts   |  1 -
 packages/wdio-electron-service/src/service.ts |  2 +-
 4 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/eslint.config.js b/eslint.config.js
index ef26c732..581aa40d 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -25,7 +25,7 @@ export default [
         ...globals.es2021,
       },
       parserOptions: {
-        ...importX.configs.recommended.parserOptions,
+        ...importX.flatConfigs.recommended.parserOptions,
       },
     },
     plugins: {
@@ -33,7 +33,7 @@ export default [
     },
     rules: {
       ...eslint.configs.recommended.rules,
-      ...importX.configs.recommended.rules,
+      ...importX.flatConfigs.recommended.rules,
       'import-x/no-named-as-default': 'off',
       'import-x/no-unresolved': 'off',
     },
@@ -51,7 +51,7 @@ export default [
       },
     },
     settings: {
-      ...importX.configs.electron.settings,
+      ...importX.flatConfigs.electron.settings,
     },
   },
   // Electron renderer process files
@@ -63,7 +63,7 @@ export default [
       },
     },
     settings: {
-      ...importX.configs.electron.settings,
+      ...importX.flatConfigs.electron.settings,
     },
   },
   // TS files
@@ -87,7 +87,7 @@ export default [
     rules: {
       ...ts.configs['eslint-recommended'].rules,
       ...ts.configs.recommended.rules,
-      ...importX.configs.typescript.rules,
+      ...importX.flatConfigs.typescript.rules,
       'no-undef': 'off', // redundant - TS will fail to compile with undefined vars
       'no-redeclare': 'off', // redundant - TS will fail to compile with duplicate declarations
       '@typescript-eslint/no-empty-interface': [
diff --git a/packages/@wdio_electron-utils/src/index.ts b/packages/@wdio_electron-utils/src/index.ts
index ea4c7b04..a9394bf1 100644
--- a/packages/@wdio_electron-utils/src/index.ts
+++ b/packages/@wdio_electron-utils/src/index.ts
@@ -8,7 +8,7 @@ import type { NormalizedReadResult } from 'read-package-up';
 
 import log from './log.js';
 import { APP_NAME_DETECTION_ERROR, BUILD_TOOL_DETECTION_ERROR } from './constants.js';
-import {
+import type {
   AppBuildInfo,
   BuilderArch,
   BuilderConfig,
diff --git a/packages/wdio-electron-service/src/index.ts b/packages/wdio-electron-service/src/index.ts
index bd904569..e96e40d6 100644
--- a/packages/wdio-electron-service/src/index.ts
+++ b/packages/wdio-electron-service/src/index.ts
@@ -11,4 +11,3 @@ export default ElectronWorkerService;
 
 export const browser: WebdriverIO.Browser = wdioBrowser;
 export const startElectron: (opts: ElectronServiceOptions) => Promise<WebdriverIO.Browser> = initSession;
-export * from '@wdio/electron-types';
diff --git a/packages/wdio-electron-service/src/service.ts b/packages/wdio-electron-service/src/service.ts
index 51e7cdd2..e20fea92 100644
--- a/packages/wdio-electron-service/src/service.ts
+++ b/packages/wdio-electron-service/src/service.ts
@@ -1,4 +1,5 @@
 import type { Capabilities, Services } from '@wdio/types';
+import type { AbstractFn, BrowserExtension, ElectronServiceOptions, ExecuteOpts } from '@wdio/electron-types';
 
 import log from '@wdio/electron-utils/log';
 import mockStore from './mockStore.js';
@@ -10,7 +11,6 @@ import { isMockFunction } from './commands/isMockFunction.js';
 import { resetAllMocks } from './commands/resetAllMocks.js';
 import { restoreAllMocks } from './commands/restoreAllMocks.js';
 import { mockAll } from './commands/mockAll.js';
-import type { AbstractFn, BrowserExtension, ElectronServiceOptions, ExecuteOpts } from './index.js';
 
 const waitUntilWindowAvailable = async (browser: WebdriverIO.Browser) =>
   await browser.waitUntil(async () => {

From a3ad311e28f5746e461d13e0d7de484c57681496 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 00:03:26 +0100
Subject: [PATCH 06/52] chore: reorder imports

---
 packages/wdio-electron-service/src/service.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/wdio-electron-service/src/service.ts b/packages/wdio-electron-service/src/service.ts
index e20fea92..34203154 100644
--- a/packages/wdio-electron-service/src/service.ts
+++ b/packages/wdio-electron-service/src/service.ts
@@ -1,7 +1,7 @@
-import type { Capabilities, Services } from '@wdio/types';
+import log from '@wdio/electron-utils/log';
 import type { AbstractFn, BrowserExtension, ElectronServiceOptions, ExecuteOpts } from '@wdio/electron-types';
+import type { Capabilities, Services } from '@wdio/types';
 
-import log from '@wdio/electron-utils/log';
 import mockStore from './mockStore.js';
 import { CUSTOM_CAPABILITY_NAME } from './constants.js';
 import { execute } from './commands/execute.js';

From f3d866cd1d60a894cbf61f035d11da412c024750 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 15:21:55 +0100
Subject: [PATCH 07/52] test(e2e): add JS specs

---
 e2e/js/api.spec.js         | 748 +++++++++++++++++++++++++++++++++++++
 e2e/js/application.spec.js |  18 +
 e2e/js/dom.spec.js         |  35 ++
 e2e/js/interaction.spec.js |  62 +++
 e2e/package.json           |   6 +-
 e2e/wdio.conf.js           |  43 +++
 e2e/wdio.no-binary.conf.js |  43 +++
 7 files changed, 953 insertions(+), 2 deletions(-)
 create mode 100644 e2e/js/api.spec.js
 create mode 100644 e2e/js/application.spec.js
 create mode 100644 e2e/js/dom.spec.js
 create mode 100644 e2e/js/interaction.spec.js
 create mode 100644 e2e/wdio.conf.js
 create mode 100644 e2e/wdio.no-binary.conf.js

diff --git a/e2e/js/api.spec.js b/e2e/js/api.spec.js
new file mode 100644
index 00000000..648fbc03
--- /dev/null
+++ b/e2e/js/api.spec.js
@@ -0,0 +1,748 @@
+import { expect } from '@wdio/globals';
+import { browser } from 'wdio-electron-service';
+
+const { name: pkgAppName, version: pkgAppVersion } = globalThis.packageJson;
+
+describe('mock', () => {
+  it('should mock an electron API function', async () => {
+    const mockShowOpenDialog = await browser.electron.mock('dialog', 'showOpenDialog');
+    await browser.electron.execute(async (electron) => {
+      await electron.dialog.showOpenDialog({
+        title: 'my dialog',
+        properties: ['openFile', 'openDirectory'],
+      });
+      return electron.dialog.showOpenDialog.mock.calls;
+    });
+
+    expect(mockShowOpenDialog).toHaveBeenCalledTimes(1);
+    expect(mockShowOpenDialog).toHaveBeenCalledWith({
+      title: 'my dialog',
+      properties: ['openFile', 'openDirectory'],
+    });
+  });
+
+  it('should mock a synchronous electron API function', async () => {
+    const mockShowOpenDialogSync = await browser.electron.mock('dialog', 'showOpenDialogSync');
+    await browser.electron.execute((electron) =>
+      electron.dialog.showOpenDialogSync({
+        title: 'my dialog',
+        properties: ['openFile', 'openDirectory'],
+      }),
+    );
+
+    expect(mockShowOpenDialogSync).toHaveBeenCalledTimes(1);
+    expect(mockShowOpenDialogSync).toHaveBeenCalledWith({
+      title: 'my dialog',
+      properties: ['openFile', 'openDirectory'],
+    });
+  });
+});
+
+describe('mockAll', () => {
+  it('should mock all functions on an API', async () => {
+    const mockedDialog = await browser.electron.mockAll('dialog');
+    await browser.electron.execute(
+      async (electron) =>
+        await electron.dialog.showOpenDialog({
+          title: 'my dialog',
+        }),
+    );
+    await browser.electron.execute((electron) =>
+      electron.dialog.showOpenDialogSync({
+        title: 'my dialog',
+      }),
+    );
+
+    expect(mockedDialog.showOpenDialog).toHaveBeenCalledTimes(1);
+    expect(mockedDialog.showOpenDialog).toHaveBeenCalledWith({
+      title: 'my dialog',
+    });
+    expect(mockedDialog.showOpenDialogSync).toHaveBeenCalledTimes(1);
+    expect(mockedDialog.showOpenDialogSync).toHaveBeenCalledWith({
+      title: 'my dialog',
+    });
+  });
+});
+
+describe('clearAllMocks', () => {
+  it('should clear existing mocks', async () => {
+    const mockSetName = await browser.electron.mock('app', 'setName');
+    const mockWriteText = await browser.electron.mock('clipboard', 'writeText');
+
+    await browser.electron.execute((electron) => electron.app.setName('new app name'));
+    await browser.electron.execute((electron) => electron.clipboard.writeText('text to be written'));
+
+    await browser.electron.clearAllMocks();
+
+    expect(mockSetName.mock.calls).toStrictEqual([]);
+    expect(mockSetName.mock.invocationCallOrder).toStrictEqual([]);
+    expect(mockSetName.mock.lastCall).toBeUndefined();
+    expect(mockSetName.mock.results).toStrictEqual([]);
+
+    expect(mockWriteText.mock.calls).toStrictEqual([]);
+    expect(mockWriteText.mock.invocationCallOrder).toStrictEqual([]);
+    expect(mockWriteText.mock.lastCall).toBeUndefined();
+    expect(mockWriteText.mock.results).toStrictEqual([]);
+  });
+
+  it('should clear existing mocks on an API', async () => {
+    const mockSetName = await browser.electron.mock('app', 'setName');
+    const mockWriteText = await browser.electron.mock('clipboard', 'writeText');
+
+    await browser.electron.execute((electron) => electron.app.setName('new app name'));
+    await browser.electron.execute((electron) => electron.clipboard.writeText('text to be written'));
+
+    await browser.electron.clearAllMocks('app');
+
+    expect(mockSetName.mock.calls).toStrictEqual([]);
+    expect(mockSetName.mock.invocationCallOrder).toStrictEqual([]);
+    expect(mockSetName.mock.lastCall).toBeUndefined();
+    expect(mockSetName.mock.results).toStrictEqual([]);
+
+    expect(mockWriteText.mock.calls).toStrictEqual([['text to be written']]);
+    expect(mockWriteText.mock.invocationCallOrder).toStrictEqual([expect.any(Number)]);
+    expect(mockWriteText.mock.lastCall).toStrictEqual(['text to be written']);
+    expect(mockWriteText.mock.results).toStrictEqual([{ type: 'return', value: undefined }]);
+  });
+
+  it('should not reset existing mocks', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+    const mockReadText = await browser.electron.mock('clipboard', 'readText');
+    await mockGetName.mockReturnValue('mocked appName');
+    await mockReadText.mockReturnValue('mocked clipboardText');
+
+    await browser.electron.clearAllMocks();
+
+    const appName = await browser.electron.execute((electron) => electron.app.getName());
+    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
+    expect(appName).toBe('mocked appName');
+    expect(clipboardText).toBe('mocked clipboardText');
+  });
+
+  it('should not reset existing mocks on an API', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+    const mockReadText = await browser.electron.mock('clipboard', 'readText');
+    await mockGetName.mockReturnValue('mocked appName');
+    await mockReadText.mockReturnValue('mocked clipboardText');
+
+    await browser.electron.clearAllMocks('app');
+
+    const appName = await browser.electron.execute((electron) => electron.app.getName());
+    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
+    expect(appName).toBe('mocked appName');
+    expect(clipboardText).toBe('mocked clipboardText');
+  });
+});
+
+describe('resetAllMocks', () => {
+  it('should clear existing mocks', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+    const mockReadText = await browser.electron.mock('clipboard', 'readText');
+    await mockGetName.mockReturnValue('mocked appName');
+    await mockReadText.mockReturnValue('mocked clipboardText');
+
+    await browser.electron.execute((electron) => electron.app.getName());
+    await browser.electron.execute((electron) => electron.clipboard.readText());
+
+    await browser.electron.resetAllMocks();
+
+    expect(mockGetName.mock.calls).toStrictEqual([]);
+    expect(mockGetName.mock.invocationCallOrder).toStrictEqual([]);
+    expect(mockGetName.mock.lastCall).toBeUndefined();
+    expect(mockGetName.mock.results).toStrictEqual([]);
+
+    expect(mockReadText.mock.calls).toStrictEqual([]);
+    expect(mockReadText.mock.invocationCallOrder).toStrictEqual([]);
+    expect(mockReadText.mock.lastCall).toBeUndefined();
+    expect(mockReadText.mock.results).toStrictEqual([]);
+  });
+
+  it('should clear existing mocks on an API', async () => {
+    const mockSetName = await browser.electron.mock('app', 'setName');
+    const mockWriteText = await browser.electron.mock('clipboard', 'writeText');
+
+    await browser.electron.execute((electron) => electron.app.setName('new app name'));
+    await browser.electron.execute((electron) => electron.clipboard.writeText('text to be written'));
+
+    await browser.electron.resetAllMocks('app');
+
+    expect(mockSetName.mock.calls).toStrictEqual([]);
+    expect(mockSetName.mock.invocationCallOrder).toStrictEqual([]);
+    expect(mockSetName.mock.lastCall).toBeUndefined();
+    expect(mockSetName.mock.results).toStrictEqual([]);
+
+    expect(mockWriteText.mock.calls).toStrictEqual([['text to be written']]);
+    expect(mockWriteText.mock.invocationCallOrder).toStrictEqual([expect.any(Number)]);
+    expect(mockWriteText.mock.lastCall).toStrictEqual(['text to be written']);
+    expect(mockWriteText.mock.results).toStrictEqual([{ type: 'return', value: undefined }]);
+  });
+
+  it('should reset existing mocks', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+    const mockReadText = await browser.electron.mock('clipboard', 'readText');
+    await mockGetName.mockReturnValue('mocked appName');
+    await mockReadText.mockReturnValue('mocked clipboardText');
+
+    await browser.electron.resetAllMocks();
+
+    const appName = await browser.electron.execute((electron) => electron.app.getName());
+    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
+    expect(appName).toBeUndefined();
+    expect(clipboardText).toBeUndefined();
+  });
+
+  it('should reset existing mocks on an API', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+    const mockReadText = await browser.electron.mock('clipboard', 'readText');
+    await mockGetName.mockReturnValue('mocked appName');
+    await mockReadText.mockReturnValue('mocked clipboardText');
+
+    await browser.electron.resetAllMocks('app');
+
+    const appName = await browser.electron.execute((electron) => electron.app.getName());
+    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
+    expect(appName).toBeUndefined();
+    expect(clipboardText).toBe('mocked clipboardText');
+  });
+});
+
+describe('restoreAllMocks', () => {
+  beforeEach(async () => {
+    await browser.electron.execute((electron) => {
+      electron.clipboard.clear();
+      electron.clipboard.writeText('some real clipboard text');
+    });
+  });
+
+  it('should restore existing mocks', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+    const mockReadText = await browser.electron.mock('clipboard', 'readText');
+    await mockGetName.mockReturnValue('mocked appName');
+    await mockReadText.mockReturnValue('mocked clipboardText');
+
+    await browser.electron.restoreAllMocks();
+
+    const appName = await browser.electron.execute((electron) => electron.app.getName());
+    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
+    expect(appName).toBe(pkgAppName);
+    expect(clipboardText).toBe('some real clipboard text');
+  });
+
+  it('should restore existing mocks on an API', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+    const mockReadText = await browser.electron.mock('clipboard', 'readText');
+    await mockGetName.mockReturnValue('mocked appName');
+    await mockReadText.mockReturnValue('mocked clipboardText');
+
+    await browser.electron.restoreAllMocks('app');
+
+    const appName = await browser.electron.execute((electron) => electron.app.getName());
+    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
+    expect(appName).toBe(pkgAppName);
+    expect(clipboardText).toBe('mocked clipboardText');
+  });
+});
+
+describe('isMockFunction', () => {
+  it('should return true when provided with an electron mock', async () => {
+    const mockGetName = await browser.electron.mock('app', 'getName');
+
+    expect(browser.electron.isMockFunction(mockGetName)).toBe(true);
+  });
+
+  it('should return false when provided with a function', async () => {
+    expect(browser.electron.isMockFunction(() => {})).toBe(false);
+  });
+
+  it('should return false when provided with a vitest mock', async () => {
+    // We have to dynamic import `@vitest/spy` due to it being an ESM only module
+    const spy = await import('@vitest/spy');
+    expect(browser.electron.isMockFunction(spy.fn())).toBe(false);
+  });
+});
+
+describe('execute', () => {
+  it('should execute an arbitrary function in the electron main process', async () => {
+    expect(
+      await browser.electron.execute(
+        (electron, a, b, c) => {
+          const version = electron.app.getVersion();
+          return [version, a + b + c];
+        },
+        1,
+        2,
+        3,
+      ),
+    ).toEqual([pkgAppVersion, 6]);
+  });
+
+  it('should execute a string-based function in the electron main process', async () => {
+    await expect(browser.electron.execute('return 1 + 2 + 3')).resolves.toEqual(6);
+  });
+
+  it('should handle executing a function which declares a function', async () => {
+    expect(
+      await browser.execute(() => {
+        function newFunc() {
+          return 'boom!';
+        }
+        return newFunc();
+      }),
+    ).toEqual('boom!');
+  });
+
+  it('should handle executing a function which declares a fat arrow function', async () => {
+    expect(
+      await browser.execute(() => {
+        const newFunc = () => 'boom!';
+        return newFunc();
+      }),
+    ).toEqual('boom!');
+  });
+});
+
+describe('mock object functionality', () => {
+  describe('mockImplementation', () => {
+    it('should use the specified implementation for an existing mock', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      let callsCount = 0;
+      await mockGetName.mockImplementation(() => {
+        // callsCount is not accessible in the electron context so we need to guard it
+        if (typeof callsCount !== 'undefined') {
+          callsCount++;
+        }
+
+        return 'mocked value';
+      });
+      const result = await browser.electron.execute(async (electron) => await electron.app.getName());
+
+      expect(callsCount).toBe(1);
+      expect(result).toBe('mocked value');
+    });
+  });
+
+  describe('mockImplementationOnce', () => {
+    it('should use the specified implementation for an existing mock once', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      await mockGetName.mockImplementation(() => 'default mocked name');
+      await mockGetName.mockImplementationOnce(() => 'first mocked name');
+      await mockGetName.mockImplementationOnce(() => 'second mocked name');
+      await mockGetName.mockImplementationOnce(() => 'third mocked name');
+
+      let name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('first mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('second mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('third mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('default mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('default mocked name');
+    });
+  });
+
+  describe('mockReturnValue', () => {
+    it('should return the specified value from an existing mock', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      await mockGetName.mockReturnValue('This is a mock');
+
+      const electronName = await browser.electron.execute((electron) => electron.app.getName());
+
+      expect(electronName).toBe('This is a mock');
+    });
+  });
+
+  describe('mockReturnValueOnce', () => {
+    it('should return the specified value from an existing mock once', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      await mockGetName.mockReturnValue('default mocked name');
+      await mockGetName.mockReturnValueOnce('first mocked name');
+      await mockGetName.mockReturnValueOnce('second mocked name');
+      await mockGetName.mockReturnValueOnce('third mocked name');
+
+      let name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('first mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('second mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('third mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('default mocked name');
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('default mocked name');
+    });
+  });
+
+  describe('mockResolvedValue', () => {
+    it('should resolve with the specified value from an existing mock', async () => {
+      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
+      await mockGetFileIcon.mockResolvedValue('This is a mock');
+
+      const fileIcon = await browser.electron.execute(
+        async (electron) => await electron.app.getFileIcon('/path/to/icon'),
+      );
+
+      expect(fileIcon).toBe('This is a mock');
+    });
+  });
+
+  describe('mockResolvedValueOnce', () => {
+    it('should resolve with the specified value from an existing mock once', async () => {
+      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
+
+      await mockGetFileIcon.mockResolvedValue('default mocked icon');
+      await mockGetFileIcon.mockResolvedValueOnce('first mocked icon');
+      await mockGetFileIcon.mockResolvedValueOnce('second mocked icon');
+      await mockGetFileIcon.mockResolvedValueOnce('third mocked icon');
+
+      let fileIcon = await browser.electron.execute(
+        async (electron) => await electron.app.getFileIcon('/path/to/icon'),
+      );
+      expect(fileIcon).toBe('first mocked icon');
+      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
+      expect(fileIcon).toBe('second mocked icon');
+      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
+      expect(fileIcon).toBe('third mocked icon');
+      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
+      expect(fileIcon).toBe('default mocked icon');
+      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
+      expect(fileIcon).toBe('default mocked icon');
+    });
+  });
+
+  describe('mockRejectedValue', () => {
+    it('should reject with the specified value from an existing mock', async () => {
+      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
+      await mockGetFileIcon.mockRejectedValue('This is a mock error');
+
+      const fileIconError = await browser.electron.execute(async (electron) => {
+        try {
+          await electron.app.getFileIcon('/path/to/icon');
+        } catch (e) {
+          return e;
+        }
+      });
+
+      expect(fileIconError).toBe('This is a mock error');
+    });
+  });
+
+  describe('mockRejectedValueOnce', () => {
+    it('should reject with the specified value from an existing mock once', async () => {
+      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
+
+      await mockGetFileIcon.mockRejectedValue('default mocked icon error');
+      await mockGetFileIcon.mockRejectedValueOnce('first mocked icon error');
+      await mockGetFileIcon.mockRejectedValueOnce('second mocked icon error');
+      await mockGetFileIcon.mockRejectedValueOnce('third mocked icon error');
+
+      const getFileIcon = async () =>
+        await browser.electron.execute(async (electron) => {
+          try {
+            await electron.app.getFileIcon('/path/to/icon');
+          } catch (e) {
+            return e;
+          }
+        });
+
+      let fileIcon = await getFileIcon();
+      expect(fileIcon).toBe('first mocked icon error');
+      fileIcon = await getFileIcon();
+      expect(fileIcon).toBe('second mocked icon error');
+      fileIcon = await getFileIcon();
+      expect(fileIcon).toBe('third mocked icon error');
+      fileIcon = await getFileIcon();
+      expect(fileIcon).toBe('default mocked icon error');
+      fileIcon = await getFileIcon();
+      expect(fileIcon).toBe('default mocked icon error');
+    });
+  });
+
+  describe('mockClear', () => {
+    it('should clear an existing mock', async () => {
+      const mockShowOpenDialog = await browser.electron.mock('dialog', 'showOpenDialog');
+      await mockShowOpenDialog.mockReturnValue('mocked name');
+
+      await browser.electron.execute((electron) => electron.dialog.showOpenDialog({}));
+      await browser.electron.execute((electron) =>
+        electron.dialog.showOpenDialog({
+          title: 'my dialog',
+        }),
+      );
+      await browser.electron.execute((electron) =>
+        electron.dialog.showOpenDialog({
+          title: 'another dialog',
+        }),
+      );
+
+      await mockShowOpenDialog.mockClear();
+
+      expect(mockShowOpenDialog.mock.calls).toStrictEqual([]);
+      expect(mockShowOpenDialog.mock.invocationCallOrder).toStrictEqual([]);
+      expect(mockShowOpenDialog.mock.lastCall).toBeUndefined();
+      expect(mockShowOpenDialog.mock.results).toStrictEqual([]);
+    });
+  });
+
+  describe('mockReset', () => {
+    it('should reset the implementation of an existing mock', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      await mockGetName.mockReturnValue('mocked name');
+
+      await mockGetName.mockReset();
+
+      const name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBeUndefined();
+    });
+
+    it('should reset mockReturnValueOnce implementations of an existing mock', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      await mockGetName.mockReturnValueOnce('first mocked name');
+      await mockGetName.mockReturnValueOnce('second mocked name');
+      await mockGetName.mockReturnValueOnce('third mocked name');
+
+      await mockGetName.mockReset();
+
+      const name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBeUndefined();
+    });
+
+    it('should reset mockImplementationOnce implementations of an existing mock', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      await mockGetName.mockImplementationOnce(() => 'first mocked name');
+      await mockGetName.mockImplementationOnce(() => 'second mocked name');
+      await mockGetName.mockImplementationOnce(() => 'third mocked name');
+
+      await mockGetName.mockReset();
+
+      const name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBeUndefined();
+    });
+
+    it('should clear the history of an existing mock', async () => {
+      const mockShowOpenDialog = await browser.electron.mock('dialog', 'showOpenDialog');
+      await mockShowOpenDialog.mockReturnValue('mocked name');
+
+      await browser.electron.execute((electron) => electron.dialog.showOpenDialog({}));
+      await browser.electron.execute((electron) =>
+        electron.dialog.showOpenDialog({
+          title: 'my dialog',
+        }),
+      );
+      await browser.electron.execute((electron) =>
+        electron.dialog.showOpenDialog({
+          title: 'another dialog',
+        }),
+      );
+
+      await mockShowOpenDialog.mockReset();
+
+      expect(mockShowOpenDialog.mock.calls).toStrictEqual([]);
+      expect(mockShowOpenDialog.mock.invocationCallOrder).toStrictEqual([]);
+      expect(mockShowOpenDialog.mock.lastCall).toBeUndefined();
+      expect(mockShowOpenDialog.mock.results).toStrictEqual([]);
+    });
+  });
+
+  describe('mockRestore', () => {
+    it('should restore an existing mock', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      await mockGetName.mockReturnValue('mocked name');
+
+      let name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe('mocked name');
+
+      await mockGetName.mockRestore();
+
+      name = await browser.electron.execute((electron) => electron.app.getName());
+      expect(name).toBe(pkgAppName);
+    });
+  });
+
+  describe('getMockName', () => {
+    it('should retrieve the mock name', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      expect(mockGetName.getMockName()).toBe('electron.app.getName');
+    });
+  });
+
+  describe('mockName', () => {
+    it('should set the mock name', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      mockGetName.mockName('my first mock');
+
+      expect(mockGetName.getMockName()).toBe('my first mock');
+    });
+  });
+
+  describe('getMockImplementation', () => {
+    it('should retrieve the mock implementation', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      await mockGetName.mockImplementation(() => 'mocked name');
+      const mockImpl = mockGetName.getMockImplementation();
+
+      expect(mockImpl()).toBe('mocked name');
+    });
+
+    it('should retrieve an empty mock implementation', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      const mockImpl = mockGetName.getMockImplementation();
+
+      expect(mockImpl()).toBeUndefined();
+    });
+  });
+
+  describe('mockReturnThis', () => {
+    it('should allow chaining', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      const mockGetVersion = await browser.electron.mock('app', 'getVersion');
+      await mockGetName.mockReturnThis();
+      await browser.electron.execute((electron) => electron.app.getName().getVersion());
+
+      expect(mockGetVersion).toHaveBeenCalled();
+    });
+  });
+
+  describe('withImplementation', () => {
+    it('should temporarily override mock implementation', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      await mockGetName.mockImplementation(() => 'default mock name');
+      await mockGetName.mockImplementationOnce(() => 'first mock name');
+      await mockGetName.mockImplementationOnce(() => 'second mock name');
+      const withImplementationResult = await mockGetName.withImplementation(
+        () => 'temporary mock name',
+        (electron) => electron.app.getName(),
+      );
+
+      expect(withImplementationResult).toBe('temporary mock name');
+      const firstName = await browser.electron.execute((electron) => electron.app.getName());
+      expect(firstName).toBe('first mock name');
+      const secondName = await browser.electron.execute((electron) => electron.app.getName());
+      expect(secondName).toBe('second mock name');
+      const thirdName = await browser.electron.execute((electron) => electron.app.getName());
+      expect(thirdName).toBe('default mock name');
+    });
+
+    it('should handle promises', async () => {
+      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
+      await mockGetFileIcon.mockResolvedValue('default mock icon');
+      await mockGetFileIcon.mockResolvedValueOnce('first mock icon');
+      await mockGetFileIcon.mockResolvedValueOnce('second mock icon');
+      const withImplementationResult = await mockGetFileIcon.withImplementation(
+        () => Promise.resolve('temporary mock icon'),
+        async (electron) => await electron.app.getFileIcon('/path/to/icon'),
+      );
+
+      expect(withImplementationResult).toBe('temporary mock icon');
+      const firstIcon = await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
+      expect(firstIcon).toBe('first mock icon');
+      const secondIcon = await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
+      expect(secondIcon).toBe('second mock icon');
+      const thirdIcon = await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
+      expect(thirdIcon).toBe('default mock icon');
+    });
+  });
+
+  describe('mock.calls', () => {
+    it('should return the calls of the mock execution', async () => {
+      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
+
+      await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
+      await browser.electron.execute((electron) =>
+        electron.app.getFileIcon('/path/to/another/icon', { size: 'small' }),
+      );
+
+      expect(mockGetFileIcon.mock.calls).toStrictEqual([
+        ['/path/to/icon'], // first call
+        ['/path/to/another/icon', { size: 'small' }], // second call
+      ]);
+    });
+
+    it('should return an empty array when the mock was never invoked', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      expect(mockGetName.mock.calls).toStrictEqual([]);
+    });
+  });
+
+  describe('mock.lastCall', () => {
+    it('should return the last call of the mock execution', async () => {
+      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
+
+      await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
+      expect(mockGetFileIcon.mock.lastCall).toStrictEqual(['/path/to/icon']);
+      await browser.electron.execute((electron) =>
+        electron.app.getFileIcon('/path/to/another/icon', { size: 'small' }),
+      );
+      expect(mockGetFileIcon.mock.lastCall).toStrictEqual(['/path/to/another/icon', { size: 'small' }]);
+      await browser.electron.execute((electron) =>
+        electron.app.getFileIcon('/path/to/a/massive/icon', { size: 'large' }),
+      );
+      expect(mockGetFileIcon.mock.lastCall).toStrictEqual(['/path/to/a/massive/icon', { size: 'large' }]);
+    });
+
+    it('should return undefined when the mock was never invoked', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      expect(mockGetName.mock.lastCall).toBeUndefined();
+    });
+  });
+
+  describe('mock.results', () => {
+    it('should return the results of the mock execution', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      // TODO: why does `mockReturnValueOnce` not work for returning 'result' here?
+      await mockGetName.mockImplementationOnce(() => 'result');
+      await mockGetName.mockImplementation(() => {
+        throw new Error('thrown error');
+      });
+
+      await expect(browser.electron.execute((electron) => electron.app.getName())).resolves.toBe('result');
+      await expect(browser.electron.execute((electron) => electron.app.getName())).rejects.toThrow('thrown error');
+
+      expect(mockGetName.mock.results).toStrictEqual([
+        {
+          type: 'return',
+          value: 'result',
+        },
+        {
+          type: 'throw',
+          value: new Error('thrown error'),
+        },
+      ]);
+    });
+
+    it('should return an empty array when the mock was never invoked', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      expect(mockGetName.mock.results).toStrictEqual([]);
+    });
+  });
+
+  describe('mock.invocationCallOrder', () => {
+    it('should return the order of execution', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+      const mockGetVersion = await browser.electron.mock('app', 'getVersion');
+
+      await browser.electron.execute((electron) => electron.app.getName());
+      await browser.electron.execute((electron) => electron.app.getVersion());
+      await browser.electron.execute((electron) => electron.app.getName());
+
+      const firstInvocationIndex = mockGetName.mock.invocationCallOrder[0];
+
+      expect(mockGetName.mock.invocationCallOrder).toStrictEqual([firstInvocationIndex, firstInvocationIndex + 2]);
+      expect(mockGetVersion.mock.invocationCallOrder).toStrictEqual([firstInvocationIndex + 1]);
+    });
+
+    it('should return an empty array when the mock was never invoked', async () => {
+      const mockGetName = await browser.electron.mock('app', 'getName');
+
+      expect(mockGetName.mock.invocationCallOrder).toStrictEqual([]);
+    });
+  });
+});
diff --git a/e2e/js/application.spec.js b/e2e/js/application.spec.js
new file mode 100644
index 00000000..2112f44b
--- /dev/null
+++ b/e2e/js/application.spec.js
@@ -0,0 +1,18 @@
+import { expect } from '@wdio/globals';
+import { browser } from 'wdio-electron-service';
+
+describe('application loading', () => {
+  describe('App', () => {
+    it('should launch the application', async () => {
+      const title = await browser.getTitle();
+      expect(title).toEqual('Test');
+    });
+
+    it('should pass args through to the launched application', async () => {
+      // custom args are set in the wdio.conf.js file as they need to be set before WDIO starts
+      const argv = await browser.electron.execute(() => process.argv);
+      expect(argv).toContain('--foo');
+      expect(argv).toContain('--bar=baz');
+    });
+  });
+});
diff --git a/e2e/js/dom.spec.js b/e2e/js/dom.spec.js
new file mode 100644
index 00000000..876e65e7
--- /dev/null
+++ b/e2e/js/dom.spec.js
@@ -0,0 +1,35 @@
+import { expect } from '@wdio/globals';
+import { browser } from 'wdio-electron-service';
+import { setupBrowser } from '@testing-library/webdriverio';
+
+describe('application loading', () => {
+  let screen;
+
+  before(() => {
+    screen = setupBrowser(browser);
+  });
+
+  describe('DOM', () => {
+    it('should determine when an element is in the document', async () => {
+      await expect(await screen.getByTestId('disabled-checkbox')).toExist();
+    });
+
+    it('should determine when an element is not in the document', async () => {
+      await expect(await screen.queryByTestId('not-there')).not.toExist();
+    });
+
+    it('should determine when an element is visible', async () => {
+      await expect(await screen.getByTestId('disabled-checkbox')).toBeDisplayed();
+    });
+
+    it('should determine when an element is not visible', async () => {
+      await expect(await screen.getByTestId('hidden-textarea')).not.toBeDisplayed();
+    });
+  });
+
+  describe('WDIO Matchers', () => {
+    it('should be able to use WebdriverIO matchers', async () => {
+      await expect(await $('#disabled-checkbox')).toBePresent();
+    });
+  });
+});
diff --git a/e2e/js/interaction.spec.js b/e2e/js/interaction.spec.js
new file mode 100644
index 00000000..1eecbe60
--- /dev/null
+++ b/e2e/js/interaction.spec.js
@@ -0,0 +1,62 @@
+import { expect } from '@wdio/globals';
+import { browser } from 'wdio-electron-service';
+import { setupBrowser } from '@testing-library/webdriverio';
+
+describe('application loading', () => {
+  let screen;
+
+  before(() => {
+    screen = setupBrowser(browser);
+  });
+
+  describe('keyboard input', () => {
+    it('should detect keyboard input', async () => {
+      await browser.keys(['y', 'o']);
+      expect(await (await screen.getByTestId('keypress-count')).getText()).toEqual('YO');
+    });
+  });
+
+  describe('click events', () => {
+    describe('when the make larger button is clicked', () => {
+      it('should increase the window height and width by 10 pixels', async () => {
+        let bounds = await browser.electron.execute((electron) => {
+          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
+          return browserWindow.getBounds();
+        });
+        expect(bounds.width).toEqual(200);
+        expect(bounds.height).toEqual(300);
+        let biggerClickCount = await browser.$('.click-count .bigger').getText();
+        expect(biggerClickCount).toEqual('0');
+        const elem = await browser.$('.make-bigger');
+        await elem.click();
+        biggerClickCount = await browser.$('.click-count .bigger').getText();
+        expect(biggerClickCount).toEqual('1');
+        bounds = await browser.electron.execute((electron) => {
+          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
+          return browserWindow.getBounds();
+        });
+        expect(bounds.width).toEqual(210);
+        expect(bounds.height).toEqual(310);
+      });
+    });
+
+    describe('when the make smaller button is clicked', () => {
+      it('should decrease the window height and width by 10 pixels', async () => {
+        let bounds = await browser.electron.execute((electron) => {
+          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
+          return browserWindow.getBounds();
+        });
+        expect(bounds.width).toEqual(210);
+        expect(bounds.height).toEqual(310);
+        const elem = await browser.$('.make-smaller');
+        await elem.click();
+        bounds = await browser.electron.execute((electron) => {
+          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
+          return browserWindow.getBounds();
+        });
+        expect(bounds.width).toEqual(200);
+        expect(bounds.height).toEqual(300);
+      });
+    });
+  });
+});
diff --git a/e2e/package.json b/e2e/package.json
index 1ee34093..71827545 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -17,11 +17,13 @@
     "test:e2e-mac-universal:builder-esm": "cross-env EXAMPLE_DIR=builder-esm pnpm run exec",
     "test:e2e:no-binary-cjs": "cross-env DEBUG=wdio-electron-service EXAMPLE_DIR=no-binary-cjs pnpm run exec-no-binary",
     "test:e2e:no-binary-esm": "cross-env DEBUG=wdio-electron-service EXAMPLE_DIR=no-binary-esm pnpm run exec-no-binary",
-    "exec": "pnpm run exec:main && pnpm run exec:multiremote && pnpm run exec:standalone",
-    "exec-no-binary": "pnpm run exec-no-binary:main && pnpm run exec-no-binary:multiremote && pnpm run exec-no-binary:standalone",
+    "exec": "pnpm run exec:main && pnpm run exec:js && pnpm run exec:multiremote && pnpm run exec:standalone",
+    "exec-no-binary": "pnpm run exec-no-binary:main && pnpm run exec-no-binary:js && pnpm run exec-no-binary:multiremote && pnpm run exec-no-binary:standalone",
+    "exec-no-binary:js": "xvfb-maybe wdio run ./wdio.no-binary.conf.js",
     "exec-no-binary:main": "xvfb-maybe wdio run ./wdio.no-binary.conf.ts",
     "exec-no-binary:multiremote": "xvfb-maybe wdio run ./wdio.no-binary.multiremote.conf.ts",
     "exec-no-binary:standalone": "xvfb-maybe tsx ./standalone/api.no-binary.spec.ts",
+    "exec:js": "xvfb-maybe wdio run ./wdio.conf.js",
     "exec:main": "xvfb-maybe wdio run ./wdio.conf.ts",
     "exec:multiremote": "xvfb-maybe wdio run ./wdio.multiremote.conf.ts",
     "exec:standalone": "xvfb-maybe tsx ./standalone/api.spec.ts",
diff --git a/e2e/wdio.conf.js b/e2e/wdio.conf.js
new file mode 100644
index 00000000..2a6d99b8
--- /dev/null
+++ b/e2e/wdio.conf.js
@@ -0,0 +1,43 @@
+import url from 'node:url';
+import path from 'node:path';
+import fs from 'node:fs';
+
+import { getAppBuildInfo, getBinaryPath, getElectronVersion } from '@wdio/electron-utils';
+
+const exampleDir = process.env.EXAMPLE_DIR || 'forge-esm';
+const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
+const packageJsonPath = path.join(__dirname, '..', 'apps', exampleDir, 'package.json');
+const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, { encoding: 'utf-8' }));
+const pkg = { packageJson, path: packageJsonPath };
+const electronVersion = getElectronVersion(pkg);
+const appBuildInfo = await getAppBuildInfo(pkg);
+const appBinaryPath = await getBinaryPath(packageJsonPath, appBuildInfo, electronVersion);
+
+globalThis.packageJson = packageJson;
+process.env.TEST = 'true';
+
+export const config = {
+  services: ['electron'],
+  capabilities: [
+    {
+      'browserName': 'electron',
+      'wdio:electronServiceOptions': {
+        appBinaryPath,
+        appArgs: ['foo', 'bar=baz'],
+        restoreMocks: true,
+      },
+    },
+  ],
+  waitforTimeout: 5000,
+  connectionRetryCount: 10,
+  connectionRetryTimeout: 30000,
+  logLevel: 'debug',
+  runner: 'local',
+  outputDir: `wdio-logs-${exampleDir}`,
+  specs: [`./js/*.spec.js`],
+  framework: 'mocha',
+  mochaOpts: {
+    ui: 'bdd',
+    timeout: 30000,
+  },
+};
diff --git a/e2e/wdio.no-binary.conf.js b/e2e/wdio.no-binary.conf.js
new file mode 100644
index 00000000..8f3cbaec
--- /dev/null
+++ b/e2e/wdio.no-binary.conf.js
@@ -0,0 +1,43 @@
+import url from 'node:url';
+import path from 'node:path';
+import fs from 'node:fs';
+
+import { getElectronVersion } from '@wdio/electron-utils';
+
+const exampleDir = process.env.EXAMPLE_DIR || 'forge-esm';
+const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
+const packageJsonPath = path.join(__dirname, '..', 'apps', exampleDir, 'package.json');
+const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, { encoding: 'utf-8' }));
+const appEntryPoint = path.join(__dirname, '..', 'apps', exampleDir, 'dist', 'main.bundle.js');
+
+globalThis.packageJson = {
+  name: 'Electron',
+  version: getElectronVersion({ packageJson, path: packageJsonPath }),
+};
+process.env.TEST = 'true';
+
+export const config = {
+  services: ['electron'],
+  capabilities: [
+    {
+      'browserName': 'electron',
+      'wdio:electronServiceOptions': {
+        appEntryPoint,
+        appArgs: ['foo', 'bar=baz'],
+        restoreMocks: true,
+      },
+    },
+  ],
+  waitforTimeout: 5000,
+  connectionRetryCount: 10,
+  connectionRetryTimeout: 30000,
+  logLevel: 'debug',
+  runner: 'local',
+  outputDir: `wdio-logs-${exampleDir}`,
+  specs: [`./js/*.spec.js`],
+  framework: 'mocha',
+  mochaOpts: {
+    ui: 'bdd',
+    timeout: 30000,
+  },
+};

From 4e5b240bf7ce6ffb1b6020a11c39be78b871e264 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 15:23:06 +0100
Subject: [PATCH 08/52] debug: run js specs first

---
 e2e/package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/e2e/package.json b/e2e/package.json
index 71827545..77472a8c 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -17,8 +17,8 @@
     "test:e2e-mac-universal:builder-esm": "cross-env EXAMPLE_DIR=builder-esm pnpm run exec",
     "test:e2e:no-binary-cjs": "cross-env DEBUG=wdio-electron-service EXAMPLE_DIR=no-binary-cjs pnpm run exec-no-binary",
     "test:e2e:no-binary-esm": "cross-env DEBUG=wdio-electron-service EXAMPLE_DIR=no-binary-esm pnpm run exec-no-binary",
-    "exec": "pnpm run exec:main && pnpm run exec:js && pnpm run exec:multiremote && pnpm run exec:standalone",
-    "exec-no-binary": "pnpm run exec-no-binary:main && pnpm run exec-no-binary:js && pnpm run exec-no-binary:multiremote && pnpm run exec-no-binary:standalone",
+    "exec": "pnpm run exec:js && pnpm run exec:main && pnpm run exec:multiremote && pnpm run exec:standalone",
+    "exec-no-binary": "pnpm run exec-no-binary:js && pnpm run exec-no-binary:main && pnpm run exec-no-binary:multiremote && pnpm run exec-no-binary:standalone",
     "exec-no-binary:js": "xvfb-maybe wdio run ./wdio.no-binary.conf.js",
     "exec-no-binary:main": "xvfb-maybe wdio run ./wdio.no-binary.conf.ts",
     "exec-no-binary:multiremote": "xvfb-maybe wdio run ./wdio.no-binary.multiremote.conf.ts",

From 81fbdd79a00b579af39ae6f55f3eea4f705610c7 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 15:28:35 +0100
Subject: [PATCH 09/52] chore(linting): exempt JS E2E files for now

---
 eslint.config.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/eslint.config.js b/eslint.config.js
index 581aa40d..6763b43b 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -14,7 +14,7 @@ export default [
   },
   // Ignored files
   {
-    ignores: ['**/*.config.js'],
+    ignores: ['**/*.config.js', 'e2e/**/*.js'],
   },
   // All files
   {

From 3d616fb44af9dbee29d0799e757ce7bec069daac Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 17:36:24 +0100
Subject: [PATCH 10/52] fix: update type imports

---
 packages/wdio-electron-service/test/launcher.spec.ts  | 2 +-
 packages/wdio-electron-service/test/mock.spec.ts      | 2 +-
 packages/wdio-electron-service/test/mockStore.spec.ts | 2 +-
 packages/wdio-electron-service/test/service.spec.ts   | 9 ++++++---
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/packages/wdio-electron-service/test/launcher.spec.ts b/packages/wdio-electron-service/test/launcher.spec.ts
index 18d334b5..c32bcfbd 100644
--- a/packages/wdio-electron-service/test/launcher.spec.ts
+++ b/packages/wdio-electron-service/test/launcher.spec.ts
@@ -3,11 +3,11 @@ import path from 'node:path';
 import { describe, beforeEach, afterEach, it, expect, vi, Mock } from 'vitest';
 import nock from 'nock';
 import type { Capabilities, Options } from '@wdio/types';
+import type { ElectronServiceOptions } from '@wdio/electron-types';
 
 import ElectronLaunchService from '../src/launcher.js';
 import { getAppBuildInfo, getBinaryPath } from '@wdio/electron-utils';
 import { mockProcessProperty, revertProcessProperty } from './helpers.js';
-import type { ElectronServiceOptions } from '../src/index.js';
 
 let LaunchService: typeof ElectronLaunchService;
 let instance: ElectronLaunchService | undefined;
diff --git a/packages/wdio-electron-service/test/mock.spec.ts b/packages/wdio-electron-service/test/mock.spec.ts
index c50fafad..1e63b563 100644
--- a/packages/wdio-electron-service/test/mock.spec.ts
+++ b/packages/wdio-electron-service/test/mock.spec.ts
@@ -3,7 +3,7 @@ import { isAsyncFunction } from 'node:util/types';
 import { describe, it, expect, beforeEach, vi, Mock } from 'vitest';
 
 import { createMock } from '../src/mock.js';
-import { ElectronInterface, ElectronType } from '@wdio/electron-types';
+import type { ElectronInterface, ElectronType } from '@wdio/electron-types';
 
 let mockFn: Mock;
 
diff --git a/packages/wdio-electron-service/test/mockStore.spec.ts b/packages/wdio-electron-service/test/mockStore.spec.ts
index 6a7c68be..823d8a62 100644
--- a/packages/wdio-electron-service/test/mockStore.spec.ts
+++ b/packages/wdio-electron-service/test/mockStore.spec.ts
@@ -1,6 +1,6 @@
 import { vi, describe, beforeEach, afterEach, it, expect } from 'vitest';
 import { ElectronServiceMockStore } from '../src/mockStore.js';
-import { ElectronMock } from '@wdio/electron-types';
+import type { ElectronMock } from '@wdio/electron-types';
 
 let mockStore: ElectronServiceMockStore;
 
diff --git a/packages/wdio-electron-service/test/service.spec.ts b/packages/wdio-electron-service/test/service.spec.ts
index 5aa33ec6..82bd3952 100644
--- a/packages/wdio-electron-service/test/service.spec.ts
+++ b/packages/wdio-electron-service/test/service.spec.ts
@@ -1,12 +1,12 @@
 import { vi, describe, beforeEach, it, expect, Mock } from 'vitest';
+import type { BrowserExtension, ElectronMock } from '@wdio/electron-types';
 
 import { mockProcessProperty } from './helpers.js';
 import { clearAllMocks } from '../src/commands/clearAllMocks.js';
 import { resetAllMocks } from '../src/commands/resetAllMocks.js';
 import { restoreAllMocks } from '../src/commands/restoreAllMocks.js';
-import type { BrowserExtension, ElectronMock } from '../src/index.js';
-import type ElectronWorkerService from '../src/service.js';
 import mockStore from '../src/mockStore.js';
+import type ElectronWorkerService from '../src/service.js';
 
 let WorkerService: typeof ElectronWorkerService;
 let instance: ElectronWorkerService | undefined;
@@ -41,7 +41,10 @@ describe('before', () => {
             requestedCapabilities: { 'wdio:electronServiceOptions': {} },
             waitUntil: vi.fn().mockResolvedValue(true),
           },
-          firefox: { requestedCapabilities: {}, waitUntil: vi.fn().mockResolvedValue(true) },
+          firefox: {
+            requestedCapabilities: {},
+            waitUntil: vi.fn().mockResolvedValue(true),
+          },
         },
         isMultiremote: true,
         instances: ['electron', 'firefox'],

From 72c4535ddcbc1da8cae83e1e9d53533d61ef84e6 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 17:38:06 +0100
Subject: [PATCH 11/52] fix: add `__name` to preload

---
 packages/wdio-electron-service/src/preload.ts | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/packages/wdio-electron-service/src/preload.ts b/packages/wdio-electron-service/src/preload.ts
index 681921a7..12c25e16 100644
--- a/packages/wdio-electron-service/src/preload.ts
+++ b/packages/wdio-electron-service/src/preload.ts
@@ -6,3 +6,5 @@ const invoke = async (channel: Channel, ...data: unknown[]) => ipcRenderer.invok
 contextBridge.exposeInMainWorld('wdioElectron', {
   execute: (script: string, args: unknown[]) => invoke(Channel.Execute, script, args),
 });
+
+contextBridge.exposeInMainWorld('__name', (func: (...args: unknown[]) => unknown) => func);

From d30314c97608412cd0d99a1a25d5346e89180aab Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 19:23:12 +0100
Subject: [PATCH 12/52] refactor: convert TS files using rollup

---
 e2e/api.spec.ts            |   4 +-
 e2e/js/api.spec.js         | 748 -------------------------------------
 e2e/js/application.spec.js |  18 -
 e2e/js/dom.spec.js         |  35 --
 e2e/js/interaction.spec.js |  62 ---
 e2e/package.json           |   5 +-
 e2e/rollup.config.js       |  10 +
 pnpm-lock.yaml             |  28 ++
 turbo.json                 |  23 +-
 9 files changed, 57 insertions(+), 876 deletions(-)
 delete mode 100644 e2e/js/api.spec.js
 delete mode 100644 e2e/js/application.spec.js
 delete mode 100644 e2e/js/dom.spec.js
 delete mode 100644 e2e/js/interaction.spec.js
 create mode 100644 e2e/rollup.config.js

diff --git a/e2e/api.spec.ts b/e2e/api.spec.ts
index cd31ee96..7955d270 100644
--- a/e2e/api.spec.ts
+++ b/e2e/api.spec.ts
@@ -421,7 +421,7 @@ describe('mock object functionality', () => {
 
       const fileIconError = await browser.electron.execute(async (electron) => {
         try {
-          await electron.app.getFileIcon('/path/to/icon');
+          return await electron.app.getFileIcon('/path/to/icon');
         } catch (e) {
           return e;
         }
@@ -443,7 +443,7 @@ describe('mock object functionality', () => {
       const getFileIcon = async () =>
         await browser.electron.execute(async (electron) => {
           try {
-            await electron.app.getFileIcon('/path/to/icon');
+            return await electron.app.getFileIcon('/path/to/icon');
           } catch (e) {
             return e;
           }
diff --git a/e2e/js/api.spec.js b/e2e/js/api.spec.js
deleted file mode 100644
index 648fbc03..00000000
--- a/e2e/js/api.spec.js
+++ /dev/null
@@ -1,748 +0,0 @@
-import { expect } from '@wdio/globals';
-import { browser } from 'wdio-electron-service';
-
-const { name: pkgAppName, version: pkgAppVersion } = globalThis.packageJson;
-
-describe('mock', () => {
-  it('should mock an electron API function', async () => {
-    const mockShowOpenDialog = await browser.electron.mock('dialog', 'showOpenDialog');
-    await browser.electron.execute(async (electron) => {
-      await electron.dialog.showOpenDialog({
-        title: 'my dialog',
-        properties: ['openFile', 'openDirectory'],
-      });
-      return electron.dialog.showOpenDialog.mock.calls;
-    });
-
-    expect(mockShowOpenDialog).toHaveBeenCalledTimes(1);
-    expect(mockShowOpenDialog).toHaveBeenCalledWith({
-      title: 'my dialog',
-      properties: ['openFile', 'openDirectory'],
-    });
-  });
-
-  it('should mock a synchronous electron API function', async () => {
-    const mockShowOpenDialogSync = await browser.electron.mock('dialog', 'showOpenDialogSync');
-    await browser.electron.execute((electron) =>
-      electron.dialog.showOpenDialogSync({
-        title: 'my dialog',
-        properties: ['openFile', 'openDirectory'],
-      }),
-    );
-
-    expect(mockShowOpenDialogSync).toHaveBeenCalledTimes(1);
-    expect(mockShowOpenDialogSync).toHaveBeenCalledWith({
-      title: 'my dialog',
-      properties: ['openFile', 'openDirectory'],
-    });
-  });
-});
-
-describe('mockAll', () => {
-  it('should mock all functions on an API', async () => {
-    const mockedDialog = await browser.electron.mockAll('dialog');
-    await browser.electron.execute(
-      async (electron) =>
-        await electron.dialog.showOpenDialog({
-          title: 'my dialog',
-        }),
-    );
-    await browser.electron.execute((electron) =>
-      electron.dialog.showOpenDialogSync({
-        title: 'my dialog',
-      }),
-    );
-
-    expect(mockedDialog.showOpenDialog).toHaveBeenCalledTimes(1);
-    expect(mockedDialog.showOpenDialog).toHaveBeenCalledWith({
-      title: 'my dialog',
-    });
-    expect(mockedDialog.showOpenDialogSync).toHaveBeenCalledTimes(1);
-    expect(mockedDialog.showOpenDialogSync).toHaveBeenCalledWith({
-      title: 'my dialog',
-    });
-  });
-});
-
-describe('clearAllMocks', () => {
-  it('should clear existing mocks', async () => {
-    const mockSetName = await browser.electron.mock('app', 'setName');
-    const mockWriteText = await browser.electron.mock('clipboard', 'writeText');
-
-    await browser.electron.execute((electron) => electron.app.setName('new app name'));
-    await browser.electron.execute((electron) => electron.clipboard.writeText('text to be written'));
-
-    await browser.electron.clearAllMocks();
-
-    expect(mockSetName.mock.calls).toStrictEqual([]);
-    expect(mockSetName.mock.invocationCallOrder).toStrictEqual([]);
-    expect(mockSetName.mock.lastCall).toBeUndefined();
-    expect(mockSetName.mock.results).toStrictEqual([]);
-
-    expect(mockWriteText.mock.calls).toStrictEqual([]);
-    expect(mockWriteText.mock.invocationCallOrder).toStrictEqual([]);
-    expect(mockWriteText.mock.lastCall).toBeUndefined();
-    expect(mockWriteText.mock.results).toStrictEqual([]);
-  });
-
-  it('should clear existing mocks on an API', async () => {
-    const mockSetName = await browser.electron.mock('app', 'setName');
-    const mockWriteText = await browser.electron.mock('clipboard', 'writeText');
-
-    await browser.electron.execute((electron) => electron.app.setName('new app name'));
-    await browser.electron.execute((electron) => electron.clipboard.writeText('text to be written'));
-
-    await browser.electron.clearAllMocks('app');
-
-    expect(mockSetName.mock.calls).toStrictEqual([]);
-    expect(mockSetName.mock.invocationCallOrder).toStrictEqual([]);
-    expect(mockSetName.mock.lastCall).toBeUndefined();
-    expect(mockSetName.mock.results).toStrictEqual([]);
-
-    expect(mockWriteText.mock.calls).toStrictEqual([['text to be written']]);
-    expect(mockWriteText.mock.invocationCallOrder).toStrictEqual([expect.any(Number)]);
-    expect(mockWriteText.mock.lastCall).toStrictEqual(['text to be written']);
-    expect(mockWriteText.mock.results).toStrictEqual([{ type: 'return', value: undefined }]);
-  });
-
-  it('should not reset existing mocks', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-    const mockReadText = await browser.electron.mock('clipboard', 'readText');
-    await mockGetName.mockReturnValue('mocked appName');
-    await mockReadText.mockReturnValue('mocked clipboardText');
-
-    await browser.electron.clearAllMocks();
-
-    const appName = await browser.electron.execute((electron) => electron.app.getName());
-    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
-    expect(appName).toBe('mocked appName');
-    expect(clipboardText).toBe('mocked clipboardText');
-  });
-
-  it('should not reset existing mocks on an API', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-    const mockReadText = await browser.electron.mock('clipboard', 'readText');
-    await mockGetName.mockReturnValue('mocked appName');
-    await mockReadText.mockReturnValue('mocked clipboardText');
-
-    await browser.electron.clearAllMocks('app');
-
-    const appName = await browser.electron.execute((electron) => electron.app.getName());
-    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
-    expect(appName).toBe('mocked appName');
-    expect(clipboardText).toBe('mocked clipboardText');
-  });
-});
-
-describe('resetAllMocks', () => {
-  it('should clear existing mocks', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-    const mockReadText = await browser.electron.mock('clipboard', 'readText');
-    await mockGetName.mockReturnValue('mocked appName');
-    await mockReadText.mockReturnValue('mocked clipboardText');
-
-    await browser.electron.execute((electron) => electron.app.getName());
-    await browser.electron.execute((electron) => electron.clipboard.readText());
-
-    await browser.electron.resetAllMocks();
-
-    expect(mockGetName.mock.calls).toStrictEqual([]);
-    expect(mockGetName.mock.invocationCallOrder).toStrictEqual([]);
-    expect(mockGetName.mock.lastCall).toBeUndefined();
-    expect(mockGetName.mock.results).toStrictEqual([]);
-
-    expect(mockReadText.mock.calls).toStrictEqual([]);
-    expect(mockReadText.mock.invocationCallOrder).toStrictEqual([]);
-    expect(mockReadText.mock.lastCall).toBeUndefined();
-    expect(mockReadText.mock.results).toStrictEqual([]);
-  });
-
-  it('should clear existing mocks on an API', async () => {
-    const mockSetName = await browser.electron.mock('app', 'setName');
-    const mockWriteText = await browser.electron.mock('clipboard', 'writeText');
-
-    await browser.electron.execute((electron) => electron.app.setName('new app name'));
-    await browser.electron.execute((electron) => electron.clipboard.writeText('text to be written'));
-
-    await browser.electron.resetAllMocks('app');
-
-    expect(mockSetName.mock.calls).toStrictEqual([]);
-    expect(mockSetName.mock.invocationCallOrder).toStrictEqual([]);
-    expect(mockSetName.mock.lastCall).toBeUndefined();
-    expect(mockSetName.mock.results).toStrictEqual([]);
-
-    expect(mockWriteText.mock.calls).toStrictEqual([['text to be written']]);
-    expect(mockWriteText.mock.invocationCallOrder).toStrictEqual([expect.any(Number)]);
-    expect(mockWriteText.mock.lastCall).toStrictEqual(['text to be written']);
-    expect(mockWriteText.mock.results).toStrictEqual([{ type: 'return', value: undefined }]);
-  });
-
-  it('should reset existing mocks', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-    const mockReadText = await browser.electron.mock('clipboard', 'readText');
-    await mockGetName.mockReturnValue('mocked appName');
-    await mockReadText.mockReturnValue('mocked clipboardText');
-
-    await browser.electron.resetAllMocks();
-
-    const appName = await browser.electron.execute((electron) => electron.app.getName());
-    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
-    expect(appName).toBeUndefined();
-    expect(clipboardText).toBeUndefined();
-  });
-
-  it('should reset existing mocks on an API', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-    const mockReadText = await browser.electron.mock('clipboard', 'readText');
-    await mockGetName.mockReturnValue('mocked appName');
-    await mockReadText.mockReturnValue('mocked clipboardText');
-
-    await browser.electron.resetAllMocks('app');
-
-    const appName = await browser.electron.execute((electron) => electron.app.getName());
-    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
-    expect(appName).toBeUndefined();
-    expect(clipboardText).toBe('mocked clipboardText');
-  });
-});
-
-describe('restoreAllMocks', () => {
-  beforeEach(async () => {
-    await browser.electron.execute((electron) => {
-      electron.clipboard.clear();
-      electron.clipboard.writeText('some real clipboard text');
-    });
-  });
-
-  it('should restore existing mocks', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-    const mockReadText = await browser.electron.mock('clipboard', 'readText');
-    await mockGetName.mockReturnValue('mocked appName');
-    await mockReadText.mockReturnValue('mocked clipboardText');
-
-    await browser.electron.restoreAllMocks();
-
-    const appName = await browser.electron.execute((electron) => electron.app.getName());
-    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
-    expect(appName).toBe(pkgAppName);
-    expect(clipboardText).toBe('some real clipboard text');
-  });
-
-  it('should restore existing mocks on an API', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-    const mockReadText = await browser.electron.mock('clipboard', 'readText');
-    await mockGetName.mockReturnValue('mocked appName');
-    await mockReadText.mockReturnValue('mocked clipboardText');
-
-    await browser.electron.restoreAllMocks('app');
-
-    const appName = await browser.electron.execute((electron) => electron.app.getName());
-    const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
-    expect(appName).toBe(pkgAppName);
-    expect(clipboardText).toBe('mocked clipboardText');
-  });
-});
-
-describe('isMockFunction', () => {
-  it('should return true when provided with an electron mock', async () => {
-    const mockGetName = await browser.electron.mock('app', 'getName');
-
-    expect(browser.electron.isMockFunction(mockGetName)).toBe(true);
-  });
-
-  it('should return false when provided with a function', async () => {
-    expect(browser.electron.isMockFunction(() => {})).toBe(false);
-  });
-
-  it('should return false when provided with a vitest mock', async () => {
-    // We have to dynamic import `@vitest/spy` due to it being an ESM only module
-    const spy = await import('@vitest/spy');
-    expect(browser.electron.isMockFunction(spy.fn())).toBe(false);
-  });
-});
-
-describe('execute', () => {
-  it('should execute an arbitrary function in the electron main process', async () => {
-    expect(
-      await browser.electron.execute(
-        (electron, a, b, c) => {
-          const version = electron.app.getVersion();
-          return [version, a + b + c];
-        },
-        1,
-        2,
-        3,
-      ),
-    ).toEqual([pkgAppVersion, 6]);
-  });
-
-  it('should execute a string-based function in the electron main process', async () => {
-    await expect(browser.electron.execute('return 1 + 2 + 3')).resolves.toEqual(6);
-  });
-
-  it('should handle executing a function which declares a function', async () => {
-    expect(
-      await browser.execute(() => {
-        function newFunc() {
-          return 'boom!';
-        }
-        return newFunc();
-      }),
-    ).toEqual('boom!');
-  });
-
-  it('should handle executing a function which declares a fat arrow function', async () => {
-    expect(
-      await browser.execute(() => {
-        const newFunc = () => 'boom!';
-        return newFunc();
-      }),
-    ).toEqual('boom!');
-  });
-});
-
-describe('mock object functionality', () => {
-  describe('mockImplementation', () => {
-    it('should use the specified implementation for an existing mock', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      let callsCount = 0;
-      await mockGetName.mockImplementation(() => {
-        // callsCount is not accessible in the electron context so we need to guard it
-        if (typeof callsCount !== 'undefined') {
-          callsCount++;
-        }
-
-        return 'mocked value';
-      });
-      const result = await browser.electron.execute(async (electron) => await electron.app.getName());
-
-      expect(callsCount).toBe(1);
-      expect(result).toBe('mocked value');
-    });
-  });
-
-  describe('mockImplementationOnce', () => {
-    it('should use the specified implementation for an existing mock once', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      await mockGetName.mockImplementation(() => 'default mocked name');
-      await mockGetName.mockImplementationOnce(() => 'first mocked name');
-      await mockGetName.mockImplementationOnce(() => 'second mocked name');
-      await mockGetName.mockImplementationOnce(() => 'third mocked name');
-
-      let name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('first mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('second mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('third mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('default mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('default mocked name');
-    });
-  });
-
-  describe('mockReturnValue', () => {
-    it('should return the specified value from an existing mock', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      await mockGetName.mockReturnValue('This is a mock');
-
-      const electronName = await browser.electron.execute((electron) => electron.app.getName());
-
-      expect(electronName).toBe('This is a mock');
-    });
-  });
-
-  describe('mockReturnValueOnce', () => {
-    it('should return the specified value from an existing mock once', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      await mockGetName.mockReturnValue('default mocked name');
-      await mockGetName.mockReturnValueOnce('first mocked name');
-      await mockGetName.mockReturnValueOnce('second mocked name');
-      await mockGetName.mockReturnValueOnce('third mocked name');
-
-      let name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('first mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('second mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('third mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('default mocked name');
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('default mocked name');
-    });
-  });
-
-  describe('mockResolvedValue', () => {
-    it('should resolve with the specified value from an existing mock', async () => {
-      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
-      await mockGetFileIcon.mockResolvedValue('This is a mock');
-
-      const fileIcon = await browser.electron.execute(
-        async (electron) => await electron.app.getFileIcon('/path/to/icon'),
-      );
-
-      expect(fileIcon).toBe('This is a mock');
-    });
-  });
-
-  describe('mockResolvedValueOnce', () => {
-    it('should resolve with the specified value from an existing mock once', async () => {
-      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
-
-      await mockGetFileIcon.mockResolvedValue('default mocked icon');
-      await mockGetFileIcon.mockResolvedValueOnce('first mocked icon');
-      await mockGetFileIcon.mockResolvedValueOnce('second mocked icon');
-      await mockGetFileIcon.mockResolvedValueOnce('third mocked icon');
-
-      let fileIcon = await browser.electron.execute(
-        async (electron) => await electron.app.getFileIcon('/path/to/icon'),
-      );
-      expect(fileIcon).toBe('first mocked icon');
-      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
-      expect(fileIcon).toBe('second mocked icon');
-      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
-      expect(fileIcon).toBe('third mocked icon');
-      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
-      expect(fileIcon).toBe('default mocked icon');
-      fileIcon = await browser.electron.execute(async (electron) => await electron.app.getFileIcon('/path/to/icon'));
-      expect(fileIcon).toBe('default mocked icon');
-    });
-  });
-
-  describe('mockRejectedValue', () => {
-    it('should reject with the specified value from an existing mock', async () => {
-      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
-      await mockGetFileIcon.mockRejectedValue('This is a mock error');
-
-      const fileIconError = await browser.electron.execute(async (electron) => {
-        try {
-          await electron.app.getFileIcon('/path/to/icon');
-        } catch (e) {
-          return e;
-        }
-      });
-
-      expect(fileIconError).toBe('This is a mock error');
-    });
-  });
-
-  describe('mockRejectedValueOnce', () => {
-    it('should reject with the specified value from an existing mock once', async () => {
-      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
-
-      await mockGetFileIcon.mockRejectedValue('default mocked icon error');
-      await mockGetFileIcon.mockRejectedValueOnce('first mocked icon error');
-      await mockGetFileIcon.mockRejectedValueOnce('second mocked icon error');
-      await mockGetFileIcon.mockRejectedValueOnce('third mocked icon error');
-
-      const getFileIcon = async () =>
-        await browser.electron.execute(async (electron) => {
-          try {
-            await electron.app.getFileIcon('/path/to/icon');
-          } catch (e) {
-            return e;
-          }
-        });
-
-      let fileIcon = await getFileIcon();
-      expect(fileIcon).toBe('first mocked icon error');
-      fileIcon = await getFileIcon();
-      expect(fileIcon).toBe('second mocked icon error');
-      fileIcon = await getFileIcon();
-      expect(fileIcon).toBe('third mocked icon error');
-      fileIcon = await getFileIcon();
-      expect(fileIcon).toBe('default mocked icon error');
-      fileIcon = await getFileIcon();
-      expect(fileIcon).toBe('default mocked icon error');
-    });
-  });
-
-  describe('mockClear', () => {
-    it('should clear an existing mock', async () => {
-      const mockShowOpenDialog = await browser.electron.mock('dialog', 'showOpenDialog');
-      await mockShowOpenDialog.mockReturnValue('mocked name');
-
-      await browser.electron.execute((electron) => electron.dialog.showOpenDialog({}));
-      await browser.electron.execute((electron) =>
-        electron.dialog.showOpenDialog({
-          title: 'my dialog',
-        }),
-      );
-      await browser.electron.execute((electron) =>
-        electron.dialog.showOpenDialog({
-          title: 'another dialog',
-        }),
-      );
-
-      await mockShowOpenDialog.mockClear();
-
-      expect(mockShowOpenDialog.mock.calls).toStrictEqual([]);
-      expect(mockShowOpenDialog.mock.invocationCallOrder).toStrictEqual([]);
-      expect(mockShowOpenDialog.mock.lastCall).toBeUndefined();
-      expect(mockShowOpenDialog.mock.results).toStrictEqual([]);
-    });
-  });
-
-  describe('mockReset', () => {
-    it('should reset the implementation of an existing mock', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      await mockGetName.mockReturnValue('mocked name');
-
-      await mockGetName.mockReset();
-
-      const name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBeUndefined();
-    });
-
-    it('should reset mockReturnValueOnce implementations of an existing mock', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      await mockGetName.mockReturnValueOnce('first mocked name');
-      await mockGetName.mockReturnValueOnce('second mocked name');
-      await mockGetName.mockReturnValueOnce('third mocked name');
-
-      await mockGetName.mockReset();
-
-      const name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBeUndefined();
-    });
-
-    it('should reset mockImplementationOnce implementations of an existing mock', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      await mockGetName.mockImplementationOnce(() => 'first mocked name');
-      await mockGetName.mockImplementationOnce(() => 'second mocked name');
-      await mockGetName.mockImplementationOnce(() => 'third mocked name');
-
-      await mockGetName.mockReset();
-
-      const name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBeUndefined();
-    });
-
-    it('should clear the history of an existing mock', async () => {
-      const mockShowOpenDialog = await browser.electron.mock('dialog', 'showOpenDialog');
-      await mockShowOpenDialog.mockReturnValue('mocked name');
-
-      await browser.electron.execute((electron) => electron.dialog.showOpenDialog({}));
-      await browser.electron.execute((electron) =>
-        electron.dialog.showOpenDialog({
-          title: 'my dialog',
-        }),
-      );
-      await browser.electron.execute((electron) =>
-        electron.dialog.showOpenDialog({
-          title: 'another dialog',
-        }),
-      );
-
-      await mockShowOpenDialog.mockReset();
-
-      expect(mockShowOpenDialog.mock.calls).toStrictEqual([]);
-      expect(mockShowOpenDialog.mock.invocationCallOrder).toStrictEqual([]);
-      expect(mockShowOpenDialog.mock.lastCall).toBeUndefined();
-      expect(mockShowOpenDialog.mock.results).toStrictEqual([]);
-    });
-  });
-
-  describe('mockRestore', () => {
-    it('should restore an existing mock', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      await mockGetName.mockReturnValue('mocked name');
-
-      let name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe('mocked name');
-
-      await mockGetName.mockRestore();
-
-      name = await browser.electron.execute((electron) => electron.app.getName());
-      expect(name).toBe(pkgAppName);
-    });
-  });
-
-  describe('getMockName', () => {
-    it('should retrieve the mock name', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      expect(mockGetName.getMockName()).toBe('electron.app.getName');
-    });
-  });
-
-  describe('mockName', () => {
-    it('should set the mock name', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      mockGetName.mockName('my first mock');
-
-      expect(mockGetName.getMockName()).toBe('my first mock');
-    });
-  });
-
-  describe('getMockImplementation', () => {
-    it('should retrieve the mock implementation', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      await mockGetName.mockImplementation(() => 'mocked name');
-      const mockImpl = mockGetName.getMockImplementation();
-
-      expect(mockImpl()).toBe('mocked name');
-    });
-
-    it('should retrieve an empty mock implementation', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      const mockImpl = mockGetName.getMockImplementation();
-
-      expect(mockImpl()).toBeUndefined();
-    });
-  });
-
-  describe('mockReturnThis', () => {
-    it('should allow chaining', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      const mockGetVersion = await browser.electron.mock('app', 'getVersion');
-      await mockGetName.mockReturnThis();
-      await browser.electron.execute((electron) => electron.app.getName().getVersion());
-
-      expect(mockGetVersion).toHaveBeenCalled();
-    });
-  });
-
-  describe('withImplementation', () => {
-    it('should temporarily override mock implementation', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      await mockGetName.mockImplementation(() => 'default mock name');
-      await mockGetName.mockImplementationOnce(() => 'first mock name');
-      await mockGetName.mockImplementationOnce(() => 'second mock name');
-      const withImplementationResult = await mockGetName.withImplementation(
-        () => 'temporary mock name',
-        (electron) => electron.app.getName(),
-      );
-
-      expect(withImplementationResult).toBe('temporary mock name');
-      const firstName = await browser.electron.execute((electron) => electron.app.getName());
-      expect(firstName).toBe('first mock name');
-      const secondName = await browser.electron.execute((electron) => electron.app.getName());
-      expect(secondName).toBe('second mock name');
-      const thirdName = await browser.electron.execute((electron) => electron.app.getName());
-      expect(thirdName).toBe('default mock name');
-    });
-
-    it('should handle promises', async () => {
-      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
-      await mockGetFileIcon.mockResolvedValue('default mock icon');
-      await mockGetFileIcon.mockResolvedValueOnce('first mock icon');
-      await mockGetFileIcon.mockResolvedValueOnce('second mock icon');
-      const withImplementationResult = await mockGetFileIcon.withImplementation(
-        () => Promise.resolve('temporary mock icon'),
-        async (electron) => await electron.app.getFileIcon('/path/to/icon'),
-      );
-
-      expect(withImplementationResult).toBe('temporary mock icon');
-      const firstIcon = await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
-      expect(firstIcon).toBe('first mock icon');
-      const secondIcon = await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
-      expect(secondIcon).toBe('second mock icon');
-      const thirdIcon = await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
-      expect(thirdIcon).toBe('default mock icon');
-    });
-  });
-
-  describe('mock.calls', () => {
-    it('should return the calls of the mock execution', async () => {
-      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
-
-      await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
-      await browser.electron.execute((electron) =>
-        electron.app.getFileIcon('/path/to/another/icon', { size: 'small' }),
-      );
-
-      expect(mockGetFileIcon.mock.calls).toStrictEqual([
-        ['/path/to/icon'], // first call
-        ['/path/to/another/icon', { size: 'small' }], // second call
-      ]);
-    });
-
-    it('should return an empty array when the mock was never invoked', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      expect(mockGetName.mock.calls).toStrictEqual([]);
-    });
-  });
-
-  describe('mock.lastCall', () => {
-    it('should return the last call of the mock execution', async () => {
-      const mockGetFileIcon = await browser.electron.mock('app', 'getFileIcon');
-
-      await browser.electron.execute((electron) => electron.app.getFileIcon('/path/to/icon'));
-      expect(mockGetFileIcon.mock.lastCall).toStrictEqual(['/path/to/icon']);
-      await browser.electron.execute((electron) =>
-        electron.app.getFileIcon('/path/to/another/icon', { size: 'small' }),
-      );
-      expect(mockGetFileIcon.mock.lastCall).toStrictEqual(['/path/to/another/icon', { size: 'small' }]);
-      await browser.electron.execute((electron) =>
-        electron.app.getFileIcon('/path/to/a/massive/icon', { size: 'large' }),
-      );
-      expect(mockGetFileIcon.mock.lastCall).toStrictEqual(['/path/to/a/massive/icon', { size: 'large' }]);
-    });
-
-    it('should return undefined when the mock was never invoked', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      expect(mockGetName.mock.lastCall).toBeUndefined();
-    });
-  });
-
-  describe('mock.results', () => {
-    it('should return the results of the mock execution', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      // TODO: why does `mockReturnValueOnce` not work for returning 'result' here?
-      await mockGetName.mockImplementationOnce(() => 'result');
-      await mockGetName.mockImplementation(() => {
-        throw new Error('thrown error');
-      });
-
-      await expect(browser.electron.execute((electron) => electron.app.getName())).resolves.toBe('result');
-      await expect(browser.electron.execute((electron) => electron.app.getName())).rejects.toThrow('thrown error');
-
-      expect(mockGetName.mock.results).toStrictEqual([
-        {
-          type: 'return',
-          value: 'result',
-        },
-        {
-          type: 'throw',
-          value: new Error('thrown error'),
-        },
-      ]);
-    });
-
-    it('should return an empty array when the mock was never invoked', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      expect(mockGetName.mock.results).toStrictEqual([]);
-    });
-  });
-
-  describe('mock.invocationCallOrder', () => {
-    it('should return the order of execution', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-      const mockGetVersion = await browser.electron.mock('app', 'getVersion');
-
-      await browser.electron.execute((electron) => electron.app.getName());
-      await browser.electron.execute((electron) => electron.app.getVersion());
-      await browser.electron.execute((electron) => electron.app.getName());
-
-      const firstInvocationIndex = mockGetName.mock.invocationCallOrder[0];
-
-      expect(mockGetName.mock.invocationCallOrder).toStrictEqual([firstInvocationIndex, firstInvocationIndex + 2]);
-      expect(mockGetVersion.mock.invocationCallOrder).toStrictEqual([firstInvocationIndex + 1]);
-    });
-
-    it('should return an empty array when the mock was never invoked', async () => {
-      const mockGetName = await browser.electron.mock('app', 'getName');
-
-      expect(mockGetName.mock.invocationCallOrder).toStrictEqual([]);
-    });
-  });
-});
diff --git a/e2e/js/application.spec.js b/e2e/js/application.spec.js
deleted file mode 100644
index 2112f44b..00000000
--- a/e2e/js/application.spec.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import { expect } from '@wdio/globals';
-import { browser } from 'wdio-electron-service';
-
-describe('application loading', () => {
-  describe('App', () => {
-    it('should launch the application', async () => {
-      const title = await browser.getTitle();
-      expect(title).toEqual('Test');
-    });
-
-    it('should pass args through to the launched application', async () => {
-      // custom args are set in the wdio.conf.js file as they need to be set before WDIO starts
-      const argv = await browser.electron.execute(() => process.argv);
-      expect(argv).toContain('--foo');
-      expect(argv).toContain('--bar=baz');
-    });
-  });
-});
diff --git a/e2e/js/dom.spec.js b/e2e/js/dom.spec.js
deleted file mode 100644
index 876e65e7..00000000
--- a/e2e/js/dom.spec.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import { expect } from '@wdio/globals';
-import { browser } from 'wdio-electron-service';
-import { setupBrowser } from '@testing-library/webdriverio';
-
-describe('application loading', () => {
-  let screen;
-
-  before(() => {
-    screen = setupBrowser(browser);
-  });
-
-  describe('DOM', () => {
-    it('should determine when an element is in the document', async () => {
-      await expect(await screen.getByTestId('disabled-checkbox')).toExist();
-    });
-
-    it('should determine when an element is not in the document', async () => {
-      await expect(await screen.queryByTestId('not-there')).not.toExist();
-    });
-
-    it('should determine when an element is visible', async () => {
-      await expect(await screen.getByTestId('disabled-checkbox')).toBeDisplayed();
-    });
-
-    it('should determine when an element is not visible', async () => {
-      await expect(await screen.getByTestId('hidden-textarea')).not.toBeDisplayed();
-    });
-  });
-
-  describe('WDIO Matchers', () => {
-    it('should be able to use WebdriverIO matchers', async () => {
-      await expect(await $('#disabled-checkbox')).toBePresent();
-    });
-  });
-});
diff --git a/e2e/js/interaction.spec.js b/e2e/js/interaction.spec.js
deleted file mode 100644
index 1eecbe60..00000000
--- a/e2e/js/interaction.spec.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import { expect } from '@wdio/globals';
-import { browser } from 'wdio-electron-service';
-import { setupBrowser } from '@testing-library/webdriverio';
-
-describe('application loading', () => {
-  let screen;
-
-  before(() => {
-    screen = setupBrowser(browser);
-  });
-
-  describe('keyboard input', () => {
-    it('should detect keyboard input', async () => {
-      await browser.keys(['y', 'o']);
-      expect(await (await screen.getByTestId('keypress-count')).getText()).toEqual('YO');
-    });
-  });
-
-  describe('click events', () => {
-    describe('when the make larger button is clicked', () => {
-      it('should increase the window height and width by 10 pixels', async () => {
-        let bounds = await browser.electron.execute((electron) => {
-          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
-          return browserWindow.getBounds();
-        });
-        expect(bounds.width).toEqual(200);
-        expect(bounds.height).toEqual(300);
-        let biggerClickCount = await browser.$('.click-count .bigger').getText();
-        expect(biggerClickCount).toEqual('0');
-        const elem = await browser.$('.make-bigger');
-        await elem.click();
-        biggerClickCount = await browser.$('.click-count .bigger').getText();
-        expect(biggerClickCount).toEqual('1');
-        bounds = await browser.electron.execute((electron) => {
-          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
-          return browserWindow.getBounds();
-        });
-        expect(bounds.width).toEqual(210);
-        expect(bounds.height).toEqual(310);
-      });
-    });
-
-    describe('when the make smaller button is clicked', () => {
-      it('should decrease the window height and width by 10 pixels', async () => {
-        let bounds = await browser.electron.execute((electron) => {
-          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
-          return browserWindow.getBounds();
-        });
-        expect(bounds.width).toEqual(210);
-        expect(bounds.height).toEqual(310);
-        const elem = await browser.$('.make-smaller');
-        await elem.click();
-        bounds = await browser.electron.execute((electron) => {
-          const browserWindow = electron.BrowserWindow.getAllWindows()[0];
-          return browserWindow.getBounds();
-        });
-        expect(bounds.width).toEqual(200);
-        expect(bounds.height).toEqual(300);
-      });
-    });
-  });
-});
diff --git a/e2e/package.json b/e2e/package.json
index 77472a8c..bfdd38b6 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -5,7 +5,8 @@
   "private": "true",
   "scripts": {
     "ci": "pnpm i && pnpm test",
-    "clean": "pnpm dlx shx rm -rf ./node_modules pnpm-lock.yaml ./wdio-logs* ./out",
+    "clean": "pnpm dlx shx rm -rf ./js ./node_modules pnpm-lock.yaml ./wdio-logs* ./out",
+    "init": "pnpm dlx shx mkdir -p ./js && rollup -c",
     "logs": "pnpm dlx shx cat ./wdio-logs*/*.log",
     "test:e2e:forge-cjs": "cross-env EXAMPLE_DIR=forge-cjs pnpm run exec",
     "test:e2e:forge-esm": "cross-env EXAMPLE_DIR=forge-esm pnpm run exec",
@@ -44,6 +45,7 @@
   },
   "devDependencies": {
     "@electron-forge/cli": "^7.2.0",
+    "@rollup/plugin-typescript": "^11.1.6",
     "@types/mocha": "^10.0.6",
     "@types/node": "^20.16.1",
     "@vitest/spy": "^2.0.5",
@@ -51,6 +53,7 @@
     "global-jsdom": "^24.0.0",
     "jsdom": "^24.1.1",
     "read-package-up": "^11.0.0",
+    "rollup": "^4.21.2",
     "ts-loader": "^9.4.4",
     "typescript": "^5.5.4"
   }
diff --git a/e2e/rollup.config.js b/e2e/rollup.config.js
new file mode 100644
index 00000000..0faa3758
--- /dev/null
+++ b/e2e/rollup.config.js
@@ -0,0 +1,10 @@
+import typescript from '@rollup/plugin-typescript';
+
+export default {
+  input: '*.spec.ts',
+  output: {
+    dir: 'js',
+    format: 'esm',
+  },
+  plugins: [typescript()],
+};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 858cb58b..d512a46d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -465,6 +465,9 @@ importers:
       '@electron-forge/cli':
         specifier: ^7.2.0
         version: 7.4.0(encoding@0.1.13)
+      '@rollup/plugin-typescript':
+        specifier: ^11.1.6
+        version: 11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.5.4)
       '@types/mocha':
         specifier: ^10.0.6
         version: 10.0.7
@@ -486,6 +489,9 @@ importers:
       read-package-up:
         specifier: ^11.0.0
         version: 11.0.0
+      rollup:
+        specifier: ^4.21.2
+        version: 4.21.2
       ts-loader:
         specifier: ^9.4.4
         version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
@@ -1379,6 +1385,19 @@ packages:
       rollup:
         optional: true
 
+  '@rollup/plugin-typescript@11.1.6':
+    resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^2.14.0||^3.0.0||^4.0.0
+      tslib: '*'
+      typescript: '>=3.7.0'
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+      tslib:
+        optional: true
+
   '@rollup/pluginutils@5.1.0':
     resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
     engines: {node: '>=14.0.0'}
@@ -6584,6 +6603,15 @@ snapshots:
     optionalDependencies:
       rollup: 4.21.2
 
+  '@rollup/plugin-typescript@11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.5.4)':
+    dependencies:
+      '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
+      resolve: 1.22.8
+      typescript: 5.5.4
+    optionalDependencies:
+      rollup: 4.21.2
+      tslib: 2.7.0
+
   '@rollup/pluginutils@5.1.0(rollup@4.21.2)':
     dependencies:
       '@types/estree': 1.0.5
diff --git a/turbo.json b/turbo.json
index f9a960e0..5da2689e 100644
--- a/turbo.json
+++ b/turbo.json
@@ -20,43 +20,46 @@
     "//#lint": {
       "inputs": ["**/*.{j,mj,cj,t}s"]
     },
+    "@repo/e2e#init": {
+      "dependsOn": ["wdio-electron-service#build"]
+    },
     "@repo/e2e#test:e2e:builder-cjs": {
-      "dependsOn": ["example-builder-cjs#build", "wdio-electron-service#build", "@repo/e2e#test:e2e:builder-esm"]
+      "dependsOn": ["example-builder-cjs#build", "@repo/e2e#init", "@repo/e2e#test:e2e:builder-esm"]
     },
     "@repo/e2e#test:e2e:builder-esm": {
-      "dependsOn": ["example-builder-esm#build", "wdio-electron-service#build"]
+      "dependsOn": ["example-builder-esm#build", "@repo/e2e#init"]
     },
     "@repo/e2e#test:e2e:forge-cjs": {
-      "dependsOn": ["example-forge-cjs#build", "wdio-electron-service#build", "@repo/e2e#test:e2e:forge-esm"]
+      "dependsOn": ["example-forge-cjs#build", "@repo/e2e#init", "@repo/e2e#test:e2e:forge-esm"]
     },
     "@repo/e2e#test:e2e:forge-esm": {
-      "dependsOn": ["example-forge-esm#build", "wdio-electron-service#build"]
+      "dependsOn": ["example-forge-esm#build", "@repo/e2e#init"]
     },
     "@repo/e2e#test:e2e:no-binary-cjs": {
-      "dependsOn": ["example-no-binary-cjs#build", "wdio-electron-service#build", "@repo/e2e#test:e2e:no-binary-esm"]
+      "dependsOn": ["example-no-binary-cjs#build", "@repo/e2e#init", "@repo/e2e#test:e2e:no-binary-esm"]
     },
     "@repo/e2e#test:e2e:no-binary-esm": {
-      "dependsOn": ["example-no-binary-esm#build", "example-no-binary-cjs#build", "wdio-electron-service#build"]
+      "dependsOn": ["example-no-binary-esm#build", "example-no-binary-cjs#build", "@repo/e2e#init"]
     },
     "@repo/e2e#test:e2e-mac-universal:forge-cjs": {
       "dependsOn": [
         "example-forge-cjs#build:mac-universal",
-        "wdio-electron-service#build",
+        "@repo/e2e#init",
         "@repo/e2e#test:e2e-mac-universal:forge-esm"
       ]
     },
     "@repo/e2e#test:e2e-mac-universal:forge-esm": {
-      "dependsOn": ["example-forge-esm#build:mac-universal", "wdio-electron-service#build"]
+      "dependsOn": ["example-forge-esm#build:mac-universal", "@repo/e2e#init"]
     },
     "@repo/e2e#test:e2e-mac-universal:builder-cjs": {
       "dependsOn": [
         "example-builder-cjs#build:mac-universal",
-        "wdio-electron-service#build",
+        "@repo/e2e#init",
         "@repo/e2e#test:e2e-mac-universal:builder-esm"
       ]
     },
     "@repo/e2e#test:e2e-mac-universal:builder-esm": {
-      "dependsOn": ["example-builder-esm#build:mac-universal", "wdio-electron-service#build"]
+      "dependsOn": ["example-builder-esm#build:mac-universal", "@repo/e2e#init"]
     },
     "@wdio/electron-types#build": {
       "dependsOn": ["//#lint", "//#format:check", "test:unit"],

From d70ffccc9b7bce0d653d35f65fc9c34803d8252f Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 19:48:57 +0100
Subject: [PATCH 13/52] fix: update browser type

---
 packages/@wdio_electron-types/src/index.ts | 33 +++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/packages/@wdio_electron-types/src/index.ts b/packages/@wdio_electron-types/src/index.ts
index 6c3c6d41..6f05556b 100644
--- a/packages/@wdio_electron-types/src/index.ts
+++ b/packages/@wdio_electron-types/src/index.ts
@@ -653,7 +653,37 @@ export interface ElectronMock<TArgs extends any[] = any, TReturns = any> extends
   (...args: TArgs): TReturns;
 }
 
-export interface BrowserExtension {
+type $ = (
+  selector: any,
+) => ChainablePromiseElementBase<Promise<WebdriverIO.Element>> | Promise<WebdriverIO.Element> | WebdriverIO.Element;
+type $$ = (
+  selector: any,
+) => ChainablePromiseArrayBase<Promise<WebdriverIO.Element>> | Promise<WebdriverIO.Element[]> | WebdriverIO.Element[];
+type ChainablePromiseElementBase<T> = Promise<T> & {
+  $: $;
+};
+type ChainablePromiseArrayBase<T> = Promise<T>;
+type SelectorsBase = {
+  $: $;
+  $$: $$;
+};
+type BaseWithExecute = {
+  execute<T>(script: string | ((...args: any[]) => T), ...args: any[]): Promise<T>;
+  execute<T>(script: string | ((...args: any[]) => T), ...args: any[]): T;
+  executeAsync(script: string | ((...args: any[]) => void), ...args: any[]): any;
+};
+type ElementBase = SelectorsBase & {
+  parent: ElementBase | BaseWithExecute;
+};
+type BrowserBase = SelectorsBase & {
+  addCommand<T extends boolean>(
+    queryName: string,
+    commandFn: (this: T extends true ? ElementBase : BrowserBase, ...args: any[]) => void,
+    isElementCommand?: T,
+  ): any;
+};
+
+export interface BrowserExtension extends BrowserBase {
   /**
    * Access the WebdriverIO Electron Service API.
    *
@@ -674,6 +704,7 @@ declare global {
 
   namespace WebdriverIO {
     interface Browser extends BrowserExtension {}
+    interface Element extends ElementBase {}
     interface MultiRemoteBrowser extends BrowserExtension {}
     interface Capabilities {
       /**

From 7ee90e80a63b0d6ac62346f2dabbbdc1648fc7dc Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 19:54:48 +0100
Subject: [PATCH 14/52] fix: await element

---
 e2e/interaction.spec.ts | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/e2e/interaction.spec.ts b/e2e/interaction.spec.ts
index 1d6e7663..f70d02de 100644
--- a/e2e/interaction.spec.ts
+++ b/e2e/interaction.spec.ts
@@ -29,11 +29,11 @@ describe('application loading', () => {
         };
         expect(bounds.width).toEqual(200);
         expect(bounds.height).toEqual(300);
-        let biggerClickCount = await browser.$('.click-count .bigger').getText();
+        let biggerClickCount = await (await browser.$('.click-count .bigger')).getText();
         expect(biggerClickCount).toEqual('0');
         const elem = await browser.$('.make-bigger');
         await elem.click();
-        biggerClickCount = await browser.$('.click-count .bigger').getText();
+        biggerClickCount = await (await browser.$('.click-count .bigger')).getText();
         expect(biggerClickCount).toEqual('1');
         bounds = (await browser.electron.execute((electron) => {
           const browserWindow = electron.BrowserWindow.getAllWindows()[0] as BrowserWindow;

From 480073d0be80ab2b4b98decdb6c40ca6869c27ec Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 20:08:26 +0100
Subject: [PATCH 15/52] fix: update rollup conf

---
 e2e/rollup.config.js | 44 ++++++++++++++++++++++++++++++++++++--------
 1 file changed, 36 insertions(+), 8 deletions(-)

diff --git a/e2e/rollup.config.js b/e2e/rollup.config.js
index 0faa3758..6e9a224d 100644
--- a/e2e/rollup.config.js
+++ b/e2e/rollup.config.js
@@ -1,10 +1,38 @@
 import typescript from '@rollup/plugin-typescript';
 
-export default {
-  input: '*.spec.ts',
-  output: {
-    dir: 'js',
-    format: 'esm',
-  },
-  plugins: [typescript()],
-};
+const tsPlugin = typescript({ tsconfig: 'tsconfig.json' });
+
+export default [
+  {
+    input: 'api.spec.ts',
+    output: {
+      outDir: 'js',
+      format: 'esm',
+    },
+    plugins: [tsPlugin],
+  },
+  {
+    input: 'application.spec.ts',
+    output: {
+      dir: 'js',
+      format: 'esm',
+    },
+    plugins: [tsPlugin],
+  },
+  {
+    input: 'dom.spec.ts',
+    output: {
+      dir: 'js',
+      format: 'esm',
+    },
+    plugins: [tsPlugin],
+  },
+  {
+    input: 'interaction.spec.ts',
+    output: {
+      dir: 'js',
+      format: 'esm',
+    },
+    plugins: [tsPlugin],
+  },
+];

From acdc2d23f8d304b89e99528e9a0c580eada9a883 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 20:15:03 +0100
Subject: [PATCH 16/52] fix: don't emit type declarations

---
 e2e/tsconfig.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json
index 85fecd2d..b47aa2ab 100755
--- a/e2e/tsconfig.json
+++ b/e2e/tsconfig.json
@@ -1,6 +1,8 @@
 {
   "extends": "../tsconfig.base.json",
   "compilerOptions": {
+    "declaration": false,
+    "declarationMap": false,
     "noEmit": true,
     "module": "NodeNext",
     "moduleResolution": "NodeNext",

From 4d085c58b4e657cfdbec9503da157d6e9baae084 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 20:15:27 +0100
Subject: [PATCH 17/52] fix: correct config dir

---
 e2e/rollup.config.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/e2e/rollup.config.js b/e2e/rollup.config.js
index 6e9a224d..58e4e49a 100644
--- a/e2e/rollup.config.js
+++ b/e2e/rollup.config.js
@@ -6,7 +6,7 @@ export default [
   {
     input: 'api.spec.ts',
     output: {
-      outDir: 'js',
+      dir: 'js',
       format: 'esm',
     },
     plugins: [tsPlugin],

From 88dd05f119a8ca8e7cc3e44f1ceaa567f3fe4658 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 20:35:41 +0100
Subject: [PATCH 18/52] debug: remove `--only`

---
 package.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/package.json b/package.json
index d2ca13d3..da46a35f 100644
--- a/package.json
+++ b/package.json
@@ -10,12 +10,12 @@
     "build": "turbo run build --filter=@wdio* --filter=wdio-electron-service --only",
     "ci": "turbo run lint format:check test:unit test:e2e:builder-cjs test:e2e:builder-esm test:e2e:forge-cjs test:e2e:forge-esm test:e2e:no-binary-cjs test:e2e:no-binary-esm",
     "ci-linux": "turbo run lint format:check test:unit test:e2e:builder-cjs test:e2e:builder-esm test:e2e:forge-cjs test:e2e:forge-esm test:e2e:no-binary-cjs test:e2e:no-binary-esm --concurrency=1",
-    "ci-mac:e2e:mac-universal": "turbo run build:mac-universal test:e2e-mac-universal:builder-cjs test:e2e-mac-universal:builder-esm test:e2e-mac-universal:forge-cjs test:e2e-mac-universal:forge-esm --only",
-    "ci-windows:e2e:builder-cjs": "turbo run build --filter=example-builder-cjs --only && turbo run test:e2e:builder-cjs --only",
-    "ci-windows:e2e:builder-esm": "turbo run build --filter=example-builder-esm --only && turbo run test:e2e:builder-esm --only",
-    "ci-windows:e2e:forge-cjs": "pnpm run init-forge:package && pnpm run init-forge:app-cjs && turbo run build --filter=example-forge-cjs --only && turbo run test:e2e:forge-cjs --only",
-    "ci-windows:e2e:forge-esm": "pnpm run init-forge:package && pnpm run init-forge:app-esm && turbo run build --filter=example-forge-esm --only && turbo run test:e2e:forge-esm --only",
-    "ci-windows:e2e:no-binary": "turbo run build --filter=example-no-binary* --only && turbo run test:e2e:no-binary-cjs test:e2e:no-binary-esm --only",
+    "ci-mac:e2e:mac-universal": "turbo run build:mac-universal test:e2e-mac-universal:builder-cjs test:e2e-mac-universal:builder-esm test:e2e-mac-universal:forge-cjs test:e2e-mac-universal:forge-esm",
+    "ci-windows:e2e:builder-cjs": "turbo run build --filter=example-builder-cjs --only && turbo run test:e2e:builder-cjs",
+    "ci-windows:e2e:builder-esm": "turbo run build --filter=example-builder-esm --only && turbo run test:e2e:builder-esm",
+    "ci-windows:e2e:forge-cjs": "pnpm run init-forge:package && pnpm run init-forge:app-cjs && turbo run build --filter=example-forge-cjs --only && turbo run test:e2e:forge-cjs",
+    "ci-windows:e2e:forge-esm": "pnpm run init-forge:package && pnpm run init-forge:app-esm && turbo run build --filter=example-forge-esm --only && turbo run test:e2e:forge-esm",
+    "ci-windows:e2e:no-binary": "turbo run build --filter=example-no-binary* --only && turbo run test:e2e:no-binary-cjs test:e2e:no-binary-esm",
     "ci-windows:units": "turbo run lint format:check test:unit",
     "ci:e2e:clean": "turbo run clean --filter=example*",
     "ci:e2e:logs": "turbo run logs --filter=@repo/e2e",

From ceb08fe3a9676f98e9c7e83448f5e45781d61c23 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 21:11:33 +0100
Subject: [PATCH 19/52] fix: limit execution of dependent tasks

---
 e2e/package.json |  2 +-
 package.json     | 12 ++++++------
 turbo.json       | 22 +++++++++++-----------
 3 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/e2e/package.json b/e2e/package.json
index bfdd38b6..98c81938 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -6,7 +6,7 @@
   "scripts": {
     "ci": "pnpm i && pnpm test",
     "clean": "pnpm dlx shx rm -rf ./js ./node_modules pnpm-lock.yaml ./wdio-logs* ./out",
-    "init": "pnpm dlx shx mkdir -p ./js && rollup -c",
+    "init-e2es": "pnpm dlx shx mkdir -p ./js && rollup -c",
     "logs": "pnpm dlx shx cat ./wdio-logs*/*.log",
     "test:e2e:forge-cjs": "cross-env EXAMPLE_DIR=forge-cjs pnpm run exec",
     "test:e2e:forge-esm": "cross-env EXAMPLE_DIR=forge-esm pnpm run exec",
diff --git a/package.json b/package.json
index da46a35f..26a099d7 100644
--- a/package.json
+++ b/package.json
@@ -10,12 +10,12 @@
     "build": "turbo run build --filter=@wdio* --filter=wdio-electron-service --only",
     "ci": "turbo run lint format:check test:unit test:e2e:builder-cjs test:e2e:builder-esm test:e2e:forge-cjs test:e2e:forge-esm test:e2e:no-binary-cjs test:e2e:no-binary-esm",
     "ci-linux": "turbo run lint format:check test:unit test:e2e:builder-cjs test:e2e:builder-esm test:e2e:forge-cjs test:e2e:forge-esm test:e2e:no-binary-cjs test:e2e:no-binary-esm --concurrency=1",
-    "ci-mac:e2e:mac-universal": "turbo run build:mac-universal test:e2e-mac-universal:builder-cjs test:e2e-mac-universal:builder-esm test:e2e-mac-universal:forge-cjs test:e2e-mac-universal:forge-esm",
-    "ci-windows:e2e:builder-cjs": "turbo run build --filter=example-builder-cjs --only && turbo run test:e2e:builder-cjs",
-    "ci-windows:e2e:builder-esm": "turbo run build --filter=example-builder-esm --only && turbo run test:e2e:builder-esm",
-    "ci-windows:e2e:forge-cjs": "pnpm run init-forge:package && pnpm run init-forge:app-cjs && turbo run build --filter=example-forge-cjs --only && turbo run test:e2e:forge-cjs",
-    "ci-windows:e2e:forge-esm": "pnpm run init-forge:package && pnpm run init-forge:app-esm && turbo run build --filter=example-forge-esm --only && turbo run test:e2e:forge-esm",
-    "ci-windows:e2e:no-binary": "turbo run build --filter=example-no-binary* --only && turbo run test:e2e:no-binary-cjs test:e2e:no-binary-esm",
+    "ci-mac:e2e:mac-universal": "turbo run build:mac-universal init-e2es test:e2e-mac-universal:builder-cjs test:e2e-mac-universal:builder-esm test:e2e-mac-universal:forge-cjs test:e2e-mac-universal:forge-esm --only",
+    "ci-windows:e2e:builder-cjs": "turbo run build --filter=example-builder-cjs --only && turbo run init-e2es test:e2e:builder-cjs --only",
+    "ci-windows:e2e:builder-esm": "turbo run build --filter=example-builder-esm --only && turbo run init-e2es test:e2e:builder-esm --only",
+    "ci-windows:e2e:forge-cjs": "pnpm run init-forge:package && pnpm run init-forge:app-cjs && turbo run build --filter=example-forge-cjs --only && turbo run init-e2es test:e2e:forge-cjs --only",
+    "ci-windows:e2e:forge-esm": "pnpm run init-forge:package && pnpm run init-forge:app-esm && turbo run build --filter=example-forge-esm --only && turbo run init-e2es test:e2e:forge-esm --only",
+    "ci-windows:e2e:no-binary": "turbo run build --filter=example-no-binary* --only && turbo run init-e2es test:e2e:no-binary-cjs test:e2e:no-binary-esm --only",
     "ci-windows:units": "turbo run lint format:check test:unit",
     "ci:e2e:clean": "turbo run clean --filter=example*",
     "ci:e2e:logs": "turbo run logs --filter=@repo/e2e",
diff --git a/turbo.json b/turbo.json
index 5da2689e..97ca1bdf 100644
--- a/turbo.json
+++ b/turbo.json
@@ -20,46 +20,46 @@
     "//#lint": {
       "inputs": ["**/*.{j,mj,cj,t}s"]
     },
-    "@repo/e2e#init": {
+    "@repo/e2e#init-e2es": {
       "dependsOn": ["wdio-electron-service#build"]
     },
     "@repo/e2e#test:e2e:builder-cjs": {
-      "dependsOn": ["example-builder-cjs#build", "@repo/e2e#init", "@repo/e2e#test:e2e:builder-esm"]
+      "dependsOn": ["example-builder-cjs#build", "@repo/e2e#init-e2es", "@repo/e2e#test:e2e:builder-esm"]
     },
     "@repo/e2e#test:e2e:builder-esm": {
-      "dependsOn": ["example-builder-esm#build", "@repo/e2e#init"]
+      "dependsOn": ["example-builder-esm#build", "@repo/e2e#init-e2es"]
     },
     "@repo/e2e#test:e2e:forge-cjs": {
-      "dependsOn": ["example-forge-cjs#build", "@repo/e2e#init", "@repo/e2e#test:e2e:forge-esm"]
+      "dependsOn": ["example-forge-cjs#build", "@repo/e2e#init-e2es", "@repo/e2e#test:e2e:forge-esm"]
     },
     "@repo/e2e#test:e2e:forge-esm": {
-      "dependsOn": ["example-forge-esm#build", "@repo/e2e#init"]
+      "dependsOn": ["example-forge-esm#build", "@repo/e2e#init-e2es"]
     },
     "@repo/e2e#test:e2e:no-binary-cjs": {
-      "dependsOn": ["example-no-binary-cjs#build", "@repo/e2e#init", "@repo/e2e#test:e2e:no-binary-esm"]
+      "dependsOn": ["example-no-binary-cjs#build", "@repo/e2e#init-e2es", "@repo/e2e#test:e2e:no-binary-esm"]
     },
     "@repo/e2e#test:e2e:no-binary-esm": {
-      "dependsOn": ["example-no-binary-esm#build", "example-no-binary-cjs#build", "@repo/e2e#init"]
+      "dependsOn": ["example-no-binary-esm#build", "example-no-binary-cjs#build", "@repo/e2e#init-e2es"]
     },
     "@repo/e2e#test:e2e-mac-universal:forge-cjs": {
       "dependsOn": [
         "example-forge-cjs#build:mac-universal",
-        "@repo/e2e#init",
+        "@repo/e2e#init-e2es",
         "@repo/e2e#test:e2e-mac-universal:forge-esm"
       ]
     },
     "@repo/e2e#test:e2e-mac-universal:forge-esm": {
-      "dependsOn": ["example-forge-esm#build:mac-universal", "@repo/e2e#init"]
+      "dependsOn": ["example-forge-esm#build:mac-universal", "@repo/e2e#init-e2es"]
     },
     "@repo/e2e#test:e2e-mac-universal:builder-cjs": {
       "dependsOn": [
         "example-builder-cjs#build:mac-universal",
-        "@repo/e2e#init",
+        "@repo/e2e#init-e2es",
         "@repo/e2e#test:e2e-mac-universal:builder-esm"
       ]
     },
     "@repo/e2e#test:e2e-mac-universal:builder-esm": {
-      "dependsOn": ["example-builder-esm#build:mac-universal", "@repo/e2e#init"]
+      "dependsOn": ["example-builder-esm#build:mac-universal", "@repo/e2e#init-e2es"]
     },
     "@wdio/electron-types#build": {
       "dependsOn": ["//#lint", "//#format:check", "test:unit"],

From bda817969642f22312568dee12a465639a499064 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 21:30:27 +0100
Subject: [PATCH 20/52] chore: use defineConfig for rollup confs

---
 apps/builder-cjs/rollup.config.js    | 5 +++--
 apps/builder-esm/rollup.config.js    | 5 +++--
 apps/forge-cjs/rollup.config.mjs     | 5 +++--
 apps/forge-esm/rollup.config.js      | 5 +++--
 apps/no-binary-cjs/rollup.config.mjs | 5 +++--
 apps/no-binary-esm/rollup.config.js  | 5 +++--
 e2e/rollup.config.js                 | 9 +++++++--
 7 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/apps/builder-cjs/rollup.config.js b/apps/builder-cjs/rollup.config.js
index c9b42893..62f727bb 100644
--- a/apps/builder-cjs/rollup.config.js
+++ b/apps/builder-cjs/rollup.config.js
@@ -1,7 +1,8 @@
 import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
+import { defineConfig } from 'rollup';
 
-export default [
+export default defineConfig([
   {
     input: 'dist/preload.js',
     output: {
@@ -12,4 +13,4 @@ export default [
     plugins: [nodeResolve(), commonjs()],
     external: ['electron'],
   },
-];
+]);
diff --git a/apps/builder-esm/rollup.config.js b/apps/builder-esm/rollup.config.js
index dd3a48af..980cdc5f 100644
--- a/apps/builder-esm/rollup.config.js
+++ b/apps/builder-esm/rollup.config.js
@@ -1,7 +1,8 @@
 import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
+import { defineConfig } from 'rollup';
 
-export default [
+export default defineConfig([
   {
     input: 'dist/preload.js',
     output: {
@@ -11,4 +12,4 @@ export default [
     plugins: [nodeResolve(), commonjs()],
     external: ['electron'],
   },
-];
+]);
diff --git a/apps/forge-cjs/rollup.config.mjs b/apps/forge-cjs/rollup.config.mjs
index aebd221b..4f9875b7 100644
--- a/apps/forge-cjs/rollup.config.mjs
+++ b/apps/forge-cjs/rollup.config.mjs
@@ -1,7 +1,8 @@
 import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
+import { defineConfig } from 'rollup';
 
-export default [
+export default defineConfig([
   {
     input: 'dist/preload.js',
     output: {
@@ -22,4 +23,4 @@ export default [
     plugins: [nodeResolve(), commonjs()],
     external: ['electron'],
   },
-];
+]);
diff --git a/apps/forge-esm/rollup.config.js b/apps/forge-esm/rollup.config.js
index bede12fc..8c056970 100644
--- a/apps/forge-esm/rollup.config.js
+++ b/apps/forge-esm/rollup.config.js
@@ -1,7 +1,8 @@
 import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
+import { defineConfig } from 'rollup';
 
-export default [
+export default defineConfig([
   {
     input: 'dist/preload.js',
     output: {
@@ -22,4 +23,4 @@ export default [
     plugins: [nodeResolve()],
     external: ['electron'],
   },
-];
+]);
diff --git a/apps/no-binary-cjs/rollup.config.mjs b/apps/no-binary-cjs/rollup.config.mjs
index aebd221b..4f9875b7 100644
--- a/apps/no-binary-cjs/rollup.config.mjs
+++ b/apps/no-binary-cjs/rollup.config.mjs
@@ -1,7 +1,8 @@
 import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
+import { defineConfig } from 'rollup';
 
-export default [
+export default defineConfig([
   {
     input: 'dist/preload.js',
     output: {
@@ -22,4 +23,4 @@ export default [
     plugins: [nodeResolve(), commonjs()],
     external: ['electron'],
   },
-];
+]);
diff --git a/apps/no-binary-esm/rollup.config.js b/apps/no-binary-esm/rollup.config.js
index bede12fc..8c056970 100644
--- a/apps/no-binary-esm/rollup.config.js
+++ b/apps/no-binary-esm/rollup.config.js
@@ -1,7 +1,8 @@
 import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
+import { defineConfig } from 'rollup';
 
-export default [
+export default defineConfig([
   {
     input: 'dist/preload.js',
     output: {
@@ -22,4 +23,4 @@ export default [
     plugins: [nodeResolve()],
     external: ['electron'],
   },
-];
+]);
diff --git a/e2e/rollup.config.js b/e2e/rollup.config.js
index 58e4e49a..b52cc877 100644
--- a/e2e/rollup.config.js
+++ b/e2e/rollup.config.js
@@ -1,8 +1,9 @@
 import typescript from '@rollup/plugin-typescript';
+import { defineConfig } from 'rollup';
 
 const tsPlugin = typescript({ tsconfig: 'tsconfig.json' });
 
-export default [
+export default defineConfig([
   {
     input: 'api.spec.ts',
     output: {
@@ -10,6 +11,7 @@ export default [
       format: 'esm',
     },
     plugins: [tsPlugin],
+    external: ['@wdio/globals', '@vitest/spy', 'wdio-electron-service'],
   },
   {
     input: 'application.spec.ts',
@@ -18,6 +20,7 @@ export default [
       format: 'esm',
     },
     plugins: [tsPlugin],
+    external: ['@wdio/globals', 'wdio-electron-service'],
   },
   {
     input: 'dom.spec.ts',
@@ -26,6 +29,7 @@ export default [
       format: 'esm',
     },
     plugins: [tsPlugin],
+    external: ['@testing-library/webdriverio', '@wdio/globals', 'wdio-electron-service'],
   },
   {
     input: 'interaction.spec.ts',
@@ -34,5 +38,6 @@ export default [
       format: 'esm',
     },
     plugins: [tsPlugin],
+    external: ['@testing-library/webdriverio', '@wdio/globals', 'wdio-electron-service'],
   },
-];
+]);

From c1c196944aaf43e3114817876e150321bb3c833d Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 21:31:01 +0100
Subject: [PATCH 21/52] chore(types): fix reference path

---
 packages/wdio-electron-service/test/mock.spec.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/wdio-electron-service/test/mock.spec.ts b/packages/wdio-electron-service/test/mock.spec.ts
index 1e63b563..ad2e289c 100644
--- a/packages/wdio-electron-service/test/mock.spec.ts
+++ b/packages/wdio-electron-service/test/mock.spec.ts
@@ -1,4 +1,4 @@
-/// <reference types="../@types/vitest" />
+/// <reference types="../../../@types/vitest/index.d.ts" />
 import { isAsyncFunction } from 'node:util/types';
 import { describe, it, expect, beforeEach, vi, Mock } from 'vitest';
 

From de6a8f55c3fd5ce2b32ce2f74850d3fbc0325be5 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 21:32:21 +0100
Subject: [PATCH 22/52] chore: reorder imports

---
 packages/wdio-electron-service/test/mock.spec.ts | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/packages/wdio-electron-service/test/mock.spec.ts b/packages/wdio-electron-service/test/mock.spec.ts
index ad2e289c..c1545e67 100644
--- a/packages/wdio-electron-service/test/mock.spec.ts
+++ b/packages/wdio-electron-service/test/mock.spec.ts
@@ -1,9 +1,10 @@
 /// <reference types="../../../@types/vitest/index.d.ts" />
 import { isAsyncFunction } from 'node:util/types';
+
 import { describe, it, expect, beforeEach, vi, Mock } from 'vitest';
+import type { ElectronInterface, ElectronType } from '@wdio/electron-types';
 
 import { createMock } from '../src/mock.js';
-import type { ElectronInterface, ElectronType } from '@wdio/electron-types';
 
 let mockFn: Mock;
 

From d65efb2ca46d887bcea8e8a72d81f41f23397f0b Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 21:57:34 +0100
Subject: [PATCH 23/52] fix(linting): use correct parserOptions, disable
 `import-x/named` for CJS

---
 eslint.config.js | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/eslint.config.js b/eslint.config.js
index 6763b43b..4ff19970 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -25,7 +25,7 @@ export default [
         ...globals.es2021,
       },
       parserOptions: {
-        ...importX.flatConfigs.recommended.parserOptions,
+        ...importX.configs.recommended.parserOptions,
       },
     },
     plugins: {
@@ -145,6 +145,13 @@ export default [
       'import-x/no-extraneous-dependencies': 'off',
     },
   },
+  // CJS example app files
+  {
+    files: ['apps/*-cjs/**/*.{js,mjs}'], // already disabled for TS files
+    rules: {
+      'import-x/named': 'off',
+    },
+  },
   // Example app TS files
   {
     files: ['apps/builder-cjs/**/*.ts'],

From d7c4df7d4201f4ca22a1bb7c3f29696724244cef Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 22:00:40 +0100
Subject: [PATCH 24/52] chore(typing): use unknown instead of any

---
 packages/@wdio_electron-types/src/index.ts | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/packages/@wdio_electron-types/src/index.ts b/packages/@wdio_electron-types/src/index.ts
index 6f05556b..3d68f607 100644
--- a/packages/@wdio_electron-types/src/index.ts
+++ b/packages/@wdio_electron-types/src/index.ts
@@ -654,10 +654,10 @@ export interface ElectronMock<TArgs extends any[] = any, TReturns = any> extends
 }
 
 type $ = (
-  selector: any,
+  selector: unknown,
 ) => ChainablePromiseElementBase<Promise<WebdriverIO.Element>> | Promise<WebdriverIO.Element> | WebdriverIO.Element;
 type $$ = (
-  selector: any,
+  selector: unknown,
 ) => ChainablePromiseArrayBase<Promise<WebdriverIO.Element>> | Promise<WebdriverIO.Element[]> | WebdriverIO.Element[];
 type ChainablePromiseElementBase<T> = Promise<T> & {
   $: $;
@@ -668,9 +668,9 @@ type SelectorsBase = {
   $$: $$;
 };
 type BaseWithExecute = {
-  execute<T>(script: string | ((...args: any[]) => T), ...args: any[]): Promise<T>;
-  execute<T>(script: string | ((...args: any[]) => T), ...args: any[]): T;
-  executeAsync(script: string | ((...args: any[]) => void), ...args: any[]): any;
+  execute<T>(script: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
+  execute<T>(script: string | ((...args: unknown[]) => T), ...args: unknown[]): T;
+  executeAsync(script: string | ((...args: unknown[]) => void), ...args: unknown[]): unknown;
 };
 type ElementBase = SelectorsBase & {
   parent: ElementBase | BaseWithExecute;
@@ -678,9 +678,9 @@ type ElementBase = SelectorsBase & {
 type BrowserBase = SelectorsBase & {
   addCommand<T extends boolean>(
     queryName: string,
-    commandFn: (this: T extends true ? ElementBase : BrowserBase, ...args: any[]) => void,
+    commandFn: (this: T extends true ? ElementBase : BrowserBase, ...args: unknown[]) => void,
     isElementCommand?: T,
-  ): any;
+  ): unknown;
 };
 
 export interface BrowserExtension extends BrowserBase {

From b52d881b49844f24e91d509f226fd07e76ad49ff Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 22:16:55 +0100
Subject: [PATCH 25/52] chore: disable sourceMaps

---
 e2e/tsconfig.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json
index b47aa2ab..4241941f 100755
--- a/e2e/tsconfig.json
+++ b/e2e/tsconfig.json
@@ -3,6 +3,8 @@
   "compilerOptions": {
     "declaration": false,
     "declarationMap": false,
+    "sourceMap": false,
+    "inlineSources": false,
     "noEmit": true,
     "module": "NodeNext",
     "moduleResolution": "NodeNext",

From 97a9471ac4691e2295d54524df220a22b1e148b4 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 22:21:54 +0100
Subject: [PATCH 26/52] chore(linting): remove `any`

---
 packages/@wdio_electron-types/src/index.ts          | 2 +-
 packages/wdio-electron-service/test/service.spec.ts | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/@wdio_electron-types/src/index.ts b/packages/@wdio_electron-types/src/index.ts
index 3d68f607..d6134705 100644
--- a/packages/@wdio_electron-types/src/index.ts
+++ b/packages/@wdio_electron-types/src/index.ts
@@ -648,7 +648,7 @@ export interface ElectronMockInstance extends Omit<Mock, Override> {
   __isElectronMock: boolean;
 }
 
-export interface ElectronMock<TArgs extends any[] = any, TReturns = any> extends ElectronMockInstance {
+export interface ElectronMock<TArgs extends unknown[] = unknown[], TReturns = unknown> extends ElectronMockInstance {
   new (...args: TArgs): TReturns;
   (...args: TArgs): TReturns;
 }
diff --git a/packages/wdio-electron-service/test/service.spec.ts b/packages/wdio-electron-service/test/service.spec.ts
index 82bd3952..862b56ec 100644
--- a/packages/wdio-electron-service/test/service.spec.ts
+++ b/packages/wdio-electron-service/test/service.spec.ts
@@ -114,7 +114,7 @@ describe('beforeTest', () => {
 });
 
 describe('afterCommand', () => {
-  let mocks: [string, ElectronMock<any, any>][] = [];
+  let mocks: [string, ElectronMock][] = [];
 
   vi.mock('../src/mockStore', () => ({
     default: {

From 10614a0c12fe06669f54f75e511b4df1db977a92 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Mon, 9 Sep 2024 22:50:43 +0100
Subject: [PATCH 27/52] chore: add comments

---
 packages/wdio-electron-service/src/preload.ts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/packages/wdio-electron-service/src/preload.ts b/packages/wdio-electron-service/src/preload.ts
index 12c25e16..e812eeb0 100644
--- a/packages/wdio-electron-service/src/preload.ts
+++ b/packages/wdio-electron-service/src/preload.ts
@@ -3,8 +3,11 @@ import { Channel } from './constants.js';
 
 const invoke = async (channel: Channel, ...data: unknown[]) => ipcRenderer.invoke(channel, ...data);
 
+// Expose `execute` to the renderer process
 contextBridge.exposeInMainWorld('wdioElectron', {
   execute: (script: string, args: unknown[]) => invoke(Channel.Execute, script, args),
 });
 
+// Expose __name to the renderer process to work around issue with function serialization
+// https://github.com/privatenumber/tsx/issues/113
 contextBridge.exposeInMainWorld('__name', (func: (...args: unknown[]) => unknown) => func);

From eff62c77f4f31e66ae35f572f2afa415932bcdce Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Tue, 10 Sep 2024 14:17:38 +0100
Subject: [PATCH 28/52] chore: remove `typeScriptVersion`

---
 packages/@wdio_electron-types/package.json  | 1 -
 packages/@wdio_electron-utils/package.json  | 1 -
 packages/wdio-electron-service/package.json | 1 -
 3 files changed, 3 deletions(-)

diff --git a/packages/@wdio_electron-types/package.json b/packages/@wdio_electron-types/package.json
index acabb9ff..2f73c1b9 100644
--- a/packages/@wdio_electron-types/package.json
+++ b/packages/@wdio_electron-types/package.json
@@ -7,7 +7,6 @@
   "exports": {
     ".": "./dist/index.js"
   },
-  "typeScriptVersion": "5.2.2",
   "scripts": {
     "clean": "pnpm clean:dist && pnpm dlx shx rm -rf ./node_modules pnpm-lock.yaml",
     "clean:dist": "pnpm dlx shx rm -rf ./dist",
diff --git a/packages/@wdio_electron-utils/package.json b/packages/@wdio_electron-utils/package.json
index a103c94b..58355599 100644
--- a/packages/@wdio_electron-utils/package.json
+++ b/packages/@wdio_electron-utils/package.json
@@ -23,7 +23,6 @@
       "./dist/cjs/log.js"
     ]
   },
-  "typeScriptVersion": "5.2.2",
   "engines": {
     "node": ">=18 || >=20"
   },
diff --git a/packages/wdio-electron-service/package.json b/packages/wdio-electron-service/package.json
index ec6379f8..f18f2adf 100644
--- a/packages/wdio-electron-service/package.json
+++ b/packages/wdio-electron-service/package.json
@@ -34,7 +34,6 @@
       "./dist/cjs/preload.js"
     ]
   },
-  "typeScriptVersion": "5.2.2",
   "types": "./dist/index.d.ts",
   "engines": {
     "node": ">=18 || >=20"

From 84b971be262bb089fb56468f414042db53a77344 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 13:37:36 +0100
Subject: [PATCH 29/52] chore(linting): remove ignored files, update ES version

---
 eslint.config.js | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/eslint.config.js b/eslint.config.js
index 4ff19970..61129873 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -12,20 +12,17 @@ export default [
   {
     ignores: ['**/dist/**/*', '@types/**/*'],
   },
-  // Ignored files
-  {
-    ignores: ['**/*.config.js', 'e2e/**/*.js'],
-  },
   // All files
   {
     files: ['**/*.{js,mjs,ts}'],
     languageOptions: {
       ecmaVersion: 'latest',
       globals: {
-        ...globals.es2021,
+        ...globals.es2023,
       },
       parserOptions: {
         ...importX.configs.recommended.parserOptions,
+        ecmaVersion: 2023,
       },
     },
     plugins: {

From b2e05677371367f26355b2ad342de518f357d27e Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 13:40:10 +0100
Subject: [PATCH 30/52] chore: update ES targets

---
 apps/forge-cjs/tsconfig.json                | 2 +-
 apps/no-binary-cjs/tsconfig.json            | 2 +-
 packages/@wdio_electron-types/tsconfig.json | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/apps/forge-cjs/tsconfig.json b/apps/forge-cjs/tsconfig.json
index b0b79714..4c74099b 100644
--- a/apps/forge-cjs/tsconfig.json
+++ b/apps/forge-cjs/tsconfig.json
@@ -1,7 +1,7 @@
 {
   "extends": "../../tsconfig.base.cjs.json",
   "compilerOptions": {
-    "target": "ES2022",
+    "target": "ES2023",
     "baseUrl": ".",
     "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../node_modules/@types", "../../@types"],
diff --git a/apps/no-binary-cjs/tsconfig.json b/apps/no-binary-cjs/tsconfig.json
index b0b79714..4c74099b 100644
--- a/apps/no-binary-cjs/tsconfig.json
+++ b/apps/no-binary-cjs/tsconfig.json
@@ -1,7 +1,7 @@
 {
   "extends": "../../tsconfig.base.cjs.json",
   "compilerOptions": {
-    "target": "ES2022",
+    "target": "ES2023",
     "baseUrl": ".",
     "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../node_modules/@types", "../../@types"],
diff --git a/packages/@wdio_electron-types/tsconfig.json b/packages/@wdio_electron-types/tsconfig.json
index ece8f519..a01afa26 100755
--- a/packages/@wdio_electron-types/tsconfig.json
+++ b/packages/@wdio_electron-types/tsconfig.json
@@ -5,7 +5,7 @@
   "compilerOptions": {
     "baseUrl": ".",
     "outDir": "dist",
-    "target": "ES2022",
+    "target": "ES2023",
     "noEmit": false,
     "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"]

From 4a83facb97d6f7302a0b6804273179d2bbfef622 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 13:43:19 +0100
Subject: [PATCH 31/52] chore: update ES version, add vitest/jsdom types

---
 packages/@wdio_electron-utils/tsconfig.json  | 4 ++--
 packages/wdio-electron-service/tsconfig.json | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/packages/@wdio_electron-utils/tsconfig.json b/packages/@wdio_electron-utils/tsconfig.json
index eff2426b..20c47989 100755
--- a/packages/@wdio_electron-utils/tsconfig.json
+++ b/packages/@wdio_electron-utils/tsconfig.json
@@ -4,9 +4,9 @@
   "exclude": ["src/cjs", "node_modules", "coverage", "dist", "test"],
   "compilerOptions": {
     "baseUrl": ".",
-    "target": "ES2022",
+    "target": "ES2023",
     "noEmit": false,
-    "types": ["node"],
+    "types": ["node", "vitest/jsdom"],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"]
   }
 }
diff --git a/packages/wdio-electron-service/tsconfig.json b/packages/wdio-electron-service/tsconfig.json
index 277104f7..7ec06b4d 100755
--- a/packages/wdio-electron-service/tsconfig.json
+++ b/packages/wdio-electron-service/tsconfig.json
@@ -11,9 +11,9 @@
   "exclude": ["src/cjs", "node_modules", "coverage", "dist", "test"],
   "compilerOptions": {
     "baseUrl": ".",
-    "target": "ES2022",
+    "target": "ES2023",
     "noEmit": false,
-    "types": ["node", "electron-to-chromium"],
+    "types": ["node", "electron-to-chromium", "vitest/jsdom"],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"]
   }
 }

From e3274e18899b20d88201ddd726e30812d7a8a80a Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 13:51:49 +0100
Subject: [PATCH 32/52] chore: delete unused deps and config including rollup

---
 apps/builder-cjs/package.json     | 12 +-----------
 apps/builder-cjs/rollup.config.js | 16 ----------------
 apps/builder-esm/README.md        |  2 +-
 apps/builder-esm/package.json     | 13 +------------
 apps/builder-esm/rollup.config.js | 15 ---------------
 5 files changed, 3 insertions(+), 55 deletions(-)
 delete mode 100644 apps/builder-cjs/rollup.config.js
 delete mode 100644 apps/builder-esm/rollup.config.js

diff --git a/apps/builder-cjs/package.json b/apps/builder-cjs/package.json
index 6dfddc81..b3f1122d 100644
--- a/apps/builder-cjs/package.json
+++ b/apps/builder-cjs/package.json
@@ -16,27 +16,17 @@
     "wdio-electron-service": "workspace:*"
   },
   "devDependencies": {
-    "@rollup/plugin-commonjs": "^26.0.1",
-    "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
     "@wdio/cli": "^9.0.9",
     "@wdio/globals": "^9.0.9",
     "@wdio/local-runner": "^9.0.9",
     "@wdio/mocha-framework": "^9.0.8",
-    "cross-env": "^7.0.3",
     "electron": "^32.0.2",
     "electron-builder": "^25.0.5",
-    "global-jsdom": "^24.0.0",
-    "jsdom": "^24.1.1",
-    "rollup": "^4.21.2",
-    "ts-loader": "^9.4.4",
     "tsx": "^4.19.0",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
   },
-  "peerDependencies": {
-    "typescript": "5.2.2"
-  },
   "build": {
     "asar": true,
     "appId": "com.example-builder-cjs.demo",
diff --git a/apps/builder-cjs/rollup.config.js b/apps/builder-cjs/rollup.config.js
deleted file mode 100644
index 62f727bb..00000000
--- a/apps/builder-cjs/rollup.config.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { nodeResolve } from '@rollup/plugin-node-resolve';
-import commonjs from '@rollup/plugin-commonjs';
-import { defineConfig } from 'rollup';
-
-export default defineConfig([
-  {
-    input: 'dist/preload.js',
-    output: {
-      file: 'dist/preload.bundle.js',
-      inlineDynamicImports: true,
-      format: 'cjs',
-    },
-    plugins: [nodeResolve(), commonjs()],
-    external: ['electron'],
-  },
-]);
diff --git a/apps/builder-esm/README.md b/apps/builder-esm/README.md
index d4c724cf..d81ab5fa 100644
--- a/apps/builder-esm/README.md
+++ b/apps/builder-esm/README.md
@@ -2,4 +2,4 @@
 
 An ESM project for a minimal Electron app, designed to provide E2E testing for `wdio-electron-service`.
 
-The app is built using `electron-builder` and the preload script is bundled as CJS, this is to work around a limitation of Electron's ESM support.
+The app is built using `electron-builder` and is not bundled.
diff --git a/apps/builder-esm/package.json b/apps/builder-esm/package.json
index c4cd6056..c4485bb9 100644
--- a/apps/builder-esm/package.json
+++ b/apps/builder-esm/package.json
@@ -18,28 +18,17 @@
     "wdio-electron-service": "workspace:*"
   },
   "devDependencies": {
-    "@rollup/plugin-commonjs": "^26.0.1",
-    "@rollup/plugin-json": "^6.1.0",
-    "@rollup/plugin-node-resolve": "^15.2.1",
     "@types/node": "^20.16.1",
     "@wdio/cli": "^9.0.9",
     "@wdio/globals": "^9.0.9",
     "@wdio/local-runner": "^9.0.9",
     "@wdio/mocha-framework": "^9.0.8",
-    "cross-env": "^7.0.3",
     "electron": "^32.0.2",
     "electron-builder": "^25.0.5",
-    "global-jsdom": "^24.0.0",
-    "jsdom": "^24.1.1",
-    "rollup": "^4.21.2",
-    "ts-loader": "^9.4.4",
     "tsx": "^4.19.0",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
   },
-  "peerDependencies": {
-    "typescript": "5.2.2"
-  },
   "build": {
     "asar": true,
     "appId": "com.example-builder-esm.demo",
diff --git a/apps/builder-esm/rollup.config.js b/apps/builder-esm/rollup.config.js
deleted file mode 100644
index 980cdc5f..00000000
--- a/apps/builder-esm/rollup.config.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { nodeResolve } from '@rollup/plugin-node-resolve';
-import commonjs from '@rollup/plugin-commonjs';
-import { defineConfig } from 'rollup';
-
-export default defineConfig([
-  {
-    input: 'dist/preload.js',
-    output: {
-      file: 'dist/preload.bundle.cjs',
-      format: 'cjs',
-    },
-    plugins: [nodeResolve(), commonjs()],
-    external: ['electron'],
-  },
-]);

From 2d5879eb541a50b7ac22b2e7ebdadbf1955e158a Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 13:54:36 +0100
Subject: [PATCH 33/52] chore: update pnpm, remove unused jsdom

---
 package.json | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 26a099d7..69f9d383 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,6 @@
     "eslint-plugin-wdio": "^9.0.8",
     "globals": "^15.9.0",
     "husky": "^9.1.5",
-    "jsdom": "^24.1.1",
     "lint-staged": "^15.2.10",
     "prettier": "^3.3.3",
     "read-package-up": "^11.0.0",
@@ -75,7 +74,7 @@
       "prettier --write"
     ]
   },
-  "packageManager": "pnpm@9.9.0+sha512.60c18acd138bff695d339be6ad13f7e936eea6745660d4cc4a776d5247c540d0edee1a563695c183a66eb917ef88f2b4feb1fc25f32a7adcadc7aaf3438e99c1",
+  "packageManager": "pnpm@9.10.0+sha512.73a29afa36a0d092ece5271de5177ecbf8318d454ecd701343131b8ebc0c1a91c487da46ab77c8e596d6acf1461e3594ced4becedf8921b074fbd8653ed7051c",
   "release-it": {
     "git": {
       "commitMessage": "chore: release v${version}",

From 82d76d1f140b94ac3ee7e533a03c4b7a413fa73f Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 13:56:07 +0100
Subject: [PATCH 34/52] chore: remove unused deps, pin `@electron/asar`to work
 around b0rkage

---
 apps/forge-cjs/package.json | 11 ++++-------
 apps/forge-esm/package.json | 11 ++++-------
 2 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/apps/forge-cjs/package.json b/apps/forge-cjs/package.json
index 0e56eac5..9e2865c0 100644
--- a/apps/forge-cjs/package.json
+++ b/apps/forge-cjs/package.json
@@ -20,22 +20,19 @@
     "@electron-forge/cli": "^7.4.0",
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
+    "@rollup/plugin-typescript": "^11.1.6",
     "@types/node": "^20.16.1",
     "@wdio/cli": "^9.0.9",
     "@wdio/globals": "^9.0.9",
     "@wdio/local-runner": "^9.0.9",
     "@wdio/mocha-framework": "^9.0.8",
-    "cross-env": "^7.0.3",
     "electron": "^32.0.2",
-    "global-jsdom": "^24.0.0",
-    "jsdom": "^24.1.1",
     "rollup": "^4.21.2",
-    "ts-loader": "^9.4.4",
     "tsx": "^4.19.0",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
   },
-  "peerDependencies": {
-    "typescript": "5.2.2"
+  "resolutions": {
+    "@electron/asar": "3.2.10"
   }
 }
diff --git a/apps/forge-esm/package.json b/apps/forge-esm/package.json
index 9c42e3b5..efcb30ad 100644
--- a/apps/forge-esm/package.json
+++ b/apps/forge-esm/package.json
@@ -21,22 +21,19 @@
     "@electron-forge/cli": "^7.4.0",
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
+    "@rollup/plugin-typescript": "^11.1.6",
     "@types/node": "^20.16.1",
     "@wdio/cli": "^9.0.9",
     "@wdio/globals": "^9.0.9",
     "@wdio/local-runner": "^9.0.9",
     "@wdio/mocha-framework": "^9.0.8",
-    "cross-env": "^7.0.3",
     "electron": "^32.0.2",
-    "global-jsdom": "^24.0.0",
-    "jsdom": "^24.1.1",
     "rollup": "^4.21.2",
-    "ts-loader": "^9.4.4",
     "tsx": "^4.19.0",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
   },
-  "peerDependencies": {
-    "typescript": "5.2.2"
+  "resolutions": {
+    "@electron/asar": "3.2.10"
   }
 }

From c390e9d3dd3e9fda9208ea4d9244beb4dc64c6bd Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 13:57:51 +0100
Subject: [PATCH 35/52] chore: update deps, fix CJS types masquerading as ESM

---
 packages/wdio-electron-service/package.json | 42 ++++++++++++++-------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/packages/wdio-electron-service/package.json b/packages/wdio-electron-service/package.json
index f18f2adf..1a09a258 100644
--- a/packages/wdio-electron-service/package.json
+++ b/packages/wdio-electron-service/package.json
@@ -11,25 +11,40 @@
   "exports": {
     ".": [
       {
-        "import": "./dist/index.js",
-        "types": "./dist/index.d.ts",
-        "require": "./dist/cjs/index.js"
+        "import": {
+          "types": "./dist/index.d.ts",
+          "default": "./dist/index.js"
+        },
+        "require": {
+          "types": "./dist/cjs/index.d.ts",
+          "default": "./dist/cjs/index.js"
+        }
       },
       "./dist/cjs/index.js"
     ],
     "./main": [
       {
-        "import": "./dist/main.js",
-        "types": "./dist/main.d.ts",
-        "require": "./dist/cjs/main.js"
+        "import": {
+          "types": "./dist/main.d.ts",
+          "default": "./dist/main.js"
+        },
+        "require": {
+          "types": "./dist/cjs/main.d.ts",
+          "default": "./dist/cjs/main.js"
+        }
       },
       "./dist/cjs/main.js"
     ],
     "./preload": [
       {
-        "import": "./dist/preload.js",
-        "types": "./dist/preload.d.ts",
-        "require": "./dist/cjs/preload.js"
+        "import": {
+          "types": "./dist/preload.d.ts",
+          "default": "./dist/preload.js"
+        },
+        "require": {
+          "types": "./dist/cjs/preload.d.ts",
+          "default": "./dist/cjs/preload.js"
+        }
       },
       "./dist/cjs/preload.js"
     ]
@@ -83,10 +98,10 @@
     "@wdio/logger": "^9.0.8",
     "compare-versions": "^6.1.1",
     "debug": "^4.3.7",
-    "electron-to-chromium": "^1.5.18",
+    "electron-to-chromium": "^1.5.19",
     "fast-copy": "^3.0.1",
     "read-package-up": "^11.0.0",
-    "tinyspy": "^3.0.0",
+    "tinyspy": "^3.0.2",
     "webdriverio": "^9.0.9"
   },
   "devDependencies": {
@@ -97,14 +112,13 @@
     "@types/node": "^20.16.1",
     "@vitest/coverage-v8": "^2.0.5",
     "@wdio/types": "^9.0.8",
-    "builder-util": "25.0.3",
+    "builder-util": "^25.0.3",
     "electron": "^32.0.2",
-    "jsdom": "^24.1.1",
     "nock": "^14.0.0-beta.11",
     "release-it": "^17.6.0",
     "rollup": "^4.21.2",
     "shx": "^0.3.4",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "vitest": "^2.0.5"
   },
   "files": [

From f7cc6cc4e751c8ad66e0a65c130197469f96d581 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:01:17 +0100
Subject: [PATCH 36/52] chore: update deps, remove unused

---
 apps/no-binary-cjs/package.json            | 10 ++--------
 apps/no-binary-esm/package.json            | 10 ++--------
 e2e/package.json                           |  5 +----
 packages/@wdio_electron-types/package.json |  2 +-
 packages/@wdio_electron-utils/package.json |  3 +--
 5 files changed, 7 insertions(+), 23 deletions(-)

diff --git a/apps/no-binary-cjs/package.json b/apps/no-binary-cjs/package.json
index 59b3d489..56ee073d 100644
--- a/apps/no-binary-cjs/package.json
+++ b/apps/no-binary-cjs/package.json
@@ -14,22 +14,16 @@
   "devDependencies": {
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
+    "@rollup/plugin-typescript": "^11.1.6",
     "@types/node": "^20.16.1",
     "@wdio/cli": "^9.0.9",
     "@wdio/globals": "^9.0.9",
     "@wdio/local-runner": "^9.0.9",
     "@wdio/mocha-framework": "^9.0.8",
-    "cross-env": "^7.0.3",
     "electron": "^32.0.2",
-    "global-jsdom": "^24.0.0",
-    "jsdom": "^24.1.1",
     "rollup": "^4.21.2",
-    "ts-loader": "^9.4.4",
     "tsx": "^4.19.0",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
-  },
-  "peerDependencies": {
-    "typescript": "5.2.2"
   }
 }
diff --git a/apps/no-binary-esm/package.json b/apps/no-binary-esm/package.json
index 037251c9..496dd989 100644
--- a/apps/no-binary-esm/package.json
+++ b/apps/no-binary-esm/package.json
@@ -16,22 +16,16 @@
   "devDependencies": {
     "@rollup/plugin-commonjs": "^26.0.1",
     "@rollup/plugin-node-resolve": "^15.2.1",
+    "@rollup/plugin-typescript": "^11.1.6",
     "@types/node": "^20.16.1",
     "@wdio/cli": "^9.0.9",
     "@wdio/globals": "^9.0.9",
     "@wdio/local-runner": "^9.0.9",
     "@wdio/mocha-framework": "^9.0.8",
-    "cross-env": "^7.0.3",
     "electron": "^32.0.2",
-    "global-jsdom": "^24.0.0",
-    "jsdom": "^24.1.1",
     "rollup": "^4.21.2",
-    "ts-loader": "^9.4.4",
     "tsx": "^4.19.0",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
-  },
-  "peerDependencies": {
-    "typescript": "5.2.2"
   }
 }
diff --git a/e2e/package.json b/e2e/package.json
index 98c81938..f5d74873 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -50,11 +50,8 @@
     "@types/node": "^20.16.1",
     "@vitest/spy": "^2.0.5",
     "@wdio/types": "^9.0.8",
-    "global-jsdom": "^24.0.0",
-    "jsdom": "^24.1.1",
     "read-package-up": "^11.0.0",
     "rollup": "^4.21.2",
-    "ts-loader": "^9.4.4",
-    "typescript": "^5.5.4"
+    "typescript": "^5.6.2"
   }
 }
diff --git a/packages/@wdio_electron-types/package.json b/packages/@wdio_electron-types/package.json
index 2f73c1b9..99100b9c 100644
--- a/packages/@wdio_electron-types/package.json
+++ b/packages/@wdio_electron-types/package.json
@@ -25,7 +25,7 @@
     "electron": "^32.0.2",
     "read-package-up": "^11.0.0",
     "release-it": "^17.6.0",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
   },
   "files": [
diff --git a/packages/@wdio_electron-utils/package.json b/packages/@wdio_electron-utils/package.json
index 58355599..3a2a5b16 100644
--- a/packages/@wdio_electron-utils/package.json
+++ b/packages/@wdio_electron-utils/package.json
@@ -49,10 +49,9 @@
     "@types/node": "^20.16.1",
     "@vitest/coverage-v8": "^2.0.5",
     "@wdio/electron-types": "workspace:*",
-    "jsdom": "^24.1.1",
     "release-it": "^17.6.0",
     "shx": "^0.3.4",
-    "typescript": "^5.5.4",
+    "typescript": "^5.6.2",
     "vitest": "^2.0.5"
   },
   "release-it": {

From 5ed876bcbf0c9856c08966939ff81e1b85dfc242 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:01:37 +0100
Subject: [PATCH 37/52] chore: update lockfile

---
 pnpm-lock.yaml | 849 +++++++++++++------------------------------------
 1 file changed, 220 insertions(+), 629 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d512a46d..0d7c0d8a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -22,13 +22,13 @@ importers:
         version: 0.8.15
       '@typescript-eslint/eslint-plugin':
         specifier: ^8.4.0
-        version: 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)
+        version: 8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)
       '@typescript-eslint/parser':
         specifier: ^8.4.0
-        version: 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+        version: 8.5.0(eslint@9.10.0)(typescript@5.6.2)
       '@vitest/eslint-plugin':
         specifier: ^1.1.0
-        version: 1.1.0(@typescript-eslint/utils@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))
+        version: 1.1.0(@typescript-eslint/utils@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)(vitest@2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0))
       cross-env:
         specifier: ^7.0.3
         version: 7.0.3
@@ -40,10 +40,10 @@ importers:
         version: 9.1.0(eslint@9.10.0)
       eslint-import-resolver-typescript:
         specifier: ^3.6.3
-        version: 3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)
+        version: 3.6.3(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)
       eslint-plugin-import-x:
         specifier: ^4.2.1
-        version: 4.2.1(eslint@9.10.0)(typescript@5.5.4)
+        version: 4.2.1(eslint@9.10.0)(typescript@5.6.2)
       eslint-plugin-wdio:
         specifier: ^9.0.8
         version: 9.0.8
@@ -54,8 +54,8 @@ importers:
         specifier: ^9.1.5
         version: 9.1.5
       jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
+        specifier: ^25.0.0
+        version: 25.0.0
       lint-staged:
         specifier: ^15.2.10
         version: 15.2.10
@@ -67,7 +67,7 @@ importers:
         version: 11.0.0
       release-it:
         specifier: ^17.6.0
-        version: 17.6.0(typescript@5.5.4)
+        version: 17.6.0(typescript@5.6.2)
       shelljs:
         specifier: ^0.8.5
         version: 0.8.5
@@ -87,12 +87,6 @@ importers:
         specifier: workspace:*
         version: link:../../packages/wdio-electron-service
     devDependencies:
-      '@rollup/plugin-commonjs':
-        specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.2)
-      '@rollup/plugin-node-resolve':
-        specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
@@ -108,33 +102,18 @@ importers:
       '@wdio/mocha-framework':
         specifier: ^9.0.8
         version: 9.0.8
-      cross-env:
-        specifier: ^7.0.3
-        version: 7.0.3
       electron:
         specifier: ^32.0.2
         version: 32.0.2
       electron-builder:
         specifier: ^25.0.5
         version: 25.0.5(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5))
-      global-jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0(jsdom@24.1.1)
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
-      rollup:
-        specifier: ^4.21.2
-        version: 4.21.2
-      ts-loader:
-        specifier: ^9.4.4
-        version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
         specifier: ^4.19.0
         version: 4.19.0
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -145,15 +124,6 @@ importers:
         specifier: workspace:*
         version: link:../../packages/wdio-electron-service
     devDependencies:
-      '@rollup/plugin-commonjs':
-        specifier: ^26.0.1
-        version: 26.0.1(rollup@4.21.2)
-      '@rollup/plugin-json':
-        specifier: ^6.1.0
-        version: 6.1.0(rollup@4.21.2)
-      '@rollup/plugin-node-resolve':
-        specifier: ^15.2.1
-        version: 15.2.3(rollup@4.21.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
@@ -169,33 +139,18 @@ importers:
       '@wdio/mocha-framework':
         specifier: ^9.0.8
         version: 9.0.8
-      cross-env:
-        specifier: ^7.0.3
-        version: 7.0.3
       electron:
         specifier: ^32.0.2
         version: 32.0.2
       electron-builder:
         specifier: ^25.0.5
         version: 25.0.5(electron-builder-squirrel-windows@25.0.5(dmg-builder@25.0.5))
-      global-jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0(jsdom@24.1.1)
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
-      rollup:
-        specifier: ^4.21.2
-        version: 4.21.2
-      ts-loader:
-        specifier: ^9.4.4
-        version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
         specifier: ^4.19.0
         version: 4.19.0
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -215,6 +170,9 @@ importers:
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
         version: 15.2.3(rollup@4.21.2)
+      '@rollup/plugin-typescript':
+        specifier: ^11.1.6
+        version: 11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.6.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
@@ -230,30 +188,18 @@ importers:
       '@wdio/mocha-framework':
         specifier: ^9.0.8
         version: 9.0.8
-      cross-env:
-        specifier: ^7.0.3
-        version: 7.0.3
       electron:
         specifier: ^32.0.2
         version: 32.0.2
-      global-jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0(jsdom@24.1.1)
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
       rollup:
         specifier: ^4.21.2
         version: 4.21.2
-      ts-loader:
-        specifier: ^9.4.4
-        version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
         specifier: ^4.19.0
         version: 4.19.0
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -273,6 +219,9 @@ importers:
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
         version: 15.2.3(rollup@4.21.2)
+      '@rollup/plugin-typescript':
+        specifier: ^11.1.6
+        version: 11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.6.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
@@ -288,30 +237,18 @@ importers:
       '@wdio/mocha-framework':
         specifier: ^9.0.8
         version: 9.0.8
-      cross-env:
-        specifier: ^7.0.3
-        version: 7.0.3
       electron:
         specifier: ^32.0.2
         version: 32.0.2
-      global-jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0(jsdom@24.1.1)
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
       rollup:
         specifier: ^4.21.2
         version: 4.21.2
-      ts-loader:
-        specifier: ^9.4.4
-        version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
         specifier: ^4.19.0
         version: 4.19.0
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -328,6 +265,9 @@ importers:
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
         version: 15.2.3(rollup@4.21.2)
+      '@rollup/plugin-typescript':
+        specifier: ^11.1.6
+        version: 11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.6.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
@@ -343,30 +283,18 @@ importers:
       '@wdio/mocha-framework':
         specifier: ^9.0.8
         version: 9.0.8
-      cross-env:
-        specifier: ^7.0.3
-        version: 7.0.3
       electron:
         specifier: ^32.0.2
         version: 32.0.2
-      global-jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0(jsdom@24.1.1)
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
       rollup:
         specifier: ^4.21.2
         version: 4.21.2
-      ts-loader:
-        specifier: ^9.4.4
-        version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
         specifier: ^4.19.0
         version: 4.19.0
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -383,6 +311,9 @@ importers:
       '@rollup/plugin-node-resolve':
         specifier: ^15.2.1
         version: 15.2.3(rollup@4.21.2)
+      '@rollup/plugin-typescript':
+        specifier: ^11.1.6
+        version: 11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.6.2)
       '@types/node':
         specifier: ^20.16.1
         version: 20.16.1
@@ -398,30 +329,18 @@ importers:
       '@wdio/mocha-framework':
         specifier: ^9.0.8
         version: 9.0.8
-      cross-env:
-        specifier: ^7.0.3
-        version: 7.0.3
       electron:
         specifier: ^32.0.2
         version: 32.0.2
-      global-jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0(jsdom@24.1.1)
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
       rollup:
         specifier: ^4.21.2
         version: 4.21.2
-      ts-loader:
-        specifier: ^9.4.4
-        version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       tsx:
         specifier: ^4.19.0
         version: 4.19.0
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -467,7 +386,7 @@ importers:
         version: 7.4.0(encoding@0.1.13)
       '@rollup/plugin-typescript':
         specifier: ^11.1.6
-        version: 11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.5.4)
+        version: 11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.6.2)
       '@types/mocha':
         specifier: ^10.0.6
         version: 10.0.7
@@ -480,24 +399,15 @@ importers:
       '@wdio/types':
         specifier: ^9.0.8
         version: 9.0.8
-      global-jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0(jsdom@24.1.1)
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
       read-package-up:
         specifier: ^11.0.0
         version: 11.0.0
       rollup:
         specifier: ^4.21.2
         version: 4.21.2
-      ts-loader:
-        specifier: ^9.4.4
-        version: 9.5.1(typescript@5.5.4)(webpack@5.94.0)
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
 
   packages/@wdio_electron-types:
     dependencies:
@@ -528,10 +438,10 @@ importers:
         version: 11.0.0
       release-it:
         specifier: ^17.6.0
-        version: 17.6.0(typescript@5.5.4)
+        version: 17.6.0(typescript@5.6.2)
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -562,25 +472,22 @@ importers:
         version: 20.16.1
       '@vitest/coverage-v8':
         specifier: ^2.0.5
-        version: 2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))
+        version: 2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0))
       '@wdio/electron-types':
         specifier: workspace:*
         version: link:../@wdio_electron-types
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
       release-it:
         specifier: ^17.6.0
-        version: 17.6.0(typescript@5.5.4)
+        version: 17.6.0(typescript@5.6.2)
       shx:
         specifier: ^0.3.4
         version: 0.3.4
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       vitest:
         specifier: ^2.0.5
-        version: 2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6)
+        version: 2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0)
 
   packages/wdio-electron-service:
     dependencies:
@@ -606,8 +513,8 @@ importers:
         specifier: ^4.3.7
         version: 4.3.7(supports-color@8.1.1)
       electron-to-chromium:
-        specifier: ^1.5.18
-        version: 1.5.18
+        specifier: ^1.5.19
+        version: 1.5.19
       fast-copy:
         specifier: ^3.0.1
         version: 3.0.2
@@ -615,8 +522,8 @@ importers:
         specifier: ^11.0.0
         version: 11.0.0
       tinyspy:
-        specifier: ^3.0.0
-        version: 3.0.0
+        specifier: ^3.0.2
+        version: 3.0.2
       webdriverio:
         specifier: ^9.0.9
         version: 9.0.9
@@ -638,25 +545,22 @@ importers:
         version: 20.16.1
       '@vitest/coverage-v8':
         specifier: ^2.0.5
-        version: 2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))
+        version: 2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0))
       '@wdio/types':
         specifier: ^9.0.8
         version: 9.0.8
       builder-util:
-        specifier: 25.0.3
+        specifier: ^25.0.3
         version: 25.0.3
       electron:
         specifier: ^32.0.2
         version: 32.0.2
-      jsdom:
-        specifier: ^24.1.1
-        version: 24.1.1
       nock:
         specifier: ^14.0.0-beta.11
         version: 14.0.0-beta.11
       release-it:
         specifier: ^17.6.0
-        version: 17.6.0(typescript@5.5.4)
+        version: 17.6.0(typescript@5.6.2)
       rollup:
         specifier: ^4.21.2
         version: 4.21.2
@@ -664,11 +568,11 @@ importers:
         specifier: ^0.3.4
         version: 0.3.4
       typescript:
-        specifier: ^5.5.4
-        version: 5.5.4
+        specifier: ^5.6.2
+        version: 5.6.2
       vitest:
         specifier: ^2.0.5
-        version: 2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6)
+        version: 2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0)
 
 packages:
 
@@ -1367,15 +1271,6 @@ packages:
       rollup:
         optional: true
 
-  '@rollup/plugin-json@6.1.0':
-    resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-
   '@rollup/plugin-node-resolve@15.2.3':
     resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
     engines: {node: '>=14.0.0'}
@@ -1566,9 +1461,6 @@ packages:
   '@types/istanbul-reports@3.0.4':
     resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
 
-  '@types/json-schema@7.0.15':
-    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
-
   '@types/keyv@3.1.4':
     resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
 
@@ -1635,8 +1527,8 @@ packages:
   '@types/yauzl@2.10.3':
     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
 
-  '@typescript-eslint/eslint-plugin@8.4.0':
-    resolution: {integrity: sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==}
+  '@typescript-eslint/eslint-plugin@8.5.0':
+    resolution: {integrity: sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@@ -1646,8 +1538,8 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/parser@8.4.0':
-    resolution: {integrity: sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==}
+  '@typescript-eslint/parser@8.5.0':
+    resolution: {integrity: sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -1660,8 +1552,12 @@ packages:
     resolution: {integrity: sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/type-utils@8.4.0':
-    resolution: {integrity: sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==}
+  '@typescript-eslint/scope-manager@8.5.0':
+    resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/type-utils@8.5.0':
+    resolution: {integrity: sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '*'
@@ -1673,6 +1569,10 @@ packages:
     resolution: {integrity: sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/types@8.5.0':
+    resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@typescript-eslint/typescript-estree@8.4.0':
     resolution: {integrity: sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1682,16 +1582,35 @@ packages:
       typescript:
         optional: true
 
+  '@typescript-eslint/typescript-estree@8.5.0':
+    resolution: {integrity: sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
   '@typescript-eslint/utils@8.4.0':
     resolution: {integrity: sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
 
+  '@typescript-eslint/utils@8.5.0':
+    resolution: {integrity: sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+
   '@typescript-eslint/visitor-keys@8.4.0':
     resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/visitor-keys@8.5.0':
+    resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@vitest/coverage-v8@2.0.5':
     resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==}
     peerDependencies:
@@ -1781,61 +1700,10 @@ packages:
     resolution: {integrity: sha512-p3EgOdkhCvMxJFd3WTtSChqYFQu2mz69/5tOsljDaL+4QYwnRR7O8M9wFsL3/9XMVcHdnC4Ija2VRxQ/lb+hHQ==}
     engines: {node: '>=18.20.0'}
 
-  '@webassemblyjs/ast@1.12.1':
-    resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==}
-
-  '@webassemblyjs/floating-point-hex-parser@1.11.6':
-    resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
-
-  '@webassemblyjs/helper-api-error@1.11.6':
-    resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
-
-  '@webassemblyjs/helper-buffer@1.12.1':
-    resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==}
-
-  '@webassemblyjs/helper-numbers@1.11.6':
-    resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
-
-  '@webassemblyjs/helper-wasm-bytecode@1.11.6':
-    resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
-
-  '@webassemblyjs/helper-wasm-section@1.12.1':
-    resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==}
-
-  '@webassemblyjs/ieee754@1.11.6':
-    resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
-
-  '@webassemblyjs/leb128@1.11.6':
-    resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
-
-  '@webassemblyjs/utf8@1.11.6':
-    resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
-
-  '@webassemblyjs/wasm-edit@1.12.1':
-    resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==}
-
-  '@webassemblyjs/wasm-gen@1.12.1':
-    resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==}
-
-  '@webassemblyjs/wasm-opt@1.12.1':
-    resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==}
-
-  '@webassemblyjs/wasm-parser@1.12.1':
-    resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==}
-
-  '@webassemblyjs/wast-printer@1.12.1':
-    resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==}
-
   '@xmldom/xmldom@0.8.10':
     resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
     engines: {node: '>=10.0.0'}
 
-  '@xtuc/ieee754@1.2.0':
-    resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
-
-  '@xtuc/long@4.2.2':
-    resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
-
   '@zip.js/zip.js@2.7.52':
     resolution: {integrity: sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==}
     engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'}
@@ -1847,11 +1715,6 @@ packages:
     resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
     engines: {node: '>=6.5'}
 
-  acorn-import-attributes@1.9.5:
-    resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
-    peerDependencies:
-      acorn: ^8
-
   acorn-jsx@5.3.2:
     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
     peerDependencies:
@@ -2092,11 +1955,6 @@ packages:
   browser-stdout@1.3.1:
     resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
 
-  browserslist@4.23.3:
-    resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==}
-    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
-    hasBin: true
-
   buffer-crc32@0.2.13:
     resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
 
@@ -2168,9 +2026,6 @@ packages:
     resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
     engines: {node: '>=14.16'}
 
-  caniuse-lite@1.0.30001658:
-    resolution: {integrity: sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==}
-
   chai@5.1.1:
     resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
     engines: {node: '>=12'}
@@ -2423,8 +2278,8 @@ packages:
     resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
     engines: {node: '>= 6'}
 
-  cssstyle@4.0.1:
-    resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
+  cssstyle@4.1.0:
+    resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
     engines: {node: '>=18'}
 
   data-uri-to-buffer@4.0.1:
@@ -2642,8 +2497,8 @@ packages:
   electron-publish@25.0.3:
     resolution: {integrity: sha512-wSGm+TFK2lArswIFBPLuIRHbo945s3MCvG5y1xVC57zL/PsrElUkaGH2ERtRrcKNpaDNq77rDA9JnMJhAFJjUg==}
 
-  electron-to-chromium@1.5.18:
-    resolution: {integrity: sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==}
+  electron-to-chromium@1.5.19:
+    resolution: {integrity: sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w==}
 
   electron@32.0.2:
     resolution: {integrity: sha512-nmZblq8wW3HZ17MAyaUuiMI9Mb0Cgc7UR3To85h/rVopbfyF5s34NxtK4gvyRfYPxpDGP4k+HoQIPniPPrdE3w==}
@@ -2701,9 +2556,6 @@ packages:
   es-get-iterator@1.1.3:
     resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
 
-  es-module-lexer@1.5.4:
-    resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
-
   es6-error@4.1.1:
     resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
 
@@ -2795,10 +2647,6 @@ packages:
     resolution: {integrity: sha512-aCWjI3p1H+AFpiJhcybGMSXqtBUkoVbpZcYhDawb4JWFhHAF8J8bdyanPYvDLoyOKVN4zJ3AFb8G4qxKXq8qXA==}
     engines: {node: '>=18.20.0'}
 
-  eslint-scope@5.1.1:
-    resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
-    engines: {node: '>=8.0.0'}
-
   eslint-scope@8.0.2:
     resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2838,10 +2686,6 @@ packages:
     resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
     engines: {node: '>=4.0'}
 
-  estraverse@4.3.0:
-    resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
-    engines: {node: '>=4.0'}
-
   estraverse@5.3.0:
     resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
     engines: {node: '>=4.0'}
@@ -3158,9 +3002,6 @@ packages:
     resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
     engines: {node: '>=10.13.0'}
 
-  glob-to-regexp@0.4.1:
-    resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
-
   glob@10.4.5:
     resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
     hasBin: true
@@ -3186,12 +3027,6 @@ packages:
     resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
     engines: {node: '>=18'}
 
-  global-jsdom@24.0.0:
-    resolution: {integrity: sha512-CARBUWkqZ3O9VOc2PIVE5kQpdQeJh9eF9kQ7zSeNtmqx5vAFDKMr9XnDt1epVMMrz1s9uK/yFCa4HLwpa6TcPA==}
-    engines: {node: '>=18'}
-    peerDependencies:
-      jsdom: '>=24 <25'
-
   global-modules@1.0.0:
     resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==}
     engines: {node: '>=0.10.0'}
@@ -3724,10 +3559,6 @@ packages:
     resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
 
-  jest-worker@27.5.1:
-    resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
-    engines: {node: '>= 10.13.0'}
-
   js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
@@ -3738,8 +3569,8 @@ packages:
   jsbn@1.1.0:
     resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==}
 
-  jsdom@24.1.1:
-    resolution: {integrity: sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==}
+  jsdom@25.0.0:
+    resolution: {integrity: sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==}
     engines: {node: '>=18'}
     peerDependencies:
       canvas: ^2.11.2
@@ -3837,10 +3668,6 @@ packages:
     resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==}
     engines: {node: '>=4'}
 
-  loader-runner@4.3.0:
-    resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
-    engines: {node: '>=6.11.5'}
-
   locate-app@2.4.39:
     resolution: {integrity: sha512-hl7NwJrpGKLlmVgNrMRxFLRJTjve6IIav08bnv4MQSjahFRUPPVp+R02PSYpll6wY/YZqMrha68uScTmRJeMeA==}
 
@@ -4009,10 +3836,6 @@ packages:
     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
     engines: {node: '>= 8'}
 
-  micromatch@4.0.7:
-    resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
-    engines: {node: '>=8.6'}
-
   micromatch@4.0.8:
     resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
     engines: {node: '>=8.6'}
@@ -4146,9 +3969,6 @@ packages:
     resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
     engines: {node: '>= 0.6'}
 
-  neo-async@2.6.2:
-    resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
-
   netmask@2.0.2:
     resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
     engines: {node: '>= 0.4.0'}
@@ -4196,9 +4016,6 @@ packages:
     engines: {node: ^12.13 || ^14.13 || >=16}
     hasBin: true
 
-  node-releases@2.0.18:
-    resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
-
   nopt@6.0.0:
     resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==}
     engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -4497,9 +4314,6 @@ packages:
   picocolors@1.0.1:
     resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
 
-  picocolors@1.1.0:
-    resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
-
   picomatch@2.3.1:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
     engines: {node: '>=8.6'}
@@ -4811,9 +4625,6 @@ packages:
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
-  rrweb-cssom@0.6.0:
-    resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
-
   rrweb-cssom@0.7.1:
     resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
 
@@ -4853,10 +4664,6 @@ packages:
     resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
     engines: {node: '>=v12.22.7'}
 
-  schema-utils@3.3.0:
-    resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
-    engines: {node: '>= 10.13.0'}
-
   semver-compare@1.0.0:
     resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
 
@@ -5005,10 +4812,6 @@ packages:
     resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
     engines: {node: '>=0.10.0'}
 
-  source-map@0.7.4:
-    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
-    engines: {node: '>= 8'}
-
   spacetrim@0.11.39:
     resolution: {integrity: sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g==}
 
@@ -5186,24 +4989,8 @@ packages:
   temp-file@3.4.0:
     resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==}
 
-  terser-webpack-plugin@5.3.10:
-    resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
-    engines: {node: '>= 10.13.0'}
-    peerDependencies:
-      '@swc/core': '*'
-      esbuild: '*'
-      uglify-js: '*'
-      webpack: ^5.1.0
-    peerDependenciesMeta:
-      '@swc/core':
-        optional: true
-      esbuild:
-        optional: true
-      uglify-js:
-        optional: true
-
-  terser@5.31.6:
-    resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==}
+  terser@5.32.0:
+    resolution: {integrity: sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==}
     engines: {node: '>=10'}
     hasBin: true
 
@@ -5239,6 +5026,10 @@ packages:
     resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==}
     engines: {node: '>=14.0.0'}
 
+  tinyspy@3.0.2:
+    resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+    engines: {node: '>=14.0.0'}
+
   tmp-promise@3.0.3:
     resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==}
 
@@ -5282,16 +5073,6 @@ packages:
     peerDependencies:
       typescript: '>=4.2.0'
 
-  ts-loader@9.5.1:
-    resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==}
-    engines: {node: '>=12.0.0'}
-    peerDependencies:
-      typescript: '*'
-      webpack: ^5.0.0
-
-  tslib@2.6.3:
-    resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
-
   tslib@2.7.0:
     resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
 
@@ -5373,8 +5154,8 @@ packages:
   typedarray-to-buffer@3.1.5:
     resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
 
-  typescript@5.5.4:
-    resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
+  typescript@5.6.2:
+    resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==}
     engines: {node: '>=14.17'}
     hasBin: true
 
@@ -5419,12 +5200,6 @@ packages:
     resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
     engines: {node: '>= 10.0.0'}
 
-  update-browserslist-db@1.1.0:
-    resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
-    hasBin: true
-    peerDependencies:
-      browserslist: '>= 4.21.0'
-
   update-notifier@7.1.0:
     resolution: {integrity: sha512-8SV3rIqVY6EFC1WxH6L0j55s0MO79MFBS1pivmInRJg3pCEDgWHBj1Q6XByTtCLOZIFA0f6zoG9ZWf2Ks9lvTA==}
     engines: {node: '>=18'}
@@ -5533,10 +5308,6 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
 
-  watchpack@2.4.2:
-    resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
-    engines: {node: '>=10.13.0'}
-
   wcwidth@1.0.1:
     resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
 
@@ -5564,20 +5335,6 @@ packages:
     resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
     engines: {node: '>=12'}
 
-  webpack-sources@3.2.3:
-    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
-    engines: {node: '>=10.13.0'}
-
-  webpack@5.94.0:
-    resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-    peerDependencies:
-      webpack-cli: '*'
-    peerDependenciesMeta:
-      webpack-cli:
-        optional: true
-
   whatwg-encoding@3.1.1:
     resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
     engines: {node: '>=18'}
@@ -6399,7 +6156,7 @@ snapshots:
       '@jest/schemas': 29.6.3
       '@types/istanbul-lib-coverage': 2.0.6
       '@types/istanbul-reports': 3.0.4
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
       '@types/yargs': 17.0.33
       chalk: 4.1.2
 
@@ -6417,6 +6174,7 @@ snapshots:
     dependencies:
       '@jridgewell/gen-mapping': 0.3.5
       '@jridgewell/trace-mapping': 0.3.25
+    optional: true
 
   '@jridgewell/sourcemap-codec@1.5.0': {}
 
@@ -6586,12 +6344,6 @@ snapshots:
     optionalDependencies:
       rollup: 4.21.2
 
-  '@rollup/plugin-json@6.1.0(rollup@4.21.2)':
-    dependencies:
-      '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
-    optionalDependencies:
-      rollup: 4.21.2
-
   '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.2)':
     dependencies:
       '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
@@ -6603,11 +6355,11 @@ snapshots:
     optionalDependencies:
       rollup: 4.21.2
 
-  '@rollup/plugin-typescript@11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.5.4)':
+  '@rollup/plugin-typescript@11.1.6(rollup@4.21.2)(tslib@2.7.0)(typescript@5.6.2)':
     dependencies:
       '@rollup/pluginutils': 5.1.0(rollup@4.21.2)
       resolve: 1.22.8
-      typescript: 5.5.4
+      typescript: 5.6.2
     optionalDependencies:
       rollup: 4.21.2
       tslib: 2.7.0
@@ -6716,7 +6468,7 @@ snapshots:
     dependencies:
       '@types/http-cache-semantics': 4.0.4
       '@types/keyv': 3.1.4
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
       '@types/responselike': 1.0.3
 
   '@types/debug@4.1.12':
@@ -6729,7 +6481,7 @@ snapshots:
 
   '@types/fs-extra@9.0.13':
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
 
   '@types/glob@7.2.0':
     dependencies:
@@ -6748,11 +6500,9 @@ snapshots:
     dependencies:
       '@types/istanbul-lib-report': 3.0.3
 
-  '@types/json-schema@7.0.15': {}
-
   '@types/keyv@3.1.4':
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
 
   '@types/minimatch@5.1.2': {}
 
@@ -6762,7 +6512,7 @@ snapshots:
 
   '@types/mute-stream@0.0.4':
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
 
   '@types/node@20.16.1':
     dependencies:
@@ -6780,7 +6530,7 @@ snapshots:
 
   '@types/plist@3.0.5':
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
       xmlbuilder: 15.1.1
     optional: true
 
@@ -6788,7 +6538,7 @@ snapshots:
 
   '@types/responselike@1.0.3':
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
 
   '@types/shelljs@0.8.15':
     dependencies:
@@ -6808,7 +6558,7 @@ snapshots:
 
   '@types/ws@8.5.12':
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
 
   '@types/yargs-parser@21.0.3': {}
 
@@ -6818,37 +6568,37 @@ snapshots:
 
   '@types/yauzl@2.10.3':
     dependencies:
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
     optional: true
 
-  '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)':
+  '@typescript-eslint/eslint-plugin@8.5.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)':
     dependencies:
       '@eslint-community/regexpp': 4.11.0
-      '@typescript-eslint/parser': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
-      '@typescript-eslint/scope-manager': 8.4.0
-      '@typescript-eslint/type-utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
-      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
-      '@typescript-eslint/visitor-keys': 8.4.0
+      '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.2)
+      '@typescript-eslint/scope-manager': 8.5.0
+      '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2)
+      '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2)
+      '@typescript-eslint/visitor-keys': 8.5.0
       eslint: 9.10.0
       graphemer: 1.4.0
       ignore: 5.3.2
       natural-compare: 1.4.0
-      ts-api-utils: 1.3.0(typescript@5.5.4)
+      ts-api-utils: 1.3.0(typescript@5.6.2)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.2
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4)':
+  '@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.4.0
-      '@typescript-eslint/types': 8.4.0
-      '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4)
-      '@typescript-eslint/visitor-keys': 8.4.0
+      '@typescript-eslint/scope-manager': 8.5.0
+      '@typescript-eslint/types': 8.5.0
+      '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2)
+      '@typescript-eslint/visitor-keys': 8.5.0
       debug: 4.3.7(supports-color@8.1.1)
       eslint: 9.10.0
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.2
     transitivePeerDependencies:
       - supports-color
 
@@ -6857,21 +6607,28 @@ snapshots:
       '@typescript-eslint/types': 8.4.0
       '@typescript-eslint/visitor-keys': 8.4.0
 
-  '@typescript-eslint/type-utils@8.4.0(eslint@9.10.0)(typescript@5.5.4)':
+  '@typescript-eslint/scope-manager@8.5.0':
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4)
-      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      '@typescript-eslint/types': 8.5.0
+      '@typescript-eslint/visitor-keys': 8.5.0
+
+  '@typescript-eslint/type-utils@8.5.0(eslint@9.10.0)(typescript@5.6.2)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2)
+      '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2)
       debug: 4.3.7(supports-color@8.1.1)
-      ts-api-utils: 1.3.0(typescript@5.5.4)
+      ts-api-utils: 1.3.0(typescript@5.6.2)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.2
     transitivePeerDependencies:
       - eslint
       - supports-color
 
   '@typescript-eslint/types@8.4.0': {}
 
-  '@typescript-eslint/typescript-estree@8.4.0(typescript@5.5.4)':
+  '@typescript-eslint/types@8.5.0': {}
+
+  '@typescript-eslint/typescript-estree@8.4.0(typescript@5.6.2)':
     dependencies:
       '@typescript-eslint/types': 8.4.0
       '@typescript-eslint/visitor-keys': 8.4.0
@@ -6880,18 +6637,44 @@ snapshots:
       is-glob: 4.0.3
       minimatch: 9.0.5
       semver: 7.6.3
-      ts-api-utils: 1.3.0(typescript@5.5.4)
+      ts-api-utils: 1.3.0(typescript@5.6.2)
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.2
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.4.0(eslint@9.10.0)(typescript@5.5.4)':
+  '@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.2)':
+    dependencies:
+      '@typescript-eslint/types': 8.5.0
+      '@typescript-eslint/visitor-keys': 8.5.0
+      debug: 4.3.7(supports-color@8.1.1)
+      fast-glob: 3.3.2
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.6.3
+      ts-api-utils: 1.3.0(typescript@5.6.2)
+    optionalDependencies:
+      typescript: 5.6.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/utils@8.4.0(eslint@9.10.0)(typescript@5.6.2)':
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0)
       '@typescript-eslint/scope-manager': 8.4.0
       '@typescript-eslint/types': 8.4.0
-      '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.5.4)
+      '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.2)
+      eslint: 9.10.0
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  '@typescript-eslint/utils@8.5.0(eslint@9.10.0)(typescript@5.6.2)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0)
+      '@typescript-eslint/scope-manager': 8.5.0
+      '@typescript-eslint/types': 8.5.0
+      '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2)
       eslint: 9.10.0
     transitivePeerDependencies:
       - supports-color
@@ -6902,7 +6685,12 @@ snapshots:
       '@typescript-eslint/types': 8.4.0
       eslint-visitor-keys: 3.4.3
 
-  '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))':
+  '@typescript-eslint/visitor-keys@8.5.0':
+    dependencies:
+      '@typescript-eslint/types': 8.5.0
+      eslint-visitor-keys: 3.4.3
+
+  '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 0.2.3
@@ -6916,17 +6704,17 @@ snapshots:
       std-env: 3.7.0
       test-exclude: 7.0.1
       tinyrainbow: 1.2.0
-      vitest: 2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6)
+      vitest: 2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/eslint-plugin@1.1.0(@typescript-eslint/utils@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6))':
+  '@vitest/eslint-plugin@1.1.0(@typescript-eslint/utils@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)(vitest@2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0))':
     dependencies:
       eslint: 9.10.0
     optionalDependencies:
-      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
-      typescript: 5.5.4
-      vitest: 2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6)
+      '@typescript-eslint/utils': 8.5.0(eslint@9.10.0)(typescript@5.6.2)
+      typescript: 5.6.2
+      vitest: 2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0)
 
   '@vitest/expect@2.0.5':
     dependencies:
@@ -7111,88 +6899,8 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@webassemblyjs/ast@1.12.1':
-    dependencies:
-      '@webassemblyjs/helper-numbers': 1.11.6
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
-
-  '@webassemblyjs/floating-point-hex-parser@1.11.6': {}
-
-  '@webassemblyjs/helper-api-error@1.11.6': {}
-
-  '@webassemblyjs/helper-buffer@1.12.1': {}
-
-  '@webassemblyjs/helper-numbers@1.11.6':
-    dependencies:
-      '@webassemblyjs/floating-point-hex-parser': 1.11.6
-      '@webassemblyjs/helper-api-error': 1.11.6
-      '@xtuc/long': 4.2.2
-
-  '@webassemblyjs/helper-wasm-bytecode@1.11.6': {}
-
-  '@webassemblyjs/helper-wasm-section@1.12.1':
-    dependencies:
-      '@webassemblyjs/ast': 1.12.1
-      '@webassemblyjs/helper-buffer': 1.12.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
-      '@webassemblyjs/wasm-gen': 1.12.1
-
-  '@webassemblyjs/ieee754@1.11.6':
-    dependencies:
-      '@xtuc/ieee754': 1.2.0
-
-  '@webassemblyjs/leb128@1.11.6':
-    dependencies:
-      '@xtuc/long': 4.2.2
-
-  '@webassemblyjs/utf8@1.11.6': {}
-
-  '@webassemblyjs/wasm-edit@1.12.1':
-    dependencies:
-      '@webassemblyjs/ast': 1.12.1
-      '@webassemblyjs/helper-buffer': 1.12.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
-      '@webassemblyjs/helper-wasm-section': 1.12.1
-      '@webassemblyjs/wasm-gen': 1.12.1
-      '@webassemblyjs/wasm-opt': 1.12.1
-      '@webassemblyjs/wasm-parser': 1.12.1
-      '@webassemblyjs/wast-printer': 1.12.1
-
-  '@webassemblyjs/wasm-gen@1.12.1':
-    dependencies:
-      '@webassemblyjs/ast': 1.12.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
-      '@webassemblyjs/ieee754': 1.11.6
-      '@webassemblyjs/leb128': 1.11.6
-      '@webassemblyjs/utf8': 1.11.6
-
-  '@webassemblyjs/wasm-opt@1.12.1':
-    dependencies:
-      '@webassemblyjs/ast': 1.12.1
-      '@webassemblyjs/helper-buffer': 1.12.1
-      '@webassemblyjs/wasm-gen': 1.12.1
-      '@webassemblyjs/wasm-parser': 1.12.1
-
-  '@webassemblyjs/wasm-parser@1.12.1':
-    dependencies:
-      '@webassemblyjs/ast': 1.12.1
-      '@webassemblyjs/helper-api-error': 1.11.6
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
-      '@webassemblyjs/ieee754': 1.11.6
-      '@webassemblyjs/leb128': 1.11.6
-      '@webassemblyjs/utf8': 1.11.6
-
-  '@webassemblyjs/wast-printer@1.12.1':
-    dependencies:
-      '@webassemblyjs/ast': 1.12.1
-      '@xtuc/long': 4.2.2
-
   '@xmldom/xmldom@0.8.10': {}
 
-  '@xtuc/ieee754@1.2.0': {}
-
-  '@xtuc/long@4.2.2': {}
-
   '@zip.js/zip.js@2.7.52': {}
 
   abbrev@1.1.1: {}
@@ -7201,10 +6909,6 @@ snapshots:
     dependencies:
       event-target-shim: 5.0.1
 
-  acorn-import-attributes@1.9.5(acorn@8.12.1):
-    dependencies:
-      acorn: 8.12.1
-
   acorn-jsx@5.3.2(acorn@8.12.1):
     dependencies:
       acorn: 8.12.1
@@ -7508,13 +7212,6 @@ snapshots:
 
   browser-stdout@1.3.1: {}
 
-  browserslist@4.23.3:
-    dependencies:
-      caniuse-lite: 1.0.30001658
-      electron-to-chromium: 1.5.18
-      node-releases: 2.0.18
-      update-browserslist-db: 1.1.0(browserslist@4.23.3)
-
   buffer-crc32@0.2.13: {}
 
   buffer-crc32@1.0.0: {}
@@ -7628,8 +7325,6 @@ snapshots:
 
   camelcase@7.0.1: {}
 
-  caniuse-lite@1.0.30001658: {}
-
   chai@5.1.1:
     dependencies:
       assertion-error: 2.0.1
@@ -7776,7 +7471,8 @@ snapshots:
 
   commander@12.1.0: {}
 
-  commander@2.20.3: {}
+  commander@2.20.3:
+    optional: true
 
   commander@4.1.1: {}
 
@@ -7815,7 +7511,7 @@ snapshots:
   config-file-ts@0.2.8-rc1:
     dependencies:
       glob: 10.4.5
-      typescript: 5.5.4
+      typescript: 5.6.2
 
   configstore@6.0.0:
     dependencies:
@@ -7834,14 +7530,14 @@ snapshots:
 
   core-util-is@1.0.3: {}
 
-  cosmiconfig@9.0.0(typescript@5.5.4):
+  cosmiconfig@9.0.0(typescript@5.6.2):
     dependencies:
       env-paths: 2.2.1
       import-fresh: 3.3.0
       js-yaml: 4.1.0
       parse-json: 5.2.0
     optionalDependencies:
-      typescript: 5.5.4
+      typescript: 5.6.2
 
   crc-32@1.2.2: {}
 
@@ -7898,9 +7594,9 @@ snapshots:
 
   css-what@6.1.0: {}
 
-  cssstyle@4.0.1:
+  cssstyle@4.1.0:
     dependencies:
-      rrweb-cssom: 0.6.0
+      rrweb-cssom: 0.7.1
 
   data-uri-to-buffer@4.0.1: {}
 
@@ -8148,7 +7844,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  electron-to-chromium@1.5.18: {}
+  electron-to-chromium@1.5.19: {}
 
   electron@32.0.2:
     dependencies:
@@ -8213,8 +7909,6 @@ snapshots:
       isarray: 2.0.5
       stop-iteration-iterator: 1.0.0
 
-  es-module-lexer@1.5.4: {}
-
   es6-error@4.1.1:
     optional: true
 
@@ -8301,38 +7995,38 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0):
+  eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0):
     dependencies:
       '@nolyfill/is-core-module': 1.0.39
       debug: 4.3.7(supports-color@8.1.1)
       enhanced-resolve: 5.17.1
       eslint: 9.10.0
-      eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0))(eslint@9.10.0)
+      eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0)
       fast-glob: 3.3.2
       get-tsconfig: 4.8.0
       is-bun-module: 1.2.1
       is-glob: 4.0.3
     optionalDependencies:
-      eslint-plugin-import-x: 4.2.1(eslint@9.10.0)(typescript@5.5.4)
+      eslint-plugin-import-x: 4.2.1(eslint@9.10.0)(typescript@5.6.2)
     transitivePeerDependencies:
       - '@typescript-eslint/parser'
       - eslint-import-resolver-node
       - eslint-import-resolver-webpack
       - supports-color
 
-  eslint-module-utils@2.11.0(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0))(eslint@9.10.0):
+  eslint-module-utils@2.11.0(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0))(eslint@9.10.0):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
-      '@typescript-eslint/parser': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      '@typescript-eslint/parser': 8.5.0(eslint@9.10.0)(typescript@5.6.2)
       eslint: 9.10.0
-      eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.4.0(eslint@9.10.0)(typescript@5.5.4))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4))(eslint@9.10.0)
+      eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.5.0(eslint@9.10.0)(typescript@5.6.2))(eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)
     transitivePeerDependencies:
       - supports-color
 
-  eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.5.4):
+  eslint-plugin-import-x@4.2.1(eslint@9.10.0)(typescript@5.6.2):
     dependencies:
-      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.5.4)
+      '@typescript-eslint/utils': 8.4.0(eslint@9.10.0)(typescript@5.6.2)
       debug: 4.3.7(supports-color@8.1.1)
       doctrine: 3.0.0
       eslint: 9.10.0
@@ -8349,11 +8043,6 @@ snapshots:
 
   eslint-plugin-wdio@9.0.8: {}
 
-  eslint-scope@5.1.1:
-    dependencies:
-      esrecurse: 4.3.0
-      estraverse: 4.3.0
-
   eslint-scope@8.0.2:
     dependencies:
       esrecurse: 4.3.0
@@ -8418,8 +8107,6 @@ snapshots:
     dependencies:
       estraverse: 5.3.0
 
-  estraverse@4.3.0: {}
-
   estraverse@5.3.0: {}
 
   estree-walker@2.0.2: {}
@@ -8806,8 +8493,6 @@ snapshots:
     dependencies:
       is-glob: 4.0.3
 
-  glob-to-regexp@0.4.1: {}
-
   glob@10.4.5:
     dependencies:
       foreground-child: 3.3.0
@@ -8822,7 +8507,7 @@ snapshots:
       fs.realpath: 1.0.0
       inflight: 1.0.6
       inherits: 2.0.4
-      minimatch: 3.0.8
+      minimatch: 3.1.2
       once: 1.4.0
       path-is-absolute: 1.0.1
 
@@ -8857,10 +8542,6 @@ snapshots:
     dependencies:
       ini: 4.1.1
 
-  global-jsdom@24.0.0(jsdom@24.1.1):
-    dependencies:
-      jsdom: 24.1.1
-
   global-modules@1.0.0:
     dependencies:
       global-prefix: 1.0.2
@@ -9384,18 +9065,12 @@ snapshots:
   jest-util@29.7.0:
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 20.16.1
+      '@types/node': 20.16.5
       chalk: 4.1.2
       ci-info: 3.9.0
       graceful-fs: 4.2.11
       picomatch: 2.3.1
 
-  jest-worker@27.5.1:
-    dependencies:
-      '@types/node': 20.16.5
-      merge-stream: 2.0.0
-      supports-color: 8.1.1
-
   js-tokens@4.0.0: {}
 
   js-yaml@4.1.0:
@@ -9404,9 +9079,9 @@ snapshots:
 
   jsbn@1.1.0: {}
 
-  jsdom@24.1.1:
+  jsdom@25.0.0:
     dependencies:
-      cssstyle: 4.0.1
+      cssstyle: 4.1.0
       data-urls: 5.0.0
       decimal.js: 10.4.3
       form-data: 4.0.0
@@ -9536,8 +9211,6 @@ snapshots:
       pify: 2.3.0
       strip-bom: 3.0.0
 
-  loader-runner@4.3.0: {}
-
   locate-app@2.4.39:
     dependencies:
       '@promptbook/utils': 0.70.0-1
@@ -9708,11 +9381,6 @@ snapshots:
 
   merge2@1.4.1: {}
 
-  micromatch@4.0.7:
-    dependencies:
-      braces: 3.0.3
-      picomatch: 2.3.1
-
   micromatch@4.0.8:
     dependencies:
       braces: 3.0.3
@@ -9836,8 +9504,6 @@ snapshots:
 
   negotiator@0.6.3: {}
 
-  neo-async@2.6.2: {}
-
   netmask@2.0.2: {}
 
   new-github-release-url@2.0.0:
@@ -9894,8 +9560,6 @@ snapshots:
       - bluebird
       - supports-color
 
-  node-releases@2.0.18: {}
-
   nopt@6.0.0:
     dependencies:
       abbrev: 1.1.1
@@ -10201,8 +9865,6 @@ snapshots:
 
   picocolors@1.0.1: {}
 
-  picocolors@1.1.0: {}
-
   picomatch@2.3.1: {}
 
   pidtree@0.6.0: {}
@@ -10437,13 +10099,13 @@ snapshots:
     dependencies:
       rc: 1.2.8
 
-  release-it@17.6.0(typescript@5.5.4):
+  release-it@17.6.0(typescript@5.6.2):
     dependencies:
       '@iarna/toml': 2.2.5
       '@octokit/rest': 20.1.1
       async-retry: 1.3.3
       chalk: 5.3.0
-      cosmiconfig: 9.0.0(typescript@5.5.4)
+      cosmiconfig: 9.0.0(typescript@5.6.2)
       execa: 8.0.1
       git-url-parse: 14.0.0
       globby: 14.0.2
@@ -10575,8 +10237,6 @@ snapshots:
       '@rollup/rollup-win32-x64-msvc': 4.21.2
       fsevents: 2.3.3
 
-  rrweb-cssom@0.6.0: {}
-
   rrweb-cssom@0.7.1: {}
 
   run-applescript@7.0.0: {}
@@ -10589,7 +10249,7 @@ snapshots:
 
   rxjs@7.8.1:
     dependencies:
-      tslib: 2.6.3
+      tslib: 2.7.0
 
   safaridriver@0.1.2: {}
 
@@ -10609,18 +10269,12 @@ snapshots:
     dependencies:
       xmlchars: 2.2.0
 
-  schema-utils@3.3.0:
-    dependencies:
-      '@types/json-schema': 7.0.15
-      ajv: 6.12.6
-      ajv-keywords: 3.5.2(ajv@6.12.6)
-
   semver-compare@1.0.0:
     optional: true
 
   semver-diff@4.0.0:
     dependencies:
-      semver: 7.6.2
+      semver: 7.6.3
 
   semver-regex@4.0.5: {}
 
@@ -10766,8 +10420,6 @@ snapshots:
 
   source-map@0.6.1: {}
 
-  source-map@0.7.4: {}
-
   spacetrim@0.11.39: {}
 
   spdx-correct@3.2.0:
@@ -10945,21 +10597,13 @@ snapshots:
       async-exit-hook: 2.0.1
       fs-extra: 10.1.0
 
-  terser-webpack-plugin@5.3.10(webpack@5.94.0):
-    dependencies:
-      '@jridgewell/trace-mapping': 0.3.25
-      jest-worker: 27.5.1
-      schema-utils: 3.3.0
-      serialize-javascript: 6.0.2
-      terser: 5.31.6
-      webpack: 5.94.0
-
-  terser@5.31.6:
+  terser@5.32.0:
     dependencies:
       '@jridgewell/source-map': 0.3.6
       acorn: 8.12.1
       commander: 2.20.3
       source-map-support: 0.5.21
+    optional: true
 
   test-exclude@7.0.1:
     dependencies:
@@ -10987,6 +10631,8 @@ snapshots:
 
   tinyspy@3.0.0: {}
 
+  tinyspy@3.0.2: {}
+
   tmp-promise@3.0.3:
     dependencies:
       tmp: 0.2.3
@@ -11024,21 +10670,9 @@ snapshots:
     dependencies:
       utf8-byte-length: 1.0.5
 
-  ts-api-utils@1.3.0(typescript@5.5.4):
+  ts-api-utils@1.3.0(typescript@5.6.2):
     dependencies:
-      typescript: 5.5.4
-
-  ts-loader@9.5.1(typescript@5.5.4)(webpack@5.94.0):
-    dependencies:
-      chalk: 4.1.2
-      enhanced-resolve: 5.17.1
-      micromatch: 4.0.7
-      semver: 7.6.3
-      source-map: 0.7.4
-      typescript: 5.5.4
-      webpack: 5.94.0
-
-  tslib@2.6.3: {}
+      typescript: 5.6.2
 
   tslib@2.7.0: {}
 
@@ -11101,7 +10735,7 @@ snapshots:
     dependencies:
       is-typedarray: 1.0.0
 
-  typescript@5.5.4: {}
+  typescript@5.6.2: {}
 
   unbzip2-stream@1.4.3:
     dependencies:
@@ -11134,12 +10768,6 @@ snapshots:
 
   universalify@2.0.1: {}
 
-  update-browserslist-db@1.1.0(browserslist@4.23.3):
-    dependencies:
-      browserslist: 4.23.3
-      escalade: 3.2.0
-      picocolors: 1.1.0
-
   update-notifier@7.1.0:
     dependencies:
       boxen: 7.1.1
@@ -11151,7 +10779,7 @@ snapshots:
       is-npm: 6.0.0
       latest-version: 9.0.0
       pupa: 3.1.0
-      semver: 7.6.2
+      semver: 7.6.3
       semver-diff: 4.0.0
       xdg-basedir: 5.1.0
 
@@ -11191,13 +10819,13 @@ snapshots:
       extsprintf: 1.4.1
     optional: true
 
-  vite-node@2.0.5(@types/node@20.16.1)(terser@5.31.6):
+  vite-node@2.0.5(@types/node@20.16.1)(terser@5.32.0):
     dependencies:
       cac: 6.7.14
       debug: 4.3.7(supports-color@8.1.1)
       pathe: 1.1.2
       tinyrainbow: 1.2.0
-      vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
+      vite: 5.4.2(@types/node@20.16.1)(terser@5.32.0)
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -11209,7 +10837,7 @@ snapshots:
       - supports-color
       - terser
 
-  vite@5.4.2(@types/node@20.16.1)(terser@5.31.6):
+  vite@5.4.2(@types/node@20.16.1)(terser@5.32.0):
     dependencies:
       esbuild: 0.21.5
       postcss: 8.4.41
@@ -11217,9 +10845,9 @@ snapshots:
     optionalDependencies:
       '@types/node': 20.16.1
       fsevents: 2.3.3
-      terser: 5.31.6
+      terser: 5.32.0
 
-  vitest@2.0.5(@types/node@20.16.1)(jsdom@24.1.1)(terser@5.31.6):
+  vitest@2.0.5(@types/node@20.16.1)(jsdom@25.0.0)(terser@5.32.0):
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@vitest/expect': 2.0.5
@@ -11237,12 +10865,12 @@ snapshots:
       tinybench: 2.9.0
       tinypool: 1.0.1
       tinyrainbow: 1.2.0
-      vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
-      vite-node: 2.0.5(@types/node@20.16.1)(terser@5.31.6)
+      vite: 5.4.2(@types/node@20.16.1)(terser@5.32.0)
+      vite-node: 2.0.5(@types/node@20.16.1)(terser@5.32.0)
       why-is-node-running: 2.3.0
     optionalDependencies:
       '@types/node': 20.16.1
-      jsdom: 24.1.1
+      jsdom: 25.0.0
     transitivePeerDependencies:
       - less
       - lightningcss
@@ -11265,11 +10893,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  watchpack@2.4.2:
-    dependencies:
-      glob-to-regexp: 0.4.1
-      graceful-fs: 4.2.11
-
   wcwidth@1.0.1:
     dependencies:
       defaults: 1.0.4
@@ -11330,38 +10953,6 @@ snapshots:
 
   webidl-conversions@7.0.0: {}
 
-  webpack-sources@3.2.3: {}
-
-  webpack@5.94.0:
-    dependencies:
-      '@types/estree': 1.0.5
-      '@webassemblyjs/ast': 1.12.1
-      '@webassemblyjs/wasm-edit': 1.12.1
-      '@webassemblyjs/wasm-parser': 1.12.1
-      acorn: 8.12.1
-      acorn-import-attributes: 1.9.5(acorn@8.12.1)
-      browserslist: 4.23.3
-      chrome-trace-event: 1.0.4
-      enhanced-resolve: 5.17.1
-      es-module-lexer: 1.5.4
-      eslint-scope: 5.1.1
-      events: 3.3.0
-      glob-to-regexp: 0.4.1
-      graceful-fs: 4.2.11
-      json-parse-even-better-errors: 2.3.1
-      loader-runner: 4.3.0
-      mime-types: 2.1.35
-      neo-async: 2.6.2
-      schema-utils: 3.3.0
-      tapable: 2.2.1
-      terser-webpack-plugin: 5.3.10(webpack@5.94.0)
-      watchpack: 2.4.2
-      webpack-sources: 3.2.3
-    transitivePeerDependencies:
-      - '@swc/core'
-      - esbuild
-      - uglify-js
-
   whatwg-encoding@3.1.1:
     dependencies:
       iconv-lite: 0.6.3

From 8024a078447ad2ca8c86c946a0468dad19328923 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:04:51 +0100
Subject: [PATCH 38/52] chore: specify correct rollup config

---
 e2e/package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/e2e/package.json b/e2e/package.json
index f5d74873..c41fbfc8 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -6,7 +6,7 @@
   "scripts": {
     "ci": "pnpm i && pnpm test",
     "clean": "pnpm dlx shx rm -rf ./js ./node_modules pnpm-lock.yaml ./wdio-logs* ./out",
-    "init-e2es": "pnpm dlx shx mkdir -p ./js && rollup -c",
+    "init-e2es": "pnpm dlx shx mkdir -p ./js && rollup -c rollup.config.js",
     "logs": "pnpm dlx shx cat ./wdio-logs*/*.log",
     "test:e2e:forge-cjs": "cross-env EXAMPLE_DIR=forge-cjs pnpm run exec",
     "test:e2e:forge-esm": "cross-env EXAMPLE_DIR=forge-esm pnpm run exec",

From b0df116212c18b0b8703fbc3142ac829bb0265c2 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:06:37 +0100
Subject: [PATCH 39/52] chore: standardise tsconfig

---
 apps/builder-esm/package.json  | 2 +-
 apps/builder-esm/tsconfig.json | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/apps/builder-esm/package.json b/apps/builder-esm/package.json
index c4485bb9..189884ff 100644
--- a/apps/builder-esm/package.json
+++ b/apps/builder-esm/package.json
@@ -7,7 +7,7 @@
   "type": "module",
   "scripts": {
     "build": "pnpm build:bundle && pnpm build:package",
-    "build:bundle": "tsc --outDir dist",
+    "build:bundle": "tsc",
     "build:package": "cp ./src/index.html ./dist && electron-builder -p never",
     "build:package:mac-universal": "cp ./src/index.html ./dist && electron-builder -p never -m --universal",
     "build:mac-universal": "pnpm build:bundle && pnpm build:package:mac-universal",
diff --git a/apps/builder-esm/tsconfig.json b/apps/builder-esm/tsconfig.json
index 116325c2..744146b6 100644
--- a/apps/builder-esm/tsconfig.json
+++ b/apps/builder-esm/tsconfig.json
@@ -3,7 +3,8 @@
   "compilerOptions": {
     "target": "ESNext",
     "types": ["node"],
-    "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"]
+    "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"],
+    "outDir": "dist"
   },
   "include": ["src/*.ts", "src/preload.cts"],
   "exclude": ["node_modules"]

From 6254ef28dc20bb6e990ccf349affd33a698cf95f Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:07:12 +0100
Subject: [PATCH 40/52] chore: update ES version

---
 packages/@wdio_electron-utils/tsconfig.cjs.json  | 2 +-
 packages/wdio-electron-service/tsconfig.cjs.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/@wdio_electron-utils/tsconfig.cjs.json b/packages/@wdio_electron-utils/tsconfig.cjs.json
index 911fa393..66517f86 100644
--- a/packages/@wdio_electron-utils/tsconfig.cjs.json
+++ b/packages/@wdio_electron-utils/tsconfig.cjs.json
@@ -3,6 +3,6 @@
   "include": ["./src/cjs/*.ts", "./src/cjs/package.json"],
   "compilerOptions": {
     "outDir": "./dist/cjs",
-    "target": "ES2022"
+    "target": "ES2023"
   }
 }
diff --git a/packages/wdio-electron-service/tsconfig.cjs.json b/packages/wdio-electron-service/tsconfig.cjs.json
index 367fa1e1..f9e20962 100644
--- a/packages/wdio-electron-service/tsconfig.cjs.json
+++ b/packages/wdio-electron-service/tsconfig.cjs.json
@@ -4,6 +4,6 @@
   "exclude": ["src/*.ts", "src/commands/*.ts", "node_modules", "coverage", "dist", "test"],
   "compilerOptions": {
     "rootDir": "src/cjs",
-    "target": "ES2022"
+    "target": "ES2023"
   }
 }

From c6acaf87ade28dad0d885226f4da2653049feb3c Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:10:19 +0100
Subject: [PATCH 41/52] chore: add extension to import

---
 apps/forge-cjs/src/main.ts        | 2 +-
 apps/forge-cjs/src/preload.ts     | 2 +-
 apps/no-binary-cjs/src/main.ts    | 2 +-
 apps/no-binary-cjs/src/preload.ts | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/apps/forge-cjs/src/main.ts b/apps/forge-cjs/src/main.ts
index ce73cb03..e47f9dda 100644
--- a/apps/forge-cjs/src/main.ts
+++ b/apps/forge-cjs/src/main.ts
@@ -1,5 +1,5 @@
 import { app, BrowserWindow, ipcMain } from 'electron';
-import { isTest } from './util';
+import { isTest } from './util.js';
 
 if (isTest) {
   require('wdio-electron-service/main');
diff --git a/apps/forge-cjs/src/preload.ts b/apps/forge-cjs/src/preload.ts
index cef0cb62..5b7b4321 100644
--- a/apps/forge-cjs/src/preload.ts
+++ b/apps/forge-cjs/src/preload.ts
@@ -1,5 +1,5 @@
 import { contextBridge, ipcRenderer } from 'electron';
-import { isTest } from './util';
+import { isTest } from './util.js';
 
 if (isTest) {
   require('wdio-electron-service/preload');
diff --git a/apps/no-binary-cjs/src/main.ts b/apps/no-binary-cjs/src/main.ts
index d8ae5a7e..cc197637 100644
--- a/apps/no-binary-cjs/src/main.ts
+++ b/apps/no-binary-cjs/src/main.ts
@@ -1,5 +1,5 @@
 import { app, BrowserWindow, ipcMain } from 'electron';
-import { isTest } from './util';
+import { isTest } from './util.js';
 
 if (isTest) {
   require('wdio-electron-service/main');
diff --git a/apps/no-binary-cjs/src/preload.ts b/apps/no-binary-cjs/src/preload.ts
index cef0cb62..5b7b4321 100644
--- a/apps/no-binary-cjs/src/preload.ts
+++ b/apps/no-binary-cjs/src/preload.ts
@@ -1,5 +1,5 @@
 import { contextBridge, ipcRenderer } from 'electron';
-import { isTest } from './util';
+import { isTest } from './util.js';
 
 if (isTest) {
   require('wdio-electron-service/preload');

From 6c2d763c0f4ddd9e1345926090f463fc834455c1 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:11:34 +0100
Subject: [PATCH 42/52] chore: remove unused template str

---
 e2e/wdio.conf.js           | 2 +-
 e2e/wdio.conf.ts           | 2 +-
 e2e/wdio.no-binary.conf.js | 2 +-
 e2e/wdio.no-binary.conf.ts | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/e2e/wdio.conf.js b/e2e/wdio.conf.js
index 2a6d99b8..a853997b 100644
--- a/e2e/wdio.conf.js
+++ b/e2e/wdio.conf.js
@@ -34,7 +34,7 @@ export const config = {
   logLevel: 'debug',
   runner: 'local',
   outputDir: `wdio-logs-${exampleDir}`,
-  specs: [`./js/*.spec.js`],
+  specs: ['./js/*.spec.js'],
   framework: 'mocha',
   mochaOpts: {
     ui: 'bdd',
diff --git a/e2e/wdio.conf.ts b/e2e/wdio.conf.ts
index 861f7574..ed6d4d17 100644
--- a/e2e/wdio.conf.ts
+++ b/e2e/wdio.conf.ts
@@ -37,7 +37,7 @@ export const config: Options.Testrunner = {
   logLevel: 'debug',
   runner: 'local',
   outputDir: `wdio-logs-${exampleDir}`,
-  specs: [`./*.spec.ts`],
+  specs: ['./*.spec.ts'],
   tsConfigPath: path.join(__dirname, 'tsconfig.json'),
   framework: 'mocha',
   mochaOpts: {
diff --git a/e2e/wdio.no-binary.conf.js b/e2e/wdio.no-binary.conf.js
index 8f3cbaec..0f487313 100644
--- a/e2e/wdio.no-binary.conf.js
+++ b/e2e/wdio.no-binary.conf.js
@@ -34,7 +34,7 @@ export const config = {
   logLevel: 'debug',
   runner: 'local',
   outputDir: `wdio-logs-${exampleDir}`,
-  specs: [`./js/*.spec.js`],
+  specs: ['./js/*.spec.js'],
   framework: 'mocha',
   mochaOpts: {
     ui: 'bdd',
diff --git a/e2e/wdio.no-binary.conf.ts b/e2e/wdio.no-binary.conf.ts
index a2200aef..4baa8b9c 100644
--- a/e2e/wdio.no-binary.conf.ts
+++ b/e2e/wdio.no-binary.conf.ts
@@ -37,7 +37,7 @@ export const config: Options.Testrunner = {
   logLevel: 'debug',
   runner: 'local',
   outputDir: `wdio-logs-${exampleDir}`,
-  specs: [`./*.spec.ts`],
+  specs: ['./*.spec.ts'],
   tsConfigPath: path.join(__dirname, 'tsconfig.json'),
   framework: 'mocha',
   mochaOpts: {

From 16bfd5bad9d61da50464c57ff709c031bcf5d6e8 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:20:36 +0100
Subject: [PATCH 43/52] refactor: standardise preloads for ESM examples

---
 apps/builder-esm/src/preload.cts   |  9 ++++-----
 apps/forge-esm/src/preload.cts     | 19 +++++++++++++++++++
 apps/forge-esm/src/preload.ts      | 15 ---------------
 apps/forge-esm/tsconfig.json       |  2 +-
 apps/no-binary-esm/src/preload.cts | 19 +++++++++++++++++++
 apps/no-binary-esm/src/preload.ts  | 15 ---------------
 apps/no-binary-esm/tsconfig.json   |  2 +-
 7 files changed, 44 insertions(+), 37 deletions(-)
 create mode 100644 apps/forge-esm/src/preload.cts
 delete mode 100644 apps/forge-esm/src/preload.ts
 create mode 100644 apps/no-binary-esm/src/preload.cts
 delete mode 100644 apps/no-binary-esm/src/preload.ts

diff --git a/apps/builder-esm/src/preload.cts b/apps/builder-esm/src/preload.cts
index bffba8d4..b8a8be1d 100644
--- a/apps/builder-esm/src/preload.cts
+++ b/apps/builder-esm/src/preload.cts
@@ -1,10 +1,11 @@
 import { contextBridge, ipcRenderer } from 'electron';
 
-async function init() {
+(async () => {
+  // util.js is an ESM module so we need to use dynamic import
   const { isTest } = await import('./util.js');
 
   if (isTest) {
-    import('wdio-electron-service/preload');
+    require('wdio-electron-service/preload');
   }
 
   const validChannels = ['increase-window-size', 'decrease-window-size'];
@@ -15,6 +16,4 @@ async function init() {
   contextBridge.exposeInMainWorld('api', {
     invoke,
   });
-}
-
-init();
+})();
diff --git a/apps/forge-esm/src/preload.cts b/apps/forge-esm/src/preload.cts
new file mode 100644
index 00000000..b8a8be1d
--- /dev/null
+++ b/apps/forge-esm/src/preload.cts
@@ -0,0 +1,19 @@
+import { contextBridge, ipcRenderer } from 'electron';
+
+(async () => {
+  // util.js is an ESM module so we need to use dynamic import
+  const { isTest } = await import('./util.js');
+
+  if (isTest) {
+    require('wdio-electron-service/preload');
+  }
+
+  const validChannels = ['increase-window-size', 'decrease-window-size'];
+
+  const invoke = (channel: string, ...data: unknown[]) =>
+    validChannels.includes(channel) ? ipcRenderer.invoke(channel, data) : Promise.reject();
+
+  contextBridge.exposeInMainWorld('api', {
+    invoke,
+  });
+})();
diff --git a/apps/forge-esm/src/preload.ts b/apps/forge-esm/src/preload.ts
deleted file mode 100644
index f26f1b3b..00000000
--- a/apps/forge-esm/src/preload.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { contextBridge, ipcRenderer } from 'electron';
-import { isTest } from './util.js';
-
-if (isTest) {
-  import('wdio-electron-service/preload');
-}
-
-const validChannels = ['increase-window-size', 'decrease-window-size'];
-
-const invoke = (channel: string, ...data: unknown[]) =>
-  validChannels.includes(channel) ? ipcRenderer.invoke(channel, data) : Promise.reject();
-
-contextBridge.exposeInMainWorld('api', {
-  invoke,
-});
diff --git a/apps/forge-esm/tsconfig.json b/apps/forge-esm/tsconfig.json
index 2fd95501..b390bb1f 100644
--- a/apps/forge-esm/tsconfig.json
+++ b/apps/forge-esm/tsconfig.json
@@ -7,5 +7,5 @@
     "outDir": "dist"
   },
   "exclude": ["node_modules"],
-  "include": ["src/*.ts"]
+  "include": ["src/*.{cts,ts}"]
 }
diff --git a/apps/no-binary-esm/src/preload.cts b/apps/no-binary-esm/src/preload.cts
new file mode 100644
index 00000000..b8a8be1d
--- /dev/null
+++ b/apps/no-binary-esm/src/preload.cts
@@ -0,0 +1,19 @@
+import { contextBridge, ipcRenderer } from 'electron';
+
+(async () => {
+  // util.js is an ESM module so we need to use dynamic import
+  const { isTest } = await import('./util.js');
+
+  if (isTest) {
+    require('wdio-electron-service/preload');
+  }
+
+  const validChannels = ['increase-window-size', 'decrease-window-size'];
+
+  const invoke = (channel: string, ...data: unknown[]) =>
+    validChannels.includes(channel) ? ipcRenderer.invoke(channel, data) : Promise.reject();
+
+  contextBridge.exposeInMainWorld('api', {
+    invoke,
+  });
+})();
diff --git a/apps/no-binary-esm/src/preload.ts b/apps/no-binary-esm/src/preload.ts
deleted file mode 100644
index f26f1b3b..00000000
--- a/apps/no-binary-esm/src/preload.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { contextBridge, ipcRenderer } from 'electron';
-import { isTest } from './util.js';
-
-if (isTest) {
-  import('wdio-electron-service/preload');
-}
-
-const validChannels = ['increase-window-size', 'decrease-window-size'];
-
-const invoke = (channel: string, ...data: unknown[]) =>
-  validChannels.includes(channel) ? ipcRenderer.invoke(channel, data) : Promise.reject();
-
-contextBridge.exposeInMainWorld('api', {
-  invoke,
-});
diff --git a/apps/no-binary-esm/tsconfig.json b/apps/no-binary-esm/tsconfig.json
index 2fd95501..b390bb1f 100644
--- a/apps/no-binary-esm/tsconfig.json
+++ b/apps/no-binary-esm/tsconfig.json
@@ -7,5 +7,5 @@
     "outDir": "dist"
   },
   "exclude": ["node_modules"],
-  "include": ["src/*.ts"]
+  "include": ["src/*.{cts,ts}"]
 }

From 8bddfe777f09dbfc4450f76665192fc8004f45dd Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:22:01 +0100
Subject: [PATCH 44/52] refactor: instantiate plugins once

---
 apps/forge-esm/rollup.config.js      | 9 ++++++---
 apps/no-binary-cjs/rollup.config.mjs | 7 +++++--
 apps/no-binary-esm/rollup.config.js  | 9 ++++++---
 3 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/apps/forge-esm/rollup.config.js b/apps/forge-esm/rollup.config.js
index 8c056970..a7e45e02 100644
--- a/apps/forge-esm/rollup.config.js
+++ b/apps/forge-esm/rollup.config.js
@@ -2,15 +2,18 @@ import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
 import { defineConfig } from 'rollup';
 
+const nodeResolvePlugin = nodeResolve();
+const commonjsPlugin = commonjs();
+
 export default defineConfig([
   {
-    input: 'dist/preload.js',
+    input: 'dist/preload.cjs',
     output: {
       file: 'dist/preload.bundle.cjs',
       inlineDynamicImports: true,
       format: 'cjs',
     },
-    plugins: [nodeResolve(), commonjs()],
+    plugins: [nodeResolvePlugin, commonjsPlugin],
     external: ['electron'],
   },
   {
@@ -20,7 +23,7 @@ export default defineConfig([
       inlineDynamicImports: true,
       format: 'esm',
     },
-    plugins: [nodeResolve()],
+    plugins: [nodeResolvePlugin],
     external: ['electron'],
   },
 ]);
diff --git a/apps/no-binary-cjs/rollup.config.mjs b/apps/no-binary-cjs/rollup.config.mjs
index 4f9875b7..d370037c 100644
--- a/apps/no-binary-cjs/rollup.config.mjs
+++ b/apps/no-binary-cjs/rollup.config.mjs
@@ -2,6 +2,9 @@ import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
 import { defineConfig } from 'rollup';
 
+const nodeResolvePlugin = nodeResolve();
+const commonjsPlugin = commonjs();
+
 export default defineConfig([
   {
     input: 'dist/preload.js',
@@ -10,7 +13,7 @@ export default defineConfig([
       inlineDynamicImports: true,
       format: 'cjs',
     },
-    plugins: [nodeResolve(), commonjs()],
+    plugins: [nodeResolvePlugin, commonjsPlugin],
     external: ['electron'],
   },
   {
@@ -20,7 +23,7 @@ export default defineConfig([
       inlineDynamicImports: true,
       format: 'cjs',
     },
-    plugins: [nodeResolve(), commonjs()],
+    plugins: [nodeResolvePlugin, commonjsPlugin],
     external: ['electron'],
   },
 ]);
diff --git a/apps/no-binary-esm/rollup.config.js b/apps/no-binary-esm/rollup.config.js
index 8c056970..a7e45e02 100644
--- a/apps/no-binary-esm/rollup.config.js
+++ b/apps/no-binary-esm/rollup.config.js
@@ -2,15 +2,18 @@ import { nodeResolve } from '@rollup/plugin-node-resolve';
 import commonjs from '@rollup/plugin-commonjs';
 import { defineConfig } from 'rollup';
 
+const nodeResolvePlugin = nodeResolve();
+const commonjsPlugin = commonjs();
+
 export default defineConfig([
   {
-    input: 'dist/preload.js',
+    input: 'dist/preload.cjs',
     output: {
       file: 'dist/preload.bundle.cjs',
       inlineDynamicImports: true,
       format: 'cjs',
     },
-    plugins: [nodeResolve(), commonjs()],
+    plugins: [nodeResolvePlugin, commonjsPlugin],
     external: ['electron'],
   },
   {
@@ -20,7 +23,7 @@ export default defineConfig([
       inlineDynamicImports: true,
       format: 'esm',
     },
-    plugins: [nodeResolve()],
+    plugins: [nodeResolvePlugin],
     external: ['electron'],
   },
 ]);

From 4895655b3ef331f25b4752f2f4298c1f228c1111 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:22:32 +0100
Subject: [PATCH 45/52] chore: rename plugin import

---
 e2e/rollup.config.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/e2e/rollup.config.js b/e2e/rollup.config.js
index b52cc877..fafedb62 100644
--- a/e2e/rollup.config.js
+++ b/e2e/rollup.config.js
@@ -1,7 +1,7 @@
-import typescript from '@rollup/plugin-typescript';
+import rollupTS from '@rollup/plugin-typescript';
 import { defineConfig } from 'rollup';
 
-const tsPlugin = typescript({ tsconfig: 'tsconfig.json' });
+const tsPlugin = rollupTS({ tsconfig: 'tsconfig.json' });
 
 export default defineConfig([
   {

From 7cfe7aa0640b231d18b961e92e41009615e656e9 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:23:29 +0100
Subject: [PATCH 46/52] chore: use top level await

---
 apps/forge-esm/src/main.ts     | 3 +--
 apps/no-binary-esm/src/main.ts | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/apps/forge-esm/src/main.ts b/apps/forge-esm/src/main.ts
index 84dcd65f..25532c99 100644
--- a/apps/forge-esm/src/main.ts
+++ b/apps/forge-esm/src/main.ts
@@ -2,11 +2,10 @@ import { app, BrowserWindow, ipcMain } from 'electron';
 import { isTest } from './util.js';
 
 if (isTest) {
-  import('wdio-electron-service/main');
+  await import('wdio-electron-service/main');
 }
 
 const appPath = app.getAppPath();
-
 const appRootPath = `${appPath}/dist`;
 let mainWindow: BrowserWindow;
 
diff --git a/apps/no-binary-esm/src/main.ts b/apps/no-binary-esm/src/main.ts
index 1d08f31a..d041896f 100644
--- a/apps/no-binary-esm/src/main.ts
+++ b/apps/no-binary-esm/src/main.ts
@@ -2,7 +2,7 @@ import { app, BrowserWindow, ipcMain } from 'electron';
 import { isTest } from './util.js';
 
 if (isTest) {
-  import('wdio-electron-service/main');
+  await import('wdio-electron-service/main');
 }
 
 const appPath = app.getAppPath();

From fc3159ff4c3ac687c74d88665b4710422236be37 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:24:00 +0100
Subject: [PATCH 47/52] chore: improve verbiage

---
 e2e/api.spec.ts | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/e2e/api.spec.ts b/e2e/api.spec.ts
index 7955d270..60286ddf 100644
--- a/e2e/api.spec.ts
+++ b/e2e/api.spec.ts
@@ -284,21 +284,21 @@ describe('execute', () => {
   it('should handle executing a function which declares a function', async () => {
     expect(
       await browser.execute(() => {
-        function newFunc() {
-          return 'boom!';
+        function innerFunc() {
+          return 'executed inner function';
         }
-        return newFunc();
+        return innerFunc();
       }),
-    ).toEqual('boom!');
+    ).toEqual('executed inner function');
   });
 
-  it('should handle executing a function which declares a fat arrow function', async () => {
+  it('should handle executing a function which declares an arrow function', async () => {
     expect(
       await browser.execute(() => {
-        const newFunc = () => 'boom!';
-        return newFunc();
+        const innerFunc = () => 'executed inner function';
+        return innerFunc();
       }),
-    ).toEqual('boom!');
+    ).toEqual('executed inner function');
   });
 });
 

From 9102cd38a18223a95835ccbe1dec337a4683fa54 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:27:18 +0100
Subject: [PATCH 48/52] chore: update lockfile

---
 pnpm-lock.yaml | 49 ++++++++++++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d7c0d8a..bc0a6f21 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -53,9 +53,6 @@ importers:
       husky:
         specifier: ^9.1.5
         version: 9.1.5
-      jsdom:
-        specifier: ^25.0.0
-        version: 25.0.0
       lint-staged:
         specifier: ^15.2.10
         version: 15.2.10
@@ -7597,6 +7594,7 @@ snapshots:
   cssstyle@4.1.0:
     dependencies:
       rrweb-cssom: 0.7.1
+    optional: true
 
   data-uri-to-buffer@4.0.1: {}
 
@@ -7606,6 +7604,7 @@ snapshots:
     dependencies:
       whatwg-mimetype: 4.0.0
       whatwg-url: 14.0.0
+    optional: true
 
   debug@2.6.9:
     dependencies:
@@ -7629,7 +7628,8 @@ snapshots:
 
   decamelize@6.0.0: {}
 
-  decimal.js@10.4.3: {}
+  decimal.js@10.4.3:
+    optional: true
 
   decompress-response@6.0.0:
     dependencies:
@@ -8664,6 +8664,7 @@ snapshots:
   html-encoding-sniffer@4.0.0:
     dependencies:
       whatwg-encoding: 3.1.1
+    optional: true
 
   html-escaper@2.0.2: {}
 
@@ -8922,7 +8923,8 @@ snapshots:
 
   is-plain-obj@4.1.0: {}
 
-  is-potential-custom-element-name@1.0.1: {}
+  is-potential-custom-element-name@1.0.1:
+    optional: true
 
   is-reference@1.2.1:
     dependencies:
@@ -9106,6 +9108,7 @@ snapshots:
       - bufferutil
       - supports-color
       - utf-8-validate
+    optional: true
 
   json-buffer@3.0.1: {}
 
@@ -9606,7 +9609,8 @@ snapshots:
     dependencies:
       boolbase: 1.0.0
 
-  nwsapi@2.2.12: {}
+  nwsapi@2.2.12:
+    optional: true
 
   object-inspect@1.13.2: {}
 
@@ -9947,7 +9951,8 @@ snapshots:
 
   proxy-from-env@1.1.0: {}
 
-  psl@1.9.0: {}
+  psl@1.9.0:
+    optional: true
 
   pump@3.0.0:
     dependencies:
@@ -9962,7 +9967,8 @@ snapshots:
 
   query-selector-shadow-dom@1.0.1: {}
 
-  querystringify@2.2.0: {}
+  querystringify@2.2.0:
+    optional: true
 
   queue-microtask@1.2.3: {}
 
@@ -10133,7 +10139,8 @@ snapshots:
 
   require-directory@2.1.1: {}
 
-  requires-port@1.0.0: {}
+  requires-port@1.0.0:
+    optional: true
 
   resedit@1.7.1:
     dependencies:
@@ -10237,7 +10244,8 @@ snapshots:
       '@rollup/rollup-win32-x64-msvc': 4.21.2
       fsevents: 2.3.3
 
-  rrweb-cssom@0.7.1: {}
+  rrweb-cssom@0.7.1:
+    optional: true
 
   run-applescript@7.0.0: {}
 
@@ -10268,6 +10276,7 @@ snapshots:
   saxes@6.0.0:
     dependencies:
       xmlchars: 2.2.0
+    optional: true
 
   semver-compare@1.0.0:
     optional: true
@@ -10557,7 +10566,8 @@ snapshots:
 
   supports-preserve-symlinks-flag@1.0.0: {}
 
-  symbol-tree@3.2.4: {}
+  symbol-tree@3.2.4:
+    optional: true
 
   tapable@2.2.1: {}
 
@@ -10655,12 +10665,14 @@ snapshots:
       punycode: 2.3.1
       universalify: 0.2.0
       url-parse: 1.5.10
+    optional: true
 
   tr46@0.0.3: {}
 
   tr46@5.0.0:
     dependencies:
       punycode: 2.3.1
+    optional: true
 
   trim-repeated@1.0.0:
     dependencies:
@@ -10764,7 +10776,8 @@ snapshots:
 
   universalify@0.1.2: {}
 
-  universalify@0.2.0: {}
+  universalify@0.2.0:
+    optional: true
 
   universalify@2.0.1: {}
 
@@ -10793,6 +10806,7 @@ snapshots:
     dependencies:
       querystringify: 2.2.0
       requires-port: 1.0.0
+    optional: true
 
   urlpattern-polyfill@10.0.0: {}
 
@@ -10884,6 +10898,7 @@ snapshots:
   w3c-xmlserializer@5.0.0:
     dependencies:
       xml-name-validator: 5.0.0
+    optional: true
 
   wait-port@1.1.0:
     dependencies:
@@ -10951,7 +10966,8 @@ snapshots:
 
   webidl-conversions@3.0.1: {}
 
-  webidl-conversions@7.0.0: {}
+  webidl-conversions@7.0.0:
+    optional: true
 
   whatwg-encoding@3.1.1:
     dependencies:
@@ -10963,6 +10979,7 @@ snapshots:
     dependencies:
       tr46: 5.0.0
       webidl-conversions: 7.0.0
+    optional: true
 
   whatwg-url@5.0.0:
     dependencies:
@@ -11064,11 +11081,13 @@ snapshots:
 
   xdg-basedir@5.1.0: {}
 
-  xml-name-validator@5.0.0: {}
+  xml-name-validator@5.0.0:
+    optional: true
 
   xmlbuilder@15.1.1: {}
 
-  xmlchars@2.2.0: {}
+  xmlchars@2.2.0:
+    optional: true
 
   xvfb-maybe@0.2.1:
     dependencies:

From c99d3cf18f54e96057693f17ec69408f98e6ba77 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 14:31:18 +0100
Subject: [PATCH 49/52] chore: fix include

---
 apps/forge-esm/tsconfig.json     | 2 +-
 apps/no-binary-esm/tsconfig.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/forge-esm/tsconfig.json b/apps/forge-esm/tsconfig.json
index b390bb1f..aab29c2f 100644
--- a/apps/forge-esm/tsconfig.json
+++ b/apps/forge-esm/tsconfig.json
@@ -7,5 +7,5 @@
     "outDir": "dist"
   },
   "exclude": ["node_modules"],
-  "include": ["src/*.{cts,ts}"]
+  "include": ["src/*.ts", "src/preload.cts"]
 }
diff --git a/apps/no-binary-esm/tsconfig.json b/apps/no-binary-esm/tsconfig.json
index b390bb1f..aab29c2f 100644
--- a/apps/no-binary-esm/tsconfig.json
+++ b/apps/no-binary-esm/tsconfig.json
@@ -7,5 +7,5 @@
     "outDir": "dist"
   },
   "exclude": ["node_modules"],
-  "include": ["src/*.{cts,ts}"]
+  "include": ["src/*.ts", "src/preload.cts"]
 }

From 700b2ba3c93fc551316c5491181ec05a71ea0189 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 15:10:45 +0100
Subject: [PATCH 50/52] chore: slim down tsconfigs

---
 apps/builder-cjs/tsconfig.json                   |  3 +--
 apps/builder-esm/tsconfig.json                   |  3 +--
 apps/forge-cjs/tsconfig.json                     |  2 --
 apps/forge-esm/tsconfig.json                     |  3 +--
 apps/no-binary-cjs/tsconfig.json                 |  2 --
 apps/no-binary-esm/tsconfig.json                 |  3 +--
 e2e/tsconfig.json                                |  1 -
 packages/@wdio_electron-types/tsconfig.json      |  3 ---
 packages/@wdio_electron-utils/tsconfig.cjs.json  |  3 +--
 packages/@wdio_electron-utils/tsconfig.json      |  3 ---
 packages/wdio-electron-service/tsconfig.cjs.json |  3 +--
 packages/wdio-electron-service/tsconfig.json     | 12 +-----------
 12 files changed, 7 insertions(+), 34 deletions(-)

diff --git a/apps/builder-cjs/tsconfig.json b/apps/builder-cjs/tsconfig.json
index 11867b21..6bbf6ce2 100644
--- a/apps/builder-cjs/tsconfig.json
+++ b/apps/builder-cjs/tsconfig.json
@@ -1,8 +1,7 @@
 {
   "extends": "../../tsconfig.base.cjs.json",
   "compilerOptions": {
-    "target": "ESNext",
-    "types": ["node"],
+    "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"],
     "outDir": "dist"
   },
diff --git a/apps/builder-esm/tsconfig.json b/apps/builder-esm/tsconfig.json
index 744146b6..47541063 100644
--- a/apps/builder-esm/tsconfig.json
+++ b/apps/builder-esm/tsconfig.json
@@ -1,8 +1,7 @@
 {
   "extends": "../../tsconfig.base.json",
   "compilerOptions": {
-    "target": "ESNext",
-    "types": ["node"],
+    "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"],
     "outDir": "dist"
   },
diff --git a/apps/forge-cjs/tsconfig.json b/apps/forge-cjs/tsconfig.json
index 4c74099b..2b2b036f 100644
--- a/apps/forge-cjs/tsconfig.json
+++ b/apps/forge-cjs/tsconfig.json
@@ -1,8 +1,6 @@
 {
   "extends": "../../tsconfig.base.cjs.json",
   "compilerOptions": {
-    "target": "ES2023",
-    "baseUrl": ".",
     "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../node_modules/@types", "../../@types"],
     "outDir": "dist"
diff --git a/apps/forge-esm/tsconfig.json b/apps/forge-esm/tsconfig.json
index aab29c2f..d378ab0c 100644
--- a/apps/forge-esm/tsconfig.json
+++ b/apps/forge-esm/tsconfig.json
@@ -1,8 +1,7 @@
 {
   "extends": "../../tsconfig.base.json",
   "compilerOptions": {
-    "target": "ESNext",
-    "types": ["node"],
+    "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../node_modules/@types", "../../@types"],
     "outDir": "dist"
   },
diff --git a/apps/no-binary-cjs/tsconfig.json b/apps/no-binary-cjs/tsconfig.json
index 4c74099b..2b2b036f 100644
--- a/apps/no-binary-cjs/tsconfig.json
+++ b/apps/no-binary-cjs/tsconfig.json
@@ -1,8 +1,6 @@
 {
   "extends": "../../tsconfig.base.cjs.json",
   "compilerOptions": {
-    "target": "ES2023",
-    "baseUrl": ".",
     "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../node_modules/@types", "../../@types"],
     "outDir": "dist"
diff --git a/apps/no-binary-esm/tsconfig.json b/apps/no-binary-esm/tsconfig.json
index aab29c2f..d378ab0c 100644
--- a/apps/no-binary-esm/tsconfig.json
+++ b/apps/no-binary-esm/tsconfig.json
@@ -1,8 +1,7 @@
 {
   "extends": "../../tsconfig.base.json",
   "compilerOptions": {
-    "target": "ESNext",
-    "types": ["node"],
+    "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../node_modules/@types", "../../@types"],
     "outDir": "dist"
   },
diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json
index 4241941f..4059eb28 100755
--- a/e2e/tsconfig.json
+++ b/e2e/tsconfig.json
@@ -8,7 +8,6 @@
     "noEmit": true,
     "module": "NodeNext",
     "moduleResolution": "NodeNext",
-    "baseUrl": ".",
     "types": ["node", "@wdio/globals/types", "mocha"],
     "typeRoots": ["./node_modules", "./node_modules/@types"]
   },
diff --git a/packages/@wdio_electron-types/tsconfig.json b/packages/@wdio_electron-types/tsconfig.json
index a01afa26..c1c27a82 100755
--- a/packages/@wdio_electron-types/tsconfig.json
+++ b/packages/@wdio_electron-types/tsconfig.json
@@ -3,10 +3,7 @@
   "include": ["src/**/*.ts"],
   "exclude": ["src/cjs", "node_modules", "coverage", "dist", "test"],
   "compilerOptions": {
-    "baseUrl": ".",
     "outDir": "dist",
-    "target": "ES2023",
-    "noEmit": false,
     "types": [],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"]
   }
diff --git a/packages/@wdio_electron-utils/tsconfig.cjs.json b/packages/@wdio_electron-utils/tsconfig.cjs.json
index 66517f86..5f6afc37 100644
--- a/packages/@wdio_electron-utils/tsconfig.cjs.json
+++ b/packages/@wdio_electron-utils/tsconfig.cjs.json
@@ -2,7 +2,6 @@
   "extends": "../../tsconfig.base.cjs.json",
   "include": ["./src/cjs/*.ts", "./src/cjs/package.json"],
   "compilerOptions": {
-    "outDir": "./dist/cjs",
-    "target": "ES2023"
+    "outDir": "./dist/cjs"
   }
 }
diff --git a/packages/@wdio_electron-utils/tsconfig.json b/packages/@wdio_electron-utils/tsconfig.json
index 20c47989..7d7005b9 100755
--- a/packages/@wdio_electron-utils/tsconfig.json
+++ b/packages/@wdio_electron-utils/tsconfig.json
@@ -3,9 +3,6 @@
   "include": ["src/*.ts"],
   "exclude": ["src/cjs", "node_modules", "coverage", "dist", "test"],
   "compilerOptions": {
-    "baseUrl": ".",
-    "target": "ES2023",
-    "noEmit": false,
     "types": ["node", "vitest/jsdom"],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"]
   }
diff --git a/packages/wdio-electron-service/tsconfig.cjs.json b/packages/wdio-electron-service/tsconfig.cjs.json
index f9e20962..86588033 100644
--- a/packages/wdio-electron-service/tsconfig.cjs.json
+++ b/packages/wdio-electron-service/tsconfig.cjs.json
@@ -3,7 +3,6 @@
   "include": ["src/cjs/**/*", "src/cjs/package.json"],
   "exclude": ["src/*.ts", "src/commands/*.ts", "node_modules", "coverage", "dist", "test"],
   "compilerOptions": {
-    "rootDir": "src/cjs",
-    "target": "ES2023"
+    "rootDir": "src/cjs"
   }
 }
diff --git a/packages/wdio-electron-service/tsconfig.json b/packages/wdio-electron-service/tsconfig.json
index 7ec06b4d..dfc186e4 100755
--- a/packages/wdio-electron-service/tsconfig.json
+++ b/packages/wdio-electron-service/tsconfig.json
@@ -1,18 +1,8 @@
 {
   "extends": "../../tsconfig.base.json",
-  "include": [
-    "src/**/*.ts",
-    "src/cjs/preload.ts",
-    "src/cjs/main.ts",
-    "src/cjs/classes.ts",
-    "src/cjs/session.ts",
-    "src/cjs/index.ts"
-  ],
+  "include": ["src/**/*.ts"],
   "exclude": ["src/cjs", "node_modules", "coverage", "dist", "test"],
   "compilerOptions": {
-    "baseUrl": ".",
-    "target": "ES2023",
-    "noEmit": false,
     "types": ["node", "electron-to-chromium", "vitest/jsdom"],
     "typeRoots": ["./node_modules", "./node_modules/@types", "../../@types"]
   }

From a6e6be47294c81fd68a27cbdfa308752be2e7486 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 15:24:47 +0100
Subject: [PATCH 51/52] fix: add workaround for rollup ts plugin overwriting
 module value

---
 e2e/rollup.config.js | 3 ++-
 e2e/tsconfig.json    | 2 --
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/e2e/rollup.config.js b/e2e/rollup.config.js
index fafedb62..b7974b8e 100644
--- a/e2e/rollup.config.js
+++ b/e2e/rollup.config.js
@@ -1,7 +1,8 @@
 import rollupTS from '@rollup/plugin-typescript';
 import { defineConfig } from 'rollup';
 
-const tsPlugin = rollupTS({ tsconfig: 'tsconfig.json' });
+// Workaround for https://github.com/rollup/plugins/issues/1583
+const tsPlugin = rollupTS({ tsconfig: 'tsconfig.json', module: 'nodeNext' });
 
 export default defineConfig([
   {
diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json
index 4059eb28..c85c2eb9 100755
--- a/e2e/tsconfig.json
+++ b/e2e/tsconfig.json
@@ -6,8 +6,6 @@
     "sourceMap": false,
     "inlineSources": false,
     "noEmit": true,
-    "module": "NodeNext",
-    "moduleResolution": "NodeNext",
     "types": ["node", "@wdio/globals/types", "mocha"],
     "typeRoots": ["./node_modules", "./node_modules/@types"]
   },

From 5eabaaf939a891db23dd7b6defdf45c3a2737750 Mon Sep 17 00:00:00 2001
From: goosewobbler <goosewobbler@protonmail.com>
Date: Wed, 11 Sep 2024 15:37:00 +0100
Subject: [PATCH 52/52] chore: update `@electron/packager`, remove asar version
 pin workaround

---
 apps/forge-cjs/package.json                |  3 --
 apps/forge-esm/package.json                |  3 --
 packages/@wdio_electron-types/package.json |  2 +-
 packages/@wdio_electron-utils/package.json |  2 +-
 pnpm-lock.yaml                             | 43 +++++++++++-----------
 5 files changed, 24 insertions(+), 29 deletions(-)

diff --git a/apps/forge-cjs/package.json b/apps/forge-cjs/package.json
index 9e2865c0..70028a14 100644
--- a/apps/forge-cjs/package.json
+++ b/apps/forge-cjs/package.json
@@ -31,8 +31,5 @@
     "tsx": "^4.19.0",
     "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
-  },
-  "resolutions": {
-    "@electron/asar": "3.2.10"
   }
 }
diff --git a/apps/forge-esm/package.json b/apps/forge-esm/package.json
index efcb30ad..5e975e13 100644
--- a/apps/forge-esm/package.json
+++ b/apps/forge-esm/package.json
@@ -32,8 +32,5 @@
     "tsx": "^4.19.0",
     "typescript": "^5.6.2",
     "webdriverio": "^9.0.9"
-  },
-  "resolutions": {
-    "@electron/asar": "3.2.10"
   }
 }
diff --git a/packages/@wdio_electron-types/package.json b/packages/@wdio_electron-types/package.json
index 99100b9c..60d13a82 100644
--- a/packages/@wdio_electron-types/package.json
+++ b/packages/@wdio_electron-types/package.json
@@ -18,7 +18,7 @@
   },
   "devDependencies": {
     "@electron-forge/shared-types": "^7.4.0",
-    "@electron/packager": "^18.3.4",
+    "@electron/packager": "^18.3.5",
     "@wdio/globals": "^9.0.9",
     "@wdio/types": "^9.0.8",
     "builder-util": "25.0.3",
diff --git a/packages/@wdio_electron-utils/package.json b/packages/@wdio_electron-utils/package.json
index 3a2a5b16..4fd706a2 100644
--- a/packages/@wdio_electron-utils/package.json
+++ b/packages/@wdio_electron-utils/package.json
@@ -38,7 +38,7 @@
     "test": "pnpm test:unit"
   },
   "dependencies": {
-    "@electron/packager": "^18.3.4",
+    "@electron/packager": "^18.3.5",
     "@wdio/logger": "^9.0.8",
     "debug": "^4.3.7",
     "find-versions": "^6.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index bc0a6f21..bf62d88d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -416,8 +416,8 @@ importers:
         specifier: ^7.4.0
         version: 7.4.0
       '@electron/packager':
-        specifier: ^18.3.4
-        version: 18.3.4
+        specifier: ^18.3.5
+        version: 18.3.5
       '@wdio/globals':
         specifier: ^9.0.9
         version: 9.0.9(@wdio/logger@9.0.8)
@@ -446,8 +446,8 @@ importers:
   packages/@wdio_electron-utils:
     dependencies:
       '@electron/packager':
-        specifier: ^18.3.4
-        version: 18.3.4
+        specifier: ^18.3.5
+        version: 18.3.5
       '@wdio/logger':
         specifier: ^9.0.8
         version: 9.0.8
@@ -669,8 +669,8 @@ packages:
     resolution: {integrity: sha512-F4jbnDn4yIZjmky1FZ6rgBKTM05AZQQfHkyJW2hdS4pDKJjdKAqWytoZKDi1/S6Cr6tN+DD0TFGD3V0i6HPHYQ==}
     engines: {node: '>= 14.17.5'}
 
-  '@electron/asar@3.2.10':
-    resolution: {integrity: sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==}
+  '@electron/asar@3.2.13':
+    resolution: {integrity: sha512-pY5z2qQSwbFzJsBdgfJIzXf5ElHTVMutC2dxh0FD60njknMu3n1NnTABOcQwbb5/v5soqE79m9UjaJryBf3epg==}
     engines: {node: '>=10.12.0'}
     hasBin: true
 
@@ -695,8 +695,8 @@ packages:
     engines: {node: '>=12.0.0'}
     hasBin: true
 
-  '@electron/packager@18.3.4':
-    resolution: {integrity: sha512-u/IxB5nelg+areXbSEWJxg1r4z0TcS1D1Dax106PsgwgPtcFvB6jjGxZVLA0WHSrLpkj6qfigHSuVXzxMTH+Qw==}
+  '@electron/packager@18.3.5':
+    resolution: {integrity: sha512-ClgTxXTt3MesWAcjIxIkgxELjTcllw1FRoVsihP7uT48kpDMqI71p4XvnMWbq8PvU57TcrKICAaLkxRhbc+/wQ==}
     engines: {node: '>= 16.13.0'}
     hasBin: true
 
@@ -5607,7 +5607,7 @@ snapshots:
       '@electron-forge/template-webpack-typescript': 7.4.0
       '@electron-forge/tracer': 7.4.0
       '@electron/get': 3.1.0
-      '@electron/packager': 18.3.4
+      '@electron/packager': 18.3.5
       '@electron/rebuild': 3.6.0
       '@malept/cross-spawn-promise': 2.0.0
       chalk: 4.1.2
@@ -5661,7 +5661,7 @@ snapshots:
   '@electron-forge/shared-types@7.4.0':
     dependencies:
       '@electron-forge/tracer': 7.4.0
-      '@electron/packager': 18.3.4
+      '@electron/packager': 18.3.5
       '@electron/rebuild': 3.6.0
       listr2: 7.0.2
     transitivePeerDependencies:
@@ -5719,8 +5719,9 @@ snapshots:
     dependencies:
       chrome-trace-event: 1.0.4
 
-  '@electron/asar@3.2.10':
+  '@electron/asar@3.2.13':
     dependencies:
+      '@types/glob': 7.2.0
       commander: 5.1.0
       glob: 7.2.3
       minimatch: 3.1.2
@@ -5763,7 +5764,7 @@ snapshots:
 
   '@electron/notarize@2.4.0':
     dependencies:
-      debug: 4.3.6
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 9.1.0
       promise-retry: 2.0.1
     transitivePeerDependencies:
@@ -5772,7 +5773,7 @@ snapshots:
   '@electron/osx-sign@1.3.1':
     dependencies:
       compare-version: 0.1.2
-      debug: 4.3.6
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 10.1.0
       isbinaryfile: 4.0.10
       minimist: 1.2.8
@@ -5780,15 +5781,15 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@electron/packager@18.3.4':
+  '@electron/packager@18.3.5':
     dependencies:
-      '@electron/asar': 3.2.10
+      '@electron/asar': 3.2.13
       '@electron/get': 3.1.0
       '@electron/notarize': 2.4.0
       '@electron/osx-sign': 1.3.1
       '@electron/universal': 2.0.1
       '@electron/windows-sign': 1.1.3
-      debug: 4.3.6
+      debug: 4.3.7(supports-color@8.1.1)
       extract-zip: 2.0.1
       filenamify: 4.3.0
       fs-extra: 11.2.0
@@ -5826,9 +5827,9 @@ snapshots:
 
   '@electron/universal@2.0.1':
     dependencies:
-      '@electron/asar': 3.2.10
+      '@electron/asar': 3.2.13
       '@malept/cross-spawn-promise': 2.0.0
-      debug: 4.3.6
+      debug: 4.3.7(supports-color@8.1.1)
       dir-compare: 4.2.0
       fs-extra: 11.2.0
       minimatch: 9.0.5
@@ -5839,7 +5840,7 @@ snapshots:
   '@electron/windows-sign@1.1.3':
     dependencies:
       cross-dirname: 0.1.0
-      debug: 4.3.6
+      debug: 4.3.7(supports-color@8.1.1)
       fs-extra: 11.2.0
       minimist: 1.2.8
       postject: 1.0.0-alpha.6
@@ -8383,7 +8384,7 @@ snapshots:
 
   galactus@1.0.0:
     dependencies:
-      debug: 4.3.6
+      debug: 4.3.7(supports-color@8.1.1)
       flora-colossus: 2.0.0
       fs-extra: 10.1.0
     transitivePeerDependencies:
@@ -8507,7 +8508,7 @@ snapshots:
       fs.realpath: 1.0.0
       inflight: 1.0.6
       inherits: 2.0.4
-      minimatch: 3.1.2
+      minimatch: 3.0.8
       once: 1.4.0
       path-is-absolute: 1.0.1