From f58274bb8482f05d217dfc07599931e73147a766 Mon Sep 17 00:00:00 2001 From: chouheiwa <849131492@qq.com> Date: Mon, 22 Dec 2025 09:18:21 +0800 Subject: [PATCH] feat(electron): add desktop application support with electron (#344) * feat(electron): add desktop application support with electron - implement complete Electron main process architecture with window management, app menu, IPC handlers, and settings window - integrate Next.js server for production builds with embedded standalone server - add configuration management with persistent storage and env file support - create preload scripts with secure context bridge for renderer communication - set up electron-builder configuration for multi-platform packaging (macOS, Windows, Linux) - add GitHub Actions workflow for automated release builds - include development scripts for hot-reload during Electron development * feat(electron): enhance security and stability - encrypt API keys using Electron safeStorage API before persisting to disk - add error handling and rollback for preset switching failures - extract inline styles to external CSS file and remove unsafe-inline from CSP - implement dynamic port allocation with automatic fallback for production builds * fix(electron): add maintainer field for Linux .deb package - add maintainer email to linux configuration in electron-builder.yml - required for building .deb packages * fix(electron): use shx for cross-platform file copying - replace Unix-only cp -r with npx shx cp -r - add shx as devDependency for Windows compatibility * fix(electron): fix runtime icon path for all platforms - use icon.png directly instead of platform-specific formats - electron-builder handles icon conversion during packaging - macOS uses embedded icon from app bundle, no explicit path needed - add icon.png to extraResources for Windows/Linux runtime access * fix(electron): add security warning for plaintext API key storage - warn user when safeStorage is unavailable (Linux without keyring) - fail secure: throw error if encryption fails instead of storing plaintext - prevent duplicate warnings with hasWarnedAboutPlaintext flag * fix(electron): add remaining review fixes - Add Windows ARM64 architecture support - Add IPC input validation with config key whitelist - Add server.js existence check before starting Next.js server - Make afterPack throw error on missing directories - Add workflow permissions for release job --------- Co-authored-by: dayuan.jiang --- .github/workflows/electron-release.yml | 100 + .gitignore | 13 + electron-builder.yml | 96 + electron.d.ts | 74 + electron/main/app-menu.ts | 241 ++ electron/main/config-manager.ts | 460 +++ electron/main/env-loader.ts | 67 + electron/main/index.ts | 105 + electron/main/ipc-handlers.ts | 212 + electron/main/next-server.ts | 161 + electron/main/port-manager.ts | 129 + electron/main/settings-window.ts | 78 + electron/main/window-manager.ts | 84 + electron/preload/index.ts | 24 + electron/preload/settings.ts | 35 + electron/settings/index.html | 110 + electron/settings/settings.css | 311 ++ electron/settings/settings.js | 311 ++ electron/tsconfig.json | 18 + package-lock.json | 5193 +++++++++++++++++++++++- package.json | 22 +- resources/entitlements.mac.plist | 16 + resources/icon.png | Bin 0 -> 55260 bytes scripts/afterPack.cjs | 39 + scripts/electron-dev.mjs | 275 ++ scripts/prepare-electron-build.mjs | 41 + tsconfig.json | 2 +- 27 files changed, 8213 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/electron-release.yml create mode 100644 electron-builder.yml create mode 100644 electron.d.ts create mode 100644 electron/main/app-menu.ts create mode 100644 electron/main/config-manager.ts create mode 100644 electron/main/env-loader.ts create mode 100644 electron/main/index.ts create mode 100644 electron/main/ipc-handlers.ts create mode 100644 electron/main/next-server.ts create mode 100644 electron/main/port-manager.ts create mode 100644 electron/main/settings-window.ts create mode 100644 electron/main/window-manager.ts create mode 100644 electron/preload/index.ts create mode 100644 electron/preload/settings.ts create mode 100644 electron/settings/index.html create mode 100644 electron/settings/settings.css create mode 100644 electron/settings/settings.js create mode 100644 electron/tsconfig.json create mode 100644 resources/entitlements.mac.plist create mode 100644 resources/icon.png create mode 100644 scripts/afterPack.cjs create mode 100644 scripts/electron-dev.mjs create mode 100644 scripts/prepare-electron-build.mjs diff --git a/.github/workflows/electron-release.yml b/.github/workflows/electron-release.yml new file mode 100644 index 0000000..dff69d2 --- /dev/null +++ b/.github/workflows/electron-release.yml @@ -0,0 +1,100 @@ +name: Electron Release + +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + version: + description: "Version tag (e.g., v0.4.5)" + required: false + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - os: macos-latest + platform: mac + - os: windows-latest + platform: win + - os: ubuntu-latest + platform: linux + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Build Electron app + run: npm run dist:${{ matrix.platform }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload macOS artifacts + if: matrix.platform == 'mac' + uses: actions/upload-artifact@v4 + with: + name: mac-build + path: | + release/*.dmg + release/*.zip + if-no-files-found: error + + - name: Upload Windows artifacts + if: matrix.platform == 'win' + uses: actions/upload-artifact@v4 + with: + name: win-build + path: | + release/*.exe + if-no-files-found: error + + - name: Upload Linux artifacts + if: matrix.platform == 'linux' + uses: actions/upload-artifact@v4 + with: + name: linux-build + path: | + release/*.AppImage + release/*.deb + if-no-files-found: error + + release: + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + if: startsWith(github.ref, 'refs/tags/') + + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + files: | + artifacts/**/*.dmg + artifacts/**/*.zip + artifacts/**/*.exe + artifacts/**/*.AppImage + artifacts/**/*.deb + draft: true + generate_release_notes: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 28fd6ac..c4eab07 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,16 @@ push-via-ec2.sh .wrangler/ .env*.local +# Electron +/dist-electron/ +/release/ +/electron-standalone/ +*.dmg +*.exe +*.AppImage +*.deb +*.rpm +*.snap + +CLAUDE.md +.spec-workflow \ No newline at end of file diff --git a/electron-builder.yml b/electron-builder.yml new file mode 100644 index 0000000..616424c --- /dev/null +++ b/electron-builder.yml @@ -0,0 +1,96 @@ +appId: com.nextaidrawio.app +productName: Next AI Draw.io +copyright: Copyright Ā© 2024 Next AI Draw.io +electronVersion: 39.2.7 + +directories: + output: release + buildResources: resources + +afterPack: ./scripts/afterPack.cjs + +files: + - dist-electron/**/* + - "!node_modules" + +asarUnpack: + - "**/*.node" + +extraResources: + # Copy prepared standalone directory (includes node_modules) + - from: electron-standalone/ + to: standalone/ + # Copy icon for runtime use (Windows/Linux) + - from: resources/icon.png + to: icon.png + +# macOS configuration +mac: + category: public.app-category.productivity + icon: resources/icon.png + target: + - target: dmg + arch: + - x64 + - arm64 + - target: zip + arch: + - x64 + - arm64 + hardenedRuntime: true + gatekeeperAssess: false + entitlements: resources/entitlements.mac.plist + entitlementsInherit: resources/entitlements.mac.plist + +dmg: + contents: + - x: 130 + y: 220 + - x: 410 + y: 220 + type: link + path: /Applications + window: + width: 540 + height: 380 + +# Windows configuration +win: + icon: resources/icon.png + target: + - target: nsis + arch: + - x64 + - arm64 + - target: portable + arch: + - x64 + - arm64 + +nsis: + oneClick: false + perMachine: false + allowToChangeInstallationDirectory: true + deleteAppDataOnUninstall: false + createDesktopShortcut: true + createStartMenuShortcut: true + +# Linux configuration +linux: + icon: resources/icon.png + category: Office + maintainer: Next AI Draw.io + target: + - target: AppImage + arch: + - x64 + - arm64 + - target: deb + arch: + - x64 + - arm64 + +# Publish configuration (optional) +publish: + provider: github + releaseType: release diff --git a/electron.d.ts b/electron.d.ts new file mode 100644 index 0000000..a629e9b --- /dev/null +++ b/electron.d.ts @@ -0,0 +1,74 @@ +/** + * Type declarations for Electron API exposed via preload script + */ + +/** Configuration preset interface */ +interface ConfigPreset { + id: string + name: string + createdAt: number + updatedAt: number + config: { + AI_PROVIDER?: string + AI_MODEL?: string + AI_API_KEY?: string + AI_BASE_URL?: string + TEMPERATURE?: string + [key: string]: string | undefined + } +} + +/** Result of applying a preset */ +interface ApplyPresetResult { + success: boolean + error?: string + env?: Record +} + +declare global { + interface Window { + /** Main window Electron API */ + electronAPI?: { + /** Current platform (darwin, win32, linux) */ + platform: NodeJS.Platform + /** Whether running in Electron environment */ + isElectron: boolean + /** Get application version */ + getVersion: () => Promise + /** Minimize the window */ + minimize: () => void + /** Maximize/restore the window */ + maximize: () => void + /** Close the window */ + close: () => void + /** Open file dialog and return file path */ + openFile: () => Promise + /** Save data to file via save dialog */ + saveFile: (data: string) => Promise + } + + /** Settings window Electron API */ + settingsAPI?: { + /** Get all configuration presets */ + getPresets: () => Promise + /** Get current preset ID */ + getCurrentPresetId: () => Promise + /** Get current preset */ + getCurrentPreset: () => Promise + /** Save (create or update) a preset */ + savePreset: (preset: { + id?: string + name: string + config: Record + }) => Promise + /** Delete a preset */ + deletePreset: (id: string) => Promise + /** Apply a preset (sets environment variables and restarts server) */ + applyPreset: (id: string) => Promise + /** Close settings window */ + close: () => void + } + } +} + +export { ConfigPreset, ApplyPresetResult } diff --git a/electron/main/app-menu.ts b/electron/main/app-menu.ts new file mode 100644 index 0000000..4a99a85 --- /dev/null +++ b/electron/main/app-menu.ts @@ -0,0 +1,241 @@ +import { + app, + BrowserWindow, + dialog, + Menu, + type MenuItemConstructorOptions, + shell, +} from "electron" +import { + applyPresetToEnv, + getAllPresets, + getCurrentPresetId, + setCurrentPreset, +} from "./config-manager" +import { restartNextServer } from "./next-server" +import { showSettingsWindow } from "./settings-window" + +/** + * Build and set the application menu + */ +export function buildAppMenu(): void { + const template = getMenuTemplate() + const menu = Menu.buildFromTemplate(template) + Menu.setApplicationMenu(menu) +} + +/** + * Rebuild the menu (call this when presets change) + */ +export function rebuildAppMenu(): void { + buildAppMenu() +} + +/** + * Get the menu template + */ +function getMenuTemplate(): MenuItemConstructorOptions[] { + const isMac = process.platform === "darwin" + + const template: MenuItemConstructorOptions[] = [] + + // macOS app menu + if (isMac) { + template.push({ + label: app.name, + submenu: [ + { role: "about" }, + { type: "separator" }, + { + label: "Settings...", + accelerator: "CmdOrCtrl+,", + click: () => { + const win = BrowserWindow.getFocusedWindow() + showSettingsWindow(win || undefined) + }, + }, + { type: "separator" }, + { role: "services" }, + { type: "separator" }, + { role: "hide" }, + { role: "hideOthers" }, + { role: "unhide" }, + { type: "separator" }, + { role: "quit" }, + ], + }) + } + + // File menu + template.push({ + label: "File", + submenu: [ + ...(isMac + ? [] + : [ + { + label: "Settings", + accelerator: "CmdOrCtrl+,", + click: () => { + const win = BrowserWindow.getFocusedWindow() + showSettingsWindow(win || undefined) + }, + }, + { type: "separator" } as MenuItemConstructorOptions, + ]), + isMac ? { role: "close" } : { role: "quit" }, + ], + }) + + // Edit menu + template.push({ + label: "Edit", + submenu: [ + { role: "undo" }, + { role: "redo" }, + { type: "separator" }, + { role: "cut" }, + { role: "copy" }, + { role: "paste" }, + ...(isMac + ? [ + { + role: "pasteAndMatchStyle", + } as MenuItemConstructorOptions, + { role: "delete" } as MenuItemConstructorOptions, + { role: "selectAll" } as MenuItemConstructorOptions, + ] + : [ + { role: "delete" } as MenuItemConstructorOptions, + { type: "separator" } as MenuItemConstructorOptions, + { role: "selectAll" } as MenuItemConstructorOptions, + ]), + ], + }) + + // View menu + template.push({ + label: "View", + submenu: [ + { role: "reload" }, + { role: "forceReload" }, + { role: "toggleDevTools" }, + { type: "separator" }, + { role: "resetZoom" }, + { role: "zoomIn" }, + { role: "zoomOut" }, + { type: "separator" }, + { role: "togglefullscreen" }, + ], + }) + + // Configuration menu with presets + template.push(buildConfigMenu()) + + // Window menu + template.push({ + label: "Window", + submenu: [ + { role: "minimize" }, + { role: "zoom" }, + ...(isMac + ? [ + { type: "separator" } as MenuItemConstructorOptions, + { role: "front" } as MenuItemConstructorOptions, + ] + : [{ role: "close" } as MenuItemConstructorOptions]), + ], + }) + + // Help menu + template.push({ + label: "Help", + submenu: [ + { + label: "Documentation", + click: async () => { + await shell.openExternal( + "https://github.com/dayuanjiang/next-ai-draw-io", + ) + }, + }, + { + label: "Report Issue", + click: async () => { + await shell.openExternal( + "https://github.com/dayuanjiang/next-ai-draw-io/issues", + ) + }, + }, + ], + }) + + return template +} + +/** + * Build the Configuration menu with presets + */ +function buildConfigMenu(): MenuItemConstructorOptions { + const presets = getAllPresets() + const currentPresetId = getCurrentPresetId() + + const presetItems: MenuItemConstructorOptions[] = presets.map((preset) => ({ + label: preset.name, + type: "radio", + checked: preset.id === currentPresetId, + click: async () => { + const previousPresetId = getCurrentPresetId() + const env = applyPresetToEnv(preset.id) + + if (env) { + try { + await restartNextServer() + rebuildAppMenu() // Rebuild menu to update checkmarks + } catch (error) { + console.error("Failed to restart server:", error) + + // Revert to previous preset on failure + if (previousPresetId) { + applyPresetToEnv(previousPresetId) + } else { + setCurrentPreset(null) + } + + // Rebuild menu to restore previous checkmark state + rebuildAppMenu() + + // Show error dialog to notify user + dialog.showErrorBox( + "Configuration Error", + `Failed to apply preset "${preset.name}". The server could not be restarted.\n\nThe previous configuration has been restored.\n\nError: ${error instanceof Error ? error.message : String(error)}`, + ) + } + } + }, + })) + + return { + label: "Configuration", + submenu: [ + ...(presetItems.length > 0 + ? [ + { label: "Switch Preset", enabled: false }, + { type: "separator" } as MenuItemConstructorOptions, + ...presetItems, + { type: "separator" } as MenuItemConstructorOptions, + ] + : []), + { + label: + presetItems.length > 0 + ? "Manage Presets..." + : "Add Configuration Preset...", + click: () => { + const win = BrowserWindow.getFocusedWindow() + showSettingsWindow(win || undefined) + }, + }, + ], + } +} diff --git a/electron/main/config-manager.ts b/electron/main/config-manager.ts new file mode 100644 index 0000000..2a66d35 --- /dev/null +++ b/electron/main/config-manager.ts @@ -0,0 +1,460 @@ +import { randomUUID } from "node:crypto" +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs" +import path from "node:path" +import { app, safeStorage } from "electron" + +/** + * Fields that contain sensitive data and should be encrypted + */ +const SENSITIVE_FIELDS = ["AI_API_KEY"] as const + +/** + * Prefix to identify encrypted values + */ +const ENCRYPTED_PREFIX = "encrypted:" + +/** + * Check if safeStorage encryption is available + */ +function isEncryptionAvailable(): boolean { + return safeStorage.isEncryptionAvailable() +} + +/** + * Track if we've already warned about plaintext storage + */ +let hasWarnedAboutPlaintext = false + +/** + * Encrypt a sensitive value using safeStorage + * Warns if encryption is not available (API key stored in plaintext) + */ +function encryptValue(value: string): string { + if (!value) { + return value + } + + if (!isEncryptionAvailable()) { + if (!hasWarnedAboutPlaintext) { + console.warn( + "āš ļø SECURITY WARNING: safeStorage not available. " + + "API keys will be stored in PLAINTEXT. " + + "On Linux, install gnome-keyring or similar for secure storage.", + ) + hasWarnedAboutPlaintext = true + } + return value + } + + try { + const encrypted = safeStorage.encryptString(value) + return ENCRYPTED_PREFIX + encrypted.toString("base64") + } catch (error) { + console.error("Encryption failed:", error) + // Fail secure: don't store if encryption fails + throw new Error( + "Failed to encrypt API key. Cannot securely store credentials.", + ) + } +} + +/** + * Decrypt a sensitive value using safeStorage + * Returns the original value if it's not encrypted or decryption fails + */ +function decryptValue(value: string): string { + if (!value || !value.startsWith(ENCRYPTED_PREFIX)) { + return value + } + if (!isEncryptionAvailable()) { + console.warn( + "Cannot decrypt value: safeStorage encryption is not available", + ) + return value + } + try { + const base64Data = value.slice(ENCRYPTED_PREFIX.length) + const buffer = Buffer.from(base64Data, "base64") + return safeStorage.decryptString(buffer) + } catch (error) { + console.error("Failed to decrypt value:", error) + return value + } +} + +/** + * Encrypt sensitive fields in a config object + */ +function encryptConfig( + config: Record, +): Record { + const encrypted = { ...config } + for (const field of SENSITIVE_FIELDS) { + if (encrypted[field]) { + encrypted[field] = encryptValue(encrypted[field] as string) + } + } + return encrypted +} + +/** + * Decrypt sensitive fields in a config object + */ +function decryptConfig( + config: Record, +): Record { + const decrypted = { ...config } + for (const field of SENSITIVE_FIELDS) { + if (decrypted[field]) { + decrypted[field] = decryptValue(decrypted[field] as string) + } + } + return decrypted +} + +/** + * Configuration preset interface + */ +export interface ConfigPreset { + id: string + name: string + createdAt: number + updatedAt: number + config: { + AI_PROVIDER?: string + AI_MODEL?: string + AI_API_KEY?: string + AI_BASE_URL?: string + TEMPERATURE?: string + [key: string]: string | undefined + } +} + +/** + * Configuration file structure + */ +interface ConfigPresetsFile { + version: 1 + currentPresetId: string | null + presets: ConfigPreset[] +} + +const CONFIG_FILE_NAME = "config-presets.json" + +/** + * Get the path to the config file + */ +function getConfigFilePath(): string { + const userDataPath = app.getPath("userData") + return path.join(userDataPath, CONFIG_FILE_NAME) +} + +/** + * Load presets from the config file + * Decrypts sensitive fields automatically + */ +export function loadPresets(): ConfigPresetsFile { + const configPath = getConfigFilePath() + + if (!existsSync(configPath)) { + return { + version: 1, + currentPresetId: null, + presets: [], + } + } + + try { + const content = readFileSync(configPath, "utf-8") + const data = JSON.parse(content) as ConfigPresetsFile + + // Decrypt sensitive fields in each preset + data.presets = data.presets.map((preset) => ({ + ...preset, + config: decryptConfig(preset.config) as ConfigPreset["config"], + })) + + return data + } catch (error) { + console.error("Failed to load config presets:", error) + return { + version: 1, + currentPresetId: null, + presets: [], + } + } +} + +/** + * Save presets to the config file + * Encrypts sensitive fields automatically + */ +export function savePresets(data: ConfigPresetsFile): void { + const configPath = getConfigFilePath() + const userDataPath = app.getPath("userData") + + // Ensure the directory exists + if (!existsSync(userDataPath)) { + mkdirSync(userDataPath, { recursive: true }) + } + + // Encrypt sensitive fields before saving + const dataToSave: ConfigPresetsFile = { + ...data, + presets: data.presets.map((preset) => ({ + ...preset, + config: encryptConfig(preset.config) as ConfigPreset["config"], + })), + } + + try { + writeFileSync(configPath, JSON.stringify(dataToSave, null, 2), "utf-8") + } catch (error) { + console.error("Failed to save config presets:", error) + throw error + } +} + +/** + * Get all presets + */ +export function getAllPresets(): ConfigPreset[] { + const data = loadPresets() + return data.presets +} + +/** + * Get current preset ID + */ +export function getCurrentPresetId(): string | null { + const data = loadPresets() + return data.currentPresetId +} + +/** + * Get current preset + */ +export function getCurrentPreset(): ConfigPreset | null { + const data = loadPresets() + if (!data.currentPresetId) { + return null + } + return data.presets.find((p) => p.id === data.currentPresetId) || null +} + +/** + * Create a new preset + */ +export function createPreset( + preset: Omit, +): ConfigPreset { + const data = loadPresets() + const now = Date.now() + + const newPreset: ConfigPreset = { + id: randomUUID(), + name: preset.name, + config: preset.config, + createdAt: now, + updatedAt: now, + } + + data.presets.push(newPreset) + savePresets(data) + + return newPreset +} + +/** + * Update an existing preset + */ +export function updatePreset( + id: string, + updates: Partial>, +): ConfigPreset | null { + const data = loadPresets() + const index = data.presets.findIndex((p) => p.id === id) + + if (index === -1) { + return null + } + + const updatedPreset: ConfigPreset = { + ...data.presets[index], + ...updates, + updatedAt: Date.now(), + } + + data.presets[index] = updatedPreset + savePresets(data) + + return updatedPreset +} + +/** + * Delete a preset + */ +export function deletePreset(id: string): boolean { + const data = loadPresets() + const index = data.presets.findIndex((p) => p.id === id) + + if (index === -1) { + return false + } + + data.presets.splice(index, 1) + + // Clear current preset if it was deleted + if (data.currentPresetId === id) { + data.currentPresetId = null + } + + savePresets(data) + return true +} + +/** + * Set the current preset + */ +export function setCurrentPreset(id: string | null): boolean { + const data = loadPresets() + + if (id !== null) { + const preset = data.presets.find((p) => p.id === id) + if (!preset) { + return false + } + } + + data.currentPresetId = id + savePresets(data) + return true +} + +/** + * Map generic AI_API_KEY and AI_BASE_URL to provider-specific environment variables + */ +const PROVIDER_ENV_MAP: Record = { + openai: { apiKey: "OPENAI_API_KEY", baseUrl: "OPENAI_BASE_URL" }, + anthropic: { apiKey: "ANTHROPIC_API_KEY", baseUrl: "ANTHROPIC_BASE_URL" }, + google: { + apiKey: "GOOGLE_GENERATIVE_AI_API_KEY", + baseUrl: "GOOGLE_BASE_URL", + }, + azure: { apiKey: "AZURE_API_KEY", baseUrl: "AZURE_BASE_URL" }, + openrouter: { + apiKey: "OPENROUTER_API_KEY", + baseUrl: "OPENROUTER_BASE_URL", + }, + deepseek: { apiKey: "DEEPSEEK_API_KEY", baseUrl: "DEEPSEEK_BASE_URL" }, + siliconflow: { + apiKey: "SILICONFLOW_API_KEY", + baseUrl: "SILICONFLOW_BASE_URL", + }, + gateway: { apiKey: "AI_GATEWAY_API_KEY", baseUrl: "AI_GATEWAY_BASE_URL" }, + // bedrock and ollama don't use API keys in the same way + bedrock: { apiKey: "", baseUrl: "" }, + ollama: { apiKey: "", baseUrl: "OLLAMA_BASE_URL" }, +} + +/** + * Apply preset environment variables to the current process + * Returns the environment variables that were applied + */ +export function applyPresetToEnv(id: string): Record | null { + const data = loadPresets() + const preset = data.presets.find((p) => p.id === id) + + if (!preset) { + return null + } + + const appliedEnv: Record = {} + const provider = preset.config.AI_PROVIDER?.toLowerCase() + + for (const [key, value] of Object.entries(preset.config)) { + if (value !== undefined && value !== "") { + // Map generic AI_API_KEY to provider-specific key + if ( + key === "AI_API_KEY" && + provider && + PROVIDER_ENV_MAP[provider] + ) { + const providerApiKey = PROVIDER_ENV_MAP[provider].apiKey + if (providerApiKey) { + process.env[providerApiKey] = value + appliedEnv[providerApiKey] = value + } + } + // Map generic AI_BASE_URL to provider-specific key + else if ( + key === "AI_BASE_URL" && + provider && + PROVIDER_ENV_MAP[provider] + ) { + const providerBaseUrl = PROVIDER_ENV_MAP[provider].baseUrl + if (providerBaseUrl) { + process.env[providerBaseUrl] = value + appliedEnv[providerBaseUrl] = value + } + } + // Apply other env vars directly + else { + process.env[key] = value + appliedEnv[key] = value + } + } + } + + // Set as current preset + data.currentPresetId = id + savePresets(data) + + return appliedEnv +} + +/** + * Get environment variables from current preset + * Maps generic AI_API_KEY/AI_BASE_URL to provider-specific keys + */ +export function getCurrentPresetEnv(): Record { + const preset = getCurrentPreset() + if (!preset) { + return {} + } + + const env: Record = {} + const provider = preset.config.AI_PROVIDER?.toLowerCase() + + for (const [key, value] of Object.entries(preset.config)) { + if (value !== undefined && value !== "") { + // Map generic AI_API_KEY to provider-specific key + if ( + key === "AI_API_KEY" && + provider && + PROVIDER_ENV_MAP[provider] + ) { + const providerApiKey = PROVIDER_ENV_MAP[provider].apiKey + if (providerApiKey) { + env[providerApiKey] = value + } + } + // Map generic AI_BASE_URL to provider-specific key + else if ( + key === "AI_BASE_URL" && + provider && + PROVIDER_ENV_MAP[provider] + ) { + const providerBaseUrl = PROVIDER_ENV_MAP[provider].baseUrl + if (providerBaseUrl) { + env[providerBaseUrl] = value + } + } + // Apply other env vars directly + else { + env[key] = value + } + } + } + return env +} diff --git a/electron/main/env-loader.ts b/electron/main/env-loader.ts new file mode 100644 index 0000000..8182b11 --- /dev/null +++ b/electron/main/env-loader.ts @@ -0,0 +1,67 @@ +import fs from "node:fs" +import path from "node:path" +import { app } from "electron" + +/** + * Load environment variables from .env file + * Searches multiple locations in priority order + */ +export function loadEnvFile(): void { + const possiblePaths = [ + // Next to the executable (for portable installations) + path.join(path.dirname(app.getPath("exe")), ".env"), + // User data directory (persists across updates) + path.join(app.getPath("userData"), ".env"), + // Development: project root + path.join(app.getAppPath(), ".env.local"), + path.join(app.getAppPath(), ".env"), + ] + + for (const envPath of possiblePaths) { + if (fs.existsSync(envPath)) { + console.log(`Loading environment from: ${envPath}`) + loadEnvFromFile(envPath) + return + } + } + + console.log("No .env file found, using system environment variables") +} + +/** + * Parse and load environment variables from a file + */ +function loadEnvFromFile(filePath: string): void { + try { + const content = fs.readFileSync(filePath, "utf-8") + const lines = content.split("\n") + + for (const line of lines) { + const trimmed = line.trim() + + // Skip comments and empty lines + if (!trimmed || trimmed.startsWith("#")) continue + + const equalIndex = trimmed.indexOf("=") + if (equalIndex === -1) continue + + const key = trimmed.slice(0, equalIndex).trim() + let value = trimmed.slice(equalIndex + 1).trim() + + // Remove surrounding quotes + if ( + (value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'")) + ) { + value = value.slice(1, -1) + } + + // Don't override existing environment variables + if (!(key in process.env)) { + process.env[key] = value + } + } + } catch (error) { + console.error(`Failed to load env file ${filePath}:`, error) + } +} diff --git a/electron/main/index.ts b/electron/main/index.ts new file mode 100644 index 0000000..60254de --- /dev/null +++ b/electron/main/index.ts @@ -0,0 +1,105 @@ +import { app, BrowserWindow, dialog, shell } from "electron" +import { buildAppMenu } from "./app-menu" +import { getCurrentPresetEnv } from "./config-manager" +import { loadEnvFile } from "./env-loader" +import { registerIpcHandlers } from "./ipc-handlers" +import { startNextServer, stopNextServer } from "./next-server" +import { registerSettingsWindowHandlers } from "./settings-window" +import { createWindow, getMainWindow } from "./window-manager" + +// Single instance lock +const gotTheLock = app.requestSingleInstanceLock() + +if (!gotTheLock) { + app.quit() +} else { + app.on("second-instance", () => { + const mainWindow = getMainWindow() + if (mainWindow) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.focus() + } + }) + + // Load environment variables from .env files + loadEnvFile() + + // Apply saved preset environment variables (overrides .env) + const presetEnv = getCurrentPresetEnv() + for (const [key, value] of Object.entries(presetEnv)) { + process.env[key] = value + } + + const isDev = process.env.NODE_ENV === "development" + let serverUrl: string | null = null + + app.whenReady().then(async () => { + // Register IPC handlers + registerIpcHandlers() + registerSettingsWindowHandlers() + + // Build application menu + buildAppMenu() + + try { + if (isDev) { + // Development: use the dev server URL + serverUrl = + process.env.ELECTRON_DEV_URL || "http://localhost:6002" + console.log(`Development mode: connecting to ${serverUrl}`) + } else { + // Production: start Next.js standalone server + serverUrl = await startNextServer() + } + + // Create main window + createWindow(serverUrl) + } catch (error) { + console.error("Failed to start application:", error) + dialog.showErrorBox( + "Startup Error", + `Failed to start the application: ${error instanceof Error ? error.message : "Unknown error"}`, + ) + app.quit() + } + + app.on("activate", () => { + if (BrowserWindow.getAllWindows().length === 0) { + if (serverUrl) { + createWindow(serverUrl) + } + } + }) + }) + + app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + stopNextServer() + app.quit() + } + }) + + app.on("before-quit", () => { + stopNextServer() + }) + + // Open external links in default browser + app.on("web-contents-created", (_, contents) => { + contents.setWindowOpenHandler(({ url }) => { + // Allow diagrams.net iframe + if ( + url.includes("diagrams.net") || + url.includes("draw.io") || + url.startsWith("http://localhost") + ) { + return { action: "allow" } + } + // Open other links in external browser + if (url.startsWith("http://") || url.startsWith("https://")) { + shell.openExternal(url) + return { action: "deny" } + } + return { action: "allow" } + }) + }) +} diff --git a/electron/main/ipc-handlers.ts b/electron/main/ipc-handlers.ts new file mode 100644 index 0000000..7e801d1 --- /dev/null +++ b/electron/main/ipc-handlers.ts @@ -0,0 +1,212 @@ +import { app, BrowserWindow, dialog, ipcMain } from "electron" +import { + applyPresetToEnv, + type ConfigPreset, + createPreset, + deletePreset, + getAllPresets, + getCurrentPreset, + getCurrentPresetId, + setCurrentPreset, + updatePreset, +} from "./config-manager" +import { restartNextServer } from "./next-server" + +/** + * Allowed configuration keys for presets + * This whitelist prevents arbitrary environment variable injection + */ +const ALLOWED_CONFIG_KEYS = new Set([ + "AI_PROVIDER", + "AI_MODEL", + "AI_API_KEY", + "AI_BASE_URL", + "TEMPERATURE", +]) + +/** + * Sanitize preset config to only include allowed keys + */ +function sanitizePresetConfig( + config: Record, +): Record { + const sanitized: Record = {} + for (const key of ALLOWED_CONFIG_KEYS) { + if (key in config && typeof config[key] === "string") { + sanitized[key] = config[key] + } + } + return sanitized +} + +/** + * Register all IPC handlers + */ +export function registerIpcHandlers(): void { + // ==================== App Info ==================== + + ipcMain.handle("get-version", () => { + return app.getVersion() + }) + + // ==================== Window Controls ==================== + + ipcMain.on("window-minimize", (event) => { + const win = BrowserWindow.fromWebContents(event.sender) + win?.minimize() + }) + + ipcMain.on("window-maximize", (event) => { + const win = BrowserWindow.fromWebContents(event.sender) + if (win?.isMaximized()) { + win.unmaximize() + } else { + win?.maximize() + } + }) + + ipcMain.on("window-close", (event) => { + const win = BrowserWindow.fromWebContents(event.sender) + win?.close() + }) + + // ==================== File Dialogs ==================== + + ipcMain.handle("dialog-open-file", async (event) => { + const win = BrowserWindow.fromWebContents(event.sender) + if (!win) return null + + const result = await dialog.showOpenDialog(win, { + properties: ["openFile"], + filters: [ + { name: "Draw.io Files", extensions: ["drawio", "xml"] }, + { name: "All Files", extensions: ["*"] }, + ], + }) + + if (result.canceled || result.filePaths.length === 0) { + return null + } + + // Read the file content + const fs = await import("node:fs/promises") + try { + const content = await fs.readFile(result.filePaths[0], "utf-8") + return content + } catch (error) { + console.error("Failed to read file:", error) + return null + } + }) + + ipcMain.handle("dialog-save-file", async (event, data: string) => { + const win = BrowserWindow.fromWebContents(event.sender) + if (!win) return false + + const result = await dialog.showSaveDialog(win, { + filters: [ + { name: "Draw.io Files", extensions: ["drawio"] }, + { name: "XML Files", extensions: ["xml"] }, + ], + }) + + if (result.canceled || !result.filePath) { + return false + } + + const fs = await import("node:fs/promises") + try { + await fs.writeFile(result.filePath, data, "utf-8") + return true + } catch (error) { + console.error("Failed to save file:", error) + return false + } + }) + + // ==================== Config Presets ==================== + + ipcMain.handle("config-presets:get-all", () => { + return getAllPresets() + }) + + ipcMain.handle("config-presets:get-current", () => { + return getCurrentPreset() + }) + + ipcMain.handle("config-presets:get-current-id", () => { + return getCurrentPresetId() + }) + + ipcMain.handle( + "config-presets:save", + ( + _event, + preset: Omit & { + id?: string + }, + ) => { + // Validate preset name + if (typeof preset.name !== "string" || !preset.name.trim()) { + throw new Error("Invalid preset name") + } + + // Sanitize config to only allow whitelisted keys + const sanitizedConfig = sanitizePresetConfig(preset.config ?? {}) + + if (preset.id) { + // Update existing preset + return updatePreset(preset.id, { + name: preset.name.trim(), + config: sanitizedConfig, + }) + } + // Create new preset + return createPreset({ + name: preset.name.trim(), + config: sanitizedConfig, + }) + }, + ) + + ipcMain.handle("config-presets:delete", (_event, id: string) => { + return deletePreset(id) + }) + + ipcMain.handle("config-presets:apply", async (_event, id: string) => { + const env = applyPresetToEnv(id) + if (!env) { + return { success: false, error: "Preset not found" } + } + + const isDev = process.env.NODE_ENV === "development" + + if (isDev) { + // In development mode, the config file change will trigger + // the file watcher in electron-dev.mjs to restart Next.js + // We just need to save the preset (already done in applyPresetToEnv) + return { success: true, env, devMode: true } + } + + // Production mode: restart the Next.js server to apply new environment variables + try { + await restartNextServer() + return { success: true, env } + } catch (error) { + return { + success: false, + error: + error instanceof Error + ? error.message + : "Failed to restart server", + } + } + }) + + ipcMain.handle( + "config-presets:set-current", + (_event, id: string | null) => { + return setCurrentPreset(id) + }, + ) +} diff --git a/electron/main/next-server.ts b/electron/main/next-server.ts new file mode 100644 index 0000000..fce07ec --- /dev/null +++ b/electron/main/next-server.ts @@ -0,0 +1,161 @@ +import { existsSync } from "node:fs" +import path from "node:path" +import { app, type UtilityProcess, utilityProcess } from "electron" +import { + findAvailablePort, + getAllocatedPort, + getServerUrl, + isPortAvailable, +} from "./port-manager" + +let serverProcess: UtilityProcess | null = null + +/** + * Get the path to the standalone server resources + * In packaged app: resources/standalone + * In development: .next/standalone + */ +function getResourcePath(): string { + if (app.isPackaged) { + return path.join(process.resourcesPath, "standalone") + } + return path.join(app.getAppPath(), ".next", "standalone") +} + +/** + * Wait for the server to be ready by polling the health endpoint + */ +async function waitForServer(url: string, timeout = 30000): Promise { + const start = Date.now() + while (Date.now() - start < timeout) { + try { + const response = await fetch(url) + if (response.ok || response.status < 500) { + return + } + } catch { + // Server not ready yet + } + await new Promise((resolve) => setTimeout(resolve, 100)) + } + throw new Error(`Server startup timeout after ${timeout}ms`) +} + +/** + * Start the Next.js standalone server using Electron's utilityProcess + * This API is designed for running Node.js code in the background + */ +export async function startNextServer(): Promise { + const resourcePath = getResourcePath() + const serverPath = path.join(resourcePath, "server.js") + + console.log(`Starting Next.js server from: ${resourcePath}`) + console.log(`Server script path: ${serverPath}`) + + // Verify server script exists before attempting to start + if (!existsSync(serverPath)) { + throw new Error( + `Server script not found at ${serverPath}. ` + + "Please ensure the app was built correctly with 'npm run build'.", + ) + } + + // Find an available port (random in production, fixed in development) + const port = await findAvailablePort() + console.log(`Using port: ${port}`) + + // Set up environment variables + const env: Record = { + NODE_ENV: "production", + PORT: String(port), + HOSTNAME: "localhost", + } + + // Set cache directory to a writable location (user's app data folder) + // This is necessary because the packaged app might be on a read-only volume + if (app.isPackaged) { + const cacheDir = path.join(app.getPath("userData"), "cache") + env.NEXT_CACHE_DIR = cacheDir + } + + // Copy existing environment variables + for (const [key, value] of Object.entries(process.env)) { + if (value !== undefined && !env[key]) { + env[key] = value + } + } + + // Use Electron's utilityProcess API for running Node.js in background + // This is the recommended way to run Node.js code in Electron + serverProcess = utilityProcess.fork(serverPath, [], { + cwd: resourcePath, + env, + stdio: "pipe", + }) + + serverProcess.stdout?.on("data", (data) => { + console.log(`[Next.js] ${data.toString().trim()}`) + }) + + serverProcess.stderr?.on("data", (data) => { + console.error(`[Next.js Error] ${data.toString().trim()}`) + }) + + serverProcess.on("exit", (code) => { + console.log(`Next.js server exited with code ${code}`) + serverProcess = null + }) + + const url = getServerUrl() + await waitForServer(url) + console.log(`Next.js server started at ${url}`) + + return url +} + +/** + * Stop the Next.js server process + */ +export function stopNextServer(): void { + if (serverProcess) { + console.log("Stopping Next.js server...") + serverProcess.kill() + serverProcess = null + } +} + +/** + * Wait for the server to fully stop + */ +async function waitForServerStop(timeout = 5000): Promise { + const port = getAllocatedPort() + if (port === null) { + return + } + + const start = Date.now() + while (Date.now() - start < timeout) { + const available = await isPortAvailable(port) + if (available) { + return + } + await new Promise((resolve) => setTimeout(resolve, 100)) + } + console.warn("Server stop timeout, port may still be in use") +} + +/** + * Restart the Next.js server with new environment variables + */ +export async function restartNextServer(): Promise { + console.log("Restarting Next.js server...") + + // Stop the current server + stopNextServer() + + // Wait for the port to be released + await waitForServerStop() + + // Start the server again + return startNextServer() +} diff --git a/electron/main/port-manager.ts b/electron/main/port-manager.ts new file mode 100644 index 0000000..eb45379 --- /dev/null +++ b/electron/main/port-manager.ts @@ -0,0 +1,129 @@ +import net from "node:net" +import { app } from "electron" + +/** + * Port configuration + */ +const PORT_CONFIG = { + // Development mode uses fixed port for hot reload compatibility + development: 6002, + // Production mode port range (will find first available) + production: { + min: 10000, + max: 65535, + }, + // Maximum attempts to find an available port + maxAttempts: 100, +} + +/** + * Currently allocated port (cached after first allocation) + */ +let allocatedPort: number | null = null + +/** + * Check if a specific port is available + */ +export function isPortAvailable(port: number): Promise { + return new Promise((resolve) => { + const server = net.createServer() + server.once("error", () => resolve(false)) + server.once("listening", () => { + server.close() + resolve(true) + }) + server.listen(port, "127.0.0.1") + }) +} + +/** + * Generate a random port within the production range + */ +function getRandomPort(): number { + const { min, max } = PORT_CONFIG.production + return Math.floor(Math.random() * (max - min + 1)) + min +} + +/** + * Find an available port + * - In development: uses fixed port (6002) + * - In production: finds a random available port + * - If a port was previously allocated, verifies it's still available + * + * @param reuseExisting If true, try to reuse the previously allocated port + * @returns Promise The available port + * @throws Error if no available port found after max attempts + */ +export async function findAvailablePort(reuseExisting = true): Promise { + const isDev = !app.isPackaged + + // Try to reuse cached port if requested and available + if (reuseExisting && allocatedPort !== null) { + const available = await isPortAvailable(allocatedPort) + if (available) { + return allocatedPort + } + console.warn( + `Previously allocated port ${allocatedPort} is no longer available`, + ) + allocatedPort = null + } + + if (isDev) { + // Development mode: use fixed port + const port = PORT_CONFIG.development + const available = await isPortAvailable(port) + if (available) { + allocatedPort = port + return port + } + console.warn( + `Development port ${port} is in use, finding alternative...`, + ) + } + + // Production mode or dev port unavailable: find random available port + for (let attempt = 0; attempt < PORT_CONFIG.maxAttempts; attempt++) { + const port = isDev + ? PORT_CONFIG.development + attempt + 1 + : getRandomPort() + + const available = await isPortAvailable(port) + if (available) { + allocatedPort = port + console.log(`Allocated port: ${port}`) + return port + } + } + + throw new Error( + `Failed to find available port after ${PORT_CONFIG.maxAttempts} attempts`, + ) +} + +/** + * Get the currently allocated port + * Returns null if no port has been allocated yet + */ +export function getAllocatedPort(): number | null { + return allocatedPort +} + +/** + * Reset the allocated port (useful for testing or restart scenarios) + */ +export function resetAllocatedPort(): void { + allocatedPort = null +} + +/** + * Get the server URL with the allocated port + */ +export function getServerUrl(): string { + if (allocatedPort === null) { + throw new Error( + "No port allocated yet. Call findAvailablePort() first.", + ) + } + return `http://localhost:${allocatedPort}` +} diff --git a/electron/main/settings-window.ts b/electron/main/settings-window.ts new file mode 100644 index 0000000..b5ee490 --- /dev/null +++ b/electron/main/settings-window.ts @@ -0,0 +1,78 @@ +import path from "node:path" +import { app, BrowserWindow, ipcMain } from "electron" + +let settingsWindow: BrowserWindow | null = null + +/** + * Create and show the settings window + */ +export function showSettingsWindow(parentWindow?: BrowserWindow): void { + // If settings window already exists, focus it + if (settingsWindow && !settingsWindow.isDestroyed()) { + settingsWindow.focus() + return + } + + // Determine path to settings preload script + // In compiled output: dist-electron/preload/settings.js + const preloadPath = path.join(__dirname, "..", "preload", "settings.js") + + // Determine path to settings HTML + // In packaged app: app.asar/dist-electron/settings/index.html + // In development: electron/settings/index.html + const settingsHtmlPath = app.isPackaged + ? path.join(__dirname, "..", "settings", "index.html") + : path.join(__dirname, "..", "..", "electron", "settings", "index.html") + + settingsWindow = new BrowserWindow({ + width: 600, + height: 700, + minWidth: 500, + minHeight: 500, + parent: parentWindow, + modal: false, + show: false, + title: "Settings - Next AI Draw.io", + webPreferences: { + preload: preloadPath, + contextIsolation: true, + nodeIntegration: false, + sandbox: true, + }, + }) + settingsWindow.loadFile(settingsHtmlPath) + + settingsWindow.once("ready-to-show", () => { + settingsWindow?.show() + }) + + settingsWindow.on("closed", () => { + settingsWindow = null + }) +} + +/** + * Close the settings window if it exists + */ +export function closeSettingsWindow(): void { + if (settingsWindow && !settingsWindow.isDestroyed()) { + settingsWindow.close() + settingsWindow = null + } +} + +/** + * Check if settings window is open + */ +export function isSettingsWindowOpen(): boolean { + return settingsWindow !== null && !settingsWindow.isDestroyed() +} + +/** + * Register settings window IPC handlers + */ +export function registerSettingsWindowHandlers(): void { + ipcMain.on("settings:close", () => { + closeSettingsWindow() + }) +} diff --git a/electron/main/window-manager.ts b/electron/main/window-manager.ts new file mode 100644 index 0000000..d4eb6ac --- /dev/null +++ b/electron/main/window-manager.ts @@ -0,0 +1,84 @@ +import path from "node:path" +import { app, BrowserWindow, screen } from "electron" + +let mainWindow: BrowserWindow | null = null + +/** + * Get the icon path based on platform + * Note: electron-builder converts icon.png during packaging, + * but at runtime we use PNG directly - Electron handles it + */ +function getIconPath(): string | undefined { + // macOS doesn't need explicit icon - it's embedded in the app bundle + if (process.platform === "darwin" && app.isPackaged) { + return undefined + } + + const iconName = "icon.png" + + if (app.isPackaged) { + return path.join(process.resourcesPath, iconName) + } + + // Development: use icon.png from resources + return path.join(__dirname, "../../resources/icon.png") +} + +/** + * Create the main application window + */ +export function createWindow(serverUrl: string): BrowserWindow { + const { width, height } = screen.getPrimaryDisplay().workAreaSize + + mainWindow = new BrowserWindow({ + width: Math.min(1400, Math.floor(width * 0.9)), + height: Math.min(900, Math.floor(height * 0.9)), + minWidth: 800, + minHeight: 600, + title: "Next AI Draw.io", + icon: getIconPath(), + show: false, // Don't show until ready + webPreferences: { + preload: path.join(__dirname, "../preload/index.js"), + contextIsolation: true, + nodeIntegration: false, + sandbox: true, + webSecurity: true, + }, + }) + + // Load the Next.js application + mainWindow.loadURL(serverUrl) + + // Show window when ready to prevent flashing + mainWindow.once("ready-to-show", () => { + mainWindow?.show() + }) + + // Open DevTools in development + if (process.env.NODE_ENV === "development") { + mainWindow.webContents.openDevTools() + } + + mainWindow.on("closed", () => { + mainWindow = null + }) + + // Handle page title updates + mainWindow.webContents.on("page-title-updated", (event, title) => { + if (title && !title.includes("localhost")) { + mainWindow?.setTitle(title) + } else { + event.preventDefault() + } + }) + + return mainWindow +} + +/** + * Get the main window instance + */ +export function getMainWindow(): BrowserWindow | null { + return mainWindow +} diff --git a/electron/preload/index.ts b/electron/preload/index.ts new file mode 100644 index 0000000..2b460c7 --- /dev/null +++ b/electron/preload/index.ts @@ -0,0 +1,24 @@ +import { contextBridge, ipcRenderer } from "electron" + +/** + * Expose safe APIs to the renderer process + */ +contextBridge.exposeInMainWorld("electronAPI", { + // Platform information + platform: process.platform, + + // Check if running in Electron + isElectron: true, + + // Application version + getVersion: () => ipcRenderer.invoke("get-version"), + + // Window controls (optional, for custom title bar) + minimize: () => ipcRenderer.send("window-minimize"), + maximize: () => ipcRenderer.send("window-maximize"), + close: () => ipcRenderer.send("window-close"), + + // File operations + openFile: () => ipcRenderer.invoke("dialog-open-file"), + saveFile: (data: string) => ipcRenderer.invoke("dialog-save-file", data), +}) diff --git a/electron/preload/settings.ts b/electron/preload/settings.ts new file mode 100644 index 0000000..d3fe011 --- /dev/null +++ b/electron/preload/settings.ts @@ -0,0 +1,35 @@ +/** + * Preload script for settings window + * Exposes APIs for managing configuration presets + */ +import { contextBridge, ipcRenderer } from "electron" + +// Expose settings API to the renderer process +contextBridge.exposeInMainWorld("settingsAPI", { + // Get all presets + getPresets: () => ipcRenderer.invoke("config-presets:get-all"), + + // Get current preset ID + getCurrentPresetId: () => + ipcRenderer.invoke("config-presets:get-current-id"), + + // Get current preset + getCurrentPreset: () => ipcRenderer.invoke("config-presets:get-current"), + + // Save (create or update) a preset + savePreset: (preset: { + id?: string + name: string + config: Record + }) => ipcRenderer.invoke("config-presets:save", preset), + + // Delete a preset + deletePreset: (id: string) => + ipcRenderer.invoke("config-presets:delete", id), + + // Apply a preset (sets environment variables and restarts server) + applyPreset: (id: string) => ipcRenderer.invoke("config-presets:apply", id), + + // Close settings window + close: () => ipcRenderer.send("settings:close"), +}) diff --git a/electron/settings/index.html b/electron/settings/index.html new file mode 100644 index 0000000..9c91eb5 --- /dev/null +++ b/electron/settings/index.html @@ -0,0 +1,110 @@ + + + + + + + Settings - Next AI Draw.io + + + +
+

Configuration Presets

+ +
+

Presets

+
+ +
+ +
+
+ + + + + + + + +
+ + + + diff --git a/electron/settings/settings.css b/electron/settings/settings.css new file mode 100644 index 0000000..8d4ee4a --- /dev/null +++ b/electron/settings/settings.css @@ -0,0 +1,311 @@ +:root { + --bg-primary: #ffffff; + --bg-secondary: #f5f5f5; + --bg-hover: #e8e8e8; + --text-primary: #1a1a1a; + --text-secondary: #666666; + --border-color: #e0e0e0; + --accent-color: #0066cc; + --accent-hover: #0052a3; + --danger-color: #dc3545; + --success-color: #28a745; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg-primary: #1a1a1a; + --bg-secondary: #2d2d2d; + --bg-hover: #3d3d3d; + --text-primary: #ffffff; + --text-secondary: #a0a0a0; + --border-color: #404040; + --accent-color: #4da6ff; + --accent-hover: #66b3ff; + } +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, + sans-serif; + background-color: var(--bg-primary); + color: var(--text-primary); + line-height: 1.5; +} + +.container { + max-width: 560px; + margin: 0 auto; + padding: 24px; +} + +h1 { + font-size: 24px; + font-weight: 600; + margin-bottom: 24px; + padding-bottom: 16px; + border-bottom: 1px solid var(--border-color); +} + +h2 { + font-size: 16px; + font-weight: 600; + margin-bottom: 16px; + color: var(--text-secondary); +} + +.section { + margin-bottom: 32px; +} + +.preset-list { + display: flex; + flex-direction: column; + gap: 12px; + margin-bottom: 16px; +} + +.preset-card { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 16px; + cursor: pointer; + transition: all 0.2s ease; +} + +.preset-card:hover { + background: var(--bg-hover); +} + +.preset-card.active { + border-color: var(--accent-color); + box-shadow: 0 0 0 1px var(--accent-color); +} + +.preset-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 8px; +} + +.preset-name { + font-weight: 600; + font-size: 15px; +} + +.preset-badge { + background: var(--accent-color); + color: white; + font-size: 11px; + padding: 2px 8px; + border-radius: 10px; +} + +.preset-info { + font-size: 13px; + color: var(--text-secondary); +} + +.preset-actions { + display: flex; + gap: 8px; + margin-top: 12px; +} + +.btn { + padding: 8px 16px; + border: none; + border-radius: 6px; + font-size: 14px; + cursor: pointer; + transition: all 0.2s ease; + font-weight: 500; +} + +.btn-primary { + background: var(--accent-color); + color: white; +} + +.btn-primary:hover { + background: var(--accent-hover); +} + +.btn-secondary { + background: var(--bg-secondary); + color: var(--text-primary); + border: 1px solid var(--border-color); +} + +.btn-secondary:hover { + background: var(--bg-hover); +} + +.btn-danger { + background: var(--danger-color); + color: white; +} + +.btn-danger:hover { + opacity: 0.9; +} + +.btn-sm { + padding: 6px 12px; + font-size: 13px; +} + +.empty-state { + text-align: center; + padding: 40px 20px; + color: var(--text-secondary); +} + +.empty-state p { + margin-bottom: 16px; +} + +/* Modal */ +.modal-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 100; + align-items: center; + justify-content: center; +} + +.modal-overlay.show { + display: flex; +} + +.modal { + background: var(--bg-primary); + border-radius: 12px; + width: 90%; + max-width: 480px; + max-height: 90vh; + overflow-y: auto; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); +} + +.modal-header { + padding: 20px 24px; + border-bottom: 1px solid var(--border-color); +} + +.modal-header h3 { + font-size: 18px; + font-weight: 600; +} + +.modal-body { + padding: 24px; +} + +.modal-footer { + padding: 16px 24px; + border-top: 1px solid var(--border-color); + display: flex; + justify-content: flex-end; + gap: 12px; +} + +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + font-size: 14px; + font-weight: 500; + margin-bottom: 6px; +} + +.form-group input, +.form-group select { + width: 100%; + padding: 10px 12px; + border: 1px solid var(--border-color); + border-radius: 6px; + font-size: 14px; + background: var(--bg-primary); + color: var(--text-primary); +} + +.form-group input:focus, +.form-group select:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.2); +} + +.form-group .hint { + font-size: 12px; + color: var(--text-secondary); + margin-top: 4px; +} + +.loading { + display: inline-block; + width: 16px; + height: 16px; + border: 2px solid var(--border-color); + border-top-color: var(--accent-color); + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.toast { + position: fixed; + bottom: 24px; + left: 50%; + transform: translateX(-50%); + background: var(--text-primary); + color: var(--bg-primary); + padding: 12px 24px; + border-radius: 8px; + font-size: 14px; + z-index: 200; + opacity: 0; + transition: opacity 0.3s ease; +} + +.toast.show { + opacity: 1; +} + +.toast.success { + background: var(--success-color); + color: white; +} + +.toast.error { + background: var(--danger-color); + color: white; +} + +/* Inline style replacements */ +.delete-warning { + color: var(--text-secondary); + margin-top: 8px; + font-size: 14px; +} diff --git a/electron/settings/settings.js b/electron/settings/settings.js new file mode 100644 index 0000000..3e550c9 --- /dev/null +++ b/electron/settings/settings.js @@ -0,0 +1,311 @@ +// Settings page JavaScript +// This file handles the UI interactions for the settings window + +let presets = [] +let currentPresetId = null +let editingPresetId = null +let deletingPresetId = null + +// DOM Elements +const presetList = document.getElementById("preset-list") +const addPresetBtn = document.getElementById("add-preset-btn") +const presetModal = document.getElementById("preset-modal") +const deleteModal = document.getElementById("delete-modal") +const presetForm = document.getElementById("preset-form") +const modalTitle = document.getElementById("modal-title") +const toast = document.getElementById("toast") + +// Form fields +const presetIdField = document.getElementById("preset-id") +const presetNameField = document.getElementById("preset-name") +const aiProviderField = document.getElementById("ai-provider") +const aiModelField = document.getElementById("ai-model") +const aiApiKeyField = document.getElementById("ai-api-key") +const aiBaseUrlField = document.getElementById("ai-base-url") +const temperatureField = document.getElementById("temperature") + +// Buttons +const cancelBtn = document.getElementById("cancel-btn") +const saveBtn = document.getElementById("save-btn") +const deleteCancelBtn = document.getElementById("delete-cancel-btn") +const deleteConfirmBtn = document.getElementById("delete-confirm-btn") + +// Initialize +document.addEventListener("DOMContentLoaded", async () => { + await loadPresets() + setupEventListeners() +}) + +// Load presets from main process +async function loadPresets() { + try { + presets = await window.settingsAPI.getPresets() + currentPresetId = await window.settingsAPI.getCurrentPresetId() + renderPresets() + } catch (error) { + console.error("Failed to load presets:", error) + showToast("Failed to load presets", "error") + } +} + +// Render presets list +function renderPresets() { + if (presets.length === 0) { + presetList.innerHTML = ` +
+

No presets configured yet.

+

Add a preset to quickly switch between different AI configurations.

+
+ ` + return + } + + presetList.innerHTML = presets + .map((preset) => { + const isActive = preset.id === currentPresetId + const providerLabel = getProviderLabel(preset.config.AI_PROVIDER) + + return ` +
+
+ ${escapeHtml(preset.name)} + ${isActive ? 'Active' : ""} +
+
+ ${providerLabel ? `Provider: ${providerLabel}` : "No provider configured"} + ${preset.config.AI_MODEL ? ` • Model: ${escapeHtml(preset.config.AI_MODEL)}` : ""} +
+
+ ${!isActive ? `` : ""} + + +
+
+ ` + }) + .join("") + + // Add event listeners to buttons + presetList.querySelectorAll(".apply-btn").forEach((btn) => { + btn.addEventListener("click", (e) => { + e.stopPropagation() + applyPreset(btn.dataset.id) + }) + }) + + presetList.querySelectorAll(".edit-btn").forEach((btn) => { + btn.addEventListener("click", (e) => { + e.stopPropagation() + openEditModal(btn.dataset.id) + }) + }) + + presetList.querySelectorAll(".delete-btn").forEach((btn) => { + btn.addEventListener("click", (e) => { + e.stopPropagation() + openDeleteModal(btn.dataset.id) + }) + }) +} + +// Setup event listeners +function setupEventListeners() { + addPresetBtn.addEventListener("click", () => openAddModal()) + cancelBtn.addEventListener("click", () => closeModal()) + saveBtn.addEventListener("click", () => savePreset()) + deleteCancelBtn.addEventListener("click", () => closeDeleteModal()) + deleteConfirmBtn.addEventListener("click", () => confirmDelete()) + + // Close modal on overlay click + presetModal.addEventListener("click", (e) => { + if (e.target === presetModal) closeModal() + }) + deleteModal.addEventListener("click", (e) => { + if (e.target === deleteModal) closeDeleteModal() + }) + + // Handle Enter key in form + presetForm.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + e.preventDefault() + savePreset() + } + }) +} + +// Open add modal +function openAddModal() { + editingPresetId = null + modalTitle.textContent = "Add Preset" + presetForm.reset() + presetIdField.value = "" + presetModal.classList.add("show") + presetNameField.focus() +} + +// Open edit modal +function openEditModal(id) { + const preset = presets.find((p) => p.id === id) + if (!preset) return + + editingPresetId = id + modalTitle.textContent = "Edit Preset" + + presetIdField.value = preset.id + presetNameField.value = preset.name + aiProviderField.value = preset.config.AI_PROVIDER || "" + aiModelField.value = preset.config.AI_MODEL || "" + aiApiKeyField.value = preset.config.AI_API_KEY || "" + aiBaseUrlField.value = preset.config.AI_BASE_URL || "" + temperatureField.value = preset.config.TEMPERATURE || "" + + presetModal.classList.add("show") + presetNameField.focus() +} + +// Close modal +function closeModal() { + presetModal.classList.remove("show") + editingPresetId = null +} + +// Open delete modal +function openDeleteModal(id) { + const preset = presets.find((p) => p.id === id) + if (!preset) return + + deletingPresetId = id + document.getElementById("delete-preset-name").textContent = preset.name + deleteModal.classList.add("show") +} + +// Close delete modal +function closeDeleteModal() { + deleteModal.classList.remove("show") + deletingPresetId = null +} + +// Save preset +async function savePreset() { + const name = presetNameField.value.trim() + if (!name) { + showToast("Please enter a preset name", "error") + presetNameField.focus() + return + } + + const preset = { + id: editingPresetId || undefined, + name: name, + config: { + AI_PROVIDER: aiProviderField.value || undefined, + AI_MODEL: aiModelField.value.trim() || undefined, + AI_API_KEY: aiApiKeyField.value.trim() || undefined, + AI_BASE_URL: aiBaseUrlField.value.trim() || undefined, + TEMPERATURE: temperatureField.value.trim() || undefined, + }, + } + + // Remove undefined values + Object.keys(preset.config).forEach((key) => { + if (preset.config[key] === undefined) { + delete preset.config[key] + } + }) + + try { + saveBtn.disabled = true + saveBtn.innerHTML = '' + + await window.settingsAPI.savePreset(preset) + await loadPresets() + closeModal() + showToast( + editingPresetId ? "Preset updated" : "Preset created", + "success", + ) + } catch (error) { + console.error("Failed to save preset:", error) + showToast("Failed to save preset", "error") + } finally { + saveBtn.disabled = false + saveBtn.textContent = "Save" + } +} + +// Confirm delete +async function confirmDelete() { + if (!deletingPresetId) return + + try { + deleteConfirmBtn.disabled = true + deleteConfirmBtn.innerHTML = '' + + await window.settingsAPI.deletePreset(deletingPresetId) + await loadPresets() + closeDeleteModal() + showToast("Preset deleted", "success") + } catch (error) { + console.error("Failed to delete preset:", error) + showToast("Failed to delete preset", "error") + } finally { + deleteConfirmBtn.disabled = false + deleteConfirmBtn.textContent = "Delete" + } +} + +// Apply preset +async function applyPreset(id) { + try { + const btn = presetList.querySelector(`.apply-btn[data-id="${id}"]`) + if (btn) { + btn.disabled = true + btn.innerHTML = '' + } + + const result = await window.settingsAPI.applyPreset(id) + if (result.success) { + currentPresetId = id + renderPresets() + showToast("Preset applied, server restarting...", "success") + } else { + showToast(result.error || "Failed to apply preset", "error") + } + } catch (error) { + console.error("Failed to apply preset:", error) + showToast("Failed to apply preset", "error") + } +} + +// Get provider display label +function getProviderLabel(provider) { + const labels = { + openai: "OpenAI", + anthropic: "Anthropic", + google: "Google AI", + azure: "Azure OpenAI", + bedrock: "AWS Bedrock", + openrouter: "OpenRouter", + deepseek: "DeepSeek", + siliconflow: "SiliconFlow", + ollama: "Ollama", + } + return labels[provider] || provider +} + +// Show toast notification +function showToast(message, type = "") { + toast.textContent = message + toast.className = "toast show" + (type ? ` ${type}` : "") + + setTimeout(() => { + toast.classList.remove("show") + }, 3000) +} + +// Escape HTML to prevent XSS +function escapeHtml(text) { + const div = document.createElement("div") + div.textContent = text + return div.innerHTML +} diff --git a/electron/tsconfig.json b/electron/tsconfig.json new file mode 100644 index 0000000..6b163d3 --- /dev/null +++ b/electron/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node", + "lib": ["ES2022"], + "outDir": "../dist-electron", + "rootDir": ".", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "declaration": false, + "sourceMap": true + }, + "include": ["./**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/package-lock.json b/package-lock.json index ed470c1..c3f6f49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,12 +74,19 @@ "@types/pako": "^2.0.3", "@types/react": "^19", "@types/react-dom": "^19", + "concurrently": "^9.2.1", + "cross-env": "^10.1.0", + "electron": "^39.2.7", + "electron-builder": "^26.0.12", + "esbuild": "^0.27.2", "eslint": "9.39.1", "eslint-config-next": "16.0.5", "husky": "^9.1.7", "lint-staged": "^16.2.7", + "shx": "^0.4.0", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5", + "wait-on": "^9.0.3" } }, "node_modules/@ai-sdk/amazon-bedrock": { @@ -1692,6 +1699,550 @@ "node": ">=18" } }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.18", + "resolved": "https://registry.npmmirror.com/@electron/asar/-/asar-3.2.18.tgz", + "integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/fuses/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/fuses/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/node-gyp": { + "version": "10.2.0-electron.1", + "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "integrity": "sha512-CrYo6TntjpoMO1SHjl5Pa/JoUsECNqNdB7Kx49WLQpWzPw53eEITJ2Hs9fh/ryUYDn4pxZz11StaBYBrLFJdqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^8.1.0", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.2.1", + "nopt": "^6.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/node-gyp/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/node-gyp/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/node-gyp/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.3.1.tgz", + "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/@electron/rebuild/-/rebuild-3.7.0.tgz", + "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/rebuild/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/windows-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@emnapi/core": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", @@ -1725,6 +2276,455 @@ "tslib": "^2.4.0" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -1916,6 +2916,67 @@ "tslib": "^2.8.0" } }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/tlds": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@hapi/tlds/-/tlds-1.1.4.tgz", + "integrity": "sha512-Fq+20dxsxLaUn5jSSWrdtSRcIUba2JquuorF9UW1wIJS5cSUwxIsO2GIhaWynPRflvxSzFN+gxKte2HEW1OuoA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/topo": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2434,6 +3495,96 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2540,6 +3691,84 @@ "@opentelemetry/api": "^1.9.0" } }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -2758,6 +3987,35 @@ "node": ">=12.4.0" } }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@openrouter/ai-sdk-provider": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.2.3.tgz", @@ -2995,6 +4253,17 @@ "node": ">=14" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -4581,6 +5850,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@smithy/abort-controller": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", @@ -5191,6 +6473,19 @@ "tslib": "^2.8.0" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tailwindcss/node": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.2.tgz", @@ -5441,6 +6736,16 @@ "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -5452,6 +6757,19 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -5476,6 +6794,16 @@ "@types/estree": "*" } }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -5485,6 +6813,13 @@ "@types/unist": "*" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -5499,6 +6834,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -5537,6 +6882,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, "node_modules/@types/prismjs": { "version": "1.26.5", "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", @@ -5562,12 +6919,41 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmmirror.com/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.48.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.0.tgz", @@ -6118,6 +7504,20 @@ "node": ">=14.6" } }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -6150,6 +7550,33 @@ "node": ">= 14" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ai": { "version": "5.0.107", "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.107.tgz", @@ -6202,6 +7629,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/ansi-escapes": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", @@ -6247,6 +7684,116 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/app-builder-bin": { + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "26.0.12", + "resolved": "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-26.0.12.tgz", + "integrity": "sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/asar": "3.2.18", + "@electron/fuses": "^1.8.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.1", + "@electron/rebuild": "3.7.0", + "@electron/universal": "2.0.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "chromium-pickle-js": "^0.2.0", + "config-file-ts": "0.2.8-rc1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.0.11", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.0.0", + "plist": "3.1.0", + "resedit": "^1.7.0", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.0.12", + "electron-builder-squirrel-windows": "26.0.12" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6436,6 +7983,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -6443,6 +8001,34 @@ "dev": true, "license": "MIT" }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -6459,6 +8045,16 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -6491,6 +8087,18 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -6554,6 +8162,27 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/bowser": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", @@ -6618,6 +8247,239 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.0.11", + "resolved": "https://registry.npmmirror.com/builder-util/-/builder-util-26.0.11.tgz", + "integrity": "sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.3.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.3.1", + "resolved": "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz", + "integrity": "sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmmirror.com/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -6764,6 +8626,39 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -6776,6 +8671,16 @@ "url": "https://polar.sh/cva" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -6792,6 +8697,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-truncate": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", @@ -6815,6 +8733,117 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -6883,6 +8912,16 @@ "node": ">=20" } }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6890,6 +8929,115 @@ "dev": true, "license": "MIT" }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/config-file-ts": { + "version": "0.2.8-rc1", + "resolved": "https://registry.npmmirror.com/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", + "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.12", + "typescript": "^5.4.3" + } + }, + "node_modules/config-file-ts/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -6897,6 +9045,52 @@ "dev": true, "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7054,6 +9248,35 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7061,6 +9284,29 @@ "dev": true, "license": "MIT" }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -7125,6 +9371,14 @@ "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -7144,6 +9398,100 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dmg-builder": { + "version": "26.0.12", + "resolved": "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-26.0.12.tgz", + "integrity": "sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -7157,6 +9505,35 @@ "node": ">=0.10.0" } }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -7171,6 +9548,180 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "39.2.7", + "resolved": "https://registry.npmmirror.com/electron/-/electron-39.2.7.tgz", + "integrity": "sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "26.0.12", + "resolved": "https://registry.npmmirror.com/electron-builder/-/electron-builder-26.0.12.tgz", + "integrity": "sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "chalk": "^4.1.2", + "dmg-builder": "26.0.12", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.0.12", + "resolved": "https://registry.npmmirror.com/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.12.tgz", + "integrity": "sha512-kpwXM7c/ayRUbYVErQbsZ0nQZX4aLHQrPEG9C4h9vuJCXylwFH8a7Jgi2VpKIObzCXO7LKHiCw4KdioFLFOgqA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "26.0.11", + "resolved": "https://registry.npmmirror.com/electron-publish/-/electron-publish-26.0.11.tgz", + "integrity": "sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "chalk": "^4.1.2", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.262", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz", @@ -7178,6 +9729,61 @@ "dev": true, "license": "ISC" }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmmirror.com/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -7185,6 +9791,27 @@ "dev": true, "license": "MIT" }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -7211,6 +9838,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -7224,6 +9861,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -7397,6 +10041,56 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -7902,12 +10596,163 @@ "node": ">=18.0.0" } }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7987,6 +10832,16 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -8000,6 +10855,39 @@ "node": ">=16.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -8051,6 +10939,27 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -8067,6 +10976,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -8110,6 +11036,41 @@ } } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -8170,6 +11131,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-east-asian-width": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", @@ -8229,6 +11200,22 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -8260,6 +11247,28 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -8273,6 +11282,25 @@ "node": ">=10.13.0" } }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -8315,6 +11343,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmmirror.com/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -8477,6 +11531,39 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -8499,6 +11586,13 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -8512,6 +11606,20 @@ "node": ">= 14" } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -8525,6 +11633,16 @@ "node": ">= 14" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/husky": { "version": "9.1.7", "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", @@ -8541,6 +11659,118 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-corefoundation/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-corefoundation/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/iconv-corefoundation/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/iconv-corefoundation/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-corefoundation/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-corefoundation/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-corefoundation/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -8553,6 +11783,27 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -8590,6 +11841,42 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/inline-style-parser": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", @@ -8611,6 +11898,26 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -8729,6 +12036,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -8875,6 +12195,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -8994,6 +12331,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -9045,6 +12392,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -9098,6 +12458,19 @@ "dev": true, "license": "MIT" }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9123,6 +12496,40 @@ "node": ">= 0.4" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jiti": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", @@ -9133,6 +12540,25 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/joi": { + "version": "18.0.2", + "resolved": "https://registry.npmmirror.com/joi/-/joi-18.0.2.tgz", + "integrity": "sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.0.0" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/js-tiktoken": { "version": "1.0.21", "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", @@ -9242,6 +12668,14 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9255,6 +12689,16 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsonrepair": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.13.1.tgz", @@ -9310,6 +12754,13 @@ "node": ">=0.10" } }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -9622,6 +13073,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9629,6 +13087,23 @@ "dev": true, "license": "MIT" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -9678,6 +13153,16 @@ "loose-envify": "cli.js" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -9693,6 +13178,96 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmmirror.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -9703,6 +13278,34 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -10569,6 +14172,19 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -10590,6 +14206,16 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -10603,6 +14229,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10626,6 +14262,130 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/motion": { "version": "12.23.25", "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.25.tgz", @@ -10825,6 +14585,44 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.85.0", + "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.85.0.tgz", + "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -10832,6 +14630,58 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/nwsapi": { "version": "2.2.20", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", @@ -10977,6 +14827,16 @@ "zod": "^4.0.16" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", @@ -11011,6 +14871,103 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -11029,6 +14986,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -11061,6 +15038,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -11127,6 +15127,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -11144,6 +15154,55 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11176,6 +15235,31 @@ "node": ">=0.10" } }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -11229,6 +15313,36 @@ "node": ">=4" } }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmmirror.com/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11252,6 +15366,47 @@ "react": ">=16.0.0" } }, + "node_modules/proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -11298,6 +15453,24 @@ "node": ">=12.0.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -11328,6 +15501,19 @@ ], "license": "MIT" }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react": { "version": "19.1.2", "resolved": "https://registry.npmjs.org/react/-/react-19.1.2.tgz", @@ -11480,6 +15666,46 @@ } } }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -11590,6 +15816,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -11611,6 +15865,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -11631,6 +15892,19 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -11648,6 +15922,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -11666,6 +15950,42 @@ "dev": true, "license": "MIT" }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/rrweb-cssom": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", @@ -11696,6 +16016,16 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -11716,6 +16046,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -11757,6 +16108,23 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -11788,6 +16156,31 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/server-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", @@ -11911,6 +16304,85 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/shelljs/-/shelljs-0.9.2.tgz", + "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "execa": "^1.0.0", + "fast-glob": "^3.3.2", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/shelljs/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/shelljs/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/shx": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/shx/-/shx-0.4.0.tgz", + "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.8", + "shelljs": "^0.9.2" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -12000,6 +16472,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/slice-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", @@ -12030,6 +16515,60 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmmirror.com/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/sonner": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", @@ -12040,6 +16579,16 @@ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -12049,6 +16598,17 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -12059,6 +16619,27 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -12066,6 +16647,16 @@ "dev": true, "license": "MIT" }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -12080,6 +16671,16 @@ "node": ">= 0.4" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -12107,6 +16708,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -12250,6 +16907,30 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -12260,6 +16941,16 @@ "node": ">=4" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -12326,6 +17017,19 @@ } } }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12406,6 +17110,134 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/third-party-capital": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz", @@ -12431,6 +17263,26 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -12497,6 +17349,26 @@ "integrity": "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==", "license": "MIT" }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12534,6 +17406,16 @@ "node": ">=18" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -12554,6 +17436,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -12612,6 +17504,20 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -12772,6 +17678,32 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -12840,6 +17772,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpdf": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/unpdf/-/unpdf-1.4.0.tgz", @@ -12982,6 +17924,13 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -12989,6 +17938,22 @@ "dev": true, "license": "MIT" }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -13029,6 +17994,36 @@ "node": ">=18" } }, + "node_modules/wait-on": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/wait-on/-/wait-on-9.0.3.tgz", + "integrity": "sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.13.2", + "joi": "^18.0.1", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -13205,6 +18200,80 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", @@ -13243,6 +18312,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", @@ -13273,12 +18349,32 @@ "node": ">=18" } }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -13302,6 +18398,101 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 095eadf..faee511 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.4.4", "license": "Apache-2.0", "private": true, + "main": "dist-electron/main/index.js", "scripts": { "dev": "next dev --turbopack --port 6002", "build": "next build", @@ -10,7 +11,17 @@ "lint": "biome lint .", "format": "biome check --write .", "check": "biome ci", - "prepare": "husky" + "prepare": "husky", + "electron:dev": "node scripts/electron-dev.mjs", + "electron:build": "npm run build && npm run electron:compile", + "electron:compile": "npx esbuild electron/main/index.ts electron/preload/index.ts electron/preload/settings.ts --bundle --platform=node --outdir=dist-electron --external:electron --sourcemap --packages=external && npx shx cp -r electron/settings dist-electron/", + "electron:start": "npx cross-env NODE_ENV=development npx electron .", + "electron:prepare": "node scripts/prepare-electron-build.mjs", + "dist": "npm run electron:build && npm run electron:prepare && npx electron-builder", + "dist:mac": "npm run electron:build && npm run electron:prepare && npx electron-builder --mac", + "dist:win": "npm run electron:build && npm run electron:prepare && npx electron-builder --win", + "dist:linux": "npm run electron:build && npm run electron:prepare && npx electron-builder --linux", + "dist:all": "npm run electron:build && npm run electron:prepare && npx electron-builder --mac --win --linux" }, "dependencies": { "@ai-sdk/amazon-bedrock": "^3.0.70", @@ -84,11 +95,18 @@ "@types/pako": "^2.0.3", "@types/react": "^19", "@types/react-dom": "^19", + "concurrently": "^9.2.1", + "cross-env": "^10.1.0", + "electron": "^39.2.7", + "electron-builder": "^26.0.12", + "esbuild": "^0.27.2", "eslint": "9.39.1", "eslint-config-next": "16.0.5", "husky": "^9.1.7", "lint-staged": "^16.2.7", + "shx": "^0.4.0", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5", + "wait-on": "^9.0.3" } } diff --git a/resources/entitlements.mac.plist b/resources/entitlements.mac.plist new file mode 100644 index 0000000..809024b --- /dev/null +++ b/resources/entitlements.mac.plist @@ -0,0 +1,16 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..38abad4528a03a8d05be863887e62a92b78a4df1 GIT binary patch literal 55260 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 literal 0 HcmV?d00001 diff --git a/scripts/afterPack.cjs b/scripts/afterPack.cjs new file mode 100644 index 0000000..e11d96f --- /dev/null +++ b/scripts/afterPack.cjs @@ -0,0 +1,39 @@ +/** + * electron-builder afterPack hook + * Copies node_modules to the standalone directory in the packaged app + */ + +const { cpSync, existsSync } = require("fs") +const path = require("path") + +module.exports = async function (context) { + const appOutDir = context.appOutDir + const resourcesDir = path.join( + appOutDir, + context.packager.platform.name === "mac" + ? `${context.packager.appInfo.productFilename}.app/Contents/Resources` + : "resources" + ) + const standaloneDir = path.join(resourcesDir, "standalone") + const sourceNodeModules = path.join( + context.packager.projectDir, + "electron-standalone", + "node_modules" + ) + const targetNodeModules = path.join(standaloneDir, "node_modules") + + console.log(`[afterPack] Copying node_modules to ${targetNodeModules}`) + + if (existsSync(sourceNodeModules) && existsSync(standaloneDir)) { + cpSync(sourceNodeModules, targetNodeModules, { recursive: true }) + console.log("[afterPack] node_modules copied successfully") + } else { + console.error("[afterPack] Source or target directory not found!") + console.error(` Source: ${sourceNodeModules} exists: ${existsSync(sourceNodeModules)}`) + console.error(` Target dir: ${standaloneDir} exists: ${existsSync(standaloneDir)}`) + throw new Error( + "[afterPack] Failed: Required directories not found. " + + "Ensure 'npm run electron:prepare' was run before building." + ) + } +} diff --git a/scripts/electron-dev.mjs b/scripts/electron-dev.mjs new file mode 100644 index 0000000..5c1e6e9 --- /dev/null +++ b/scripts/electron-dev.mjs @@ -0,0 +1,275 @@ +#!/usr/bin/env node + +/** + * Development script for running Electron with Next.js + * 1. Reads preset configuration (if exists) + * 2. Starts Next.js dev server with preset env vars + * 3. Waits for it to be ready + * 4. Compiles Electron TypeScript + * 5. Launches Electron + * 6. Watches for preset changes and restarts Next.js + */ + +import { spawn } from "node:child_process" +import { fileURLToPath } from "node:url" +import { existsSync, readFileSync, watch } from "node:fs" +import path from "node:path" +import os from "node:os" + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const rootDir = path.join(__dirname, "..") + +const NEXT_PORT = 6002 +const NEXT_URL = `http://localhost:${NEXT_PORT}` + +/** + * Get the user data path (same as Electron's app.getPath("userData")) + */ +function getUserDataPath() { + const appName = "next-ai-draw-io" + switch (process.platform) { + case "darwin": + return path.join(os.homedir(), "Library", "Application Support", appName) + case "win32": + return path.join(process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming"), appName) + default: + return path.join(os.homedir(), ".config", appName) + } +} + +/** + * Load preset configuration from config file + */ +function loadPresetConfig() { + const configPath = path.join(getUserDataPath(), "config-presets.json") + + if (!existsSync(configPath)) { + console.log("šŸ“‹ No preset configuration found, using .env.local") + return null + } + + try { + const content = readFileSync(configPath, "utf-8") + const data = JSON.parse(content) + + if (!data.currentPresetId) { + console.log("šŸ“‹ No active preset, using .env.local") + return null + } + + const preset = data.presets.find(p => p.id === data.currentPresetId) + if (!preset) { + console.log("šŸ“‹ Active preset not found, using .env.local") + return null + } + + console.log(`šŸ“‹ Using preset: "${preset.name}"`) + return preset.config + } catch (error) { + console.error("Failed to load preset config:", error.message) + return null + } +} + +/** + * Wait for the Next.js server to be ready + */ +async function waitForServer(url, timeout = 120000) { + const start = Date.now() + console.log(`Waiting for server at ${url}...`) + + while (Date.now() - start < timeout) { + try { + const response = await fetch(url) + if (response.ok || response.status < 500) { + console.log("Server is ready!") + return true + } + } catch { + // Server not ready yet + } + await new Promise((r) => setTimeout(r, 500)) + process.stdout.write(".") + } + + throw new Error(`Timeout waiting for server at ${url}`) +} + +/** + * Run a command and wait for it to complete + */ +function runCommand(command, args, options = {}) { + return new Promise((resolve, reject) => { + const proc = spawn(command, args, { + cwd: rootDir, + stdio: "inherit", + shell: true, + ...options, + }) + + proc.on("close", (code) => { + if (code === 0) { + resolve() + } else { + reject(new Error(`Command failed with code ${code}`)) + } + }) + + proc.on("error", reject) + }) +} + +/** + * Start Next.js dev server with preset environment + */ +function startNextServer(presetEnv) { + const env = { ...process.env } + + // Apply preset environment variables + if (presetEnv) { + for (const [key, value] of Object.entries(presetEnv)) { + if (value !== undefined && value !== "") { + env[key] = value + } + } + } + + const nextProcess = spawn("npm", ["run", "dev"], { + cwd: rootDir, + stdio: "inherit", + shell: true, + env, + }) + + nextProcess.on("error", (err) => { + console.error("Failed to start Next.js:", err) + }) + + return nextProcess +} + +/** + * Main entry point + */ +async function main() { + console.log("šŸš€ Starting Electron development environment...\n") + + // Load preset configuration + const presetEnv = loadPresetConfig() + + // Start Next.js dev server with preset env + console.log("1. Starting Next.js development server...") + let nextProcess = startNextServer(presetEnv) + + // Wait for Next.js to be ready + try { + await waitForServer(NEXT_URL) + console.log("") + } catch (err) { + console.error("\nāŒ Next.js server failed to start:", err.message) + nextProcess.kill() + process.exit(1) + } + + // Compile Electron TypeScript + console.log("\n2. Compiling Electron code...") + try { + await runCommand("npm", ["run", "electron:compile"]) + } catch (err) { + console.error("āŒ Electron compilation failed:", err.message) + nextProcess.kill() + process.exit(1) + } + + // Start Electron + console.log("\n3. Starting Electron...") + const electronProcess = spawn("npm", ["run", "electron:start"], { + cwd: rootDir, + stdio: "inherit", + shell: true, + env: { + ...process.env, + NODE_ENV: "development", + ELECTRON_DEV_URL: NEXT_URL, + }, + }) + + // Watch for preset config changes + const configPath = path.join(getUserDataPath(), "config-presets.json") + let configWatcher = null + let restartPending = false + + function setupConfigWatcher() { + if (!existsSync(path.dirname(configPath))) { + // Directory doesn't exist yet, check again later + setTimeout(setupConfigWatcher, 5000) + return + } + + try { + configWatcher = watch(configPath, { persistent: false }, async (eventType) => { + if (eventType === "change" && !restartPending) { + restartPending = true + console.log("\nšŸ”„ Preset configuration changed, restarting Next.js server...") + + // Kill current Next.js process + nextProcess.kill() + + // Wait a bit for process to die + await new Promise(r => setTimeout(r, 1000)) + + // Reload preset and restart + const newPresetEnv = loadPresetConfig() + nextProcess = startNextServer(newPresetEnv) + + try { + await waitForServer(NEXT_URL) + console.log("āœ… Next.js server restarted with new configuration\n") + } catch (err) { + console.error("āŒ Failed to restart Next.js:", err.message) + } + + restartPending = false + } + }) + console.log("šŸ‘€ Watching for preset configuration changes...") + } catch (err) { + // File might not exist yet, that's ok + setTimeout(setupConfigWatcher, 5000) + } + } + + // Start watching after a delay (config file might not exist yet) + setTimeout(setupConfigWatcher, 2000) + + electronProcess.on("close", (code) => { + console.log(`\nElectron exited with code ${code}`) + if (configWatcher) configWatcher.close() + nextProcess.kill() + process.exit(code || 0) + }) + + electronProcess.on("error", (err) => { + console.error("Electron error:", err) + if (configWatcher) configWatcher.close() + nextProcess.kill() + process.exit(1) + }) + + // Handle termination signals + const cleanup = () => { + console.log("\nšŸ›‘ Shutting down...") + if (configWatcher) configWatcher.close() + electronProcess.kill() + nextProcess.kill() + process.exit(0) + } + + process.on("SIGINT", cleanup) + process.on("SIGTERM", cleanup) +} + +main().catch((err) => { + console.error("Fatal error:", err) + process.exit(1) +}) diff --git a/scripts/prepare-electron-build.mjs b/scripts/prepare-electron-build.mjs new file mode 100644 index 0000000..d2e8d0b --- /dev/null +++ b/scripts/prepare-electron-build.mjs @@ -0,0 +1,41 @@ +#!/usr/bin/env node + +/** + * Prepare standalone directory for Electron packaging + * Copies the Next.js standalone output to a temp directory + * that electron-builder can properly include + */ + +import { cpSync, rmSync, existsSync, mkdirSync } from "node:fs" +import { join } from "node:path" +import { fileURLToPath } from "node:url" + +const __dirname = fileURLToPath(new URL(".", import.meta.url)) +const rootDir = join(__dirname, "..") + +const standaloneDir = join(rootDir, ".next", "standalone") +const staticDir = join(rootDir, ".next", "static") +const targetDir = join(rootDir, "electron-standalone") + +console.log("Preparing Electron build...") + +// Clean target directory +if (existsSync(targetDir)) { + console.log("Cleaning previous build...") + rmSync(targetDir, { recursive: true }) +} + +// Create target directory +mkdirSync(targetDir, { recursive: true }) + +// Copy standalone (includes node_modules) +console.log("Copying standalone directory...") +cpSync(standaloneDir, targetDir, { recursive: true }) + +// Copy static files +console.log("Copying static files...") +const targetStaticDir = join(targetDir, ".next", "static") +mkdirSync(targetStaticDir, { recursive: true }) +cpSync(staticDir, targetStaticDir, { recursive: true }) + +console.log("Done! Files prepared in electron-standalone/") diff --git a/tsconfig.json b/tsconfig.json index fa238a0..6b47dbe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,5 +29,5 @@ ".next/types/**/*.ts", ".next/dev/types/**/*.ts" ], - "exclude": ["node_modules", "packages"] + "exclude": ["node_modules", "packages", "electron", "dist-electron"] }