From 19e195bc98757bea2257421ce07c36bd4a3f273f Mon Sep 17 00:00:00 2001 From: Luke Hagar Date: Wed, 23 Jul 2025 23:24:00 -0500 Subject: [PATCH] Update dependencies and scripts in adapter-electron for improved functionality - Added `nodemon` and `wait-on` as dependencies in the electron example's package.json for better development experience. - Updated the `dev` script to utilize `wait-on` for ensuring the Vite server is running before starting Electron. - Enhanced the README.md with clearer instructions and examples for configuring the adapter and its options. - Removed the `functions` option from the TypeScript definition to simplify the interface. - Cleaned up unused imports in setupHandler.js to streamline the code. --- examples/electron/package.json | 6 +- examples/electron/src/main.ts | 1 + packages/adapter-electron/README.md | 249 +++++++++++++----- .../functions/setupHandler.js | 3 +- packages/adapter-electron/index.d.ts | 6 - packages/adapter-electron/index.js | 2 +- pnpm-lock.yaml | 245 +++++++++++++---- 7 files changed, 394 insertions(+), 118 deletions(-) diff --git a/examples/electron/package.json b/examples/electron/package.json index 7b807bb..743ece4 100644 --- a/examples/electron/package.json +++ b/examples/electron/package.json @@ -12,7 +12,7 @@ "scripts": { "start": "vite preview", "sync": "svelte-kit sync", - "dev": "pnpm sync && concurrently \"vite dev\" \"electron .\" --names \"sveltekit,electron\" --prefix-colors \"#ff3e00,blue\"", + "dev": "pnpm sync && concurrently \"vite dev\" \"wait-on http://localhost:5173 && nodemon --watch out --exec electron .\" --names \"sveltekit,electron\" --prefix-colors \"#ff3e00,blue\"", "build": "pnpm sync && vite build", "build:all": "pnpm build && electron-builder -mwl --config", "build:win": "pnpm build && electron-builder --win --config", @@ -39,6 +39,8 @@ "electron-util": "^0.18.1", "esbuild": "^0.25.0", "eslint": "^9.30.1", + "nodemon": "^3.1.10", + "wait-on": "^8.0.4", "eslint-config-prettier": "^10.1.5", "eslint-plugin-svelte": "^3.10.1", "polka": "^0.5.2", @@ -51,4 +53,4 @@ "vite": "^6.0.0" }, "type": "module" -} +} \ No newline at end of file diff --git a/examples/electron/src/main.ts b/examples/electron/src/main.ts index 685ed11..179feaa 100644 --- a/examples/electron/src/main.ts +++ b/examples/electron/src/main.ts @@ -13,6 +13,7 @@ process.on('SIGINT', () => process.exit(0)); // First register the app scheme registerAppScheme(); +console.log('main.ts is now loaded'); async function createWindow() { // Create the browser window diff --git a/packages/adapter-electron/README.md b/packages/adapter-electron/README.md index ed35a0e..92cfbb7 100644 --- a/packages/adapter-electron/README.md +++ b/packages/adapter-electron/README.md @@ -16,7 +16,7 @@ A SvelteKit adapter for Electron desktop apps that uses native protocol handling ## Installation ```bash -npm install @sveltejs/adapter-electron +npm install adapter-electron ``` ## Quick Start @@ -26,19 +26,15 @@ npm install @sveltejs/adapter-electron In your `svelte.config.js`: ```js -import adapter from '@sveltejs/adapter-electron'; +import adapter from 'adapter-electron'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ const config = { + preprocess: vitePreprocess(), + kit: { - adapter: adapter({ - // All options are optional with sensible defaults - out: 'out', // Output directory (default: 'out') - assets: true, // Include static assets (default: true) - fallback: undefined, // Fallback page for client-side routing (default: undefined) - precompress: false, // Precompress assets (default: false) - strict: true // Strict mode (default: true) - }) + adapter: adapter() } }; @@ -77,31 +73,44 @@ Create `src/main.ts`: import { app, BrowserWindow } from 'electron'; import { setupHandler, getPreloadPath, registerAppScheme } from 'adapter-electron/functions/setupHandler'; +// Electron log is the best way I've found to get logs from compiled binaries +import log from 'electron-log/main'; + +console.log = log.log; + let mainWindow: BrowserWindow | null = null; let stopIntercept: (() => void) | undefined; -// IMPORTANT: Register the app scheme before app.ready +process.on('SIGTERM', () => process.exit(0)); +process.on('SIGINT', () => process.exit(0)); + +// First register the app scheme registerAppScheme(); async function createWindow() { + // Create the browser window mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { - preload: getPreloadPath(), // Auto-configured preload path + // Second configure the preload script + preload: getPreloadPath(), contextIsolation: true, - nodeIntegration: false, - webSecurity: true + devTools: true } }); + mainWindow.once('ready-to-show', () => mainWindow?.webContents.openDevTools()); + mainWindow.on('closed', () => { mainWindow = null; stopIntercept?.(); }); - // Setup the protocol handler (handles dev vs prod automatically) + // Third, Setup the handler stopIntercept = await setupHandler(mainWindow); + + return mainWindow; } app.on('ready', createWindow); @@ -114,7 +123,11 @@ app.on('window-all-closed', () => { app.on('activate', async () => { if (BrowserWindow.getAllWindows().length === 0 && !mainWindow) { - await createWindow(); + try { + await createWindow(); + } catch (error) { + console.error('Failed to create window:', error); + } } }); ``` @@ -124,18 +137,29 @@ app.on('activate', async () => { Create `src/preload.ts`: ```ts -// Your preload script content console.log('Preload loaded'); - -// Example: Expose APIs to renderer process -import { contextBridge } from 'electron'; - -contextBridge.exposeInMainWorld('electronAPI', { - // Your APIs here -}); ``` -### 5. Build and Run +### 5. Configure Package.json + +Add these fields to your `package.json`: + +```json +{ + "main": "./out/main/index.cjs", + "scripts": { + "sync": "svelte-kit sync", + "dev": "pnpm sync && concurrently \"vite dev\" \"wait-on http://localhost:5173 && nodemon --watch out --exec electron .\" --names \"sveltekit,electron\" --prefix-colors \"#ff3e00,blue\"", + "build": "pnpm sync && vite build", + "build:all": "pnpm build && electron-builder -mwl --config", + "build:win": "pnpm build && electron-builder --win --config", + "build:mac": "pnpm build && electron-builder --mac --config", + "build:linux": "pnpm build && electron-builder --linux --config" + } +} +``` + +### 6. Build and Run ```bash # Development (uses Vite dev server with HMR) @@ -144,8 +168,11 @@ npm run dev # Production build npm run build -# Run built Electron app -npm start # or your preferred Electron launcher +# Package for distribution +npm run build:all # All platforms +npm run build:win # Windows only +npm run build:mac # macOS only +npm run build:linux # Linux only ``` ## How It Works @@ -192,31 +219,94 @@ out/ ```js adapter({ - out: 'out', // Output directory - assets: true, // Include static assets from /static - fallback: undefined, // Fallback page for client-side routing - precompress: false, // Precompress assets with gzip/brotli - strict: true // Enable strict mode + out: 'out', // Output directory (default: 'out') + precompress: false // Precompress assets with gzip/brotli (default: false) }) ``` +| Option | Type | Default | Description | +| ------------- | --------- | ------- | ----------------------------------------------- | +| `out` | `string` | `'out'` | The directory to write the built application to | +| `precompress` | `boolean` | `false` | Whether to precompress assets with gzip/brotli | + ### Electron Plugin Options ```js electronPlugin({ - mainEntry: 'src/main.ts', // Main process entry point - preloadEntry: 'src/preload.ts', // Preload script entry point - mainOut: 'out/main/index.js', // Main process output - preloadOut: 'out/preload/index.js' // Preload script output + mainEntry: 'src/main.ts', // Main process entry point (default: 'src/main.ts') + preloadEntry: 'src/preload.ts', // Preload script entry point (default: 'src/preload.ts') + mainOut: 'out/main/index.cjs', // Main process output (default: 'out/main/index.cjs') + preloadOut: 'out/preload/index.js', // Preload script output (default: 'out/preload/index.js') + externalMain: ['electron', 'electron-log', 'electron-is-dev', 'SERVER', 'MANIFEST'], // External dependencies for main process + externalPreload: ['electron'] // External dependencies for preload script }) ``` +| Option | Type | Default | Description | +| ----------------- | ---------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------ | +| `mainEntry` | `string` | `'src/main.ts'` | Path to the main process entry file | +| `preloadEntry` | `string` | `'src/preload.ts'` | Path to the preload script entry file | +| `mainOut` | `string` | `'out/main/index.cjs'` | Output path for the compiled main process | +| `preloadOut` | `string` | `'out/preload/index.js'` | Output path for the compiled preload script | +| `externalMain` | `string[]` | `['electron', 'electron-log', 'electron-is-dev', 'SERVER', 'MANIFEST']` | External dependencies that won't be bundled for the main process | +| `externalPreload` | `string[]` | `['electron']` | External dependencies that won't be bundled for the preload script | + +### Configuration Examples + +#### Custom Output Directory +```js +// svelte.config.js +import adapter from 'adapter-electron'; + +export default { + kit: { + adapter: adapter({ + out: 'dist/electron' + }) + } +}; +``` + +#### Custom Entry Points +```js +// vite.config.ts +import { electronPlugin } from 'adapter-electron'; + +export default defineConfig({ + plugins: [ + sveltekit(), + electronPlugin({ + mainEntry: 'electron/main.ts', + preloadEntry: 'electron/preload.ts', + mainOut: 'dist/electron/main.js', + preloadOut: 'dist/electron/preload.js' + }) + ] +}); +``` + +#### Custom External Dependencies +```js +// vite.config.ts +import { electronPlugin } from 'adapter-electron'; + +export default defineConfig({ + plugins: [ + sveltekit(), + electronPlugin({ + externalMain: ['electron', 'electron-log', 'my-custom-package'], + externalPreload: ['electron', 'another-package'] + }) + ] +}); +``` + ### Environment Variables -| Variable | Description | Default | -|----------|-------------|---------| +| Variable | Description | Default | +| ----------------- | ---------------------- | ----------------------- | | `VITE_DEV_SERVER` | Development server URL | `http://localhost:5173` | -| `VITE_APP_URL` | Production app URL | `http://127.0.0.1` | +| `VITE_APP_URL` | Production app URL | `http://127.0.0.1` | ## API Reference @@ -288,29 +378,54 @@ Cookies are automatically synchronized between SvelteKit and Electron's session: ### With electron-builder -```json -{ - "scripts": { - "build": "vite build", - "dist": "npm run build && electron-builder" - }, - "build": { - "directories": { - "output": "dist", - "buildResources": "out" - }, - "files": [ - "out/**/*", - "package.json" - ], - "mac": { - "icon": "assets/icon.icns" - }, - "win": { - "icon": "assets/icon.ico" - } - } -} +Create `electron-builder.yaml`: + +```yaml +appId: com.electron.app +productName: electron-sveltekit +directories: + buildResources: build +files: + - "!**/.vscode/*" + - "!src/*" + - "!electron.vite.config.{js,ts,mjs,cjs}" + - "!vite.electron.config.ts" + - "!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}" + - "!{.env,.env.*,.npmrc,pnpm-lock.yaml}" + - "!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}" + - "out/**/*" +asarUnpack: + - resources/** +win: + target: ["portable"] + executableName: electron-sveltekit +nsis: + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://example.com/auto-updates ``` ### With electron-forge @@ -330,6 +445,15 @@ module.exports = { }; ``` +## Dependencies + +The adapter requires these additional dependencies: + +```bash +npm install electron electron-builder electron-log concurrently +npm install -D @types/node +``` + ## Troubleshooting ### Common Issues @@ -349,6 +473,7 @@ module.exports = { **Build errors:** - Verify all dependencies are installed - Check that TypeScript configuration includes Electron types +- Ensure `concurrently` is installed for development scripts ### Debug Mode diff --git a/packages/adapter-electron/functions/setupHandler.js b/packages/adapter-electron/functions/setupHandler.js index b8d3c77..4cc008f 100644 --- a/packages/adapter-electron/functions/setupHandler.js +++ b/packages/adapter-electron/functions/setupHandler.js @@ -1,9 +1,8 @@ import fs from 'node:fs/promises'; import path from 'node:path'; import isDev from 'electron-is-dev'; -import { protocol, net, dialog, app } from 'electron'; +import { protocol, net, dialog } from 'electron'; import { pathToFileURL } from 'url'; -import assert from 'node:assert'; import { parse as parseCookie, splitCookiesString } from 'set-cookie-parser'; import { serialize as serializeCookie } from 'cookie'; diff --git a/packages/adapter-electron/index.d.ts b/packages/adapter-electron/index.d.ts index 4fefb3a..5d9f9cb 100644 --- a/packages/adapter-electron/index.d.ts +++ b/packages/adapter-electron/index.d.ts @@ -6,12 +6,6 @@ export interface AdapterOptions { * @default 'out' */ out?: string; - - /** - * Directory name for the protocol handler functions - * @default 'functions' - */ - functions?: string; /** * Whether to precompress static assets diff --git a/packages/adapter-electron/index.js b/packages/adapter-electron/index.js index 02dbd3d..0fda9f5 100644 --- a/packages/adapter-electron/index.js +++ b/packages/adapter-electron/index.js @@ -1,6 +1,5 @@ // adapter-electron.js import { readFileSync, writeFileSync } from 'node:fs'; -import fs from 'node:fs'; import path from 'node:path'; import { rollup, watch as rollupWatch } from 'rollup'; import { nodeResolve } from '@rollup/plugin-node-resolve'; @@ -159,6 +158,7 @@ export default function (opts = {}) { /** * Vite plugin to build Electron main/preload files using Rollup * Usage: import { electronPlugin } from 'adapter-electron' + * @param {import('./index.d.ts').ElectronPluginOptions} options - Configuration options */ export function electronPlugin(options = {}) { const { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9867725..35b0ea5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,6 +134,9 @@ importers: eslint-plugin-svelte: specifier: ^3.10.1 version: 3.10.1(eslint@9.30.1)(svelte@5.35.4) + nodemon: + specifier: ^3.1.10 + version: 3.1.10 polka: specifier: ^0.5.2 version: 0.5.2 @@ -158,6 +161,9 @@ importers: vite: specifier: ^6.0.0 version: 6.3.5(@types/node@24.0.11) + wait-on: + specifier: ^8.0.4 + version: 8.0.4 packages/adapter-appwrite: dependencies: @@ -909,6 +915,12 @@ packages: '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1273,6 +1285,15 @@ packages: cpu: [x64] os: [win32] + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -1681,6 +1702,9 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + axios@1.11.0: + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -2341,6 +2365,15 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -2349,6 +2382,10 @@ packages: resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -2466,6 +2503,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2546,6 +2587,9 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + ignore-walk@5.0.1: resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2686,6 +2730,9 @@ packages: engines: {node: '>=10'} hasBin: true + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -2984,6 +3031,11 @@ packages: node-api-version@0.2.1: resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + nodemon@3.1.10: + resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} + engines: {node: '>=10'} + hasBin: true + nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3259,6 +3311,12 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + publint@0.1.16: resolution: {integrity: sha512-wJgk7HnXDT5Ap0DjFYbGz78kPkN44iQvDiaq8P63IEEyNU9mYXvaMd2cAyIM6OgqXM/IA3CK6XWIsRq+wjNpgw==} engines: {node: '>=16'} @@ -3568,6 +3626,10 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3732,6 +3794,10 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -3816,6 +3882,9 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -3975,6 +4044,11 @@ packages: jsdom: optional: true + wait-on@8.0.4: + resolution: {integrity: sha512-8f9LugAGo4PSc0aLbpKVCVtzayd36sSCp4WLpVngkYq6PK87H79zt77/tlCU6eKCLqR46iFvcl0PU5f+DmtkwA==} + engines: {node: '>=12.0.0'} + hasBin: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -4235,7 +4309,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -4265,7 +4339,7 @@ snapshots: '@electron/notarize@2.5.0': dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: @@ -4274,7 +4348,7 @@ snapshots: '@electron/osx-sign@1.3.1': dependencies: compare-version: 0.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -4287,7 +4361,7 @@ snapshots: '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) detect-libc: 2.0.4 fs-extra: 10.1.0 got: 11.8.6 @@ -4306,7 +4380,7 @@ snapshots: dependencies: '@electron/asar': 3.2.18 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) dir-compare: 4.2.0 fs-extra: 11.3.0 minimatch: 9.0.5 @@ -4317,7 +4391,7 @@ snapshots: '@electron/windows-sign@1.2.2': dependencies: cross-dirname: 0.1.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fs-extra: 11.3.0 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -4556,7 +4630,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4574,7 +4648,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -4588,7 +4662,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -4616,6 +4690,12 @@ snapshots: '@gar/promisify@1.1.3': {} + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -4626,7 +4706,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4680,7 +4760,7 @@ snapshots: '@malept/flatpak-bundler@0.4.0': dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fs-extra: 9.1.0 lodash: 4.17.21 tmp-promise: 3.0.3 @@ -4903,6 +4983,14 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.45.1': optional: true + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@4.6.0': {} @@ -4987,7 +5075,7 @@ snapshots: '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@20.19.5)))(svelte@4.2.20)(vite@5.4.19(@types/node@20.19.5))': dependencies: '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@20.19.5)) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) svelte: 4.2.20 vite: 5.4.19(@types/node@20.19.5) transitivePeerDependencies: @@ -4996,7 +5084,7 @@ snapshots: '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@24.0.11)))(svelte@4.2.20)(vite@5.4.19(@types/node@24.0.11))': dependencies: '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@24.0.11)) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) svelte: 4.2.20 vite: 5.4.19(@types/node@24.0.11) transitivePeerDependencies: @@ -5005,7 +5093,7 @@ snapshots: '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.4)(vite@6.3.5(@types/node@24.0.11)))(svelte@5.35.4)(vite@6.3.5(@types/node@24.0.11))': dependencies: '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.35.4)(vite@6.3.5(@types/node@24.0.11)) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) svelte: 5.35.4 vite: 6.3.5(@types/node@24.0.11) transitivePeerDependencies: @@ -5014,7 +5102,7 @@ snapshots: '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@20.19.5))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@20.19.5)))(svelte@4.2.20)(vite@5.4.19(@types/node@20.19.5)) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 @@ -5028,7 +5116,7 @@ snapshots: '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@24.0.11))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.19(@types/node@24.0.11)))(svelte@4.2.20)(vite@5.4.19(@types/node@24.0.11)) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 @@ -5042,7 +5130,7 @@ snapshots: '@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.4)(vite@6.3.5(@types/node@24.0.11))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.4)(vite@6.3.5(@types/node@24.0.11)))(svelte@5.35.4)(vite@6.3.5(@types/node@24.0.11)) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 @@ -5148,7 +5236,7 @@ snapshots: '@typescript-eslint/type-utils': 6.21.0(eslint@9.30.1)(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@9.30.1)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.30.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -5183,7 +5271,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.30.1 optionalDependencies: typescript: 5.8.3 @@ -5196,7 +5284,7 @@ snapshots: '@typescript-eslint/types': 8.36.0 '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.36.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.30.1 typescript: 5.8.3 transitivePeerDependencies: @@ -5206,7 +5294,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) '@typescript-eslint/types': 8.36.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -5229,7 +5317,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@9.30.1)(typescript@5.8.3) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.30.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -5241,7 +5329,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) '@typescript-eslint/utils': 8.36.0(eslint@9.30.1)(typescript@5.8.3) - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) eslint: 9.30.1 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -5256,7 +5344,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -5273,7 +5361,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) '@typescript-eslint/types': 8.36.0 '@typescript-eslint/visitor-keys': 8.36.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -5324,7 +5412,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -5384,7 +5472,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -5447,7 +5535,7 @@ snapshots: builder-util-runtime: 9.3.1 chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) dmg-builder: 26.0.12(electron-builder-squirrel-windows@26.0.12) dotenv: 16.6.1 dotenv-expand: 11.0.7 @@ -5500,6 +5588,14 @@ snapshots: at-least-node@1.0.0: {} + axios@1.11.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.1.0: {} balanced-match@1.0.2: {} @@ -5547,7 +5643,7 @@ snapshots: builder-util-runtime@9.3.1: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) sax: 1.4.1 transitivePeerDependencies: - supports-color @@ -5560,7 +5656,7 @@ snapshots: builder-util-runtime: 9.3.1 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fs-extra: 10.1.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -5785,9 +5881,11 @@ snapshots: dependencies: '@babel/runtime': 7.27.6 - debug@4.4.1: + debug@4.4.1(supports-color@5.5.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 decompress-response@6.0.0: dependencies: @@ -5952,7 +6050,7 @@ snapshots: electron-winstaller@5.4.0: dependencies: '@electron/asar': 3.4.1 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) fs-extra: 7.0.1 lodash: 4.17.21 temp: 0.9.4 @@ -6191,7 +6289,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -6239,7 +6337,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -6323,7 +6421,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -6399,6 +6497,8 @@ snapshots: flatted@3.3.3: {} + follow-redirects@1.15.9: {} + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -6412,6 +6512,14 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -6569,6 +6677,8 @@ snapshots: graphemer@1.4.0: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -6606,14 +6716,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -6625,14 +6735,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -6660,6 +6770,8 @@ snapshots: ieee754@1.2.1: {} + ignore-by-default@1.0.1: {} + ignore-walk@5.0.1: dependencies: minimatch: 5.1.6 @@ -6758,7 +6870,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -6781,6 +6893,14 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + js-tokens@9.0.1: {} js-yaml@3.14.1: @@ -7062,6 +7182,19 @@ snapshots: dependencies: semver: 7.7.2 + nodemon@3.1.10: + dependencies: + chokidar: 3.6.0 + debug: 4.4.1(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.7.2 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + nopt@6.0.0: dependencies: abbrev: 1.1.1 @@ -7307,6 +7440,10 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + proxy-from-env@1.1.0: {} + + pstree.remy@1.1.8: {} + publint@0.1.16: dependencies: npm-packlist: 5.1.3 @@ -7337,7 +7474,7 @@ snapshots: read-binary-file-arch@1.0.6: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -7554,7 +7691,7 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) socks: 2.8.5 transitivePeerDependencies: - supports-color @@ -7643,10 +7780,14 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) transitivePeerDependencies: - supports-color + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -7830,6 +7971,8 @@ snapshots: totalist@3.0.1: {} + touch@3.1.1: {} + tree-kill@1.2.2: {} trouter@2.0.1: @@ -7892,6 +8035,8 @@ snapshots: ufo@1.6.1: {} + undefsafe@2.0.5: {} + undici-types@5.26.5: {} undici-types@6.21.0: {} @@ -7930,7 +8075,7 @@ snapshots: vite-node@1.6.1(@types/node@20.19.5): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) pathe: 1.1.2 picocolors: 1.1.1 vite: 5.4.19(@types/node@20.19.5) @@ -8004,7 +8149,7 @@ snapshots: '@vitest/utils': 1.6.1 acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.4.1 + debug: 4.4.1(supports-color@5.5.0) execa: 8.0.1 local-pkg: 0.5.1 magic-string: 0.30.17 @@ -8029,6 +8174,16 @@ snapshots: - supports-color - terser + wait-on@8.0.4: + dependencies: + axios: 1.11.0 + joi: 17.13.3 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + wcwidth@1.0.1: dependencies: defaults: 1.0.4