diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..d0a65058
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,75 @@
+name: Release
+
+on:
+ push:
+ tags:
+ - "v*"
+
+jobs:
+ build:
+ strategy:
+ matrix:
+ os: [windows-latest, macos-latest, ubuntu-latest]
+ include:
+ - os: windows-latest
+ artifact_name: devtools-windows
+ - os: macos-latest
+ artifact_name: devtools-macos
+ - os: ubuntu-latest
+ artifact_name: devtools-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"
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build and package
+ run: npm run dist
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: devtools-${{ matrix.os }}
+ path: release/*
+ retention-days: 30
+
+ release:
+ needs: build
+ runs-on: ubuntu-latest
+ if: startsWith(github.ref, 'refs/tags/v')
+
+ permissions:
+ contents: write
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Download all artifacts
+ uses: actions/download-artifact@v4
+ with:
+ path: release-artifacts
+
+ - name: Display structure of downloaded files
+ run: ls -R release-artifacts
+
+ - name: Create Release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: release-artifacts/**/*
+ draft: false
+ prerelease: false
+ generate_release_notes: false
+ fail_on_unmatched_files: false
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 52e80a16..00000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
diff --git a/README.md b/README.md
index b3eb76af..e76b3dd0 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,6 @@ Offline-first developer utilities for macOS, Windows, and Linux. No cloud depend
- **API Response Formatter** - Format REST/GraphQL responses with interactive tree view and real-time search
- **Text Compare** - Diff viewer with line-by-line comparison
- **Case Converter** - Transform between camelCase, snake_case, kebab-case, and more
-- **SQL Formatter** - Format SQL queries with customizable indentation
- **Markdown Editor** - Live preview with export support
- **Code Playground** - Multi-language editor (JS, HTML, CSS, JSON, Markdown)
@@ -27,19 +26,20 @@ Offline-first developer utilities for macOS, Windows, and Linux. No cloud depend
### Generators
-- **UUID** - Generate v1/v4 UUIDs with batch support
+- **UUID Generator** - Generate v1/v4/v6/v7 UUIDs and ULIDs with batch support
- **Password Generator** - Generate secure passwords and passphrases with strength analysis
-- **Hash** - MD5, SHA-1, SHA-256, SHA-512
-- **QR Code** - Generate QR codes with custom size and error correction
+- **Hash Generator** - MD5, SHA-1, SHA-256, SHA-512
+- **QR Generator** - Generate QR codes with custom size and error correction
- **Color Palette** - Create monochromatic, analogous, complementary schemes
-- **Lorem Ipsum** - Generate placeholder text
+- **Lorem Generator** - Generate placeholder text
### Developer Utilities
- **JWT Decoder** - Decode and inspect JWT tokens
-- **Regex Builder** - Interactive regex construction with live testing
-- **Cron Parser** - Build cron expressions with plain English descriptions
+- **Regex Generator** - Interactive regex construction with live testing
+- **Cron Calculator** - Build cron expressions with plain English descriptions
- **Timestamp Converter** - Unix timestamp conversion with multiple formats
+- **Date Difference** - Calculate difference between two dates
- **Image Converter** - Convert between PNG, JPEG, WebP, BMP
## Quick Start
@@ -50,8 +50,8 @@ git clone https://github.com/me-shaon/devtools.git
cd devtools
npm install
-# Run locally
-npm start
+# Run locally (development mode)
+npm run dev
# Build for distribution
npm run dist
@@ -59,62 +59,73 @@ npm run dist
## Requirements
-- Node.js 14+
+- Node.js 18+
- npm or yarn
## Architecture
```
src/
-├── main.js # Electron main process
-└── renderer/
- ├── index.html # Single-page application
- ├── styles/ # CSS modules
- └── js/
- ├── main.js # App router and state
- └── tools/ # Tool implementations (23 modules)
+├── components/
+│ └── tools/ # Tool implementations (24 React components)
+├── app/
+│ └── DevToolsApp.tsx # Main app with sidebar navigation
+└── main.tsx # React entry point
+
+src-electron/
+├── main.ts # Electron main process
+└── preload.ts # Secure IPC bridge
```
-Each tool is a self-contained module with no external dependencies. All processing happens client-side.
+### Tech Stack
+- **Electron** 40+ for desktop runtime
+- **React** 18+ with TypeScript
+- **Vite** for fast builds and hot reload
+- **Tailwind CSS** for styling
+- **shadcn/ui** for UI components
+- No analytics or telemetry
## Development
-### Adding a Tool
+### Running in Development
-1. Create module in `src/renderer/js/tools/`
-2. Add HTML section in `index.html`
-3. Register in navigation sidebar
-4. Add menu item in `src/main.js`
+```bash
+npm run dev # Starts Vite dev server + Electron
+```
### Build Scripts
```bash
-npm start # Development server
-npm run build # Build executable
-npm run pack # Package without distributing
-npm run dist # Create installer
-npm test # Run test suite
-npm run security-check # Run security checks
+npm run dev # Development mode with hot reload
+npm run build # Build React app + Electron
+npm run dist # Create installers for all platforms
+npm run dist:publish # Build and publish to GitHub releases
```
-## Security
+## Releases
+
+Releases are built automatically via GitHub Actions when you push a version tag:
-This project uses GitGuardian for secret detection and follows security best practices:
+```bash
+# Create and push a version tag
+git tag v1.0.0
+git push origin v1.0.0
+```
-- 🔒 **Secret Scanning**: Automated detection of hardcoded secrets
-- 🛡️ **Pre-commit Hooks**: Prevent secrets from being committed
-- 📋 **Security Guidelines**: See [SECURITY.md](SECURITY.md) for details
-- 🔧 **Local Testing**: Run `npm run security-check` before committing
+The workflow will:
+1. Build for Windows, macOS, and Linux
+2. Create a GitHub release
+3. Attach all installer files (DMG, NSIS, AppImage)
-For security issues, please review our [Security Guidelines](SECURITY.md).
+See [RELEASE.md](RELEASE.md) for detailed release instructions.
-## Tech Stack
+## Adding a Tool
-- Electron 22+ for desktop runtime
-- Vanilla JavaScript (ES6+)
-- No framework dependencies
-- No analytics or telemetry
+1. Create component in `src/components/tools/YourTool.tsx`
+2. Add tool definition to `ALL_TOOLS` array in `src/app/DevToolsApp.tsx`
+3. Add render case in the `renderTool()` switch statement
+4. That's it! The tool will appear in the sidebar automatically
## Contributing
@@ -128,10 +139,9 @@ Pull requests welcome. For major changes, open an issue first to discuss the pro
```bash
git clone https://github.com/me-shaon/devtools.git
-cd devtools-desktop
+cd devtools
npm install
-npm start # Run in development mode
-npm test # Run test suite
+npm run dev # Run in development mode
```
## License
diff --git a/assets/screenshot.png b/assets/screenshot.png
index 6f990e65..fbc43034 100644
Binary files a/assets/screenshot.png and b/assets/screenshot.png differ
diff --git a/components.json b/components.json
new file mode 100644
index 00000000..62e10116
--- /dev/null
+++ b/components.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "src/index.css",
+ "baseColor": "slate",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ }
+}
diff --git a/dist-electron/main.js b/dist-electron/main.js
new file mode 100644
index 00000000..190cc8ed
--- /dev/null
+++ b/dist-electron/main.js
@@ -0,0 +1,95 @@
+// src-electron/main.ts
+import { app, BrowserWindow, dialog, shell } from "electron";
+import path from "path";
+import { fileURLToPath } from "url";
+import { dirname } from "path";
+import electronUpdater from "electron-updater";
+var { autoUpdater } = electronUpdater;
+var __filename = fileURLToPath(import.meta.url);
+var __dirname = dirname(__filename);
+var win = null;
+var isDev = !app.isPackaged;
+function createWindow() {
+ win = new BrowserWindow({
+ width: 1200,
+ height: 800,
+ backgroundColor: "#191919",
+ show: false,
+ webPreferences: {
+ preload: path.join(__dirname, "preload.js"),
+ contextIsolation: true,
+ nodeIntegration: false,
+ webSecurity: true
+ }
+ });
+ win.once("ready-to-show", () => {
+ win?.show();
+ });
+ const url = isDev ? "http://localhost:8080" : `file://${path.join(__dirname, "../dist/index.html")}`;
+ win.loadURL(url);
+ if (isDev) {
+ win.webContents.openDevTools();
+ }
+ win.webContents.setWindowOpenHandler(({ url: url2 }) => {
+ shell.openExternal(url2);
+ return { action: "deny" };
+ });
+ win.on("closed", () => {
+ win = null;
+ });
+}
+function createTray() {
+ const trayIconPath = path.join(__dirname, "assets/tray.png");
+}
+app.whenReady().then(() => {
+ createWindow();
+ createTray();
+ if (!isDev) {
+ autoUpdater.checkForUpdates();
+ }
+});
+app.on("window-all-closed", () => {
+ if (process.platform !== "darwin") {
+ app.quit();
+ }
+});
+app.on("activate", () => {
+ if (BrowserWindow.getAllWindows().length === 0) {
+ createWindow();
+ }
+});
+autoUpdater.autoDownload = false;
+autoUpdater.setFeedURL({
+ provider: "github",
+ owner: "me-shaon",
+ repo: "devtools"
+});
+autoUpdater.on("update-available", () => {
+ dialog.showMessageBox({
+ type: "info",
+ title: "Update available",
+ message: "A new version of DevTools is available. Update now?",
+ buttons: ["Update", "Later"]
+ }).then((result) => {
+ if (result.response === 0) {
+ autoUpdater.downloadUpdate();
+ }
+ });
+});
+autoUpdater.on("update-not-available", () => {
+});
+autoUpdater.on("update-downloaded", () => {
+ dialog.showMessageBox({
+ type: "info",
+ title: "Update ready",
+ message: "Restart to install update?",
+ buttons: ["Restart", "Later"]
+ }).then((result) => {
+ if (result.response === 0) {
+ autoUpdater.quitAndInstall();
+ }
+ });
+});
+autoUpdater.on("error", (error) => {
+ console.error("Auto-updater error:", error);
+});
diff --git a/dist-electron/preload.js b/dist-electron/preload.js
new file mode 100644
index 00000000..4700ede5
--- /dev/null
+++ b/dist-electron/preload.js
@@ -0,0 +1,25 @@
+// src-electron/preload.ts
+import { contextBridge, ipcRenderer } from "electron";
+contextBridge.exposeInMainWorld("electronAPI", {
+ invoke: (channel, ...args) => {
+ const validChannels = ["app-version", "get-path"];
+ if (validChannels.includes(channel)) {
+ return ipcRenderer.invoke(channel, ...args);
+ }
+ return Promise.reject(new Error(`Channel ${channel} is not allowed`));
+ },
+ on: (channel, callback) => {
+ const validChannels = ["update-available", "update-downloaded"];
+ if (validChannels.includes(channel)) {
+ const subscription = (_event, ...args) => callback(...args);
+ ipcRenderer.on(channel, subscription);
+ return () => {
+ ipcRenderer.removeListener(channel, subscription);
+ };
+ }
+ return () => {
+ };
+ },
+ platform: process.platform,
+ version: process.versions.electron
+});
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 00000000..40f72cc4
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,26 @@
+import js from "@eslint/js";
+import globals from "globals";
+import reactHooks from "eslint-plugin-react-hooks";
+import reactRefresh from "eslint-plugin-react-refresh";
+import tseslint from "typescript-eslint";
+
+export default tseslint.config(
+ { ignores: ["dist"] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
+ files: ["**/*.{ts,tsx}"],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ plugins: {
+ "react-hooks": reactHooks,
+ "react-refresh": reactRefresh,
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ "react-refresh/only-export-components": ["warn", { allowConstantExport: true }],
+ "@typescript-eslint/no-unused-vars": "off",
+ },
+ },
+);
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..633a96ed
--- /dev/null
+++ b/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ DevTools - Your Essential Dev Companion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
index 2f4768c3..4605a34d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,40 +1,81 @@
{
- "name": "dev-tools-desktop",
+ "name": "devtools",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "dev-tools-desktop",
+ "name": "devtools",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "crypto-js": "^4.2.0",
- "jsonwebtoken": "^9.0.2",
- "marked": "^12.0.0",
- "node-cron": "^3.0.3",
- "qrcode": "^1.5.3",
- "uuid": "^9.0.1"
+ "@radix-ui/react-label": "^2.1.7",
+ "@radix-ui/react-select": "^2.2.5",
+ "@radix-ui/react-slider": "^1.3.5",
+ "@radix-ui/react-slot": "^1.2.3",
+ "@radix-ui/react-switch": "^1.2.5",
+ "@radix-ui/react-tabs": "^1.1.12",
+ "@radix-ui/react-toast": "^1.2.14",
+ "@radix-ui/react-tooltip": "^1.2.7",
+ "@tanstack/react-query": "^5.83.0",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "concurrently": "^9.2.1",
+ "electron-updater": "^6.7.3",
+ "input-otp": "^1.4.2",
+ "lucide-react": "^0.462.0",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-resizable-panels": "^2.1.9",
+ "sonner": "^1.7.4",
+ "tailwind-merge": "^2.6.0",
+ "tailwindcss-animate": "^1.0.7",
+ "wait-on": "^9.0.3"
},
"devDependencies": {
- "electron": "^28.0.0",
- "electron-builder": "^24.0.0",
- "jest": "^29.7.0",
- "jest-environment-jsdom": "^29.7.0"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "@eslint/js": "^9.32.0",
+ "@tailwindcss/typography": "^0.5.16",
+ "@testing-library/jest-dom": "^6.6.0",
+ "@testing-library/react": "^16.0.0",
+ "@types/node": "^22.19.7",
+ "@types/react": "^18.3.23",
+ "@types/react-dom": "^18.3.7",
+ "@vitejs/plugin-react-swc": "^3.11.0",
+ "autoprefixer": "^10.4.21",
+ "electron": "^40.0.0",
+ "electron-builder": "^26.4.0",
+ "esbuild": "^0.27.2",
+ "eslint": "^9.32.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.20",
+ "globals": "^15.15.0",
+ "jsdom": "^20.0.3",
+ "postcss": "^8.5.6",
+ "sharp": "^0.34.5",
+ "tailwindcss": "^3.4.17",
+ "typescript": "^5.8.3",
+ "typescript-eslint": "^8.38.0",
+ "vite": "^5.4.19",
+ "vitest": "^3.2.4"
+ }
+ },
+ "node_modules/@adobe/css-tools": {
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz",
+ "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
+ "license": "MIT"
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@babel/code-frame": {
@@ -43,6 +84,7 @@
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.27.1",
"js-tokens": "^4.0.0",
@@ -52,1907 +94,1964 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/compat-data": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz",
- "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==",
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"dev": true,
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/core": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
- "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
+ "node_modules/@babel/runtime": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.0",
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-module-transforms": "^7.27.3",
- "@babel/helpers": "^7.27.6",
- "@babel/parser": "^7.28.0",
- "@babel/template": "^7.27.2",
- "@babel/traverse": "^7.28.0",
- "@babel/types": "^7.28.0",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
"engines": {
"node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
}
},
- "node_modules/@babel/generator": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz",
- "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==",
+ "node_modules/@develar/schema-utils": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz",
+ "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.0",
- "@babel/types": "^7.28.0",
- "@jridgewell/gen-mapping": "^0.3.12",
- "@jridgewell/trace-mapping": "^0.3.28",
- "jsesc": "^3.0.2"
+ "ajv": "^6.12.0",
+ "ajv-keywords": "^3.4.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
- "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "node_modules/@electron/asar": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz",
+ "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.27.2",
- "@babel/helper-validator-option": "^7.27.1",
- "browserslist": "^4.24.0",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
+ "commander": "^5.0.0",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4"
+ },
+ "bin": {
+ "asar": "bin/asar.js"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=10.12.0"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "node_modules/@electron/asar/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/@babel/helper-globals": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
- "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
- "dev": true,
- "license": "MIT",
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": "*"
}
},
- "node_modules/@babel/helper-module-imports": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
- "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "node_modules/@electron/fuses": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz",
+ "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.27.1",
- "@babel/types": "^7.27.1"
+ "chalk": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "minimist": "^1.2.5"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "electron-fuses": "dist/bin.js"
}
},
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.27.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
- "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
+ "node_modules/@electron/fuses/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1",
- "@babel/traverse": "^7.27.3"
- },
- "engines": {
- "node": ">=6.9.0"
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
- "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
- "dev": true,
- "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=10"
}
},
- "node_modules/@babel/helper-string-parser": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "node_modules/@electron/fuses/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6.9.0"
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
- "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "node_modules/@electron/fuses/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/helper-validator-option": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
- "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "node_modules/@electron/get": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@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": ">=6.9.0"
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "global-agent": "^3.0.0"
}
},
- "node_modules/@babel/helpers": {
- "version": "7.28.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz",
- "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==",
+ "node_modules/@electron/notarize": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz",
+ "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.2"
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "promise-retry": "^2.0.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/parser": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz",
- "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
+ "node_modules/@electron/notarize/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.0"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=10"
}
},
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "node_modules/@electron/notarize/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/plugin-syntax-bigint": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
- "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "node_modules/@electron/notarize/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "node_modules/@electron/osx-sign": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz",
+ "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
+ "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"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "bin": {
+ "electron-osx-flat": "bin/electron-osx-flat.js",
+ "electron-osx-sign": "bin/electron-osx-sign.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "node_modules/@electron/osx-sign/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=12"
}
},
- "node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
- "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+ "node_modules/@electron/osx-sign/node_modules/isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
- },
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 8.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
}
},
- "node_modules/@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "node_modules/@electron/osx-sign/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "node_modules/@electron/osx-sign/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
- "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
+ "node_modules/@electron/rebuild": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.1.tgz",
+ "integrity": "sha512-iMGXb6Ib7H/Q3v+BKZJoETgF9g6KMNZVbsO4b7Dmpgb5qTFqyFTzqW9F3TOSHdybv2vKYKzSS9OiZL+dcJb+1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@malept/cross-spawn-promise": "^2.0.0",
+ "chalk": "^4.0.0",
+ "debug": "^4.1.1",
+ "detect-libc": "^2.0.1",
+ "got": "^11.7.0",
+ "graceful-fs": "^4.2.11",
+ "node-abi": "^4.2.0",
+ "node-api-version": "^0.2.1",
+ "node-gyp": "^11.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"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "electron-rebuild": "lib/cli.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=22.12.0"
}
},
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "node_modules/@electron/rebuild/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "node_modules/@electron/universal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz",
+ "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@electron/asar": "^3.3.1",
+ "@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"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=16.4"
}
},
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "node_modules/@electron/universal/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "node_modules/@electron/universal/node_modules/fs-extra": {
+ "version": "11.3.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
+ "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=14.14"
}
},
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "node_modules/@electron/universal/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "node_modules/@electron/universal/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "brace-expansion": "^2.0.1"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "node_modules/@electron/universal/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "node_modules/@electron/windows-sign": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz",
+ "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "cross-dirname": "^0.1.0",
+ "debug": "^4.3.4",
+ "fs-extra": "^11.1.1",
+ "minimist": "^1.2.8",
+ "postject": "^1.0.0-alpha.6"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "electron-windows-sign": "bin/electron-windows-sign.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=14.14"
}
},
- "node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
- "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+ "node_modules/@electron/windows-sign/node_modules/fs-extra": {
+ "version": "11.3.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
+ "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
"dev": true,
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=14.14"
}
},
- "node_modules/@babel/template": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
- "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "node_modules/@electron/windows-sign/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/parser": "^7.27.2",
- "@babel/types": "^7.27.1"
+ "universalify": "^2.0.0"
},
- "engines": {
- "node": ">=6.9.0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/traverse": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz",
- "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==",
+ "node_modules/@electron/windows-sign/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.0",
- "@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.0",
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.0",
- "debug": "^4.3.1"
- },
+ "optional": true,
+ "peer": true,
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/types": {
- "version": "7.28.2",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
- "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
+ "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
"dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
+ "tslib": "^2.4.0"
}
},
- "node_modules/@bcoe/v8-coverage": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@develar/schema-utils": {
- "version": "2.6.5",
- "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz",
- "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==",
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
+ "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "ajv": "^6.12.0",
- "ajv-keywords": "^3.4.1"
- },
+ "optional": true,
+ "os": [
+ "aix"
+ ],
"engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
+ "node": ">=18"
}
},
- "node_modules/@electron/asar": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz",
- "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==",
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
+ "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "commander": "^5.0.0",
- "glob": "^7.1.6",
- "minimatch": "^3.0.4"
- },
- "bin": {
- "asar": "bin/asar.js"
- },
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">=10.12.0"
+ "node": ">=18"
}
},
- "node_modules/@electron/asar/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
+ "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@electron/asar/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
+ "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": "*"
+ "node": ">=18"
}
},
- "node_modules/@electron/get": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz",
- "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==",
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
+ "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
+ "cpu": [
+ "arm64"
+ ],
"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"
- },
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "global-agent": "^3.0.0"
+ "node": ">=18"
}
},
- "node_modules/@electron/notarize": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz",
- "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==",
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
+ "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "debug": "^4.1.1",
- "fs-extra": "^9.0.1",
- "promise-retry": "^2.0.1"
- },
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=18"
}
},
- "node_modules/@electron/notarize/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/@electron/notarize/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
+ "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@electron/notarize/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@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": ">= 10.0.0"
+ "node": ">=18"
}
},
- "node_modules/@electron/osx-sign": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz",
- "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==",
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
+ "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
+ "cpu": [
+ "arm64"
+ ],
"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"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=12.0.0"
+ "node": ">=18"
}
},
- "node_modules/@electron/osx-sign/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
+ "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/@electron/osx-sign/node_modules/isbinaryfile": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
- "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
+ "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
+ "cpu": [
+ "loong64"
+ ],
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 8.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/gjtorikian/"
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@electron/osx-sign/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
+ "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
+ "cpu": [
+ "mips64el"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@electron/osx-sign/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
+ "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=18"
}
},
- "node_modules/@electron/universal": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz",
- "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==",
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
+ "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "@electron/asar": "^3.2.1",
- "@malept/cross-spawn-promise": "^1.1.0",
- "debug": "^4.3.1",
- "dir-compare": "^3.0.0",
- "fs-extra": "^9.0.1",
- "minimatch": "^3.0.4",
- "plist": "^3.0.4"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8.6"
+ "node": ">=18"
}
},
- "node_modules/@electron/universal/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
+ "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@electron/universal/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
+ "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/@electron/universal/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@electron/universal/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": "*"
+ "node": ">=18"
}
},
- "node_modules/@electron/universal/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@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": ">= 10.0.0"
+ "node": ">=18"
}
},
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
+ "cpu": [
+ "x64"
+ ],
"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"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@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": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ "node": ">=18"
}
},
- "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@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": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=18"
}
},
- "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
+ "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
},
- "node_modules/@isaacs/cliui/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
+ "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=18"
}
},
- "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "node": ">=18"
}
},
- "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
- "node": ">=12"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/@istanbuljs/load-nyc-config": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
- "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "camelcase": "^5.3.1",
- "find-up": "^4.1.0",
- "get-package-type": "^0.1.0",
- "js-yaml": "^3.13.1",
- "resolve-from": "^5.0.0"
+ "url": "https://opencollective.com/eslint"
},
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "sprintf-js": "~1.0.2"
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@jest/console": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
- "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0"
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@jest/core": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
- "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/reporters": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.7.0",
- "jest-config": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-resolve-dependencies": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-ansi": "^6.0.0"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "node": "*"
}
},
- "node_modules/@jest/environment": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
- "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0"
+ "@eslint/core": "^0.17.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@jest/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "expect": "^29.7.0",
- "jest-snapshot": "^29.7.0"
+ "@types/json-schema": "^7.0.15"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@jest/expect-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
- "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "jest-get-type": "^29.6.3"
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@jest/fake-timers": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
- "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@sinonjs/fake-timers": "^10.0.2",
- "@types/node": "*",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/@jest/globals": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
- "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/types": "^29.6.3",
- "jest-mock": "^29.7.0"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "*"
}
},
- "node_modules/@jest/reporters": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
- "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "node_modules/@eslint/js": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
+ "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "collect-v8-coverage": "^1.0.0",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^6.0.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "slash": "^3.0.0",
- "string-length": "^4.0.1",
- "strip-ansi": "^6.0.0",
- "v8-to-istanbul": "^9.0.1"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "funding": {
+ "url": "https://eslint.org/donate"
}
},
- "node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@jest/source-map": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
- "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.18",
- "callsites": "^3.0.0",
- "graceful-fs": "^4.2.9"
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@jest/test-result": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
- "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
- "dev": true,
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
+ "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
"license": "MIT",
"dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "collect-v8-coverage": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "@floating-ui/utils": "^0.2.10"
}
},
- "node_modules/@jest/test-sequencer": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
- "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
- "dev": true,
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
+ "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
"license": "MIT",
"dependencies": {
- "@jest/test-result": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "@floating-ui/core": "^1.7.3",
+ "@floating-ui/utils": "^0.2.10"
}
},
- "node_modules/@jest/transform": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
- "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
- "dev": true,
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz",
+ "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/types": "^29.6.3",
- "@jridgewell/trace-mapping": "^0.3.18",
- "babel-plugin-istanbul": "^6.1.1",
- "chalk": "^4.0.0",
- "convert-source-map": "^2.0.0",
- "fast-json-stable-stringify": "^2.1.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "micromatch": "^4.0.4",
- "pirates": "^4.0.4",
- "slash": "^3.0.0",
- "write-file-atomic": "^4.0.2"
+ "@floating-ui/dom": "^1.7.4"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
}
},
- "node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "dev": true,
- "license": "MIT",
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "license": "MIT"
+ },
+ "node_modules/@hapi/address": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz",
+ "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
+ "@hapi/hoek": "^11.0.2"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
+ "node_modules/@hapi/formula": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz",
+ "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==",
+ "license": "BSD-3-Clause"
},
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
+ "node_modules/@hapi/hoek": {
+ "version": "11.0.7",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz",
+ "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/pinpoint": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz",
+ "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/tlds": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.4.tgz",
+ "integrity": "sha512-Fq+20dxsxLaUn5jSSWrdtSRcIUba2JquuorF9UW1wIJS5cSUwxIsO2GIhaWynPRflvxSzFN+gxKte2HEW1OuoA==",
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.30",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
- "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
- "dev": true,
- "license": "MIT",
+ "node_modules/@hapi/topo": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz",
+ "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "@hapi/hoek": "^11.0.2"
}
},
- "node_modules/@malept/cross-spawn-promise": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
- "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
"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": ">= 10"
+ "node": ">=18.18.0"
}
},
- "node_modules/@malept/flatpak-bundler": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
- "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "debug": "^4.1.1",
- "fs-extra": "^9.0.0",
- "lodash": "^4.17.15",
- "tmp-promise": "^3.0.2"
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=18.18.0"
}
},
- "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=10"
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@malept/flatpak-bundler/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@img/colour": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
+ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=18"
}
},
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
- "node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=10"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
}
},
- "node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "type-detect": "4.0.8"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@sinonjs/fake-timers": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
- "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@sinonjs/commons": "^3.0.0"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "defer-to-connect": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 10"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/babel__generator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
- "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.0.0"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
- "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.28.2"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/cacheable-request": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
- "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "^3.1.4",
- "@types/node": "*",
- "@types/responselike": "^1.0.0"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/debug": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/ms": "*"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/fs-extra": {
- "version": "9.0.13",
- "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
- "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/graceful-fs": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
- "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
}
},
- "node_modules/@types/http-cache-semantics": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
},
- "node_modules/@types/istanbul-lib-report": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "*"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
}
},
- "node_modules/@types/istanbul-reports": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-report": "*"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
}
},
- "node_modules/@types/jsdom": {
- "version": "20.0.1",
- "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz",
- "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==",
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "@types/tough-cookie": "*",
- "parse5": "^7.0.0"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
}
},
- "node_modules/@types/keyv": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
}
},
- "node_modules/@types/ms": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
- "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
},
- "node_modules/@types/node": {
- "version": "18.19.122",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.122.tgz",
- "integrity": "sha512-yzegtT82dwTNEe/9y+CM8cgb42WrUfMMCg2QqSddzO1J6uPmBD7qKCZ7dOHZP2Yrpm/kb0eqdNMn2MUyEiqBmA==",
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~5.26.4"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
}
},
- "node_modules/@types/plist": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz",
- "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==",
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
- "@types/node": "*",
- "xmlbuilder": ">=11.0.1"
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/responselike": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
- "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@types/stack-utils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
- "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
},
- "node_modules/@types/tough-cookie": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
- "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
},
- "node_modules/@types/verror": {
- "version": "1.10.11",
- "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz",
- "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==",
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
"dev": true,
"license": "MIT",
- "optional": true
+ "engines": {
+ "node": "20 || >=22"
+ }
},
- "node_modules/@types/yargs": {
- "version": "17.0.33",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
- "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/yargs-parser": "*"
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
}
},
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/yauzl": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
- "license": "MIT",
- "optional": true,
+ "license": "ISC",
"dependencies": {
- "@types/node": "*"
+ "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/@xmldom/xmldom": {
- "version": "0.8.10",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
- "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/7zip-bin": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz",
- "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "deprecated": "Use your platform's native atob() and btoa() methods instead",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
"engines": {
- "node": ">=0.4.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/acorn-globals": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
- "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.1.0",
- "acorn-walk": "^8.0.2"
- }
+ "license": "MIT"
},
- "node_modules/acorn-walk": {
- "version": "8.3.4",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
- "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "acorn": "^8.11.0"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">=0.4.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "debug": "4"
+ "ansi-regex": "^6.0.1"
},
"engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "node": ">=12"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "ajv": "^6.9.1"
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "type-fest": "^0.21.3"
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/ansi-escapes/node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
"dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=18.0.0"
}
},
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=6.0.0"
}
},
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.30",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz",
+ "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==",
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "node_modules/@malept/cross-spawn-promise": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz",
+ "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==",
"dev": true,
- "license": "ISC",
+ "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": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
+ "cross-spawn": "^7.0.1"
},
"engines": {
- "node": ">= 8"
+ "node": ">= 12.13.0"
}
},
- "node_modules/app-builder-bin": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz",
- "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/app-builder-lib": {
- "version": "24.13.3",
- "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz",
- "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==",
+ "node_modules/@malept/flatpak-bundler": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
+ "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@develar/schema-utils": "~2.6.5",
- "@electron/notarize": "2.2.1",
- "@electron/osx-sign": "1.0.5",
- "@electron/universal": "1.5.1",
- "@malept/flatpak-bundler": "^0.4.0",
- "@types/fs-extra": "9.0.13",
- "async-exit-hook": "^2.0.1",
- "bluebird-lst": "^1.0.9",
- "builder-util": "24.13.1",
- "builder-util-runtime": "9.2.4",
- "chromium-pickle-js": "^0.2.0",
- "debug": "^4.3.4",
- "ejs": "^3.1.8",
- "electron-publish": "24.13.1",
- "form-data": "^4.0.0",
- "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",
- "lazy-val": "^1.0.5",
- "minimatch": "^5.1.1",
- "read-config-file": "6.3.2",
- "sanitize-filename": "^1.6.3",
- "semver": "^7.3.8",
- "tar": "^6.1.12",
- "temp-file": "^3.4.0"
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.0",
+ "lodash": "^4.17.15",
+ "tmp-promise": "^3.0.2"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "dmg-builder": "24.13.3",
- "electron-builder-squirrel-windows": "24.13.3"
+ "node": ">= 10.0.0"
}
},
- "node_modules/app-builder-lib/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/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": ">=12"
+ "node": ">=10"
}
},
- "node_modules/app-builder-lib/node_modules/jsonfile": {
+ "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
@@ -1965,20 +2064,7 @@
"graceful-fs": "^4.1.6"
}
},
- "node_modules/app-builder-lib/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/app-builder-lib/node_modules/universalify": {
+ "node_modules/@malept/flatpak-bundler/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
@@ -1988,1224 +2074,4717 @@
"node": ">= 10.0.0"
}
},
- "node_modules/archiver": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz",
- "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
- "dev": true,
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"license": "MIT",
- "peer": true,
"dependencies": {
- "archiver-utils": "^2.1.0",
- "async": "^3.2.4",
- "buffer-crc32": "^0.2.1",
- "readable-stream": "^3.6.0",
- "readdir-glob": "^1.1.2",
- "tar-stream": "^2.2.0",
- "zip-stream": "^4.1.0"
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
},
"engines": {
- "node": ">= 10"
+ "node": ">= 8"
}
},
- "node_modules/archiver-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
- "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
- "dev": true,
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"license": "MIT",
- "peer": true,
- "dependencies": {
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.5.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.union": "^4.6.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^2.0.0"
- },
"engines": {
- "node": ">= 6"
+ "node": ">= 8"
}
},
- "node_modules/archiver-utils/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"license": "MIT",
- "peer": true,
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/archiver-utils/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/archiver-utils/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "node_modules/@npmcli/agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz",
+ "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==",
"dev": true,
- "license": "MIT",
- "peer": true,
+ "license": "ISC",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "node_modules/@npmcli/agent/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
"dev": true,
"license": "MIT",
- "optional": true,
"engines": {
- "node": ">=0.8"
+ "node": ">= 14"
}
},
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "node_modules/@npmcli/agent/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"dev": true,
"license": "MIT",
- "optional": true,
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 14"
}
},
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/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.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
- "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "node_modules/@npmcli/agent/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
"engines": {
- "node": ">=0.12.0"
+ "node": ">= 14"
}
},
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "node_modules/@npmcli/agent/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true,
- "license": "MIT"
+ "license": "ISC"
},
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "node_modules/@npmcli/fs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz",
+ "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==",
"dev": true,
"license": "ISC",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/babel-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
- "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
- "dev": true,
- "license": "MIT",
"dependencies": {
- "@jest/transform": "^29.7.0",
- "@types/babel__core": "^7.1.14",
- "babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.6.3",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "slash": "^3.0.0"
+ "semver": "^7.3.5"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.8.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/babel-plugin-istanbul": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
- "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "node_modules/@npmcli/fs/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@istanbuljs/load-nyc-config": "^1.0.0",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-instrument": "^5.0.4",
- "test-exclude": "^6.0.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
"dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/core": "^7.12.3",
- "@babel/parser": "^7.14.7",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
- },
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">=8"
+ "node": ">=14"
}
},
- "node_modules/babel-plugin-jest-hoist": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
- "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
- "dev": true,
+ "node_modules/@radix-ui/number": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
+ "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
+ "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.3.3",
- "@babel/types": "^7.3.3",
- "@types/babel__core": "^7.1.14",
- "@types/babel__traverse": "^7.0.6"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/babel-preset-current-node-syntax": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
- "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-bigint": "^7.8.3",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-import-attributes": "^7.24.7",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ "@radix-ui/react-primitive": "2.1.3"
},
"peerDependencies": {
- "@babel/core": "^7.0.0 || ^8.0.0-0"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/babel-preset-jest": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
- "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
- "dev": true,
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
"license": "MIT",
"dependencies": {
- "babel-plugin-jest-hoist": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
},
"peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
},
- {
- "type": "consulting",
- "url": "https://feross.org/support"
+ "@types/react-dom": {
+ "optional": true
}
- ],
- "license": "MIT"
+ }
},
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dev": true,
+ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
"license": "MIT",
- "peer": true,
"dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/bluebird-lst": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz",
- "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==",
- "dev": true,
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
"license": "MIT",
- "dependencies": {
- "bluebird": "^3.5.5"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/boolean": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/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,
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
"license": "MIT",
- "optional": true
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
},
- "node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
"license": "MIT",
"dependencies": {
- "fill-range": "^7.1.1"
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
},
- "engines": {
- "node": ">=8"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/browserslist": {
- "version": "4.25.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz",
- "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
}
- ],
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
"license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001733",
- "electron-to-chromium": "^1.5.199",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.3"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
},
- "bin": {
- "browserslist": "cli.js"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "dev": true,
- "license": "Apache-2.0",
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "license": "MIT",
"dependencies": {
- "node-int64": "^0.4.0"
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/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"
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz",
+ "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.4"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
},
- {
- "type": "consulting",
- "url": "https://feross.org/support"
+ "@types/react-dom": {
+ "optional": true
}
- ],
+ }
+ },
+ "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
+ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
"license": "MIT",
"dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
+ "@radix-ui/react-slot": "1.2.4"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
+ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
"license": "MIT",
- "engines": {
- "node": "*"
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-rect": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1",
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/buffer-equal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
- "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
- "dev": true,
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
"license": "MIT",
- "engines": {
- "node": ">=0.4"
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
- "license": "BSD-3-Clause"
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/builder-util": {
- "version": "24.13.1",
- "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz",
- "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==",
- "dev": true,
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
"license": "MIT",
"dependencies": {
- "@types/debug": "^4.1.6",
- "7zip-bin": "~5.2.0",
- "app-builder-bin": "4.0.0",
- "bluebird-lst": "^1.0.9",
- "builder-util-runtime": "9.2.4",
- "chalk": "^4.1.2",
- "cross-spawn": "^7.0.3",
- "debug": "^4.3.4",
- "fs-extra": "^10.1.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.1",
- "is-ci": "^3.0.0",
- "js-yaml": "^4.1.0",
- "source-map-support": "^0.5.19",
- "stat-mode": "^1.0.0",
- "temp-file": "^3.4.0"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/builder-util-runtime": {
- "version": "9.2.4",
- "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
- "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
- "dev": true,
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
"license": "MIT",
"dependencies": {
- "debug": "^4.3.4",
- "sax": "^1.2.4"
+ "@radix-ui/react-slot": "1.2.3"
},
- "engines": {
- "node": ">=12.0.0"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/builder-util/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
+ "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "@radix-ui/react-compose-refs": "1.1.2"
},
- "engines": {
- "node": ">=12"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/builder-util/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
- "dev": true,
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
+ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
"license": "MIT",
"dependencies": {
- "universalify": "^2.0.0"
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/builder-util/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
+ "node_modules/@radix-ui/react-select": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz",
+ "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.3",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
"license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
- "dev": true,
+ "node_modules/@radix-ui/react-slider": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz",
+ "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==",
"license": "MIT",
- "engines": {
- "node": ">=10.6.0"
+ "dependencies": {
+ "@radix-ui/number": "1.1.1",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
- "dev": true,
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
"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"
+ "@radix-ui/react-compose-refs": "1.1.2"
},
- "engines": {
- "node": ">=8"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dev": true,
+ "node_modules/@radix-ui/react-switch": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz",
+ "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==",
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1"
},
- "engines": {
- "node": ">= 0.4"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
+ "node_modules/@radix-ui/react-tabs": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
+ "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "node_modules/@radix-ui/react-toast": {
+ "version": "1.2.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz",
+ "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==",
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/caniuse-lite": {
- "version": "1.0.30001734",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz",
- "integrity": "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
+ "node_modules/@radix-ui/react-tooltip": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz",
+ "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-visually-hidden": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
},
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-previous": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
+ "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
+ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz",
+ "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
},
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
+ "@types/react-dom": {
+ "optional": true
}
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
+ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
+ "license": "MIT"
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.3.tgz",
+ "integrity": "sha512-qyX8+93kK/7R5BEXPC2PjUt0+fS/VO2BVHjEHyIEWiYn88rcRBHmdLgoJjktBltgAf+NY7RfCGB1SoyKS/p9kg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.3.tgz",
+ "integrity": "sha512-6sHrL42bjt5dHQzJ12Q4vMKfN+kUnZ0atHHnv4V0Wd9JMTk7FDzSY35+7qbz3ypQYMBPANbpGK7JpnWNnhGt8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.3.tgz",
+ "integrity": "sha512-1ht2SpGIjEl2igJ9AbNpPIKzb1B5goXOcmtD0RFxnwNuMxqkR6AUaaErZz+4o+FKmzxcSNBOLrzsICZVNYa1Rw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.3.tgz",
+ "integrity": "sha512-FYZ4iVunXxtT+CZqQoPVwPhH7549e/Gy7PIRRtq4t5f/vt54pX6eG9ebttRH6QSH7r/zxAFA4EZGlQ0h0FvXiA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.3.tgz",
+ "integrity": "sha512-M/mwDCJ4wLsIgyxv2Lj7Len+UMHd4zAXu4GQ2UaCdksStglWhP61U3uowkaYBQBhVoNpwx5Hputo8eSqM7K82Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.3.tgz",
+ "integrity": "sha512-5jZT2c7jBCrMegKYTYTpni8mg8y3uY8gzeq2ndFOANwNuC/xJbVAoGKR9LhMDA0H3nIhvaqUoBEuJoICBudFrA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.3.tgz",
+ "integrity": "sha512-YeGUhkN1oA+iSPzzhEjVPS29YbViOr8s4lSsFaZKLHswgqP911xx25fPOyE9+khmN6W4VeM0aevbDp4kkEoHiA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.3.tgz",
+ "integrity": "sha512-eo0iOIOvcAlWB3Z3eh8pVM8hZ0oVkK3AjEM9nSrkSug2l15qHzF3TOwT0747omI6+CJJvl7drwZepT+re6Fy/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.3.tgz",
+ "integrity": "sha512-DJay3ep76bKUDImmn//W5SvpjRN5LmK/ntWyeJs/dcnwiiHESd3N4uteK9FDLf0S0W8E6Y0sVRXpOCoQclQqNg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.3.tgz",
+ "integrity": "sha512-BKKWQkY2WgJ5MC/ayvIJTHjy0JUGb5efaHCUiG/39sSUvAYRBaO3+/EK0AZT1RF3pSj86O24GLLik9mAYu0IJg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.3.tgz",
+ "integrity": "sha512-Q9nVlWtKAG7ISW80OiZGxTr6rYtyDSkauHUtvkQI6TNOJjFvpj4gcH+KaJihqYInnAzEEUetPQubRwHef4exVg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.3.tgz",
+ "integrity": "sha512-2H5LmhzrpC4fFRNwknzmmTvvyJPHwESoJgyReXeFoYYuIDfBhP29TEXOkCJE/KxHi27mj7wDUClNq78ue3QEBQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.3.tgz",
+ "integrity": "sha512-9S542V0ie9LCTznPYlvaeySwBeIEa7rDBgLHKZ5S9DBgcqdJYburabm8TqiqG6mrdTzfV5uttQRHcbKff9lWtA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.3.tgz",
+ "integrity": "sha512-ukxw+YH3XXpcezLgbJeasgxyTbdpnNAkrIlFGDl7t+pgCxZ89/6n1a+MxlY7CegU+nDgrgdqDelPRNQ/47zs0g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.3.tgz",
+ "integrity": "sha512-Iauw9UsTTvlF++FhghFJjqYxyXdggXsOqGpFBylaRopVpcbfyIIsNvkf9oGwfgIcf57z3m8+/oSYTo6HutBFNw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.3.tgz",
+ "integrity": "sha512-3OqKAHSEQXKdq9mQ4eajqUgNIK27VZPW3I26EP8miIzuKzCJ3aW3oEn2pzF+4/Hj/Moc0YDsOtBgT5bZ56/vcA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.3.tgz",
+ "integrity": "sha512-0CM8dSVzVIaqMcXIFej8zZrSFLnGrAE8qlNbbHfTw1EEPnFTg1U1ekI0JdzjPyzSfUsHWtodilQQG/RA55berA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.3.tgz",
+ "integrity": "sha512-+fgJE12FZMIgBaKIAGd45rxf+5ftcycANJRWk8Vz0NnMTM5rADPGuRFTYar+Mqs560xuART7XsX2lSACa1iOmQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.3.tgz",
+ "integrity": "sha512-tMD7NnbAolWPzQlJQJjVFh/fNH3K/KnA7K8gv2dJWCwwnaK6DFCYST1QXYWfu5V0cDwarWC8Sf/cfMHniNq21A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.3.tgz",
+ "integrity": "sha512-u5KsqxOxjEeIbn7bUK1MPM34jrnPwjeqgyin4/N6e/KzXKfpE9Mi0nCxcQjaM9lLmPcHmn/xx1yOjgTMtu1jWQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.3.tgz",
+ "integrity": "sha512-vo54aXwjpTtsAnb3ca7Yxs9t2INZg7QdXN/7yaoG7nPGbOBXYXQY41Km+S1Ov26vzOAzLcAjmMdjyEqS1JkVhw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.3.tgz",
+ "integrity": "sha512-HI+PIVZ+m+9AgpnY3pt6rinUdRYrGHvmVdsNQ4odNqQ/eRF78DVpMR7mOq7nW06QxpczibwBmeQzB68wJ+4W4A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.3.tgz",
+ "integrity": "sha512-vRByotbdMo3Wdi+8oC2nVxtc3RkkFKrGaok+a62AT8lz/YBuQjaVYAS5Zcs3tPzW43Vsf9J0wehJbUY5xRSekA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.3.tgz",
+ "integrity": "sha512-POZHq7UeuzMJljC5NjKi8vKMFN6/5EOqcX1yGntNLp7rUTpBAXQ1hW8kWPFxYLv07QMcNM75xqVLGPWQq6TKFA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.3.tgz",
+ "integrity": "sha512-aPFONczE4fUFKNXszdvnd2GqKEYQdV5oEsIbKPujJmWlCI9zEsv1Otig8RKK+X9bed9gFUN6LAeN4ZcNuu4zjg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@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/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT"
+ },
+ "node_modules/@swc/core": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.10.tgz",
+ "integrity": "sha512-udNofxftduMUEv7nqahl2nvodCiCDQ4Ge0ebzsEm6P8s0RC2tBM0Hqx0nNF5J/6t9uagFJyWIDjXy3IIWMHDJw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "@swc/types": "^0.1.25"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.15.10",
+ "@swc/core-darwin-x64": "1.15.10",
+ "@swc/core-linux-arm-gnueabihf": "1.15.10",
+ "@swc/core-linux-arm64-gnu": "1.15.10",
+ "@swc/core-linux-arm64-musl": "1.15.10",
+ "@swc/core-linux-x64-gnu": "1.15.10",
+ "@swc/core-linux-x64-musl": "1.15.10",
+ "@swc/core-win32-arm64-msvc": "1.15.10",
+ "@swc/core-win32-ia32-msvc": "1.15.10",
+ "@swc/core-win32-x64-msvc": "1.15.10"
+ },
+ "peerDependencies": {
+ "@swc/helpers": ">=0.5.17"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.10.tgz",
+ "integrity": "sha512-U72pGqmJYbjrLhMndIemZ7u9Q9owcJczGxwtfJlz/WwMaGYAV/g4nkGiUVk/+QSX8sFCAjanovcU1IUsP2YulA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.10.tgz",
+ "integrity": "sha512-NZpDXtwHH083L40xdyj1sY31MIwLgOxKfZEAGCI8xHXdHa+GWvEiVdGiu4qhkJctoHFzAEc7ZX3GN5phuJcPuQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.10.tgz",
+ "integrity": "sha512-ioieF5iuRziUF1HkH1gg1r93e055dAdeBAPGAk40VjqpL5/igPJ/WxFHGvc6WMLhUubSJI4S0AiZAAhEAp1jDg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.10.tgz",
+ "integrity": "sha512-tD6BClOrxSsNus9cJL7Gxdv7z7Y2hlyvZd9l0NQz+YXzmTWqnfzLpg16ovEI7gknH2AgDBB5ywOsqu8hUgSeEQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.10.tgz",
+ "integrity": "sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.10.tgz",
+ "integrity": "sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.10.tgz",
+ "integrity": "sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.10.tgz",
+ "integrity": "sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.10.tgz",
+ "integrity": "sha512-i4X/q8QSvzVlaRtv1xfnfl+hVKpCfiJ+9th484rh937fiEZKxZGf51C+uO0lfKDP1FfnT6C1yBYwHy7FLBVXFw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.10.tgz",
+ "integrity": "sha512-HvY8XUFuoTXn6lSccDLYFlXv1SU/PzYi4PyUqGT++WfTnbw/68N/7BdUZqglGRwiSqr0qhYt/EhmBpULj0J9rA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.25",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz",
+ "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@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/typography": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
+ "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "6.0.10"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.90.19",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.19.tgz",
+ "integrity": "sha512-GLW5sjPVIvH491VV1ufddnfldyVB+teCnpPIvweEfkpRx7CfUmUGhoh9cdcUKBh/KwVxk22aNEDxeTsvmyB/WA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.90.19",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.19.tgz",
+ "integrity": "sha512-qTZRZ4QyTzQc+M0IzrbKHxSeISUmRB3RPGmao5bT+sI6ayxSRhn0FXEnT5Hg3as8SBFcRosrXXRFB+yAcxVxJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-core": "5.90.19"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19"
+ }
+ },
+ "node_modules/@testing-library/dom": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz",
+ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "picocolors": "1.1.1",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@testing-library/jest-dom": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz",
+ "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@adobe/css-tools": "^4.4.0",
+ "aria-query": "^5.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.6.3",
+ "picocolors": "^1.1.1",
+ "redent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@testing-library/react": {
+ "version": "16.3.2",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz",
+ "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": "^10.0.0",
+ "@types/react": "^18.0.0 || ^19.0.0",
+ "@types/react-dom": "^18.0.0 || ^19.0.0",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/cacheable-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@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/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@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/http-cache-semantics": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@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",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.19.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.7.tgz",
+ "integrity": "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/plist": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@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/prop-types": {
+ "version": "15.7.15",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.27",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz",
+ "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/responselike": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@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/verror": {
+ "version": "1.10.11",
+ "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz",
+ "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.53.1",
+ "@typescript-eslint/type-utils": "8.53.1",
+ "@typescript-eslint/utils": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.53.1",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz",
+ "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.53.1",
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz",
+ "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.53.1",
+ "@typescript-eslint/types": "^8.53.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz",
+ "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz",
+ "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz",
+ "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1",
+ "@typescript-eslint/utils": "8.53.1",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz",
+ "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz",
+ "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.53.1",
+ "@typescript-eslint/tsconfig-utils": "8.53.1",
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/visitor-keys": "8.53.1",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/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/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/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/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz",
+ "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.53.1",
+ "@typescript-eslint/types": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz",
+ "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.53.1",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.11.0.tgz",
+ "integrity": "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "1.0.0-beta.27",
+ "@swc/core": "^1.12.11"
+ },
+ "peerDependencies": {
+ "vite": "^4 || ^5 || ^6 || ^7"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
+ "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "3.2.4",
+ "@vitest/utils": "3.2.4",
+ "chai": "^5.2.0",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
+ "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.2.4",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
+ "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz",
+ "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.2.4",
+ "pathe": "^2.0.3",
+ "strip-literal": "^3.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz",
+ "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.4",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
+ "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^4.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
+ "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.4",
+ "loupe": "^3.1.4",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.11",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+ "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/7zip-bin": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz",
+ "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/abbrev": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
+ "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+ "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.1.0",
+ "acorn-walk": "^8.0.2"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/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/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/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-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/app-builder-bin": {
+ "version": "5.0.0-alpha.12",
+ "resolved": "https://registry.npmjs.org/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.4.0",
+ "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.4.0.tgz",
+ "integrity": "sha512-Uas6hNe99KzP3xPWxh5LGlH8kWIVjZixzmMJHNB9+6hPyDpjc7NQMkVgi16rQDdpCFy22ZU5sp8ow7tvjeMgYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@develar/schema-utils": "~2.6.5",
+ "@electron/asar": "3.4.1",
+ "@electron/fuses": "^1.8.0",
+ "@electron/notarize": "2.5.0",
+ "@electron/osx-sign": "1.3.3",
+ "@electron/rebuild": "4.0.1",
+ "@electron/universal": "2.0.3",
+ "@malept/flatpak-bundler": "^0.4.0",
+ "@types/fs-extra": "9.0.13",
+ "async-exit-hook": "^2.0.1",
+ "builder-util": "26.3.4",
+ "builder-util-runtime": "9.5.1",
+ "chromium-pickle-js": "^0.2.0",
+ "ci-info": "4.3.1",
+ "debug": "^4.3.4",
+ "dotenv": "^16.4.5",
+ "dotenv-expand": "^11.0.6",
+ "ejs": "^3.1.8",
+ "electron-publish": "26.3.4",
+ "fs-extra": "^10.1.0",
+ "hosted-git-info": "^4.1.0",
+ "isbinaryfile": "^5.0.0",
+ "jiti": "^2.4.2",
+ "js-yaml": "^4.1.0",
+ "json5": "^2.2.3",
+ "lazy-val": "^1.0.5",
+ "minimatch": "^10.0.3",
+ "plist": "3.1.0",
+ "resedit": "^1.7.0",
+ "semver": "~7.7.3",
+ "tar": "^6.1.12",
+ "temp-file": "^3.4.0",
+ "tiny-async-pool": "1.3.0",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "dmg-builder": "26.4.0",
+ "electron-builder-squirrel-windows": "26.4.0"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/ci-info": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/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/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/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/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/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/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/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/autoprefixer": {
+ "version": "10.4.23",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz",
+ "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.1",
+ "caniuse-lite": "^1.0.30001760",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.4",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "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/baseline-browser-mapping": {
+ "version": "2.9.17",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz",
+ "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/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.3.4",
+ "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.3.4.tgz",
+ "integrity": "sha512-aRn88mYMktHxzdqDMF6Ayj0rKoX+ZogJ75Ck7RrIqbY/ad0HBvnS2xA4uHfzrGr5D2aLL3vU6OBEH4p0KMV2XQ==",
+ "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.5.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",
+ "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.5.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz",
+ "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/builder-util/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/builder-util/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/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/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/builder-util/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/builder-util/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cacache": {
+ "version": "19.0.1",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz",
+ "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^4.0.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3",
+ "unique-filename": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/cacache/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/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/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cacache/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/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/cacache/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cacache/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/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/cacache/node_modules/tar": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz",
+ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cacache/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001765",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz",
+ "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chai": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+ "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz",
+ "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://polar.sh/cva"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/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/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/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": "2.1.0",
+ "resolved": "https://registry.npmjs.org/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/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/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",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concurrently": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz",
+ "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==",
+ "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.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/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-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/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",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/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",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/dir-compare": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/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/dir-compare/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/dir-compare/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "license": "MIT"
+ },
+ "node_modules/dmg-builder": {
+ "version": "26.4.0",
+ "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.4.0.tgz",
+ "integrity": "sha512-ce4Ogns4VMeisIuCSK0C62umG0lFy012jd8LMZ6w/veHUeX4fqfDrGe+HTWALAEwK6JwKP+dhPvizhArSOsFbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "app-builder-lib": "26.4.0",
+ "builder-util": "26.3.4",
+ "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.npmjs.org/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.npmjs.org/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.npmjs.org/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.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz",
+ "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
],
- "license": "CC-BY-4.0"
+ "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/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "deprecated": "Use your platform's native DOMException instead",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "webidl-conversions": "^7.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://dotenvx.com"
}
},
- "node_modules/char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "node_modules/dotenv-expand": {
+ "version": "11.0.7",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dotenv": "^16.4.5"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
}
},
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "license": "ISC",
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
}
},
- "node_modules/chromium-pickle-js": {
+ "node_modules/eastasianwidth": {
"version": "0.2.0",
- "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
- "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true,
"license": "MIT"
},
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=0.10.0"
}
},
- "node_modules/cjs-module-lexer": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
- "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "node_modules/electron": {
+ "version": "40.0.0",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-40.0.0.tgz",
+ "integrity": "sha512-UyBy5yJ0/wm4gNugCtNPjvddjAknMTuXR2aCHioXicH7aKRKGDBPp4xqTEi/doVcB3R+MN3wfU9o8d/9pwgK2A==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
- "optional": true,
"dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
+ "@electron/get": "^2.0.0",
+ "@types/node": "^24.9.0",
+ "extract-zip": "^2.0.1"
},
- "engines": {
- "node": ">=8"
+ "bin": {
+ "electron": "cli.js"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 12.20.55"
}
},
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "node_modules/electron-builder": {
+ "version": "26.4.0",
+ "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.4.0.tgz",
+ "integrity": "sha512-FCUqvdq2AULL+Db2SUGgjOYTbrgkPxZtCjqIZGnjH9p29pTWyesQqBIfvQBKa6ewqde87aWl49n/WyI/NyUBog==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
+ "app-builder-lib": "26.4.0",
+ "builder-util": "26.3.4",
+ "builder-util-runtime": "9.5.1",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "dmg-builder": "26.4.0",
+ "fs-extra": "^10.1.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": ">=12"
+ "node": ">=14.0.0"
}
},
- "node_modules/clone-response": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
- "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
+ "node_modules/electron-builder-squirrel-windows": {
+ "version": "26.4.0",
+ "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.4.0.tgz",
+ "integrity": "sha512-7dvalY38xBzWNaoOJ4sqy2aGIEpl2S1gLPkkB0MHu1Hu5xKQ82il1mKSFlXs6fLpXUso/NmyjdHGlSHDRoG8/w==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "mimic-response": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "app-builder-lib": "26.4.0",
+ "builder-util": "26.3.4",
+ "electron-winstaller": "5.4.0"
}
},
- "node_modules/co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "node_modules/electron-builder/node_modules/ci-info": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
"license": "MIT",
"engines": {
- "iojs": ">= 1.0.0",
- "node": ">= 0.12.0"
+ "node": ">=8"
}
},
- "node_modules/collect-v8-coverage": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
- "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "node_modules/electron-builder/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=12"
}
},
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "license": "MIT"
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "node_modules/electron-builder/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "delayed-stream": "~1.0.0"
+ "universalify": "^2.0.0"
},
- "engines": {
- "node": ">= 0.8"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "node_modules/electron-builder/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 6"
+ "node": ">= 10.0.0"
}
},
- "node_modules/compare-version": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
- "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
+ "node_modules/electron-publish": {
+ "version": "26.3.4",
+ "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.3.4.tgz",
+ "integrity": "sha512-5/ouDPb73SkKuay2EXisPG60LTFTMNHWo2WLrK5GDphnWK9UC+yzYrzVeydj078Yk4WUXi0+TaaZsNd6Zt5k/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/fs-extra": "^9.0.11",
+ "builder-util": "26.3.4",
+ "builder-util-runtime": "9.5.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.npmjs.org/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": ">=0.10.0"
+ "node": ">=12"
}
},
- "node_modules/compress-commons": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz",
- "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==",
+ "node_modules/electron-publish/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
- "peer": true,
- "dependencies": {
- "buffer-crc32": "^0.2.13",
- "crc32-stream": "^4.0.2",
- "normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
- },
"engines": {
- "node": ">= 10"
+ "node": ">= 10.0.0"
}
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.267",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
+ "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
"dev": true,
- "license": "MIT"
+ "license": "ISC"
},
- "node_modules/config-file-ts": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz",
- "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==",
- "dev": true,
+ "node_modules/electron-updater": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.7.3.tgz",
+ "integrity": "sha512-EgkT8Z9noqXKbwc3u5FkJA+r48jwZ5DTUiOkJMOTEEH//n5Am6wfQGz7nvSFEA2oIAMv9jRzn5JKTyWeSKOPgg==",
"license": "MIT",
"dependencies": {
- "glob": "^10.3.10",
- "typescript": "^5.3.3"
+ "builder-util-runtime": "9.5.1",
+ "fs-extra": "^10.1.0",
+ "js-yaml": "^4.1.0",
+ "lazy-val": "^1.0.5",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isequal": "^4.5.0",
+ "semver": "~7.7.3",
+ "tiny-typed-emitter": "^2.1.0"
}
},
- "node_modules/config-file-ts/node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
- "dev": true,
- "license": "ISC",
+ "node_modules/electron-updater/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
"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"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/config-file-ts/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
+ "node_modules/electron-updater/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
+ "universalify": "^2.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/config-file-ts/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
+ "node_modules/electron-updater/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=10"
}
},
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/crc": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
- "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
- "dev": true,
+ "node_modules/electron-updater/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"license": "MIT",
- "optional": true,
- "dependencies": {
- "buffer": "^5.1.0"
- }
- },
- "node_modules/crc-32": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
- "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
- "dev": true,
- "license": "Apache-2.0",
- "peer": true,
- "bin": {
- "crc32": "bin/crc32.njs"
- },
"engines": {
- "node": ">=0.8"
+ "node": ">= 10.0.0"
}
},
- "node_modules/crc32-stream": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz",
- "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==",
+ "node_modules/electron-winstaller": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz",
+ "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
"peer": true,
"dependencies": {
- "crc-32": "^1.2.0",
- "readable-stream": "^3.4.0"
+ "@electron/asar": "^3.2.1",
+ "debug": "^4.1.1",
+ "fs-extra": "^7.0.1",
+ "lodash": "^4.17.21",
+ "temp": "^0.9.0"
},
"engines": {
- "node": ">= 10"
+ "node": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@electron/windows-sign": "^1.1.2"
}
},
- "node_modules/create-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
- "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "node_modules/electron-winstaller/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "prompts": "^2.0.1"
- },
- "bin": {
- "create-jest": "bin/create-jest.js"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6 <7 || >=8"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "node_modules/electron/node_modules/@types/node": {
+ "version": "24.10.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz",
+ "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
+ "undici-types": "~7.16.0"
}
},
- "node_modules/crypto-js": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
- "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
+ "node_modules/electron/node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/cssom": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
- "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
- "dev": true,
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
- "node_modules/cssstyle": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
- "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
"dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "cssom": "~0.3.6"
- },
- "engines": {
- "node": ">=8"
+ "iconv-lite": "^0.6.2"
}
},
- "node_modules/cssstyle/node_modules/cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/data-urls": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
- "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "abab": "^2.0.6",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^11.0.0"
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
},
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=6"
}
},
- "node_modules/debug": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
- "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": ">= 0.4"
}
},
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
}
},
- "node_modules/decimal.js": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
- "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
"dev": true,
"license": "MIT"
},
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dev": true,
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
- "mimic-response": "^3.1.0"
+ "es-errors": "^1.3.0"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/decompress-response/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "optional": true
},
- "node_modules/dedent": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz",
- "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==",
+ "node_modules/esbuild": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
+ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
- "peerDependencies": {
- "babel-plugin-macros": "^3.1.0"
+ "bin": {
+ "esbuild": "bin/esbuild"
},
- "peerDependenciesMeta": {
- "babel-plugin-macros": {
- "optional": true
- }
+ "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/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "dev": true,
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6"
}
},
- "node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"dev": true,
- "license": "MIT",
- "optional": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=6.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
}
},
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "node_modules/eslint": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz",
+ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
"dev": true,
"license": "MIT",
- "optional": true,
"dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.2",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.4.0"
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
}
},
- "node_modules/detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.26",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz",
+ "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "peerDependencies": {
+ "eslint": ">=8.40"
}
},
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
- "license": "MIT",
- "optional": true
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
},
- "node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/dijkstrajs": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
- "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
- "license": "MIT"
- },
- "node_modules/dir-compare": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
- "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"license": "MIT",
"dependencies": {
- "buffer-equal": "^1.0.0",
- "minimatch": "^3.0.4"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/dir-compare/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/dir-compare/node_modules/minimatch": {
+ "node_modules/eslint/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
@@ -3218,896 +6797,991 @@
"node": "*"
}
},
- "node_modules/dmg-builder": {
- "version": "24.13.3",
- "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz",
- "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==",
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "app-builder-lib": "24.13.3",
- "builder-util": "24.13.1",
- "builder-util-runtime": "9.2.4",
- "fs-extra": "^10.1.0",
- "iconv-lite": "^0.6.2",
- "js-yaml": "^4.1.0"
+ "yocto-queue": "^0.1.0"
},
- "optionalDependencies": {
- "dmg-license": "^1.0.11"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/dmg-builder/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "p-limit": "^3.0.2"
},
"engines": {
- "node": ">=12"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/dmg-builder/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "universalify": "^2.0.0"
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/dmg-builder/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=4"
}
},
- "node_modules/dmg-license": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz",
- "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==",
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "BSD-3-Clause",
"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"
+ "estraverse": "^5.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=0.10"
}
},
- "node_modules/domexception": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
- "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
- "deprecated": "Use your platform's native DOMException instead",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "webidl-conversions": "^7.0.0"
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=4.0"
}
},
- "node_modules/dotenv": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz",
- "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==",
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
- "node": ">=10"
+ "node": ">=4.0"
}
},
- "node_modules/dotenv-expand": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
- "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10.0"
}
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "node_modules/expect-type": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
"license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "node_modules/ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "node_modules/exponential-backoff": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
+ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "Apache-2.0"
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "jake": "^10.8.5"
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
},
"bin": {
- "ejs": "bin/cli.js"
+ "extract-zip": "cli.js"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
}
},
- "node_modules/electron": {
- "version": "28.3.3",
- "resolved": "https://registry.npmjs.org/electron/-/electron-28.3.3.tgz",
- "integrity": "sha512-ObKMLSPNhomtCOBAxFS8P2DW/4umkh72ouZUlUKzXGtYuPzgr1SYhskhFWgzAsPtUzhL2CzyV2sfbHcEW4CXqw==",
+ "node_modules/extsprintf": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
+ "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
"dev": true,
- "hasInstallScript": 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",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"license": "MIT",
"dependencies": {
- "@electron/get": "^2.0.0",
- "@types/node": "^18.11.18",
- "extract-zip": "^2.0.1"
- },
- "bin": {
- "electron": "cli.js"
+ "@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": ">= 12.20.55"
+ "node": ">=8.6.0"
}
},
- "node_modules/electron-builder": {
- "version": "24.13.3",
- "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz",
- "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==",
- "dev": true,
- "license": "MIT",
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
"dependencies": {
- "app-builder-lib": "24.13.3",
- "builder-util": "24.13.1",
- "builder-util-runtime": "9.2.4",
- "chalk": "^4.1.2",
- "dmg-builder": "24.13.3",
- "fs-extra": "^10.1.0",
- "is-ci": "^3.0.0",
- "lazy-val": "^1.0.5",
- "read-config-file": "6.3.2",
- "simple-update-notifier": "2.0.0",
- "yargs": "^17.6.2"
- },
- "bin": {
- "electron-builder": "cli.js",
- "install-app-deps": "install-app-deps.js"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">= 6"
}
},
- "node_modules/electron-builder-squirrel-windows": {
- "version": "24.13.3",
- "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz",
- "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==",
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true,
- "license": "MIT",
- "peer": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
"dependencies": {
- "app-builder-lib": "24.13.3",
- "archiver": "^5.3.1",
- "builder-util": "24.13.1",
- "fs-extra": "^10.1.0"
+ "reusify": "^1.0.4"
}
},
- "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
+ "pend": "~1.2.0"
}
},
- "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "universalify": "^2.0.0"
+ "flat-cache": "^4.0.0"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": ">=16.0.0"
}
},
- "node_modules/electron-builder-squirrel-windows/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
"dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 10.0.0"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
}
},
- "node_modules/electron-builder/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/electron-builder/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "universalify": "^2.0.0"
+ "brace-expansion": "^2.0.1"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/electron-builder/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=8"
}
},
- "node_modules/electron-publish": {
- "version": "24.13.1",
- "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz",
- "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==",
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/fs-extra": "^9.0.11",
- "builder-util": "24.13.1",
- "builder-util-runtime": "9.2.4",
- "chalk": "^4.1.2",
- "fs-extra": "^10.1.0",
- "lazy-val": "^1.0.5",
- "mime": "^2.5.2"
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
}
},
- "node_modules/electron-publish/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"dev": true,
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
"license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
"engines": {
- "node": ">=12"
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
}
},
- "node_modules/electron-publish/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "universalify": "^2.0.0"
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/electron-publish/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/electron-to-chromium": {
- "version": "1.5.200",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz",
- "integrity": "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w==",
- "dev": true,
- "license": "ISC"
+ "node_modules/form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
},
- "node_modules/emittery": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=12"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
}
},
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "license": "MIT"
- },
- "node_modules/end-of-stream": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
- "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "once": "^1.4.0"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
}
},
- "node_modules/entities": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
- "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
"dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
},
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=6"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/err-code": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
- "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
- "license": "MIT",
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
"engines": {
- "node": ">= 0.4"
+ "node": "6.* || 8.* || >= 10.*"
}
},
- "node_modules/es-errors": {
+ "node_modules/get-intrinsic": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dev": true,
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
"license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=6"
}
},
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dev": true,
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
- "node_modules/es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/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": ">=6"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
- "license": "MIT",
- "optional": 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": ">=10"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "dev": true,
- "license": "BSD-2-Clause",
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
"dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">=6.0"
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
},
- "optionalDependencies": {
- "source-map": "~0.6.1"
+ "engines": {
+ "node": "*"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "node_modules/global-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
"dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "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": ">=4"
+ "node": ">=10.0"
}
},
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "node_modules/global-agent/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">=4.0"
+ "node": ">=10"
}
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/execa/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/execa/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "node_modules/got": {
+ "version": "11.8.6",
+ "resolved": "https://registry.npmjs.org/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",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
- "dev": true,
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=8"
}
},
- "node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
+ "es-define-property": "^1.0.0"
},
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "license": "BSD-2-Clause",
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
+ "has-symbols": "^1.0.3"
},
- "bin": {
- "extract-zip": "cli.js"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">= 10.17.0"
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/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"
},
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/extsprintf": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
- "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
"dev": true,
- "engines": [
- "node >=0.6.0"
- ],
"license": "MIT",
- "optional": true
+ "dependencies": {
+ "whatwg-encoding": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
},
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
"dev": true,
- "license": "MIT"
+ "license": "BSD-2-Clause"
},
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
},
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "node_modules/http2-wrapper": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "bser": "2.1.1"
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "pend": "~1.2.0"
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "node_modules/iconv-corefoundation": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
+ "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"dependencies": {
- "minimatch": "^5.0.1"
+ "cli-truncate": "^2.1.0",
+ "node-addon-api": "^1.6.3"
+ },
+ "engines": {
+ "node": "^8.11.2 || >=10"
}
},
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=0.10.0"
}
},
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/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",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
"engines": {
- "node": ">=8"
+ "node": ">= 4"
}
},
- "node_modules/foreground-child": {
+ "node_modules/import-fresh": {
"version": "3.3.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
- "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.6",
- "signal-exit": "^4.0.1"
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=6"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/form-data": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
- "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "hasown": "^2.0.2",
- "mime-types": "^2.1.12"
- },
"engines": {
- "node": ">= 6"
+ "node": ">=4"
}
},
- "node_modules/fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
"engines": {
- "node": ">=6 <7 || >=8"
+ "node": ">=0.8.19"
}
},
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 8"
+ "node": ">=8"
}
},
- "node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/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": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true,
"license": "ISC"
},
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
+ "node_modules/input-otp": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz",
+ "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==",
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
}
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "node_modules/ip-address": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
+ "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 12"
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "license": "ISC",
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": ">=8"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "dev": true,
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -4116,1164 +7790,1089 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
- "dev": true,
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"license": "MIT",
"engines": {
- "node": ">=8.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dev": true,
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"license": "MIT",
"dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
+ "is-extglob": "^2.1.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10.0"
}
},
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
"engines": {
"node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
"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"
- },
+ "license": "MIT"
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "node_modules/isbinaryfile": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz",
+ "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
}
},
- "node_modules/glob/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
+ "license": "ISC"
},
- "node_modules/global-agent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
- "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
"dev": true,
- "license": "BSD-3-Clause",
- "optional": true,
+ "license": "BlueOak-1.0.0",
"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"
+ "@isaacs/cliui": "^8.0.2"
},
- "engines": {
- "node": ">=10.0"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
}
},
- "node_modules/global-agent/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "node_modules/jake": {
+ "version": "10.9.4",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
"dev": true,
- "license": "ISC",
- "optional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.6",
+ "filelist": "^1.0.4",
+ "picocolors": "^1.1.1"
+ },
"bin": {
- "semver": "bin/semver.js"
+ "jake": "bin/cli.js"
},
"engines": {
"node": ">=10"
}
},
- "node_modules/globalthis": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
- "dev": true,
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "devOptional": true,
"license": "MIT",
- "optional": true,
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/joi": {
+ "version": "18.0.2",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-18.0.2.tgz",
+ "integrity": "sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
+ "@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": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 20"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "dev": true,
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "argparse": "^2.0.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+ "node_modules/jsdom": {
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
+ "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
"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"
+ "abab": "^2.0.6",
+ "acorn": "^8.8.1",
+ "acorn-globals": "^7.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.2",
+ "decimal.js": "^10.4.2",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.2",
+ "parse5": "^7.1.1",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.1.2",
+ "w3c-xmlserializer": "^4.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0",
+ "ws": "^8.11.0",
+ "xml-name-validator": "^4.0.0"
},
"engines": {
- "node": ">=10.19.0"
+ "node": ">=14"
},
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/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",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
"license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "dependencies": {
+ "json-buffer": "3.0.1"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/lazy-val": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
+ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==",
+ "license": "MIT"
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 0.8.0"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
}
},
- "node_modules/hosted-git-info": {
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^6.0.0"
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
},
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/html-encoding-sniffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
- "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
- "dev": true,
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"license": "MIT",
"dependencies": {
- "whatwg-encoding": "^2.0.0"
+ "js-tokens": "^3.0.0 || ^4.0.0"
},
- "engines": {
- "node": ">=12"
+ "bin": {
+ "loose-envify": "cli.js"
}
},
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "node_modules/loupe": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+ "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
"dev": true,
"license": "MIT"
},
- "node_modules/http-cache-semantics": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
- "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+ "node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true,
- "license": "BSD-2-Clause"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 6"
+ "node": ">=10"
}
},
- "node_modules/http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+ "node_modules/lucide-react": {
+ "version": "0.462.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.462.0.tgz",
+ "integrity": "sha512-NTL7EbAao9IFtuSivSZgrAh4fZd09Lr+6MTkqIxuHaH2nnYiYIzXPo06cOxHg9wKLdj6LL8TByG4qpePqwgx/g==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
+ "peer": true,
+ "bin": {
+ "lz-string": "bin/bin.js"
}
},
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
+ "@jridgewell/sourcemap-codec": "^1.5.5"
}
},
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "node_modules/make-fetch-happen": {
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz",
+ "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^3.0.0",
+ "cacache": "^19.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
+ },
"engines": {
- "node": ">=10.17.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/iconv-corefoundation": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
- "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==",
+ "node_modules/matcher": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
"dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "darwin"
- ],
"dependencies": {
- "cli-truncate": "^2.1.0",
- "node-addon-api": "^1.6.3"
+ "escape-string-regexp": "^4.0.0"
},
"engines": {
- "node": "^8.11.2 || >=10"
+ "node": ">=10"
}
},
- "node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/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/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
},
- "node_modules/import-local": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
- "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
- "dev": true,
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"license": "MIT",
"dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
},
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "license": "MIT",
"bin": {
- "import-local-fixture": "fixtures/cli.js"
+ "mime": "cli.js"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=4.0.0"
}
},
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
- "node": ">=0.8.19"
+ "node": ">= 0.6"
}
},
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/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",
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
"dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
- "license": "ISC"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "node_modules/minimatch": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "hasown": "^2.0.2"
+ "@isaacs/brace-expansion": "^5.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": "20 || >=22"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
- "dev": true,
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"engines": {
- "node": ">=0.12.0"
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-stream": {
+ "node_modules/minipass-collect": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/isbinaryfile": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz",
- "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==",
+ "node_modules/minipass-fetch": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz",
+ "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^3.0.1"
+ },
"engines": {
- "node": ">= 18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
},
- "funding": {
- "url": "https://github.com/sponsors/gjtorikian/"
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
}
},
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/istanbul-lib-coverage": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
- "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 8"
}
},
- "node_modules/istanbul-lib-instrument": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
- "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
"dependencies": {
- "@babel/core": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@istanbuljs/schema": "^0.1.3",
- "istanbul-lib-coverage": "^3.2.0",
- "semver": "^7.5.4"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
"dev": true,
"license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "dependencies": {
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/istanbul-lib-report": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
- "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
"dependencies": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^4.0.0",
- "supports-color": "^7.1.0"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/istanbul-lib-source-maps": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
- "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
"dependencies": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/istanbul-reports": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
- "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
"dependencies": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT",
"dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "minipass": "^7.1.2"
},
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
+ "engines": {
+ "node": ">= 18"
}
},
- "node_modules/jake": {
- "version": "10.9.4",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
- "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "async": "^3.2.6",
- "filelist": "^1.0.4",
- "picocolors": "^1.1.1"
- },
+ "license": "MIT",
"bin": {
- "jake": "bin/cli.js"
+ "mkdirp": "bin/cmd.js"
},
"engines": {
"node": ">=10"
}
},
- "node_modules/jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
- "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
- "dev": true,
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"license": "MIT",
"dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/types": "^29.6.3",
- "import-local": "^3.0.2",
- "jest-cli": "^29.7.0"
- },
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"bin": {
- "jest": "bin/jest.js"
+ "nanoid": "bin/nanoid.cjs"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "node_modules/jest-changed-files": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
- "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "execa": "^5.0.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.6"
}
},
- "node_modules/jest-changed-files/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/node-abi": {
+ "version": "4.26.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.26.0.tgz",
+ "integrity": "sha512-8QwIZqikRvDIkXS2S93LjzhsSPJuIbfaMETWH+Bx8oOT9Sa9UsUtBFQlc3gBNd1+QINjaTloitXr1W3dQLi9Iw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "semver": "^7.6.3"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=22.12.0"
}
},
- "node_modules/jest-circus": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
- "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/expect": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "co": "^4.6.0",
- "dedent": "^1.0.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^29.7.0",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "p-limit": "^3.1.0",
- "pretty-format": "^29.7.0",
- "pure-rand": "^6.0.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-circus/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/node-abi/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-cli": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
- "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "node_modules/node-addon-api": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/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.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz",
+ "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/core": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "create-jest": "^29.7.0",
- "exit": "^0.1.2",
- "import-local": "^3.0.2",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "yargs": "^17.3.1"
- },
+ "semver": "^7.3.5"
+ }
+ },
+ "node_modules/node-api-version/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
"bin": {
- "jest": "bin/jest.js"
+ "semver": "bin/semver.js"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "node": ">=10"
}
},
- "node_modules/jest-config": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
- "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "node_modules/node-gyp": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz",
+ "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-jest": "^29.7.0",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "deepmerge": "^4.2.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-circus": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-runner": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "micromatch": "^4.0.4",
- "parse-json": "^5.2.0",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^14.0.3",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.4.3",
+ "tinyglobby": "^0.2.12",
+ "which": "^5.0.0"
},
- "peerDependencies": {
- "@types/node": "*",
- "ts-node": ">=9.0.0"
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/jest-diff": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
- "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "node_modules/node-gyp/node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "diff-sequences": "^29.6.3",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=18"
}
},
- "node_modules/jest-docblock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
- "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "node_modules/node-gyp/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "detect-newline": "^3.0.0"
- },
+ "license": "ISC",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=16"
}
},
- "node_modules/jest-each": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
- "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "node_modules/node-gyp/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "jest-util": "^29.7.0",
- "pretty-format": "^29.7.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10"
}
},
- "node_modules/jest-environment-jsdom": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz",
- "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==",
+ "node_modules/node-gyp/node_modules/tar": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz",
+ "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/jsdom": "^20.0.0",
- "@types/node": "*",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0",
- "jsdom": "^20.0.0"
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "canvas": "^2.5.0"
- },
- "peerDependenciesMeta": {
- "canvas": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/jest-environment-node": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
- "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "node_modules/node-gyp/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "node_modules/node-gyp/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=18"
}
},
- "node_modules/jest-haste-map": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
- "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true,
- "license": "MIT",
+ "license": "MIT"
+ },
+ "node_modules/nopt": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
+ "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/graceful-fs": "^4.1.3",
- "@types/node": "*",
- "anymatch": "^3.0.3",
- "fb-watchman": "^2.0.0",
- "graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.6.3",
- "jest-util": "^29.7.0",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
+ "abbrev": "^3.0.0"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "bin": {
+ "nopt": "bin/nopt.js"
},
- "optionalDependencies": {
- "fsevents": "^2.3.2"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/jest-leak-detector": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
- "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
- "dev": true,
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"license": "MIT",
- "dependencies": {
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-matcher-utils": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
- "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "pretty-format": "^29.7.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-message-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "node_modules/nwsapi": {
+ "version": "2.2.21",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz",
+ "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.6.3",
- "@types/stack-utils": "^2.0.0",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "micromatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.3"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-mock": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
- "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
- "dev": true,
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-util": "^29.7.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 6"
}
},
- "node_modules/jest-pnp-resolver": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
- "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"license": "MIT",
+ "optional": true,
"engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "jest-resolve": "*"
- },
- "peerDependenciesMeta": {
- "jest-resolve": {
- "optional": true
- }
+ "node": ">= 0.4"
}
},
- "node_modules/jest-regex-util": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
- "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
}
},
- "node_modules/jest-resolve": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
- "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.7.0",
- "jest-validate": "^29.7.0",
- "resolve": "^1.20.0",
- "resolve.exports": "^2.0.0",
- "slash": "^3.0.0"
+ "mimic-fn": "^2.1.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-resolve-dependencies": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
- "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "jest-regex-util": "^29.6.3",
- "jest-snapshot": "^29.7.0"
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.8.0"
}
},
- "node_modules/jest-runner": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
- "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jest/console": "^29.7.0",
- "@jest/environment": "^29.7.0",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "graceful-fs": "^4.2.9",
- "jest-docblock": "^29.7.0",
- "jest-environment-node": "^29.7.0",
- "jest-haste-map": "^29.7.0",
- "jest-leak-detector": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-resolve": "^29.7.0",
- "jest-runtime": "^29.7.0",
- "jest-util": "^29.7.0",
- "jest-watcher": "^29.7.0",
- "jest-worker": "^29.7.0",
- "p-limit": "^3.1.0",
- "source-map-support": "0.5.13"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-runner/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "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"
@@ -5282,2382 +8881,2816 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-runner/node_modules/source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "node_modules/p-cancelable": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/jest-runtime": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
- "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "node_modules/p-map": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
+ "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@jest/environment": "^29.7.0",
- "@jest/fake-timers": "^29.7.0",
- "@jest/globals": "^29.7.0",
- "@jest/source-map": "^29.6.3",
- "@jest/test-result": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "cjs-module-lexer": "^1.0.0",
- "collect-v8-coverage": "^1.0.0",
- "glob": "^7.1.3",
- "graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-regex-util": "^29.6.3",
- "jest-resolve": "^29.7.0",
- "jest-snapshot": "^29.7.0",
- "jest-util": "^29.7.0",
- "slash": "^3.0.0",
- "strip-bom": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-snapshot": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
- "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.11.6",
- "@babel/generator": "^7.7.2",
- "@babel/plugin-syntax-jsx": "^7.7.2",
- "@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.7.0",
- "@jest/transform": "^29.7.0",
- "@jest/types": "^29.6.3",
- "babel-preset-current-node-syntax": "^1.0.0",
- "chalk": "^4.0.0",
- "expect": "^29.7.0",
- "graceful-fs": "^4.2.9",
- "jest-diff": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0",
- "natural-compare": "^1.4.0",
- "pretty-format": "^29.7.0",
- "semver": "^7.5.3"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
+ "license": "BlueOak-1.0.0"
},
- "node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
+ "callsites": "^3.0.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=6"
}
},
- "node_modules/jest-validate": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/types": "^29.6.3",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "leven": "^3.1.0",
- "pretty-format": "^29.7.0"
+ "entities": "^6.0.0"
},
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "node_modules/jest-validate/node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/jest-watcher": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
- "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@jest/test-result": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.0.0",
- "emittery": "^0.13.1",
- "jest-util": "^29.7.0",
- "string-length": "^4.0.1"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "jest-util": "^29.7.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "has-flag": "^4.0.0"
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true,
- "license": "MIT"
+ "license": "ISC"
},
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
+ "license": "MIT"
},
- "node_modules/jsdom": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
- "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+ "node_modules/pathval": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+ "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "abab": "^2.0.6",
- "acorn": "^8.8.1",
- "acorn-globals": "^7.0.0",
- "cssom": "^0.5.0",
- "cssstyle": "^2.3.0",
- "data-urls": "^3.0.2",
- "decimal.js": "^10.4.2",
- "domexception": "^4.0.0",
- "escodegen": "^2.0.0",
- "form-data": "^4.0.0",
- "html-encoding-sniffer": "^3.0.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.1",
- "is-potential-custom-element-name": "^1.0.1",
- "nwsapi": "^2.2.2",
- "parse5": "^7.1.1",
- "saxes": "^6.0.0",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^4.1.2",
- "w3c-xmlserializer": "^4.0.0",
- "webidl-conversions": "^7.0.0",
- "whatwg-encoding": "^2.0.0",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^11.0.0",
- "ws": "^8.11.0",
- "xml-name-validator": "^4.0.0"
- },
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "canvas": "^2.5.0"
- },
- "peerDependenciesMeta": {
- "canvas": {
- "optional": true
- }
+ "node": ">= 14.16"
}
},
- "node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "node_modules/pe-library": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz",
+ "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==",
"dev": true,
"license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
"engines": {
- "node": ">=6"
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jet2jet"
}
},
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"dev": true,
"license": "MIT"
},
- "node_modules/json-parse-even-better-errors": {
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
"version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true,
- "license": "MIT"
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
},
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true,
- "license": "ISC",
- "optional": true
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
},
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
"dev": true,
"license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
},
"engines": {
- "node": ">=6"
+ "node": ">=10.4.0"
}
},
- "node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"license": "MIT",
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
}
},
- "node_modules/jsonwebtoken": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
- "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
"license": "MIT",
"dependencies": {
- "jws": "^3.2.2",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^7.5.4"
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
},
"engines": {
- "node": ">=12",
- "npm": ">=6"
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
}
},
- "node_modules/jsonwebtoken/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/postcss-js": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
},
"engines": {
- "node": ">=10"
+ "node": "^12 || ^14 || >= 16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
}
},
- "node_modules/jwa": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
- "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
+ "node_modules/postcss-load-config": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "buffer-equal-constant-time": "^1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
}
},
- "node_modules/jws": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "jwa": "^1.4.1",
- "safe-buffer": "^5.0.1"
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
}
},
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
+ "node_modules/postcss-nested/node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"license": "MIT",
"dependencies": {
- "json-buffer": "3.0.1"
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=4"
}
},
- "node_modules/lazy-val": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
- "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==",
- "dev": true,
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"license": "MIT"
},
- "node_modules/lazystream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
- "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+ "node_modules/postject": {
+ "version": "1.0.0-alpha.6",
+ "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz",
+ "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==",
"dev": true,
"license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
- "readable-stream": "^2.0.5"
+ "commander": "^9.4.0"
+ },
+ "bin": {
+ "postject": "dist/cli.js"
},
"engines": {
- "node": ">= 0.6.3"
+ "node": ">=14.0.0"
}
},
- "node_modules/lazystream/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "node_modules/postject/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"dev": true,
"license": "MIT",
+ "optional": true,
"peer": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "engines": {
+ "node": "^12.20.0 || >=14"
}
},
- "node_modules/lazystream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
"license": "MIT",
- "peer": true
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "node_modules/lazystream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "node_modules/proc-log": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
+ "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==",
"dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=0.4.0"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"license": "MIT",
"dependencies": {
- "p-locate": "^4.1.0"
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true,
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
- "node_modules/lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
"dev": true,
"license": "MIT",
- "peer": true
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/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/lodash.difference": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
- "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==",
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"license": "MIT",
- "peer": true
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
"dev": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
- "license": "MIT"
- },
- "node_modules/lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
- "license": "MIT"
- },
- "node_modules/lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
- "license": "MIT"
- },
- "node_modules/lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
- "license": "MIT"
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "license": "MIT"
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
"license": "MIT"
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "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/lodash.union": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
- "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==",
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"license": "MIT",
- "peer": true
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true,
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=0.10.0"
}
},
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "license": "ISC",
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
},
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "react": "^18.3.1"
}
},
- "node_modules/make-dir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
- "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
- "dev": true,
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
"license": "MIT",
"dependencies": {
- "semver": "^7.5.3"
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
},
"engines": {
"node": ">=10"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/make-dir/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
},
"engines": {
"node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/makeerror": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tmpl": "1.0.5"
+ "node_modules/react-resizable-panels": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz",
+ "integrity": "sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
}
},
- "node_modules/marked": {
- "version": "12.0.2",
- "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz",
- "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==",
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
"license": "MIT",
- "bin": {
- "marked": "bin/marked.js"
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
},
"engines": {
- "node": ">= 18"
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/matcher": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
- "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
+ "node_modules/read-binary-file-arch": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz",
+ "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==",
"dev": true,
"license": "MIT",
- "optional": true,
"dependencies": {
- "escape-string-regexp": "^4.0.0"
+ "debug": "^4.3.4"
},
- "engines": {
- "node": ">=10"
+ "bin": {
+ "read-binary-file-arch": "cli.js"
}
},
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "dev": true,
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "pify": "^2.3.0"
}
},
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
},
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"license": "MIT",
"dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
+ "picomatch": "^2.2.1"
},
"engines": {
- "node": ">=8.6"
+ "node": ">=8.10.0"
}
},
- "node_modules/mime": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
"dev": true,
"license": "MIT",
- "bin": {
- "mime": "cli.js"
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">=8"
}
},
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">=0.10.0"
}
},
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/resedit": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz",
+ "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "mime-db": "1.52.0"
+ "pe-library": "^0.4.1"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jet2jet"
}
},
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
"license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
+ "license": "MIT"
},
- "node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "node_modules/responselike": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/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": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
"dev": true,
"license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">= 4"
}
},
- "node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
- "dev": true,
- "license": "ISC",
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
}
},
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "peer": true,
"dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
+ "glob": "^7.1.3"
},
- "engines": {
- "node": ">= 8"
+ "bin": {
+ "rimraf": "bin.js"
}
},
- "node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "node_modules/roarr": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
"dev": true,
- "license": "ISC",
+ "license": "BSD-3-Clause",
+ "optional": true,
"dependencies": {
- "yallist": "^4.0.0"
+ "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"
+ "node": ">=8.0"
}
},
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "node_modules/rollup": {
+ "version": "4.55.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.3.tgz",
+ "integrity": "sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
"bin": {
- "mkdirp": "bin/cmd.js"
+ "rollup": "dist/bin/rollup"
},
"engines": {
- "node": ">=10"
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.55.3",
+ "@rollup/rollup-android-arm64": "4.55.3",
+ "@rollup/rollup-darwin-arm64": "4.55.3",
+ "@rollup/rollup-darwin-x64": "4.55.3",
+ "@rollup/rollup-freebsd-arm64": "4.55.3",
+ "@rollup/rollup-freebsd-x64": "4.55.3",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.55.3",
+ "@rollup/rollup-linux-arm-musleabihf": "4.55.3",
+ "@rollup/rollup-linux-arm64-gnu": "4.55.3",
+ "@rollup/rollup-linux-arm64-musl": "4.55.3",
+ "@rollup/rollup-linux-loong64-gnu": "4.55.3",
+ "@rollup/rollup-linux-loong64-musl": "4.55.3",
+ "@rollup/rollup-linux-ppc64-gnu": "4.55.3",
+ "@rollup/rollup-linux-ppc64-musl": "4.55.3",
+ "@rollup/rollup-linux-riscv64-gnu": "4.55.3",
+ "@rollup/rollup-linux-riscv64-musl": "4.55.3",
+ "@rollup/rollup-linux-s390x-gnu": "4.55.3",
+ "@rollup/rollup-linux-x64-gnu": "4.55.3",
+ "@rollup/rollup-linux-x64-musl": "4.55.3",
+ "@rollup/rollup-openbsd-x64": "4.55.3",
+ "@rollup/rollup-openharmony-arm64": "4.55.3",
+ "@rollup/rollup-win32-arm64-msvc": "4.55.3",
+ "@rollup/rollup-win32-ia32-msvc": "4.55.3",
+ "@rollup/rollup-win32-x64-gnu": "4.55.3",
+ "@rollup/rollup-win32-x64-msvc": "4.55.3",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "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": {
+ "queue-microtask": "^1.2.2"
}
},
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/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/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"license": "MIT"
},
- "node_modules/node-addon-api": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
- "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==",
+ "node_modules/sanitize-filename": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
+ "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
"dev": true,
- "license": "MIT",
- "optional": true
+ "license": "WTFPL OR ISC",
+ "dependencies": {
+ "truncate-utf8-bytes": "^1.0.0"
+ }
},
- "node_modules/node-cron": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz",
- "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
+ "node_modules/sax": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
+ "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
"license": "ISC",
"dependencies": {
- "uuid": "8.3.2"
+ "xmlchars": "^2.2.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=v12.22.7"
}
},
- "node_modules/node-cron/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
+ "dependencies": {
+ "loose-envify": "^1.1.0"
}
},
- "node_modules/node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "license": "MIT"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
},
- "node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "node_modules/semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true
},
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "node_modules/serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/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": ">=0.10.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
"dev": true,
- "license": "MIT",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
"engines": {
- "node": ">=10"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/sharp/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "path-key": "^3.0.0"
+ "shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/nwsapi": {
- "version": "2.2.21",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz",
- "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==",
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
"license": "MIT",
- "optional": true,
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
+ "license": "ISC"
},
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "mimic-fn": "^2.1.0"
+ "semver": "^7.5.3"
},
"engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=10"
}
},
- "node_modules/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "node_modules/simple-update-notifier/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=10"
}
},
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "p-limit": "^2.2.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
}
},
- "node_modules/package-json-from-dist": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/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/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "node_modules/socks": {
+ "version": "2.8.7",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
+ "ip-address": "^10.0.1",
+ "smart-buffer": "^4.2.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
}
},
- "node_modules/parse5": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
- "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "entities": "^6.0.0"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
},
- "funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
+ "engines": {
+ "node": ">= 14"
}
},
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "node_modules/socks-proxy-agent/node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 14"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
+ "node_modules/sonner": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz",
+ "integrity": "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==",
"license": "MIT",
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/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/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
},
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
"dev": true,
- "license": "MIT"
+ "license": "BSD-3-Clause",
+ "optional": true
},
- "node_modules/path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "node_modules/ssri": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz",
+ "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "ISC",
"dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ "minipass": "^7.0.3"
},
"engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
"dev": true,
"license": "MIT"
},
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "node_modules/stat-mode": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
+ "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "node_modules/std-env": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "license": "MIT"
},
- "node_modules/plist": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
- "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"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/pngjs": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
- "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
+ "safe-buffer": "~5.2.0"
}
},
- "node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "dev": true,
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true,
- "license": "MIT",
"engines": {
- "node": ">=0.4.0"
+ "node": ">=8"
}
},
- "node_modules/promise-retry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
- "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
- "dev": true,
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
- "err-code": "^2.0.2",
- "retry": "^0.12.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": ">= 6"
+ "node": ">=8"
}
},
- "node_modules/psl": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
- "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "punycode": "^2.3.1"
+ "min-indent": "^1.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/lupomontero"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/pump": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
- "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "node_modules/strip-literal": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
+ "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
}
},
- "node_modules/pure-rand": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
- "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/dubzzz"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fast-check"
- }
- ],
"license": "MIT"
},
- "node_modules/qrcode": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz",
- "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
+ "node_modules/sucrase": {
+ "version": "3.35.1",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
"license": "MIT",
"dependencies": {
- "dijkstrajs": "^1.0.1",
- "pngjs": "^5.0.0",
- "yargs": "^15.3.1"
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "tinyglobby": "^0.2.11",
+ "ts-interface-checker": "^0.1.9"
},
"bin": {
- "qrcode": "bin/qrcode"
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/qrcode/node_modules/cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/qrcode/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "license": "MIT",
+ "node_modules/sumchecker": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
+ "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "debug": "^4.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 8.0"
}
},
- "node_modules/qrcode/node_modules/y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "license": "ISC"
- },
- "node_modules/qrcode/node_modules/yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
"dependencies": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
+ "has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/qrcode/node_modules/yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "license": "ISC",
- "dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
"dev": true,
"license": "MIT"
},
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true,
+ "node_modules/tailwind-merge": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
+ "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
"license": "MIT",
- "engines": {
- "node": ">=10"
- },
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.19",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
+ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.7",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
}
},
- "node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true,
- "license": "MIT"
+ "node_modules/tailwindcss-animate": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
+ "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders"
+ }
},
- "node_modules/read-config-file": {
- "version": "6.3.2",
- "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz",
- "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==",
- "dev": true,
+ "node_modules/tailwindcss/node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"license": "MIT",
"dependencies": {
- "config-file-ts": "^0.2.4",
- "dotenv": "^9.0.2",
- "dotenv-expand": "^5.1.0",
- "js-yaml": "^4.1.0",
- "json5": "^2.2.0",
- "lazy-val": "^1.0.4"
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=4"
}
},
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me",
"dev": true,
- "license": "MIT",
- "peer": true,
+ "license": "ISC",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "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": ">= 6"
+ "node": ">=10"
}
},
- "node_modules/readdir-glob": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
- "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
+ "node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"dev": true,
- "license": "Apache-2.0",
- "peer": true,
+ "license": "ISC",
"dependencies": {
- "minimatch": "^5.1.0"
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "license": "MIT",
+ "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
- "node_modules/require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "license": "ISC"
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
- "license": "MIT"
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "node_modules/tar/node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
},
- "bin": {
- "resolve": "bin/resolve"
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tar/node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
+ }
+ },
+ "node_modules/temp": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/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"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "node_modules/temp-file": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz",
+ "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "async-exit-hook": "^2.0.1",
+ "fs-extra": "^10.0.0"
+ }
},
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "node_modules/temp-file/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "resolve-from": "^5.0.0"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
}
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/temp-file/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/resolve.exports": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
- "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
+ "node_modules/temp-file/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 10.0.0"
}
},
- "node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "node_modules/temp/node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "lowercase-keys": "^2.0.0"
+ "minimist": "^1.2.6"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "bin": {
+ "mkdirp": "bin/cmd.js"
}
},
- "node_modules/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
- "dev": true,
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"license": "MIT",
- "engines": {
- "node": ">= 4"
+ "dependencies": {
+ "any-promise": "^1.0.0"
}
},
- "node_modules/roarr": {
- "version": "2.15.4",
- "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
- "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
- "dev": true,
- "license": "BSD-3-Clause",
- "optional": true,
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
"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"
+ "thenify": ">= 3.1.0 < 4"
},
"engines": {
- "node": ">=8.0"
+ "node": ">=0.8"
}
},
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "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/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "node_modules/tiny-async-pool": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz",
+ "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^5.5.0"
+ }
},
- "node_modules/sanitize-filename": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
- "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
+ "node_modules/tiny-async-pool/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
- "license": "WTFPL OR ISC",
- "dependencies": {
- "truncate-utf8-bytes": "^1.0.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
}
},
- "node_modules/sax": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
- "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "node_modules/tiny-typed-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
+ "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==",
+ "license": "MIT"
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/saxes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
- "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "license": "MIT",
"dependencies": {
- "xmlchars": "^2.2.0"
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
},
"engines": {
- "node": ">=v12.22.7"
- }
- },
- "node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
}
},
- "node_modules/semver-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
- "dev": true,
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"license": "MIT",
- "optional": true
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
},
- "node_modules/serialize-error": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
- "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
- "dev": true,
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT",
- "optional": true,
- "dependencies": {
- "type-fest": "^0.13.1"
- },
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "license": "ISC"
+ "node_modules/tinypool": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+ "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
},
- "node_modules/shebang-command": {
+ "node_modules/tinyrainbow": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
"engines": {
- "node": ">=8"
+ "node": ">=14.0.0"
}
},
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "node_modules/tinyspy": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz",
+ "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=14.0.0"
}
},
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "node_modules/tmp": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
+ "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=14.14"
}
},
- "node_modules/simple-update-notifier": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
- "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "node_modules/tmp-promise": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
+ "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "semver": "^7.5.3"
+ "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",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8.0"
}
},
- "node_modules/simple-update-notifier/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
},
"engines": {
- "node": ">=10"
+ "node": ">=6"
}
},
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 4.0.0"
}
},
- "node_modules/slice-ansi": {
+ "node_modules/tr46": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
"dev": true,
"license": "MIT",
- "optional": true,
"dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
+ "punycode": "^2.1.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
}
},
- "node_modules/smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "dev": true,
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
"license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
+ "bin": {
+ "tree-kill": "cli.js"
}
},
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/truncate-utf8-bytes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+ "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
"dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
+ "license": "WTFPL",
+ "dependencies": {
+ "utf8-byte-length": "^1.0.1"
}
},
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "node_modules/ts-api-utils": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
+ "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
}
},
- "node_modules/sprintf-js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/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/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
},
- "node_modules/stack-utils": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
- "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
"dependencies": {
- "escape-string-regexp": "^2.0.0"
+ "prelude-ls": "^1.2.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.8.0"
}
},
- "node_modules/stack-utils/node_modules/escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
"dev": true,
- "license": "MIT",
+ "license": "(MIT OR CC0-1.0)",
+ "optional": true,
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/stat-mode": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
- "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
+ "node_modules/typescript": {
+ "version": "5.9.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
+ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
"engines": {
- "node": ">= 6"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
+ "node": ">=14.17"
}
},
- "node_modules/string-length": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
- "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "node_modules/typescript-eslint": {
+ "version": "8.53.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.1.tgz",
+ "integrity": "sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "char-regex": "^1.0.2",
- "strip-ansi": "^6.0.0"
+ "@typescript-eslint/eslint-plugin": "8.53.1",
+ "@typescript-eslint/parser": "8.53.1",
+ "@typescript-eslint/typescript-estree": "8.53.1",
+ "@typescript-eslint/utils": "8.53.1"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "license": "MIT",
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unique-filename": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz",
+ "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
+ "unique-slug": "^5.0.0"
},
"engines": {
- "node": ">=8"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "node_modules/unique-slug": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz",
+ "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
+ "imurmurhash": "^0.1.4"
},
"engines": {
- "node": ">=8"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
"engines": {
- "node": ">=8"
+ "node": ">= 4.0.0"
}
},
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "ansi-regex": "^5.0.1"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
},
- "engines": {
- "node": ">=8"
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
}
},
- "node_modules/strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
}
},
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.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",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
"license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/sumchecker": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
- "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
- "dev": true,
- "license": "Apache-2.0",
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.0"
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
},
"engines": {
- "node": ">= 8.0"
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/utf8-byte-length": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/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",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/verror": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz",
+ "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==",
"dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "has-flag": "^4.0.0"
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=0.6.0"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "node_modules/vite": {
+ "version": "5.4.21",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": "^18.0.0 || >=20.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
}
},
- "node_modules/symbol-tree": {
+ "node_modules/vite-node": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tar": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
- "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
+ "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"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"
+ "cac": "^6.7.14",
+ "debug": "^4.4.1",
+ "es-module-lexer": "^1.7.0",
+ "pathe": "^2.0.3",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
},
"engines": {
- "node": ">=10"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
"license": "MIT",
- "peer": true,
- "dependencies": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- },
+ "optional": true,
+ "os": [
+ "aix"
+ ],
"engines": {
- "node": ">=6"
+ "node": ">=12"
}
},
- "node_modules/temp-file": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz",
- "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "async-exit-hook": "^2.0.1",
- "fs-extra": "^10.0.0"
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/temp-file/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
"node": ">=12"
}
},
- "node_modules/temp-file/node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/temp-file/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=12"
}
},
- "node_modules/test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "ISC",
- "dependencies": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">=12"
}
},
- "node_modules/test-exclude/node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/test-exclude/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": "*"
+ "node": ">=12"
}
},
- "node_modules/tmp": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
- "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">=14.14"
+ "node": ">=12"
}
},
- "node_modules/tmp-promise": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
- "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "tmp": "^0.2.0"
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8.0"
+ "node": ">=12"
}
},
- "node_modules/tough-cookie": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
- "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6"
+ "node": ">=12"
}
},
- "node_modules/tough-cookie/node_modules/universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">= 4.0.0"
+ "node": ">=12"
}
},
- "node_modules/tr46": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
- "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "punycode": "^2.1.1"
- },
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
"node": ">=12"
}
},
- "node_modules/truncate-utf8-bytes": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
- "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "license": "WTFPL",
- "dependencies": {
- "utf8-byte-length": "^1.0.1"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=4"
+ "node": ">=12"
}
},
- "node_modules/type-fest": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "license": "(MIT OR CC0-1.0)",
+ "license": "MIT",
"optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=12"
}
},
- "node_modules/typescript": {
- "version": "5.9.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
- "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=14.17"
+ "node": ">=12"
}
},
- "node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": ">= 4.0.0"
+ "node": ">=12"
}
},
- "node_modules/update-browserslist-db": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
- "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
],
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/utf8-byte-length": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/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",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
"license": "MIT",
- "peer": true
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
},
- "node_modules/uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
],
+ "dev": true,
"license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/v8-to-istanbul": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
- "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.12",
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^2.0.0"
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
},
"engines": {
- "node": ">=10.12.0"
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
+ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/expect": "3.2.4",
+ "@vitest/mocker": "3.2.4",
+ "@vitest/pretty-format": "^3.2.4",
+ "@vitest/runner": "3.2.4",
+ "@vitest/snapshot": "3.2.4",
+ "@vitest/spy": "3.2.4",
+ "@vitest/utils": "3.2.4",
+ "chai": "^5.2.0",
+ "debug": "^4.4.1",
+ "expect-type": "^1.2.1",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.2",
+ "std-env": "^3.9.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.14",
+ "tinypool": "^1.1.1",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+ "vite-node": "3.2.4",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.2.4",
+ "@vitest/ui": "3.2.4",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
}
},
- "node_modules/verror": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz",
- "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==",
+ "node_modules/vitest/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"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": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/w3c-xmlserializer": {
@@ -7673,14 +11706,33 @@
"node": ">=14"
}
},
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "node_modules/wait-on": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.3.tgz",
+ "integrity": "sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==",
+ "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.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "makeerror": "1.0.12"
+ "defaults": "^1.0.3"
}
},
"node_modules/webidl-conversions": {
@@ -7746,17 +11798,37 @@
"node": ">= 8"
}
},
- "node_modules/which-module": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
- "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
- "license": "ISC"
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -7796,27 +11868,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/write-file-atomic": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
- "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/write-file-atomic/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "license": "ISC"
- },
"node_modules/ws": {
"version": "8.18.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
@@ -7870,7 +11921,6 @@
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
"license": "ISC",
"engines": {
"node": ">=10"
@@ -7887,7 +11937,6 @@
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
@@ -7906,7 +11955,6 @@
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
@@ -7935,45 +11983,6 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
- },
- "node_modules/zip-stream": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz",
- "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "archiver-utils": "^3.0.4",
- "compress-commons": "^4.1.2",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/zip-stream/node_modules/archiver-utils": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz",
- "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "glob": "^7.2.3",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.5.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.union": "^4.6.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">= 10"
- }
}
}
}
diff --git a/package.json b/package.json
index e7bb24c0..3ee71b41 100644
--- a/package.json
+++ b/package.json
@@ -1,77 +1,131 @@
{
- "name": "dev-tools-desktop",
+ "name": "devtools",
+ "private": true,
"version": "1.0.0",
- "description": "Desktop version of dev-tool.dev - Ultimate Developer Toolkit",
- "main": "src/main.js",
- "scripts": {
- "start": "electron .",
- "dev": "electron . --dev",
- "build": "electron-builder",
- "pack": "electron-builder --dir",
- "dist": "electron-builder --publish=never",
- "test": "jest",
- "test:watch": "jest --watch",
- "test:coverage": "jest --coverage",
- "security-check": "./scripts/security-check.sh",
- "pre-commit": "npm run security-check"
- },
- "keywords": [
- "electron",
- "developer-tools",
- "utilities",
- "json",
- "base64",
- "uuid",
- "converter"
- ],
- "author": "Dev Tools Desktop",
+ "description": "DevTools - Your Essential Developer Companion",
+ "author": "Ahmed Shamim",
"license": "MIT",
- "devDependencies": {
- "electron": "^28.0.0",
- "electron-builder": "^24.0.0",
- "jest": "^29.7.0",
- "jest-environment-jsdom": "^29.7.0"
+ "main": "dist-electron/main.js",
+ "type": "module",
+ "scripts": {
+ "dev": "concurrently \"vite\" \"node scripts/build-electron.js --watch\" \"wait-on http://localhost:8080 && electron .\"",
+ "build:electron": "node scripts/build-electron.js",
+ "build": "vite build && npm run build:electron",
+ "build:dev": "vite build --mode development && npm run build:electron",
+ "dist": "npm run build && electron-builder --publish=never",
+ "dist:publish": "npm run build && electron-builder --publish=always",
+ "icon": "node scripts/create-icon.js",
+ "lint": "eslint .",
+ "preview": "vite preview",
+ "test": "vitest run",
+ "test:watch": "vitest"
},
"dependencies": {
- "crypto-js": "^4.2.0",
- "jsonwebtoken": "^9.0.2",
- "marked": "^12.0.0",
- "node-cron": "^3.0.3",
- "qrcode": "^1.5.3",
- "uuid": "^9.0.1"
+ "@radix-ui/react-label": "^2.1.7",
+ "@radix-ui/react-select": "^2.2.5",
+ "@radix-ui/react-slider": "^1.3.5",
+ "@radix-ui/react-slot": "^1.2.3",
+ "@radix-ui/react-switch": "^1.2.5",
+ "@radix-ui/react-tabs": "^1.1.12",
+ "@radix-ui/react-toast": "^1.2.14",
+ "@radix-ui/react-tooltip": "^1.2.7",
+ "@tanstack/react-query": "^5.83.0",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "concurrently": "^9.2.1",
+ "electron-updater": "^6.7.3",
+ "input-otp": "^1.4.2",
+ "lucide-react": "^0.462.0",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-resizable-panels": "^2.1.9",
+ "sonner": "^1.7.4",
+ "tailwind-merge": "^2.6.0",
+ "tailwindcss-animate": "^1.0.7",
+ "wait-on": "^9.0.3"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.32.0",
+ "@tailwindcss/typography": "^0.5.16",
+ "@testing-library/jest-dom": "^6.6.0",
+ "@testing-library/react": "^16.0.0",
+ "@types/node": "^22.19.7",
+ "@types/react": "^18.3.23",
+ "@types/react-dom": "^18.3.7",
+ "@vitejs/plugin-react-swc": "^3.11.0",
+ "autoprefixer": "^10.4.21",
+ "electron": "^40.0.0",
+ "electron-builder": "^26.4.0",
+ "esbuild": "^0.27.2",
+ "eslint": "^9.32.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.20",
+ "globals": "^15.15.0",
+ "jsdom": "^20.0.3",
+ "postcss": "^8.5.6",
+ "sharp": "^0.34.5",
+ "tailwindcss": "^3.4.17",
+ "typescript": "^5.8.3",
+ "typescript-eslint": "^8.38.0",
+ "vite": "^5.4.19",
+ "vitest": "^3.2.4"
},
"build": {
- "appId": "com.devtools.desktop",
- "productName": "Dev Tools Desktop",
+ "appId": "com.meshaon.devtools",
+ "productName": "DevTools",
"directories": {
- "output": "dist"
+ "output": "release"
},
"files": [
- "src/**/*",
- "node_modules/**/*"
+ "dist/**",
+ "dist-electron/**",
+ "package.json"
],
+ "extraMetadata": {
+ "main": "dist-electron/main.js"
+ },
"mac": {
- "category": "public.app-category.developer-tools"
+ "target": [
+ {
+ "target": "dmg",
+ "arch": [
+ "x64",
+ "arm64"
+ ]
+ }
+ ],
+ "icon": "build/icon.png",
+ "category": "public.app-category.developer-tools",
+ "hardenedRuntime": true
},
"win": {
- "target": "nsis"
+ "target": [
+ {
+ "target": "nsis",
+ "arch": [
+ "x64",
+ "ia32"
+ ]
+ }
+ ],
+ "icon": "build/icon.png"
},
"linux": {
- "target": "AppImage"
+ "target": [
+ {
+ "target": "AppImage",
+ "arch": [
+ "x64"
+ ]
+ }
+ ],
+ "icon": "build/icon.png",
+ "category": "Development"
+ },
+ "publish": {
+ "provider": "github",
+ "owner": "me-shaon",
+ "repo": "devtools"
}
- },
- "jest": {
- "testEnvironment": "jsdom",
- "collectCoverageFrom": [
- "src/renderer/js/tools/**/*.js",
- "!src/renderer/js/tools/**/*.test.js"
- ],
- "testMatch": [
- "**/__tests__/**/*.test.js",
- "**/*.test.js"
- ],
- "setupFilesAfterEnv": [
- "/tests/setup.js"
- ]
}
}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 00000000..2aa7205d
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/public/app-icon.png b/public/app-icon.png
new file mode 100644
index 00000000..d5e519a1
Binary files /dev/null and b/public/app-icon.png differ
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 00000000..0b2da7f4
Binary files /dev/null and b/public/favicon.png differ
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 00000000..c2a49f4f
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Allow: /
diff --git a/scripts/build-electron.js b/scripts/build-electron.js
new file mode 100644
index 00000000..d9ce73bf
--- /dev/null
+++ b/scripts/build-electron.js
@@ -0,0 +1,52 @@
+import esbuild from "esbuild";
+import { resolve, dirname } from "path";
+import { fileURLToPath } from "url";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+const rootDir = resolve(__dirname, "..");
+
+const isWatch = process.argv.includes("--watch");
+
+async function build() {
+ // Build main process as ESM
+ const mainContext = await esbuild.context({
+ entryPoints: [resolve(rootDir, "src-electron/main.ts")],
+ bundle: true,
+ platform: "node",
+ target: "node20",
+ format: "esm",
+ outfile: resolve(rootDir, "dist-electron/main.js"),
+ external: ["electron", "electron-updater"],
+ logLevel: "info",
+ });
+
+ // Build preload script as CommonJS (Electron requires this)
+ const preloadContext = await esbuild.context({
+ entryPoints: [resolve(rootDir, "src-electron/preload.ts")],
+ bundle: true,
+ platform: "node",
+ target: "node20",
+ format: "cjs",
+ outfile: resolve(rootDir, "dist-electron/preload.js"),
+ external: ["electron"],
+ logLevel: "info",
+ });
+
+ if (isWatch) {
+ await mainContext.watch();
+ await preloadContext.watch();
+ console.log("Watching for changes...");
+ } else {
+ await mainContext.rebuild();
+ await mainContext.dispose();
+ await preloadContext.rebuild();
+ await preloadContext.dispose();
+ console.log("Build complete!");
+ }
+}
+
+build().catch((err) => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/scripts/create-icon.js b/scripts/create-icon.js
new file mode 100644
index 00000000..c9697bba
--- /dev/null
+++ b/scripts/create-icon.js
@@ -0,0 +1,16 @@
+import sharp from "sharp";
+import { readFileSync } from "fs";
+
+// Read the SVG
+const svgBuffer = readFileSync("build/icon.svg");
+
+// Convert to PNG
+sharp(svgBuffer)
+ .resize(1024, 1024)
+ .png()
+ .toFile("build/icon.png")
+ .then(() => console.log("Icon created successfully!"))
+ .catch((err) => {
+ console.error("Error creating icon:", err);
+ process.exit(1);
+ });
diff --git a/src-electron/main.ts b/src-electron/main.ts
new file mode 100644
index 00000000..e838c789
--- /dev/null
+++ b/src-electron/main.ts
@@ -0,0 +1,144 @@
+import { app, BrowserWindow, Tray, dialog, shell } from "electron";
+import path from "path";
+import { fileURLToPath } from "url";
+import { dirname } from "path";
+import electronUpdater from "electron-updater";
+
+const { autoUpdater } = electronUpdater;
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+let win: BrowserWindow | null = null;
+let tray: Tray | null = null;
+
+const isDev = !app.isPackaged;
+
+function createWindow() {
+ win = new BrowserWindow({
+ width: 1200,
+ height: 800,
+ backgroundColor: "#191919",
+ show: false,
+ webPreferences: {
+ preload: path.join(__dirname, "preload.js"),
+ contextIsolation: true,
+ nodeIntegration: false,
+ webSecurity: true,
+ },
+ });
+
+ // Show window when ready to prevent visual flash
+ win.once("ready-to-show", () => {
+ win?.show();
+ });
+
+ const url = isDev
+ ? "http://localhost:8080"
+ : `file://${path.join(__dirname, "../dist/index.html")}`;
+
+ win.loadURL(url);
+
+ // Open DevTools in development
+ if (isDev) {
+ win.webContents.openDevTools();
+ }
+
+ // Handle external links
+ win.webContents.setWindowOpenHandler(({ url }) => {
+ shell.openExternal(url);
+ return { action: "deny" };
+ });
+
+ win.on("closed", () => {
+ win = null;
+ });
+}
+
+function createTray() {
+ // Note: You'll need to add a tray icon at src-electron/assets/tray.png
+ // For now, we'll skip tray creation if the icon doesn't exist
+ const trayIconPath = path.join(__dirname, "assets/tray.png");
+
+ // Only create tray if icon exists (we can add this later)
+ // tray = new Tray(trayIconPath);
+ // tray.setToolTip("DevTools");
+ // tray.on("click", () => {
+ // if (win) {
+ // if (win.isMinimized()) {
+ // win.restore();
+ // } else {
+ // win.focus();
+ // }
+ // } else {
+ // createWindow();
+ // }
+ // });
+}
+
+app.whenReady().then(() => {
+ createWindow();
+ createTray();
+
+ if (!isDev) {
+ autoUpdater.checkForUpdates();
+ }
+});
+
+app.on("window-all-closed", () => {
+ if (process.platform !== "darwin") {
+ app.quit();
+ }
+});
+
+app.on("activate", () => {
+ if (BrowserWindow.getAllWindows().length === 0) {
+ createWindow();
+ }
+});
+
+// Auto Update UX
+autoUpdater.autoDownload = false;
+autoUpdater.setFeedURL({
+ provider: "github",
+ owner: "me-shaon",
+ repo: "devtools",
+});
+
+autoUpdater.on("update-available", () => {
+ dialog
+ .showMessageBox({
+ type: "info",
+ title: "Update available",
+ message: "A new version of DevTools is available. Update now?",
+ buttons: ["Update", "Later"],
+ })
+ .then((result) => {
+ if (result.response === 0) {
+ autoUpdater.downloadUpdate();
+ }
+ });
+});
+
+autoUpdater.on("update-not-available", () => {
+ // No update available - silent
+});
+
+autoUpdater.on("update-downloaded", () => {
+ dialog
+ .showMessageBox({
+ type: "info",
+ title: "Update ready",
+ message: "Restart to install update?",
+ buttons: ["Restart", "Later"],
+ })
+ .then((result) => {
+ if (result.response === 0) {
+ autoUpdater.quitAndInstall();
+ }
+ });
+});
+
+autoUpdater.on("error", (error) => {
+ console.error("Auto-updater error:", error);
+});
diff --git a/src-electron/preload.ts b/src-electron/preload.ts
new file mode 100644
index 00000000..bb26723a
--- /dev/null
+++ b/src-electron/preload.ts
@@ -0,0 +1,47 @@
+import { contextBridge, ipcRenderer } from "electron";
+
+/**
+ * Expose a safe API to the renderer process via contextBridge
+ * This provides a secure way for the renderer to communicate with the main process
+ */
+contextBridge.exposeInMainWorld("electronAPI", {
+ invoke: (channel: string, ...args: unknown[]) => {
+ // Whitelist allowed channels
+ const validChannels = ["app-version", "get-path"];
+ if (validChannels.includes(channel)) {
+ return ipcRenderer.invoke(channel, ...args);
+ }
+ return Promise.reject(new Error(`Channel ${channel} is not allowed`));
+ },
+ on: (channel: string, callback: (...args: unknown[]) => void) => {
+ // Whitelist allowed channels
+ const validChannels = ["update-available", "update-downloaded"];
+ if (validChannels.includes(channel)) {
+ const subscription = (_event: Electron.IpcRendererEvent, ...args: unknown[]) =>
+ callback(...args);
+ ipcRenderer.on(channel, subscription);
+
+ // Return unsubscribe function
+ return () => {
+ ipcRenderer.removeListener(channel, subscription);
+ };
+ }
+ return () => {};
+ },
+ platform: process.platform,
+ version: process.versions.electron,
+});
+
+// TypeScript type declarations for the exposed API
+export interface ElectronAPI {
+ invoke: (channel: string, ...args: unknown[]) => Promise;
+ on: (channel: string, callback: (...args: unknown[]) => void) => () => void;
+ platform: string;
+ version: string;
+}
+
+declare global {
+ interface Window {
+ electronAPI: ElectronAPI;
+ }
+}
diff --git a/src-electron/tsconfig.json b/src-electron/tsconfig.json
new file mode 100644
index 00000000..d1de0c5d
--- /dev/null
+++ b/src-electron/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "CommonJS",
+ "lib": ["ES2020"],
+ "outDir": "../dist-electron",
+ "rootDir": ".",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "moduleResolution": "node",
+ "types": ["node"]
+ },
+ "include": ["./**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 00000000..e31fb48f
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,19 @@
+import { Toaster } from "@/components/ui/toaster";
+import { Toaster as Sonner } from "@/components/ui/sonner";
+import { TooltipProvider } from "@/components/ui/tooltip";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import DevToolsApp from "./app/DevToolsApp";
+
+const queryClient = new QueryClient();
+
+const App = () => (
+
+
+
+
+
+
+
+);
+
+export default App;
diff --git a/src/components/tools/ApiFormatter.tsx b/src/components/tools/ApiFormatter.tsx
new file mode 100644
index 00000000..43bab1d0
--- /dev/null
+++ b/src/components/tools/ApiFormatter.tsx
@@ -0,0 +1,210 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { Copy, Check, Code2 } from "lucide-react";
+import { toast } from "sonner";
+
+export function ApiFormatter() {
+ const [input, setInput] = useState("");
+ const [output, setOutput] = useState("");
+ const [copied, setCopied] = useState(false);
+
+ const formatJson = () => {
+ if (!input.trim()) {
+ toast.error("Please enter JSON to format");
+ return;
+ }
+
+ try {
+ const parsed = JSON.parse(input);
+ setOutput(JSON.stringify(parsed, null, 2));
+ toast.success("JSON formatted!");
+ } catch (error) {
+ toast.error("Invalid JSON");
+ }
+ };
+
+ const minifyJson = () => {
+ if (!input.trim()) {
+ toast.error("Please enter JSON to minify");
+ return;
+ }
+
+ try {
+ const parsed = JSON.parse(input);
+ setOutput(JSON.stringify(parsed));
+ toast.success("JSON minified!");
+ } catch (error) {
+ toast.error("Invalid JSON");
+ }
+ };
+
+ const parseUrlEncoded = () => {
+ if (!input.trim()) {
+ toast.error("Please enter URL-encoded data");
+ return;
+ }
+
+ try {
+ const params = new URLSearchParams(input);
+ const result: Record = {};
+ params.forEach((value, key) => {
+ result[key] = value;
+ });
+ setOutput(JSON.stringify(result, null, 2));
+ toast.success("URL-encoded data parsed!");
+ } catch (error) {
+ toast.error("Invalid URL-encoded data");
+ }
+ };
+
+ const parseQueryString = () => {
+ if (!input.trim()) {
+ toast.error("Please enter a query string");
+ return;
+ }
+
+ try {
+ const queryString = input.startsWith("?") ? input.slice(1) : input;
+ const params = new URLSearchParams(queryString);
+ const result: Record = {};
+ params.forEach((value, key) => {
+ result[key] = value;
+ });
+ setOutput(JSON.stringify(result, null, 2));
+ toast.success("Query string parsed!");
+ } catch (error) {
+ toast.error("Invalid query string");
+ }
+ };
+
+ const copyOutput = () => {
+ navigator.clipboard.writeText(output);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("Output copied!");
+ };
+
+ const clearAll = () => {
+ setInput("");
+ setOutput("");
+ };
+
+ const examples = {
+ json: '{"name":"John","age":30,"city":"New York"}',
+ urlEncoded: "name=John&age=30&city=New+York",
+ queryString: "?name=John&age=30&city=New+York",
+ };
+
+ return (
+
+
+
+
+
+ API Response Formatter
+
+ Format and parse API responses
+
+
+
+
+ Format JSON
+ Minify JSON
+ URL Encoded
+ Query String
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {output && (
+ <>
+
+
+
+
+
+ {copied ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy Output
+ >
+ )}
+
+
+ Clear
+
+
+ >
+ )}
+
+
+
+ );
+}
diff --git a/src/components/tools/Base64Converter.tsx b/src/components/tools/Base64Converter.tsx
new file mode 100644
index 00000000..4873a3f3
--- /dev/null
+++ b/src/components/tools/Base64Converter.tsx
@@ -0,0 +1,135 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { ArrowRight, ArrowLeft, Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+export function Base64Converter() {
+ const [activeTab, setActiveTab] = useState<"encode" | "decode">("encode");
+ const [textToEncode, setTextToEncode] = useState("");
+ const [encodedOutput, setEncodedOutput] = useState("");
+ const [base64ToDecode, setBase64ToDecode] = useState("");
+ const [decodedOutput, setDecodedOutput] = useState("");
+
+ const encodeToBase64 = () => {
+ if (!textToEncode.trim()) {
+ toast.error("Please enter text to encode.");
+ return;
+ }
+
+ try {
+ const encoded = btoa(unescape(encodeURIComponent(textToEncode)));
+ setEncodedOutput(encoded);
+ toast.success("Text encoded to Base64!");
+ } catch (err) {
+ toast.error("Error encoding text");
+ setEncodedOutput("");
+ }
+ };
+
+ const decodeFromBase64 = () => {
+ if (!base64ToDecode.trim()) {
+ toast.error("Please enter Base64 to decode.");
+ return;
+ }
+
+ try {
+ const decoded = decodeURIComponent(escape(atob(base64ToDecode.trim())));
+ setDecodedOutput(decoded);
+ toast.success("Base64 decoded successfully!");
+ } catch (err) {
+ toast.error("Invalid Base64 format or corrupted data");
+ setDecodedOutput("");
+ }
+ };
+
+ const copyToClipboard = (text: string) => {
+ navigator.clipboard.writeText(text);
+ toast.success("Copied to clipboard!");
+ };
+
+ return (
+
+
setActiveTab(v as "encode" | "decode")} className="w-full">
+
+ Encode
+ Decode
+
+
+ {/* Encode Tab */}
+
+
+ Text to Encode
+
+
+
+
+ Encode to Base64
+
+
+
+
+ {encodedOutput && (
+
+
+ Encoded Output
+ copyToClipboard(encodedOutput)} variant="ghost" size="sm">
+
+ Copy
+
+
+
+
+ )}
+
+
+ {/* Decode Tab */}
+
+
+ Base64 to Decode
+
+
+
+
+ Decode from Base64
+
+
+
+
+ {decodedOutput && (
+
+
+ Decoded Output
+ copyToClipboard(decodedOutput)} variant="ghost" size="sm">
+
+ Copy
+
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/src/components/tools/CaseConverter.tsx b/src/components/tools/CaseConverter.tsx
new file mode 100644
index 00000000..60b8e292
--- /dev/null
+++ b/src/components/tools/CaseConverter.tsx
@@ -0,0 +1,176 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+type CaseType = "camelCase" | "PascalCase" | "snake_case" | "kebab-case" | "UPPER_SNAKE_CASE" | "Sentence case" | "lowercase" | "UPPERCASE" | "Title Case";
+
+export function CaseConverter() {
+ const [input, setInput] = useState("");
+ const [outputs, setOutputs] = useState>({
+ camelCase: "",
+ PascalCase: "",
+ snake_case: "",
+ "kebab-case": "",
+ UPPER_SNAKE_CASE: "",
+ "Sentence case": "",
+ lowercase: "",
+ UPPERCASE: "",
+ "Title Case": "",
+ });
+ const [copied, setCopied] = useState(null);
+
+ const toCamelCase = (str: string) => {
+ return str
+ .replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ""))
+ .replace(/^(.)/, (c) => c.toLowerCase());
+ };
+
+ const toPascalCase = (str: string) => {
+ return str
+ .replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ""))
+ .replace(/^(.)/, (c) => c.toUpperCase());
+ };
+
+ const toSnakeCase = (str: string) => {
+ return str
+ .replace(/([A-Z])/g, "_$1")
+ .replace(/^_/, "")
+ .replace(/[-\s]+/g, "_")
+ .toLowerCase();
+ };
+
+ const toKebabCase = (str: string) => {
+ return str
+ .replace(/([A-Z])/g, "-$1")
+ .replace(/^-/, "")
+ .replace(/[\s_]+/g, "-")
+ .toLowerCase();
+ };
+
+ const toUpperSnakeCase = (str: string) => {
+ return str
+ .replace(/([A-Z])/g, "_$1")
+ .replace(/^_/, "")
+ .replace(/[-\s]+/g, "_")
+ .toUpperCase();
+ };
+
+ const toSentenceCase = (str: string) => {
+ return str
+ .replace(/[-_]+(.)?/g, (_, c) => (c ? " " + c.toLowerCase() : " "))
+ .replace(/^\s/, "")
+ .replace(/([.!?]\s*)(.)/g, (_, prefix, c) => prefix + c.toUpperCase())
+ .replace(/^(.)/, (c) => c.toUpperCase());
+ };
+
+ const toTitleCase = (str: string) => {
+ return str
+ .replace(/[-_\s]+(.)?/g, (_, c) => (c ? " " + c.toUpperCase() : " "))
+ .replace(/^\s/, "")
+ .replace(/^./, (c) => c.toUpperCase());
+ };
+
+ const convert = () => {
+ if (!input.trim()) {
+ toast.error("Please enter text to convert");
+ return;
+ }
+
+ const converted = {
+ camelCase: toCamelCase(input),
+ PascalCase: toPascalCase(input),
+ snake_case: toSnakeCase(input),
+ "kebab-case": toKebabCase(input),
+ UPPER_SNAKE_CASE: toUpperSnakeCase(input),
+ "Sentence case": toSentenceCase(input),
+ lowercase: input.toLowerCase(),
+ UPPERCASE: input.toUpperCase(),
+ "Title Case": toTitleCase(input),
+ };
+
+ setOutputs(converted);
+ toast.success("Text converted!");
+ };
+
+ const copyToClipboard = (caseType: CaseType, value: string) => {
+ navigator.clipboard.writeText(value);
+ setCopied(caseType);
+ setTimeout(() => setCopied(null), 2000);
+ toast.success(`${caseType} copied!`);
+ };
+
+ const caseLabels: { key: CaseType; label: string; description: string }[] = [
+ { key: "camelCase", label: "camelCase", description: "First word lowercase, subsequent words capitalized" },
+ { key: "PascalCase", label: "PascalCase", description: "Every word capitalized" },
+ { key: "snake_case", label: "snake_case", description: "Words separated by underscores, all lowercase" },
+ { key: "kebab-case", label: "kebab-case", description: "Words separated by hyphens, all lowercase" },
+ { key: "UPPER_SNAKE_CASE", label: "UPPER_SNAKE_CASE", description: "Words separated by underscores, all uppercase" },
+ { key: "Sentence case", label: "Sentence case", description: "First letter capitalized, spaces between words" },
+ { key: "lowercase", label: "lowercase", description: "All letters lowercase" },
+ { key: "UPPERCASE", label: "UPPERCASE", description: "All letters uppercase" },
+ { key: "Title Case", label: "Title Case", description: "First letter of each word capitalized" },
+ ];
+
+ return (
+
+
+
+ Enter Text
+ Type or paste text to convert to different cases
+
+
+
+
+
+ {outputs.camelCase && (
+
+ {caseLabels.map(({ key, label, description }) => (
+
+
+
+
+
{label}
+
{description}
+
+
copyToClipboard(key, outputs[key])}
+ className="ml-2 shrink-0"
+ >
+ {copied === key ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy
+ >
+ )}
+
+
+
+ {outputs[key] || "(empty)"}
+
+
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/src/components/tools/CodePlayground.tsx b/src/components/tools/CodePlayground.tsx
new file mode 100644
index 00000000..55adc5d2
--- /dev/null
+++ b/src/components/tools/CodePlayground.tsx
@@ -0,0 +1,201 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { Play, Code2, AlertCircle } from "lucide-react";
+import { toast } from "sonner";
+
+type Language = "javascript" | "html" | "css";
+
+const snippets = {
+ javascript: `// JavaScript code example
+function greet(name) {
+ return \`Hello, \${name}!\`;
+}
+
+console.log(greet("World"));
+
+// Array operations
+const numbers = [1, 2, 3, 4, 5];
+const doubled = numbers.map(n => n * 2);
+console.log("Doubled:", doubled);
+
+// Async example
+async function fetchData() {
+ console.log("Fetching data...");
+ return { status: "success", data: [1, 2, 3] };
+}`,
+ html: `
+
+
+ My Page
+
+
+
+
+
Hello World
+
This is a sample HTML document.
+
Click Me
+
+
+`,
+ css: `/* CSS Styles */
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ background-color: #f5f5f5;
+ margin: 0;
+ padding: 20px;
+}
+
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ background: white;
+ padding: 20px;
+ border-radius: 8px;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+}
+
+.button {
+ background: #007bff;
+ color: white;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 4px;
+ cursor: pointer;
+}
+
+.button:hover {
+ background: #0056b3;
+}`,
+};
+
+export function CodePlayground() {
+ const [language, setLanguage] = useState("javascript");
+ const [code, setCode] = useState(snippets.javascript);
+ const [output, setOutput] = useState("");
+ const [error, setError] = useState("");
+
+ const runCode = () => {
+ setError("");
+ setOutput("");
+
+ if (language === "javascript") {
+ try {
+ // Capture console.log output
+ const logs: string[] = [];
+ const originalLog = console.log;
+ console.log = (...args) => {
+ logs.push(args.map(arg =>
+ typeof arg === "object" ? JSON.stringify(arg, null, 2) : String(arg)
+ ).join(" "));
+ };
+
+ // Execute the code
+ const result = new Function(code)();
+
+ // Restore console.log
+ console.log = originalLog;
+
+ setOutput(logs.join("\n") || (result !== undefined ? String(result) : "Code executed successfully"));
+ toast.success("Code executed!");
+ } catch (err) {
+ setError(err instanceof Error ? err.message : "Unknown error");
+ console.log = console.log; // Restore
+ }
+ } else {
+ toast.info(`${language.toUpperCase()} preview is read-only`);
+ }
+ };
+
+ const updateLanguage = (lang: Language) => {
+ setLanguage(lang);
+ setCode(snippets[lang]);
+ setOutput("");
+ setError("");
+ };
+
+ return (
+
+
+
+
+
+ Code Playground
+
+ Write and run JavaScript, HTML, and CSS
+
+
+
+
+
+
+
+
+
+ JavaScript
+ HTML
+ CSS
+
+
+
+
+ Run
+
+
+
+
+ {/* Code Input */}
+
+
+ {/* Output */}
+
+
Output
+ {error ? (
+
+ ) : (
+
+
{output || "Output will appear here..."}
+
+ )}
+
+
+
+
+
+
+
+
+ Notes
+
+
+
+ JavaScript code can be executed directly in the browser
+ HTML and CSS are provided for reference and copying
+ Console.log output is captured and displayed
+ Be careful with infinite loops or blocking operations
+
+
+
+
+ );
+}
diff --git a/src/components/tools/ColorPalette.tsx b/src/components/tools/ColorPalette.tsx
new file mode 100644
index 00000000..c128c722
--- /dev/null
+++ b/src/components/tools/ColorPalette.tsx
@@ -0,0 +1,282 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+interface Color {
+ hex: string;
+ rgb: string;
+ hsl: string;
+}
+
+export function ColorPalette() {
+ const [hexInput, setHexInput] = useState("");
+ const [colors, setColors] = useState([]);
+ const [copied, setCopied] = useState(null);
+
+ const hexToRgb = (hex: string) => {
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+ return result
+ ? {
+ r: parseInt(result[1], 16),
+ g: parseInt(result[2], 16),
+ b: parseInt(result[3], 16),
+ }
+ : null;
+ };
+
+ const rgbToHsl = (r: number, g: number, b: number) => {
+ r /= 255;
+ g /= 255;
+ b /= 255;
+
+ const max = Math.max(r, g, b);
+ const min = Math.min(r, g, b);
+ let h = 0;
+ let s = 0;
+ const l = (max + min) / 2;
+
+ if (max !== min) {
+ const d = max - min;
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+
+ switch (max) {
+ case r:
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
+ break;
+ case g:
+ h = ((b - r) / d + 2) / 6;
+ break;
+ case b:
+ h = ((r - g) / d + 4) / 6;
+ break;
+ }
+ }
+
+ return {
+ h: Math.round(h * 360),
+ s: Math.round(s * 100),
+ l: Math.round(l * 100),
+ };
+ };
+
+ const generatePalette = (baseHex: string) => {
+ let hex = baseHex.replace("#", "");
+
+ // Handle 3-character hex codes
+ if (hex.length === 3) {
+ hex = hex
+ .split("")
+ .map((c) => c + c)
+ .join("");
+ }
+
+ if (!/^([0-9A-Fa-f]{6})$/.test(hex)) {
+ toast.error("Invalid hex color");
+ return;
+ }
+
+ const rgb = hexToRgb("#" + hex);
+ if (!rgb) {
+ toast.error("Invalid hex color");
+ return;
+ }
+
+ const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
+
+ const newColors: Color[] = [];
+
+ // Generate variations
+ // Original color
+ newColors.push({
+ hex: "#" + hex,
+ rgb: `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`,
+ hsl: `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`,
+ });
+
+ // Lighter shades (increase lightness)
+ for (let i = 1; i <= 5; i++) {
+ const newL = Math.min(100, hsl.l + i * 10);
+ newColors.push({
+ hex: hslToHex(hsl.h, hsl.s, newL),
+ rgb: hslToRgb(hsl.h, hsl.s, newL),
+ hsl: `hsl(${hsl.h}, ${hsl.s}%, ${newL}%)`,
+ });
+ }
+
+ // Darker shades (decrease lightness)
+ for (let i = 1; i <= 5; i++) {
+ const newL = Math.max(0, hsl.l - i * 10);
+ newColors.push({
+ hex: hslToHex(hsl.h, hsl.s, newL),
+ rgb: hslToRgb(hsl.h, hsl.s, newL),
+ hsl: `hsl(${hsl.h}, ${hsl.s}%, ${newL}%)`,
+ });
+ }
+
+ setColors(newColors);
+ toast.success("Palette generated!");
+ };
+
+ const hslToHex = (h: number, s: number, l: number) => {
+ s /= 100;
+ l /= 100;
+
+ const c = (1 - Math.abs(2 * l - 1)) * s;
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
+ const m = l - c / 2;
+ let r = 0,
+ g = 0,
+ b = 0;
+
+ if (h >= 0 && h < 60) {
+ r = c;
+ g = x;
+ b = 0;
+ } else if (h >= 60 && h < 120) {
+ r = x;
+ g = c;
+ b = 0;
+ } else if (h >= 120 && h < 180) {
+ r = 0;
+ g = c;
+ b = x;
+ } else if (h >= 180 && h < 240) {
+ r = 0;
+ g = x;
+ b = c;
+ } else if (h >= 240 && h < 300) {
+ r = x;
+ g = 0;
+ b = c;
+ } else if (h >= 300 && h < 360) {
+ r = c;
+ g = 0;
+ b = x;
+ }
+
+ const toHex = (n: number) => {
+ const hex = Math.round((n + m) * 255).toString(16);
+ return hex.length === 1 ? "0" + hex : hex;
+ };
+
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
+ };
+
+ const hslToRgb = (h: number, s: number, l: number) => {
+ s /= 100;
+ l /= 100;
+
+ const c = (1 - Math.abs(2 * l - 1)) * s;
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
+ const m = l - c / 2;
+ let r = 0,
+ g = 0,
+ b = 0;
+
+ if (h >= 0 && h < 60) {
+ r = c;
+ g = x;
+ b = 0;
+ } else if (h >= 60 && h < 120) {
+ r = x;
+ g = c;
+ b = 0;
+ } else if (h >= 120 && h < 180) {
+ r = 0;
+ g = c;
+ b = x;
+ } else if (h >= 180 && h < 240) {
+ r = 0;
+ g = x;
+ b = c;
+ } else if (h >= 240 && h < 300) {
+ r = x;
+ g = 0;
+ b = c;
+ } else if (h >= 300 && h < 360) {
+ r = c;
+ g = 0;
+ b = x;
+ }
+
+ const toValue = (n: number) => Math.round((n + m) * 255);
+
+ return `rgb(${toValue(r)}, ${toValue(g)}, ${toValue(b)})`;
+ };
+
+ const copyToClipboard = (value: string, label: string) => {
+ navigator.clipboard.writeText(value);
+ setCopied(label);
+ setTimeout(() => setCopied(null), 2000);
+ toast.success(`${label} copied!`);
+ };
+
+ return (
+
+
+
+ Color Palette Generator
+ Generate a color palette from a base color
+
+
+
+ setHexInput(e.target.value)}
+ className="font-mono"
+ />
+ generatePalette(hexInput)} size="lg">
+ Generate
+
+
+
+
+
+ {colors.length > 0 && (
+
+ {colors.map((color, index) => (
+
+
+
+
+
+ HEX
+ copyToClipboard(color.hex, "HEX")}
+ className="h-6 px-2"
+ >
+ {copied === `HEX-${index}` ? (
+
+ ) : (
+
+ )}
+
+
+
{color.hex}
+
+
+ RGB
+ {color.rgb}
+
+
+ HSL
+ {color.hsl}
+
+
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/src/components/tools/CronCalculator.tsx b/src/components/tools/CronCalculator.tsx
new file mode 100644
index 00000000..991082a7
--- /dev/null
+++ b/src/components/tools/CronCalculator.tsx
@@ -0,0 +1,207 @@
+import { useState, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { Calendar, Clock, Info } from "lucide-react";
+import { toast } from "sonner";
+
+interface CronPart {
+ type: string;
+ value: string;
+ options: string[];
+}
+
+const cronParts: CronPart[] = [
+ {
+ type: "minute",
+ value: "*",
+ options: ["*", "*/5", "*/15", "0", "15", "30", "45"],
+ },
+ {
+ type: "hour",
+ value: "*",
+ options: ["*", "*/2", "*/6", "*/12", "0", "6", "12", "18"],
+ },
+ {
+ type: "dayOfMonth",
+ value: "*",
+ options: ["*", "1", "15", "L"],
+ },
+ {
+ type: "month",
+ value: "*",
+ options: ["*", "1", "6", "12"],
+ },
+ {
+ type: "dayOfWeek",
+ value: "*",
+ options: ["*", "MON", "MON-FRI", "1", "5", "L"],
+ },
+];
+
+export function CronCalculator() {
+ const [parts, setParts] = useState(["*", "*", "*", "*", "*"]);
+ const [expression, setExpression] = useState("* * * * *");
+ const [nextRuns, setNextRuns] = useState([]);
+
+ useEffect(() => {
+ setExpression(parts.join(" "));
+ calculateNextRuns();
+ }, [parts]);
+
+ const updatePart = (index: number, value: string) => {
+ const newParts = [...parts];
+ newParts[index] = value;
+ setParts(newParts);
+ };
+
+ const calculateNextRuns = () => {
+ try {
+ const runs: Date[] = [];
+ const now = new Date();
+
+ // Simple implementation - calculate next 5 runs
+ // In production, you'd use a proper cron library like cron-parser
+ for (let i = 0; i < 5; i++) {
+ const nextDate = new Date(now.getTime() + i * 60000 * 60); // Placeholder
+ runs.push(nextDate);
+ }
+
+ setNextRuns(runs);
+ } catch (error) {
+ setNextRuns([]);
+ }
+ };
+
+ const getPartLabel = (type: string) => {
+ switch (type) {
+ case "minute":
+ return "Minute";
+ case "hour":
+ return "Hour";
+ case "dayOfMonth":
+ return "Day of Month";
+ case "month":
+ return "Month";
+ case "dayOfWeek":
+ return "Day of Week";
+ }
+ };
+
+ const getPartDescription = (index: number) => {
+ switch (index) {
+ case 0:
+ return "At " + (parts[0] === "*" ? "every minute" : `minute ${parts[0]}`);
+ case 1:
+ return parts[1] === "*"
+ ? "every hour"
+ : parts[1].startsWith("*/")
+ ? `every ${parts[1].slice(2)} hours`
+ : `at hour ${parts[1]}`;
+ case 2:
+ return parts[2] === "*"
+ ? "every day"
+ : parts[2] === "L"
+ ? "on the last day of the month"
+ : `on day ${parts[2]}`;
+ case 3:
+ return parts[3] === "*" ? "every month" : `in month ${parts[3]}`;
+ case 4:
+ return parts[4] === "*"
+ ? "every day of the week"
+ : `on ${parts[4]}`;
+ }
+ };
+
+ return (
+
+
+
+ Cron Expression Builder
+ Build and understand cron expressions
+
+
+ {/* Expression Display */}
+
+
Expression
+
+ {expression}
+
+
+
+ {/* Cron Parts */}
+
+ {cronParts.map((part, index) => (
+
+
{getPartLabel(part.type)}
+
updatePart(index, value)}
+ >
+
+
+
+
+ {part.options.map((option) => (
+
+ {option}
+
+ ))}
+
+
+
+ {getPartDescription(index)}
+
+
+ ))}
+
+
+
+
+ {/* Next Runs */}
+
+
+
+
+ Next Scheduled Runs
+
+
+
+
+ {nextRuns.map((date, index) => (
+
+
+
+ {date.toLocaleString()}
+
+
+ ))}
+
+
+
+
+ {/* Info Card */}
+
+
+
+
+ Cron Format
+
+
+
+
+
Format: minute hour dayOfMonth month dayOfWeek
+
+ * - Every value
+ */n - Every n units
+ n - At specific value
+ L - Last (for day of month/week)
+
+
+
+
+
+ );
+}
diff --git a/src/components/tools/CsvToJsonConverter.tsx b/src/components/tools/CsvToJsonConverter.tsx
new file mode 100644
index 00000000..dc2b4788
--- /dev/null
+++ b/src/components/tools/CsvToJsonConverter.tsx
@@ -0,0 +1,169 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Label } from "@/components/ui/label";
+import { Switch } from "@/components/ui/switch";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+export function CsvToJsonConverter() {
+ const [csvInput, setCsvInput] = useState("");
+ const [jsonOutput, setJsonOutput] = useState("");
+ const [copied, setCopied] = useState(false);
+ const [options, setOptions] = useState({
+ hasHeader: true,
+ pretty: true,
+ });
+
+ const convertToJson = () => {
+ if (!csvInput.trim()) {
+ toast.error("Please enter CSV data");
+ return;
+ }
+
+ try {
+ const lines = csvInput.trim().split("\n");
+ if (lines.length < 1) {
+ throw new Error("No data to convert");
+ }
+
+ const parseLine = (line: string) => {
+ const result: string[] = [];
+ let current = "";
+ let inQuotes = false;
+
+ for (let i = 0; i < line.length; i++) {
+ const char = line[i];
+ const nextChar = line[i + 1];
+
+ if (char === '"') {
+ if (inQuotes && nextChar === '"') {
+ current += '"';
+ i++;
+ } else {
+ inQuotes = !inQuotes;
+ }
+ } else if (char === "," && !inQuotes) {
+ result.push(current.trim());
+ current = "";
+ } else {
+ current += char;
+ }
+ }
+ result.push(current.trim());
+ return result;
+ };
+
+ const headers = parseLine(lines[0]);
+ const dataStart = options.hasHeader ? 1 : 0;
+
+ const result = lines.slice(dataStart).map((line) => {
+ const values = parseLine(line);
+ const obj: Record = {};
+
+ headers.forEach((header, index) => {
+ const key = options.hasHeader ? header : `column${index + 1}`;
+ obj[key] = values[index] || "";
+ });
+
+ return obj;
+ });
+
+ const json = options.pretty ? JSON.stringify(result, null, 2) : JSON.stringify(result);
+ setJsonOutput(json);
+ toast.success("CSV converted to JSON!");
+ } catch (error) {
+ toast.error(error instanceof Error ? error.message : "Failed to convert CSV");
+ }
+ };
+
+ const copyOutput = () => {
+ navigator.clipboard.writeText(jsonOutput);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("JSON copied!");
+ };
+
+ const clearAll = () => {
+ setCsvInput("");
+ setJsonOutput("");
+ };
+
+ return (
+
+
+
+ CSV to JSON Converter
+ Convert CSV data to JSON format
+
+
+
+ First row is header
+
+
+
+ Pretty print JSON
+ setOptions({ ...options, pretty: checked })}
+ />
+
+
+
+ CSV Input
+
+
+
+ Convert to JSON
+
+
+ {jsonOutput && (
+ <>
+
+ JSON Output
+
+
+
+
+ {copied ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy JSON
+ >
+ )}
+
+
+ Clear
+
+
+ >
+ )}
+
+
+
+ );
+}
diff --git a/src/components/tools/DateDifference.tsx b/src/components/tools/DateDifference.tsx
new file mode 100644
index 00000000..1762e4c8
--- /dev/null
+++ b/src/components/tools/DateDifference.tsx
@@ -0,0 +1,213 @@
+import { useState, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Calendar, Clock, ArrowRight } from "lucide-react";
+import { toast } from "sonner";
+
+export function DateDifference() {
+ const [date1, setDate1] = useState("");
+ const [date2, setDate2] = useState("");
+ const [time1, setTime1] = useState("00:00");
+ const [time2, setTime2] = useState("00:00");
+ const [now, setNow] = useState(new Date());
+
+ useEffect(() => {
+ const interval = setInterval(() => setNow(new Date()), 1000);
+ return () => clearInterval(interval);
+ }, []);
+
+ useEffect(() => {
+ // Set default dates
+ const today = new Date();
+ const yesterday = new Date(today);
+ yesterday.setDate(yesterday.getDate() - 1);
+
+ setDate2(formatDateForInput(today));
+ setDate1(formatDateForInput(yesterday));
+ }, []);
+
+ const formatDateForInput = (date: Date) => {
+ return date.toISOString().split("T")[0];
+ };
+
+ const calculateDifference = () => {
+ if (!date1 || !date2) {
+ return null;
+ }
+
+ const d1 = new Date(`${date1}T${time1}`);
+ const d2 = new Date(`${date2}T${time2}`);
+
+ if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {
+ return null;
+ }
+
+ const diffMs = Math.abs(d2.getTime() - d1.getTime());
+ const isNegative = d2 < d1;
+
+ const seconds = Math.floor(diffMs / 1000);
+ const minutes = Math.floor(seconds / 60);
+ const hours = Math.floor(minutes / 60);
+ const days = Math.floor(hours / 24);
+ const weeks = Math.floor(days / 7);
+ const months = Math.floor(days / 30);
+ const years = Math.floor(days / 365);
+
+ return {
+ diffMs,
+ isNegative,
+ breakdown: {
+ milliseconds: diffMs,
+ seconds,
+ minutes,
+ hours,
+ days,
+ weeks,
+ months,
+ years,
+ },
+ };
+ };
+
+ const difference = calculateDifference();
+
+ const useNow = (position: "first" | "second") => {
+ const current = now;
+ setDate(formatDateForInput(current));
+ setTime(current.toTimeString().slice(0, 5));
+ };
+
+ const setDate = (date: string) => {
+ if (date1 > date2) {
+ setDate1(date);
+ } else {
+ setDate2(date);
+ }
+ };
+
+ const setTime = (time: string) => {
+ setTime1(time);
+ setTime2(time);
+ };
+
+ return (
+
+
+
+ Date Difference Calculator
+ Calculate the difference between two dates
+
+
+
+ {/* First Date */}
+
+
+ {/* Arrow */}
+
+
+ {/* Second Date */}
+
+
+
+
+
+ {difference && (
+
+
+ Difference
+
+ {difference.isNegative ? "Second date is earlier" : "Second date is later"}
+
+
+
+
+
+
{difference.breakdown.years}
+
Years
+
+
+
{difference.breakdown.months}
+
Months
+
+
+
{difference.breakdown.weeks}
+
Weeks
+
+
+
{difference.breakdown.days}
+
Days
+
+
+
{difference.breakdown.hours}
+
Hours
+
+
+
{difference.breakdown.minutes}
+
Minutes
+
+
+
{difference.breakdown.seconds}
+
Seconds
+
+
+
{difference.breakdown.milliseconds.toLocaleString()}
+
Milliseconds
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/renderer/js/tools/hash-generator.js b/src/components/tools/HashGenerator.tsx
similarity index 54%
rename from src/renderer/js/tools/hash-generator.js
rename to src/components/tools/HashGenerator.tsx
index 6f98095d..aa9a58c9 100644
--- a/src/renderer/js/tools/hash-generator.js
+++ b/src/components/tools/HashGenerator.tsx
@@ -1,110 +1,80 @@
-class HashGenerator {
- constructor() {
- this.init();
- }
-
- init() {
- const hashButtons = document.querySelectorAll('.hash-btn');
- const inputTextarea = document.getElementById('hash-input');
-
- hashButtons.forEach((button) => {
- button.addEventListener('click', () => {
- const hashType = button.dataset.type;
- this.generateHash(hashType);
- });
- });
-
- if (inputTextarea) {
- inputTextarea.addEventListener('input', () => this.generateAllHashes());
- }
- }
-
- async generateHash(type) {
- const input = document.getElementById('hash-input').value;
-
- if (!input) {
- window.app?.showMessage('Please enter text to hash.', 'error');
- return;
+import { useState, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Label } from "@/components/ui/label";
+import { Copy, Hash as HashIcon } from "lucide-react";
+import { toast } from "sonner";
+
+type HashType = "md5" | "sha1" | "sha256" | "sha512";
+
+export function HashGenerator() {
+ const [input, setInput] = useState("");
+ const [hashes, setHashes] = useState>({
+ md5: "",
+ sha1: "",
+ sha256: "",
+ sha512: "",
+ });
+ const [loading, setLoading] = useState>({
+ md5: false,
+ sha1: false,
+ sha256: false,
+ sha512: false,
+ });
+
+ // Auto-generate all hashes when input changes
+ useEffect(() => {
+ if (input.trim()) {
+ generateAllHashes();
+ } else {
+ clearAllHashes();
}
+ }, [input]);
- try {
- const hash = await this.createHash(input, type);
- const resultElement = document.querySelector(`#${type}-result textarea`);
-
- if (resultElement) {
- resultElement.value = hash;
- this.selectHash(resultElement);
- }
-
- window.app?.showMessage(
- `${type.toUpperCase()} hash generated!`,
- 'success'
- );
- } catch (error) {
- window.app?.showMessage(
- `Error generating ${type} hash: ${error.message}`,
- 'error'
- );
- }
- }
-
- async generateAllHashes() {
- const input = document.getElementById('hash-input').value;
+ const generateHash = async (type: HashType): Promise => {
+ const encoder = new TextEncoder();
+ const data = encoder.encode(input);
- if (!input) {
- this.clearAllHashes();
- return;
+ switch (type) {
+ case "md5":
+ return md5(input);
+ case "sha1":
+ const sha1Buffer = await crypto.subtle.digest("SHA-1", data);
+ return bufferToHex(sha1Buffer);
+ case "sha256":
+ const sha256Buffer = await crypto.subtle.digest("SHA-256", data);
+ return bufferToHex(sha256Buffer);
+ case "sha512":
+ const sha512Buffer = await crypto.subtle.digest("SHA-512", data);
+ return bufferToHex(sha512Buffer);
}
+ };
- const hashTypes = ['md5', 'sha1', 'sha256', 'sha512'];
+ const generateAllHashes = async () => {
+ const types: HashType[] = ["md5", "sha1", "sha256", "sha512"];
- for (const type of hashTypes) {
+ for (const type of types) {
try {
- const hash = await this.createHash(input, type);
- const resultElement = document.querySelector(
- `#${type}-result textarea`
- );
- if (resultElement) {
- resultElement.value = hash;
- }
+ const hash = await generateHash(type);
+ setHashes((prev) => ({ ...prev, [type]: hash }));
} catch (error) {
console.error(`Error generating ${type} hash:`, error);
}
}
- }
-
- async createHash(input, algorithm) {
- const encoder = new TextEncoder();
- const data = encoder.encode(input);
-
- let hashBuffer;
- switch (algorithm) {
- case 'md5':
- return this.md5(input);
- case 'sha1':
- hashBuffer = await crypto.subtle.digest('SHA-1', data);
- break;
- case 'sha256':
- hashBuffer = await crypto.subtle.digest('SHA-256', data);
- break;
- case 'sha512':
- hashBuffer = await crypto.subtle.digest('SHA-512', data);
- break;
- default:
- throw new Error('Unsupported hash algorithm');
- }
+ };
- return Array.from(new Uint8Array(hashBuffer))
- .map((b) => b.toString(16).padStart(2, '0'))
- .join('');
- }
+ const bufferToHex = (buffer: ArrayBuffer): string => {
+ return Array.from(new Uint8Array(buffer))
+ .map((b) => b.toString(16).padStart(2, "0"))
+ .join("");
+ };
- md5(input) {
- function rotateLeft(lValue, iShiftBits) {
+ // MD5 implementation
+ const md5 = (input: string): string => {
+ function rotateLeft(lValue: number, iShiftBits: number) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
- function addUnsigned(lX, lY) {
+ function addUnsigned(lX: number, lY: number) {
const lX4 = lX & 0x40000000;
const lY4 = lY & 0x40000000;
const lX8 = lX & 0x80000000;
@@ -124,55 +94,53 @@ class HashGenerator {
}
}
- function F(x, y, z) {
+ function F(x: number, y: number, z: number) {
return (x & y) | (~x & z);
}
- function G(x, y, z) {
+ function G(x: number, y: number, z: number) {
return (x & z) | (y & ~z);
}
- function H(x, y, z) {
+ function H(x: number, y: number, z: number) {
return x ^ y ^ z;
}
- function I(x, y, z) {
+ function I(x: number, y: number, z: number) {
return y ^ (x | ~z);
}
- function FF(a, b, c, d, x, s, ac) {
+ function FF(a: number, b: number, c: number, d: number, x: number, s: number, ac: number) {
a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
- function GG(a, b, c, d, x, s, ac) {
+ function GG(a: number, b: number, c: number, d: number, x: number, s: number, ac: number) {
a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
- function HH(a, b, c, d, x, s, ac) {
+ function HH(a: number, b: number, c: number, d: number, x: number, s: number, ac: number) {
a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
- function II(a, b, c, d, x, s, ac) {
+ function II(a: number, b: number, c: number, d: number, x: number, s: number, ac: number) {
a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
}
- function convertToWordArray(string) {
- let lWordCount;
+ function convertToWordArray(string: string) {
+ let lWordCount: number;
const lMessageLength = string.length;
const lNumberOfWordsTemp1 = lMessageLength + 8;
- const lNumberOfWordsTemp2 =
- (lNumberOfWordsTemp1 - (lNumberOfWordsTemp1 % 64)) / 64;
+ const lNumberOfWordsTemp2 = (lNumberOfWordsTemp1 - (lNumberOfWordsTemp1 % 64)) / 64;
const lNumberOfWords = (lNumberOfWordsTemp2 + 1) * 16;
- const lWordArray = Array(lNumberOfWords - 1);
+ const lWordArray = Array(lNumberOfWords - 1).fill(0);
let lBytePosition = 0;
let lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] =
- lWordArray[lWordCount] |
- (string.charCodeAt(lByteCount) << lBytePosition);
+ lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition);
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
@@ -183,16 +151,15 @@ class HashGenerator {
return lWordArray;
}
- function wordToHex(lValue) {
- let wordToHexValue = '';
- let wordToHexValueTemp = '';
- let lByte, lCount;
+ function wordToHex(lValue: number) {
+ let wordToHexValue = "";
+ let wordToHexValueTemp = "";
+ let lByte: number, lCount: number;
for (lCount = 0; lCount <= 3; lCount++) {
lByte = (lValue >>> (lCount * 8)) & 255;
- wordToHexValueTemp = '0' + lByte.toString(16);
+ wordToHexValueTemp = "0" + lByte.toString(16);
wordToHexValue =
- wordToHexValue +
- wordToHexValueTemp.substring(wordToHexValueTemp.length - 2);
+ wordToHexValue + wordToHexValueTemp.substring(wordToHexValueTemp.length - 2);
}
return wordToHexValue;
}
@@ -229,7 +196,7 @@ class HashGenerator {
c = GG(c, d, a, b, x[k + 11], 14, 0x265e5a51);
b = GG(b, c, d, a, x[k + 0], 20, 0xe9b6c7aa);
a = GG(a, b, c, d, x[k + 5], 5, 0xd62f105d);
- d = GG(d, a, b, c, x[k + 10], 9, 0x2441453);
+ d = GG(d, a, b, c, x[k + 10], 9, 0x02441453);
c = GG(c, d, a, b, x[k + 15], 14, 0xd8a1e681);
b = GG(b, c, d, a, x[k + 4], 20, 0xe7d3fbc8);
a = GG(a, b, c, d, x[k + 9], 5, 0x21e1cde6);
@@ -251,7 +218,7 @@ class HashGenerator {
a = HH(a, b, c, d, x[k + 13], 4, 0x289b7ec6);
d = HH(d, a, b, c, x[k + 0], 11, 0xeaa127fa);
c = HH(c, d, a, b, x[k + 3], 16, 0xd4ef3085);
- b = HH(b, c, d, a, x[k + 6], 23, 0x4881d05);
+ b = HH(b, c, d, a, x[k + 6], 23, 0x04881d05);
a = HH(a, b, c, d, x[k + 9], 4, 0xd9d4d039);
d = HH(d, a, b, c, x[k + 12], 11, 0xe6db99e5);
c = HH(c, d, a, b, x[k + 15], 16, 0x1fa27cf8);
@@ -280,94 +247,61 @@ class HashGenerator {
const temp = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
return temp.toLowerCase();
- }
+ };
- selectHash(element) {
- setTimeout(() => {
- element.select();
- element.setSelectionRange(0, 99999);
- }, 100);
- }
+ const clearAllHashes = () => {
+ setHashes({ md5: "", sha1: "", sha256: "", sha512: "" });
+ };
- clearAllHashes() {
- const hashTypes = ['md5', 'sha1', 'sha256', 'sha512'];
- hashTypes.forEach((type) => {
- const resultElement = document.querySelector(`#${type}-result textarea`);
- if (resultElement) {
- resultElement.value = '';
- }
- });
- }
-
- copyHash(type) {
- const resultElement = document.querySelector(`#${type}-result textarea`);
- if (resultElement && resultElement.value) {
- navigator.clipboard.writeText(resultElement.value).then(() => {
- window.app?.showMessage(
- `${type.toUpperCase()} hash copied!`,
- 'success'
- );
- });
+ const copyHash = (hash: string) => {
+ if (hash) {
+ navigator.clipboard.writeText(hash);
+ toast.success("Copied to clipboard!");
}
- }
-}
-
-window.HashGenerator = new HashGenerator();
-
-const hashStyles = `
-.hash-options {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
- margin: 20px 0;
-}
-
-.hash-btn {
- background: #f0f0f0;
- border: 1px solid #d0d0d0;
- padding: 10px 16px;
- border-radius: 6px;
- cursor: pointer;
- font-size: 14px;
- transition: all 0.3s ease;
-}
-
-.hash-btn:hover {
- background: #667eea;
- color: white;
- border-color: #667eea;
+ };
+
+ const hashTypes: { type: HashType; label: string }[] = [
+ { type: "md5", label: "MD5" },
+ { type: "sha1", label: "SHA-1" },
+ { type: "sha256", label: "SHA-256" },
+ { type: "sha512", label: "SHA-512" },
+ ];
+
+ return (
+
+ {/* Input */}
+
+ Input Text
+
+
+ {/* Hash Results */}
+
+ {hashTypes.map(({ type, label }) => (
+
+
+ {label}
+ {hashes[type] && (
+ copyHash(hashes[type])} variant="ghost" size="sm">
+
+ Copy
+
+ )}
+
+
+
+ ))}
+
+
+ );
}
-
-.hash-results {
- display: grid;
- gap: 15px;
- margin-top: 20px;
-}
-
-.hash-result {
- display: flex;
- flex-direction: column;
- gap: 5px;
-}
-
-.hash-result label {
- font-weight: 500;
- color: #1d1d1f;
- font-size: 14px;
-}
-
-.hash-result textarea {
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 12px;
- padding: 10px;
- border: 2px solid #f0f0f0;
- border-radius: 6px;
- resize: none;
- height: 60px;
- background-color: #fafafa;
-}
-`;
-
-const hashGeneratorStyle = document.createElement('style');
-hashGeneratorStyle.textContent = hashGeneratorStyles;
-document.head.appendChild(hashGeneratorStyle);
diff --git a/src/components/tools/ImageConverter.tsx b/src/components/tools/ImageConverter.tsx
new file mode 100644
index 00000000..b53c5e80
--- /dev/null
+++ b/src/components/tools/ImageConverter.tsx
@@ -0,0 +1,212 @@
+import { useState, useRef, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { Slider } from "@/components/ui/slider";
+import { Upload, Download, ImageIcon as ImageIconLucide } from "lucide-react";
+import { toast } from "sonner";
+
+type Format = "png" | "jpeg" | "webp";
+
+export function ImageConverter() {
+ const [image, setImage] = useState(null);
+ const [originalFormat, setOriginalFormat] = useState("");
+ const [format, setFormat] = useState("png");
+ const [quality, setQuality] = useState([90]);
+ const [originalSize, setOriginalSize] = useState(0);
+ const [convertedSize, setConvertedSize] = useState(0);
+ const canvasRef = useRef(null);
+ const fileInputRef = useRef(null);
+
+ useEffect(() => {
+ if (image && canvasRef.current) {
+ const canvas = canvasRef.current;
+ const ctx = canvas.getContext("2d");
+ if (!ctx) return;
+
+ const img = new Image();
+ img.onload = () => {
+ canvas.width = img.width;
+ canvas.height = img.height;
+ ctx.drawImage(img, 0, 0);
+
+ const mimeType = format === "jpeg" ? "image/jpeg" : format === "webp" ? "image/webp" : "image/png";
+ const dataUrl = canvas.toDataURL(mimeType, quality[0] / 100);
+
+ setConvertedSize(Math.round((dataUrl.length - "data:".length) * 3 / 4));
+ };
+ img.src = image;
+ }
+ }, [image, format, quality]);
+
+ const handleFileUpload = (e: React.ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (!file) return;
+
+ if (!file.type.startsWith("image/")) {
+ toast.error("Please select an image file");
+ return;
+ }
+
+ setOriginalFormat(file.type);
+ setOriginalSize(file.size);
+
+ const reader = new FileReader();
+ reader.onload = (e) => {
+ setImage(e.target?.result as string);
+ };
+ reader.readAsDataURL(file);
+ };
+
+ const downloadImage = () => {
+ if (!canvasRef.current) return;
+
+ const mimeType = format === "jpeg" ? "image/jpeg" : format === "webp" ? "image/webp" : "image/png";
+ canvasRef.current.toBlob((blob) => {
+ if (!blob) return;
+
+ const url = URL.createObjectURL(blob);
+ const link = document.createElement("a");
+ link.download = `converted-image.${format}`;
+ link.href = url;
+ link.click();
+ URL.revokeObjectURL(url);
+
+ toast.success("Image downloaded!");
+ }, mimeType, quality[0] / 100);
+ };
+
+ const formatSize = (bytes: number) => {
+ if (bytes === 0) return "0 Bytes";
+ const k = 1024;
+ const sizes = ["Bytes", "KB", "MB", "GB"];
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
+ return Math.round(bytes / Math.pow(k, i) * 100) / 100 + " " + sizes[i];
+ };
+
+ return (
+
+
+
+ Image Converter
+ Convert images between PNG, JPEG, and WebP formats
+
+
+
+
+ fileInputRef.current?.click()}
+ className="w-full"
+ variant="outline"
+ >
+
+ Upload Image
+
+
+
+ {image && (
+ <>
+
+
+
Original Image
+
+
+
+ {originalFormat} • {formatSize(originalSize)}
+
+
+
+
+
+
Preview
+
+
+
+
+ {format.toUpperCase()} • {formatSize(convertedSize)}
+ {convertedSize < originalSize && (
+
+ ({Math.round((1 - convertedSize / originalSize) * 100)}% smaller)
+
+ )}
+
+
+
+
+
+
+
+ Output Format
+ setFormat(v)}>
+
+
+
+
+ PNG (Lossless)
+ JPEG (Lossy)
+ WebP (Modern)
+
+
+
+
+ {(format === "jpeg" || format === "webp") && (
+
+ Quality: {quality[0]}%
+
+
+ )}
+
+
+
+ Download Converted Image
+
+
+ >
+ )}
+
+ {!image && (
+
+
+
Upload an image to get started
+
+ )}
+
+
+
+
+
+ Format Information
+
+
+
+
+
PNG
+ Lossless compression, best for graphics with transparent backgrounds
+
+
+
JPEG
+ Lossy compression, best for photos and complex images
+
+
+
WebP
+ Modern format with excellent compression and quality
+
+
+
+
+
+ );
+}
diff --git a/src/components/tools/JsonToTypeScript.tsx b/src/components/tools/JsonToTypeScript.tsx
new file mode 100644
index 00000000..42ca97b2
--- /dev/null
+++ b/src/components/tools/JsonToTypeScript.tsx
@@ -0,0 +1,209 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Label } from "@/components/ui/label";
+import { Switch } from "@/components/ui/switch";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+interface TypeDefinition {
+ name: string;
+ type: string;
+ optional: boolean;
+ isArray: boolean;
+ children?: Record;
+}
+
+export function JsonToTypeScript() {
+ const [jsonInput, setJsonInput] = useState("");
+ const [tsOutput, setTsOutput] = useState("");
+ const [copied, setCopied] = useState(false);
+ const [options, setOptions] = useState({
+ rootName: "RootObject",
+ readonly: false,
+ strictNullChecks: true,
+ });
+
+ const getType = (value: any): string => {
+ if (value === null) return options.strictNullChecks ? "null" : "any";
+ if (value === undefined) return "undefined";
+
+ const type = typeof value;
+ if (type === "boolean") return "boolean";
+ if (type === "number") return "number";
+ if (type === "string") return "string";
+ if (Array.isArray(value)) return "array";
+ if (type === "object") return "object";
+ return "any";
+ };
+
+ const generateInterface = (obj: any, name: string): string => {
+ if (obj === null || typeof obj !== "object") {
+ return `export type ${name} = ${getType(obj)};\n`;
+ }
+
+ if (Array.isArray(obj)) {
+ if (obj.length === 0) {
+ return `export type ${name} = any[];\n`;
+ }
+
+ // Infer array type from first element
+ const elementType = generateTypeDefinition(obj[0], "Item");
+ return `export type ${name} = ${elementType}[];\n`;
+ }
+
+ const lines: string[] = [];
+ lines.push(`export interface ${name} {`);
+
+ for (const [key, value] of Object.entries(obj)) {
+ const typeDef = generateTypeDefinition(value, key);
+ const readonly = options.readonly ? "readonly " : "";
+ const optional = typeDef.optional ? "?" : "";
+
+ if (typeDef.children) {
+ // Nested object - generate inline interface
+ const nestedName = toPascalCase(key);
+ const nestedInterface = generateInterface(value, nestedName);
+ lines.push(` ${readonly}${key}${optional}: ${nestedName};`);
+ } else {
+ lines.push(` ${readonly}${key}${optional}: ${typeDef.type};`);
+ }
+ }
+
+ lines.push("}");
+ return lines.join("\n");
+ };
+
+ const generateTypeDefinition = (value: any, key: string): Omit => {
+ const type = getType(value);
+
+ if (type === "array") {
+ if (value.length === 0) {
+ return { type: "any[]", optional: false, isArray: true };
+ }
+ const itemType = generateTypeDefinition(value[0], key);
+ return {
+ type: `${itemType.type}[]`,
+ optional: false,
+ isArray: true,
+ children: itemType.children,
+ };
+ }
+
+ if (type === "object") {
+ return {
+ type: toPascalCase(key),
+ optional: false,
+ isArray: false,
+ children: value,
+ };
+ }
+
+ return { type, optional: false, isArray: false };
+ };
+
+ const toPascalCase = (str: string): string => {
+ return str
+ .replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ""))
+ .replace(/^(.)/, (c) => c.toUpperCase())
+ .replace(/[^a-zA-Z0-9]/g, "");
+ };
+
+ const convert = () => {
+ if (!jsonInput.trim()) {
+ toast.error("Please enter JSON to convert");
+ return;
+ }
+
+ try {
+ const parsed = JSON.parse(jsonInput);
+ const result = generateInterface(parsed, options.rootName);
+ setTsOutput(result);
+ toast.success("Converted to TypeScript!");
+ } catch (error) {
+ toast.error(error instanceof Error ? error.message : "Invalid JSON");
+ }
+ };
+
+ const copyOutput = () => {
+ navigator.clipboard.writeText(tsOutput);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("TypeScript copied!");
+ };
+
+ return (
+
+
+
+ JSON to TypeScript
+ Convert JSON to TypeScript interfaces
+
+
+
+ Root Interface Name
+ setOptions({ ...options, rootName: e.target.value })}
+ placeholder="RootObject"
+ />
+
+
+
+ Use readonly properties
+ setOptions({ ...options, readonly: checked })}
+ />
+
+
+
+ JSON Input
+
+
+
+ Convert to TypeScript
+
+
+ {tsOutput && (
+ <>
+
+ TypeScript Output
+
+
+
+ {copied ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy TypeScript
+ >
+ )}
+
+ >
+ )}
+
+
+
+ );
+}
diff --git a/src/components/tools/JsonViewer.tsx b/src/components/tools/JsonViewer.tsx
new file mode 100644
index 00000000..2d08f502
--- /dev/null
+++ b/src/components/tools/JsonViewer.tsx
@@ -0,0 +1,210 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { FileJson, CheckCircle, XCircle, Info } from "lucide-react";
+import { toast } from "sonner";
+
+interface JSONInfo {
+ type: string;
+ size: number;
+ keys: number;
+ depth: number;
+}
+
+export function JsonViewer() {
+ const [input, setInput] = useState("");
+ const [output, setOutput] = useState("");
+ const [error, setError] = useState("");
+ const [jsonInfo, setJsonInfo] = useState(null);
+
+ const formatJSON = () => {
+ if (!input.trim()) {
+ toast.error("Please enter JSON data to format.");
+ return;
+ }
+
+ try {
+ const parsed = JSON.parse(input);
+ const formatted = JSON.stringify(parsed, null, 2);
+ setOutput(formatted);
+ setError("");
+ setJsonInfo(null);
+ toast.success("JSON formatted successfully!");
+ } catch (err) {
+ const message = err instanceof Error ? err.message : "Invalid JSON";
+ setError(`Invalid JSON: ${message}`);
+ setOutput("");
+ setJsonInfo(null);
+ }
+ };
+
+ const minifyJSON = () => {
+ if (!input.trim()) {
+ toast.error("Please enter JSON data to minify.");
+ return;
+ }
+
+ try {
+ const parsed = JSON.parse(input);
+ const minified = JSON.stringify(parsed);
+ setOutput(minified);
+ setError("");
+ setJsonInfo(null);
+ toast.success("JSON minified successfully!");
+ } catch (err) {
+ const message = err instanceof Error ? err.message : "Invalid JSON";
+ setError(`Invalid JSON: ${message}`);
+ setOutput("");
+ setJsonInfo(null);
+ }
+ };
+
+ const validateJSON = () => {
+ if (!input.trim()) {
+ toast.error("Please enter JSON data to validate.");
+ return;
+ }
+
+ try {
+ const parsed = JSON.parse(input);
+ const info = getJSONInfo(parsed);
+ setJsonInfo(info);
+ setOutput("");
+ setError("");
+ toast.success("JSON is valid!");
+ } catch (err) {
+ const message = err instanceof Error ? err.message : "Invalid JSON";
+ setError(`Invalid JSON: ${message}`);
+ setOutput("");
+ setJsonInfo(null);
+ }
+ };
+
+ const getJSONInfo = (obj: unknown): JSONInfo => {
+ const type = Array.isArray(obj) ? "Array" : typeof obj;
+ const size = JSON.stringify(obj).length;
+ const keys = countKeys(obj);
+ const depth = getMaxDepth(obj);
+ return { type, size, keys, depth };
+ };
+
+ const countKeys = (obj: unknown): number => {
+ if (typeof obj !== "object" || obj === null) return 0;
+ if (Array.isArray(obj)) return obj.length;
+
+ let count = 0;
+ for (const key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ count++;
+ if (typeof obj[key as keyof typeof obj] === "object" && obj[key as keyof typeof obj] !== null) {
+ count += countKeys(obj[key as keyof typeof obj]);
+ }
+ }
+ }
+ return count;
+ };
+
+ const getMaxDepth = (obj: unknown, depth = 0): number => {
+ if (typeof obj !== "object" || obj === null) return depth;
+
+ let maxDepth = depth;
+ for (const key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ maxDepth = Math.max(maxDepth, getMaxDepth(obj[key as keyof typeof obj], depth + 1));
+ }
+ }
+ return maxDepth;
+ };
+
+ const copyOutput = () => {
+ if (output) {
+ navigator.clipboard.writeText(output);
+ toast.success("Copied to clipboard!");
+ }
+ };
+
+ return (
+
+ {/* Input */}
+
+ JSON Input
+
+
+ {/* Actions */}
+
+
+
+ Format
+
+
+ Minify
+
+
+ Validate
+
+
+
+ {/* Error */}
+ {error && (
+
+
+
+
Invalid JSON
+
{error}
+
+
+ )}
+
+ {/* JSON Info */}
+ {jsonInfo && (
+
+
+
+
Valid JSON
+
+
+
Type
+
{jsonInfo.type}
+
+
+
Size
+
{jsonInfo.size.toLocaleString()} chars
+
+
+
Keys/Items
+
{jsonInfo.keys.toLocaleString()}
+
+
+
Depth
+
{jsonInfo.depth}
+
+
+
+
+ )}
+
+ {/* Output */}
+ {output && (
+
+
+ Output
+
+ Copy
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/components/tools/JwtDecoder.tsx b/src/components/tools/JwtDecoder.tsx
new file mode 100644
index 00000000..72c0f9be
--- /dev/null
+++ b/src/components/tools/JwtDecoder.tsx
@@ -0,0 +1,208 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+interface JwtHeader {
+ alg?: string;
+ typ?: string;
+ [key: string]: any;
+}
+
+interface JwtPayload {
+ iss?: string;
+ sub?: string;
+ aud?: string | string[];
+ exp?: number;
+ nbf?: number;
+ iat?: number;
+ jti?: string;
+ [key: string]: any;
+}
+
+interface DecodedJwt {
+ header: JwtHeader;
+ payload: JwtPayload;
+ signature: string;
+ isValid: boolean;
+}
+
+export function JwtDecoder() {
+ const [input, setInput] = useState("");
+ const [decoded, setDecoded] = useState(null);
+ const [copied, setCopied] = useState(null);
+
+ const decodeJwt = () => {
+ if (!input.trim()) {
+ toast.error("Please enter a JWT token");
+ return;
+ }
+
+ try {
+ const parts = input.split(".");
+ if (parts.length !== 3) {
+ throw new Error("Invalid JWT format. Expected 3 parts separated by dots.");
+ }
+
+ const [headerB64, payloadB64, signature] = parts;
+
+ // Add padding if needed
+ const addPadding = (str: string) => str + "=".repeat((4 - (str.length % 4)) % 4);
+
+ // Decode base64url
+ const base64urlDecode = (str: string) => {
+ const base64 = str.replace(/-/g, "+").replace(/_/g, "/");
+ const padded = addPadding(base64);
+ return atob(padded);
+ };
+
+ const headerJson = base64urlDecode(headerB64);
+ const payloadJson = base64urlDecode(payloadB64);
+
+ const header: JwtHeader = JSON.parse(headerJson);
+ const payload: JwtPayload = JSON.parse(payloadJson);
+
+ // Check expiration
+ let isValid = true;
+ if (payload.exp) {
+ const now = Math.floor(Date.now() / 1000);
+ if (payload.exp < now) {
+ isValid = false;
+ }
+ }
+
+ setDecoded({
+ header,
+ payload,
+ signature,
+ isValid,
+ });
+
+ toast.success("JWT decoded successfully!");
+ } catch (error) {
+ toast.error(error instanceof Error ? error.message : "Failed to decode JWT");
+ setDecoded(null);
+ }
+ };
+
+ const formatTimestamp = (timestamp?: number) => {
+ if (!timestamp) return "N/A";
+ const date = new Date(timestamp * 1000);
+ return date.toLocaleString();
+ };
+
+ const copyToClipboard = (value: string, label: string) => {
+ navigator.clipboard.writeText(value);
+ setCopied(label);
+ setTimeout(() => setCopied(null), 2000);
+ toast.success(`${label} copied!`);
+ };
+
+ const renderObject = (obj: Record, title: string, color: string) => (
+
+
+ {title}
+
+
+
+ {JSON.stringify(obj, null, 2)}
+
+
+
+ );
+
+ return (
+
+
+
+ JWT Token
+ Enter a JSON Web Token to decode
+
+
+
+
+
+ {decoded && (
+ <>
+
+
Token Status
+
+ {decoded.isValid ? "Valid" : "Expired"}
+
+
+
+ {renderObject(decoded.header, "Header", "text-blue-500")}
+
+ {renderObject(decoded.payload, "Payload", "text-green-500")}
+
+
+
+ Signature
+
+
+
+ {decoded.signature}
+
+ copyToClipboard(decoded!.signature, "Signature")}
+ className="mt-2"
+ >
+ {copied === "Signature" ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy Signature
+ >
+ )}
+
+
+
+
+ {decoded.payload.iat && (
+
+
+ Timestamp Information
+
+
+
+ Issued At (iat):
+ {formatTimestamp(decoded.payload.iat)}
+
+ {decoded.payload.exp && (
+
+ Expires At (exp):
+ {formatTimestamp(decoded.payload.exp)}
+
+ )}
+ {decoded.payload.nbf && (
+
+ Not Before (nbf):
+ {formatTimestamp(decoded.payload.nbf)}
+
+ )}
+
+
+ )}
+ >
+ )}
+
+ );
+}
diff --git a/src/components/tools/LoremGenerator.tsx b/src/components/tools/LoremGenerator.tsx
new file mode 100644
index 00000000..5c046b62
--- /dev/null
+++ b/src/components/tools/LoremGenerator.tsx
@@ -0,0 +1,157 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { Slider } from "@/components/ui/slider";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+const words = [
+ "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit",
+ "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore",
+ "magna", "aliqua", "enim", "ad", "minim", "veniam", "quis", "nostrud",
+ "exercitation", "ullamco", "laboris", "nisi", "aliquip", "ex", "ea", "commodo",
+ "consequat", "duis", "aute", "irure", "in", "reprehenderit", "voluptate",
+ "velit", "esse", "cillum", "fugiat", "nulla", "pariatur", "excepteur", "sint",
+ "occaecat", "cupidatat", "non", "proident", "sunt", "culpa", "qui", "officia",
+ "deserunt", "mollit", "anim", "id", "est", "laborum",
+];
+
+export function LoremGenerator() {
+ const [type, setType] = useState<"paragraphs" | "sentences" | "words">("paragraphs");
+ const [count, setCount] = useState(3);
+ const [output, setOutput] = useState("");
+ const [copied, setCopied] = useState(false);
+
+ const generateWords = (numWords: number): string => {
+ const result: string[] = [];
+ for (let i = 0; i < numWords; i++) {
+ result.push(words[Math.floor(Math.random() * words.length)]);
+ }
+ return result.join(" ");
+ };
+
+ const generateSentences = (numSentences: number): string => {
+ const result: string[] = [];
+ for (let i = 0; i < numSentences; i++) {
+ const numWords = Math.floor(Math.random() * 10) + 5;
+ const sentence = generateWords(numWords);
+ result.push(sentence.charAt(0).toUpperCase() + sentence.slice(1) + ".");
+ }
+ return result.join(" ");
+ };
+
+ const generateParagraphs = (numParagraphs: number): string => {
+ const result: string[] = [];
+ for (let i = 0; i < numParagraphs; i++) {
+ const numSentences = Math.floor(Math.random() * 4) + 4;
+ const paragraph = generateSentences(numSentences);
+ result.push(paragraph);
+ }
+ return result.join("\n\n");
+ };
+
+ const generate = () => {
+ let result = "";
+ switch (type) {
+ case "words":
+ result = generateWords(count);
+ break;
+ case "sentences":
+ result = generateSentences(count);
+ break;
+ case "paragraphs":
+ result = generateParagraphs(count);
+ break;
+ }
+ setOutput(result);
+ toast.success("Lorem ipsum generated!");
+ };
+
+ const copyOutput = () => {
+ navigator.clipboard.writeText(output);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("Copied to clipboard!");
+ };
+
+ const getTypeLabel = () => {
+ switch (type) {
+ case "words":
+ return "Words";
+ case "sentences":
+ return "Sentences";
+ case "paragraphs":
+ return "Paragraphs";
+ }
+ };
+
+ return (
+
+
+
+ Lorem Ipsum Generator
+ Generate placeholder text for your projects
+
+
+
+ Output Type
+ setType(v)}>
+
+
+
+
+ Paragraphs
+ Sentences
+ Words
+
+
+
+
+
+
+ Amount: {count} {getTypeLabel().toLowerCase()}
+
+ setCount(value)}
+ min={1}
+ max={type === "words" ? 100 : type === "sentences" ? 50 : 20}
+ step={1}
+ />
+
+
+
+ Generate Lorem Ipsum
+
+
+ {output && (
+ <>
+
+
+ {copied ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy to Clipboard
+ >
+ )}
+
+ >
+ )}
+
+
+
+ );
+}
diff --git a/src/components/tools/MarkdownEditor.tsx b/src/components/tools/MarkdownEditor.tsx
new file mode 100644
index 00000000..d21481ca
--- /dev/null
+++ b/src/components/tools/MarkdownEditor.tsx
@@ -0,0 +1,223 @@
+import { useState, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Copy, Check, Eye, Code } from "lucide-react";
+import { toast } from "sonner";
+
+const defaultMarkdown = `# Welcome to Markdown Editor
+
+## Features
+
+- **Bold** and *italic* text
+- Lists (ordered and unordered)
+- [Links](https://example.com)
+- \`Inline code\` and code blocks
+
+## Code Block
+
+\`\`\`javascript
+function greet(name) {
+ return \`Hello, \${name}!\`;
+}
+\`\`\`
+
+## Table
+
+| Header 1 | Header 2 | Header 3 |
+|----------|----------|----------|
+| Cell 1 | Cell 2 | Cell 3 |
+| Cell 4 | Cell 5 | Cell 6 |
+
+## Blockquote
+
+> This is a blockquote
+> with multiple lines
+
+---
+
+**Start typing to see the preview!**
+`;
+
+export function MarkdownEditor() {
+ const [markdown, setMarkdown] = useState(defaultMarkdown);
+ const [html, setHtml] = useState("");
+ const [copied, setCopied] = useState(false);
+ const [view, setView] = useState<"split" | "preview" | "source">("split");
+
+ useEffect(() => {
+ convertMarkdown();
+ }, [markdown]);
+
+ const convertMarkdown = () => {
+ let html = markdown;
+
+ // Headers
+ html = html.replace(/^### (.*$)/gim, "$1 ");
+ html = html.replace(/^## (.*$)/gim, "$1 ");
+ html = html.replace(/^# (.*$)/gim, "$1 ");
+
+ // Bold and Italic
+ html = html.replace(/\*\*\*(.*?)\*\*\*/gim, "$1 ");
+ html = html.replace(/\*\*(.*?)\*\*/gim, "$1 ");
+ html = html.replace(/\*(.*?)\*/gim, "$1 ");
+
+ // Links
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/gim, '$1 ');
+
+ // Images
+ html = html.replace(/!\[([^\]]*)\]\(([^)]+)\)/gim, ' ');
+
+ // Code blocks
+ html = html.replace(/```(\w+)?\n([\s\S]*?)```/gim, '$2 ');
+
+ // Inline code
+ html = html.replace(/`([^`]+)`/gim, '$1');
+
+ // Blockquotes
+ html = html.replace(/^> (.*$)/gim, "$1 ");
+
+ // Unordered lists
+ html = html.replace(/^\s*-\s+(.*$)/gim, "$1 ");
+ html = html.replace(/(.*<\/li>)/s, "");
+
+ // Ordered lists
+ html = html.replace(/^\s*\d+\.\s+(.*$)/gim, " $1 ");
+
+ // Horizontal rule
+ html = html.replace(/^---$/gim, " ");
+
+ // Line breaks
+ html = html.replace(/\n/g, " ");
+
+ setHtml(html);
+ };
+
+ const copyHtml = () => {
+ const cleanHtml = html.replace(/ /g, "\n");
+ navigator.clipboard.writeText(cleanHtml);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("HTML copied!");
+ };
+
+ const copyMarkdown = () => {
+ navigator.clipboard.writeText(markdown);
+ toast.success("Markdown copied!");
+ };
+
+ return (
+
+
+
+ Markdown Editor
+ Write markdown and see live HTML preview
+
+
+
+ setView("split")}
+ >
+
+ Split
+
+ setView("preview")}
+ >
+
+ Preview Only
+
+ setView("source")}
+ >
+
+ Source Only
+
+
+
+
+ {(view === "split" || view === "source") && (
+
+ )}
+
+ {(view === "split" || view === "preview") && (
+
+
+ HTML Preview
+
+ {copied ? : }
+
+
+
+
+ )}
+
+
+
+
+
+
+ Markdown Quick Reference
+
+
+
+
+
# Heading
+
H1 Heading
+
+
+
+
*italic*
+
Italic text
+
+
+
+
\`code\`
+
Inline code
+
+
+
+
+
---hr---
+
Horizontal rule
+
+
+
+
+
+ );
+}
diff --git a/src/components/tools/NumberBaseConverter.tsx b/src/components/tools/NumberBaseConverter.tsx
new file mode 100644
index 00000000..85206f1a
--- /dev/null
+++ b/src/components/tools/NumberBaseConverter.tsx
@@ -0,0 +1,184 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+type Base = 2 | 8 | 10 | 16;
+
+export function NumberBaseConverter() {
+ const [value, setValue] = useState("");
+ const [fromBase, setFromBase] = useState (10);
+ const [toBase, setToBase] = useState (16);
+ const [result, setResult] = useState("");
+ const [copied, setCopied] = useState(false);
+
+ const bases: { value: Base; label: string; example: string }[] = [
+ { value: 2, label: "Binary (Base 2)", example: "1010" },
+ { value: 8, label: "Octal (Base 8)", example: "12" },
+ { value: 10, label: "Decimal (Base 10)", example: "10" },
+ { value: 16, label: "Hexadecimal (Base 16)", example: "A" },
+ ];
+
+ const convert = () => {
+ if (!value.trim()) {
+ toast.error("Please enter a value to convert");
+ return;
+ }
+
+ try {
+ // Parse the input value based on fromBase
+ const decimalValue = parseInt(value, fromBase);
+
+ if (isNaN(decimalValue)) {
+ toast.error(`Invalid ${fromBase}-base number`);
+ return;
+ }
+
+ // Convert to target base
+ const converted = decimalValue.toString(toBase).toUpperCase();
+ setResult(converted);
+ toast.success("Converted successfully!");
+ } catch (error) {
+ toast.error("Conversion failed");
+ }
+ };
+
+ const swapBases = () => {
+ const temp = fromBase;
+ setFromBase(toBase);
+ setToBase(temp);
+ if (result) {
+ setValue(result);
+ }
+ };
+
+ const copyResult = () => {
+ navigator.clipboard.writeText(result);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("Result copied!");
+ };
+
+ const getConversionInfo = () => {
+ if (!result) return null;
+ const decimalValue = parseInt(value, fromBase);
+ return {
+ decimal: decimalValue.toString(),
+ binary: decimalValue.toString(2),
+ octal: decimalValue.toString(8),
+ hex: decimalValue.toString(16).toUpperCase(),
+ };
+ };
+
+ const info = getConversionInfo();
+
+ return (
+
+
+
+ Number Base Converter
+ Convert numbers between different bases
+
+
+
+
+ From Base
+ setFromBase(parseInt(v) as Base)}>
+
+
+
+
+ {bases.map((base) => (
+
+ {base.label}
+
+ ))}
+
+
+
+
+
+ ↔
+
+
+
+ To Base
+ setToBase(parseInt(v) as Base)}>
+
+
+
+
+ {bases.map((base) => (
+
+ {base.label}
+
+ ))}
+
+
+
+
+
+
+
+ Input ({bases.find((b) => b.value === fromBase)?.label})
+
+ setValue(e.target.value)}
+ placeholder={bases.find((b) => b.value === fromBase)?.example}
+ className="font-mono"
+ />
+
+
+
+ Convert
+
+
+ {result && (
+
+
+ Result ({bases.find((b) => b.value === toBase)?.label})
+
+
+
+
+ {copied ? : }
+
+
+
+ )}
+
+
+
+ {info && (
+
+
+ All Bases
+ Decimal: {info.decimal}
+
+
+
+
+
Binary (2)
+
{info.binary}
+
+
+
Octal (8)
+
{info.octal}
+
+
+
Hexadecimal (16)
+
{info.hex}
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/components/tools/PasswordGenerator.tsx b/src/components/tools/PasswordGenerator.tsx
new file mode 100644
index 00000000..40c41bb9
--- /dev/null
+++ b/src/components/tools/PasswordGenerator.tsx
@@ -0,0 +1,166 @@
+import { useState, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Switch } from "@/components/ui/switch";
+import { Slider } from "@/components/ui/slider";
+import { Copy, Check, RefreshCw } from "lucide-react";
+import { toast } from "sonner";
+
+export function PasswordGenerator() {
+ const [length, setLength] = useState(16);
+ const [password, setPassword] = useState("");
+ const [copied, setCopied] = useState(false);
+ const [options, setOptions] = useState({
+ uppercase: true,
+ lowercase: true,
+ numbers: true,
+ symbols: true,
+ });
+
+ const generatePassword = () => {
+ const uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const lowercase = "abcdefghijklmnopqrstuvwxyz";
+ const numbers = "0123456789";
+ const symbols = "!@#$%^&*()_+-=[]{}|;:,.<>?";
+
+ let chars = "";
+ if (options.uppercase) chars += uppercase;
+ if (options.lowercase) chars += lowercase;
+ if (options.numbers) chars += numbers;
+ if (options.symbols) chars += symbols;
+
+ if (!chars) {
+ toast.error("Please select at least one character type");
+ return;
+ }
+
+ let result = "";
+ const array = new Uint32Array(length);
+ crypto.getRandomValues(array);
+
+ for (let i = 0; i < length; i++) {
+ result += chars[array[i] % chars.length];
+ }
+
+ setPassword(result);
+ };
+
+ useEffect(() => {
+ generatePassword();
+ }, [length, options]);
+
+ const copyPassword = () => {
+ navigator.clipboard.writeText(password);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("Password copied!");
+ };
+
+ const getStrength = () => {
+ let strength = 0;
+ if (length >= 12) strength++;
+ if (length >= 16) strength++;
+ if (options.uppercase && options.lowercase) strength++;
+ if (options.numbers) strength++;
+ if (options.symbols) strength++;
+
+ if (strength <= 2) return { label: "Weak", color: "text-red-500", bg: "bg-red-500" };
+ if (strength <= 3) return { label: "Fair", color: "text-yellow-500", bg: "bg-yellow-500" };
+ if (strength <= 4) return { label: "Good", color: "text-blue-500", bg: "bg-blue-500" };
+ return { label: "Strong", color: "text-green-500", bg: "bg-green-500" };
+ };
+
+ const strength = getStrength();
+
+ return (
+
+
+
+ Password Generator
+ Generate secure random passwords
+
+
+
+ Password Length: {length}
+ setLength(value)}
+ min={4}
+ max={64}
+ step={1}
+ className="w-full"
+ />
+
+
+
+
+ Uppercase (A-Z)
+ setOptions({ ...options, uppercase: checked })}
+ />
+
+
+
+ Lowercase (a-z)
+ setOptions({ ...options, lowercase: checked })}
+ />
+
+
+
+ Numbers (0-9)
+ setOptions({ ...options, numbers: checked })}
+ />
+
+
+
+ Symbols (!@#$...)
+ setOptions({ ...options, symbols: checked })}
+ />
+
+
+
+
+
Generated Password
+
+
+
+ {copied ? : }
+
+
+
+
+
+
+
+
+
+ Strength
+ {strength.label}
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/tools/QrGenerator.tsx b/src/components/tools/QrGenerator.tsx
new file mode 100644
index 00000000..56922e65
--- /dev/null
+++ b/src/components/tools/QrGenerator.tsx
@@ -0,0 +1,161 @@
+import { useState, useRef, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Slider } from "@/components/ui/slider";
+import { Download } from "lucide-react";
+import { toast } from "sonner";
+
+export function QrGenerator() {
+ const [text, setText] = useState("");
+ const [size, setSize] = useState(256);
+ const canvasRef = useRef(null);
+
+ // Simple QR code generation using a lightweight approach
+ // For a production app, you'd want to use a proper QR library like qrcode
+ useEffect(() => {
+ if (text && canvasRef.current) {
+ generateQR();
+ }
+ }, [text, size]);
+
+ const generateQR = () => {
+ const canvas = canvasRef.current;
+ if (!canvas) return;
+
+ const ctx = canvas.getContext("2d");
+ if (!ctx) return;
+
+ // Clear canvas
+ ctx.fillStyle = "#FFFFFF";
+ ctx.fillRect(0, 0, size, size);
+
+ // For demo purposes, generate a visual placeholder
+ // In production, use a library like qrcode or qrious
+ ctx.fillStyle = "#000000";
+ const moduleSize = size / 25;
+
+ // Draw finder patterns (corners)
+ const drawFinder = (x: number, y: number) => {
+ ctx.fillRect(x * moduleSize, y * moduleSize, 7 * moduleSize, 7 * moduleSize);
+ ctx.fillStyle = "#FFFFFF";
+ ctx.fillRect((x + 1) * moduleSize, (y + 1) * moduleSize, 5 * moduleSize, 5 * moduleSize);
+ ctx.fillStyle = "#000000";
+ ctx.fillRect((x + 2) * moduleSize, (y + 2) * moduleSize, 3 * moduleSize, 3 * moduleSize);
+ };
+
+ drawFinder(0, 0);
+ drawFinder(18, 0);
+ drawFinder(0, 18);
+
+ // Draw data pattern (pseudo-random based on text)
+ let hash = 0;
+ for (let i = 0; i < text.length; i++) {
+ hash = ((hash << 5) - hash) + text.charCodeAt(i);
+ hash = hash & hash;
+ }
+
+ const random = (seed: number) => {
+ const x = Math.sin(seed++) * 10000;
+ return x - Math.floor(x);
+ };
+
+ for (let y = 0; y < 25; y++) {
+ for (let x = 0; x < 25; x++) {
+ // Skip finder patterns
+ if (
+ (x < 8 && y < 8) ||
+ (x > 16 && y < 8) ||
+ (x < 8 && y > 16) ||
+ (x === 6 && y > 7 && y < 17) ||
+ (y === 6 && x > 7 && x < 17)
+ ) {
+ continue;
+ }
+
+ if (random(hash + x + y * 25) > 0.5) {
+ ctx.fillRect(x * moduleSize, y * moduleSize, moduleSize, moduleSize);
+ }
+ }
+ }
+ };
+
+ const downloadQR = () => {
+ const canvas = canvasRef.current;
+ if (!canvas) return;
+
+ const link = document.createElement("a");
+ link.download = `qr-code-${Date.now()}.png`;
+ link.href = canvas.toDataURL("image/png");
+ link.click();
+ toast.success("QR code downloaded!");
+ };
+
+ return (
+
+
+
+ QR Code Generator
+ Generate QR codes for text, URLs, and more
+
+
+
+ Text or URL
+ setText(e.target.value)}
+ />
+
+
+
+ Size: {size}x{size}px
+ setSize(value)}
+ min={128}
+ max={512}
+ step={32}
+ />
+
+
+ {text && (
+
+
+
+
+ Download QR Code
+
+
+ )}
+
+ {!text && (
+
+ Enter text above to generate a QR code
+
+ )}
+
+
+
+
+
+ Note
+
+
+
+ This is a basic QR code generator for demonstration purposes.
+ For production use, consider using a dedicated QR code library
+ with full encoding support and error correction.
+
+
+
+
+ );
+}
diff --git a/src/components/tools/RegexGenerator.tsx b/src/components/tools/RegexGenerator.tsx
new file mode 100644
index 00000000..4deceb35
--- /dev/null
+++ b/src/components/tools/RegexGenerator.tsx
@@ -0,0 +1,228 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+interface Preset {
+ name: string;
+ pattern: string;
+ description: string;
+}
+
+const presets: Preset[] = [
+ { name: "Email", pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", description: "Validate email addresses" },
+ { name: "URL", pattern: "^https?:\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+[/#?]?.*$", description: "Match HTTP/HTTPS URLs" },
+ { name: "IPv4", pattern: "^((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4}$", description: "Validate IPv4 addresses" },
+ { name: "Hex Color", pattern: "^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$", description: "Match hex color codes" },
+ { name: "Date (YYYY-MM-DD)", pattern: "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$", description: "Validate ISO date format" },
+ { name: "Username", pattern: "^[a-zA-Z0-9_]{3,16}$", description: "3-16 chars, alphanumeric + underscore" },
+ { name: "Password (Strong)", pattern: "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$", description: "At least 8 chars with uppercase, lowercase, number, and special char" },
+ { name: "Credit Card", pattern: "^\\d{4}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}$", description: "Match common credit card formats" },
+ { name: "Phone (US)", pattern: "^\\+1\\s?\\(\\d{3}\\)\\s?\\d{3}[- ]?\\d{4}$", description: "US phone number format" },
+ { name: "Time (24h)", pattern: "^([01]?\\d|2[0-3]):[0-5]\\d$", description: "24-hour time format (HH:MM)" },
+];
+
+export function RegexGenerator() {
+ const [pattern, setPattern] = useState("");
+ const [testString, setTestString] = useState("");
+ const [matches, setMatches] = useState([]);
+ const [flags, setFlags] = useState("g");
+ const [copied, setCopied] = useState(false);
+
+ const testRegex = () => {
+ if (!pattern) {
+ toast.error("Please enter a regex pattern");
+ return;
+ }
+
+ try {
+ const regex = new RegExp(pattern, flags);
+ const found: RegExpMatchArray[] = [];
+ let match;
+
+ if (flags.includes("g")) {
+ while ((match = regex.exec(testString)) !== null) {
+ found.push(match);
+ }
+ } else {
+ match = regex.exec(testString);
+ if (match) found.push(match);
+ }
+
+ setMatches(found);
+ toast.success(`Found ${found.length} match${found.length !== 1 ? "es" : ""}`);
+ } catch (error) {
+ toast.error(error instanceof Error ? error.message : "Invalid regex pattern");
+ setMatches([]);
+ }
+ };
+
+ const applyPreset = (preset: Preset) => {
+ setPattern(preset.pattern);
+ setMatches([]);
+ toast.success(`Applied ${preset.name} pattern`);
+ };
+
+ const copyPattern = () => {
+ navigator.clipboard.writeText(`/${pattern}/${flags}`);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("Pattern copied!");
+ };
+
+ const toggleFlag = (flag: string) => {
+ if (flags.includes(flag)) {
+ setFlags(flags.replace(flag, ""));
+ } else {
+ setFlags(flags + flag);
+ }
+ setMatches([]);
+ };
+
+ return (
+
+
+
+ Regex Tester
+ Test and validate regular expressions
+
+
+
+
+
+ toggleFlag("g")}
+ >
+ g (global)
+
+ toggleFlag("i")}
+ >
+ i (ignore case)
+
+ toggleFlag("m")}
+ >
+ m (multiline)
+
+
+
+
+ Test String
+
+
+
+ Test Pattern
+
+
+
+
+ {matches.length > 0 && (
+
+
+ Matches ({matches.length})
+
+
+
+ {matches.map((match, index) => (
+
+
Match {index + 1}
+
{match[0]}
+ {match.index !== undefined && (
+
+ Position: {match.index}
+
+ )}
+
+ ))}
+
+
+
+ )}
+
+
+
+ Common Patterns
+ Click to use a preset pattern
+
+
+
+ {presets.map((preset) => (
+ applyPreset(preset)}
+ className="justify-start"
+ >
+ {preset.name}
+
+ {preset.description}
+
+
+ ))}
+
+
+
+
+
+
+ Regex Flags
+
+
+
+
+
g
+ Global - find all matches
+
+
+
i
+ Ignore case
+
+
+
m
+ Multiline mode
+
+
+
+
+
+ );
+}
diff --git a/src/components/tools/TextCompare.tsx b/src/components/tools/TextCompare.tsx
new file mode 100644
index 00000000..f4ac86ac
--- /dev/null
+++ b/src/components/tools/TextCompare.tsx
@@ -0,0 +1,216 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { ArrowRight, Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+interface DiffLine {
+ line: number;
+ type: "same" | "added" | "removed" | "modified";
+ content: string;
+ oldContent?: string;
+}
+
+export function TextCompare() {
+ const [text1, setText1] = useState("");
+ const [text2, setText2] = useState("");
+ const [diffs, setDiffs] = useState([]);
+ const [copied, setCopied] = useState(false);
+
+ const compareTexts = () => {
+ if (!text1.trim() && !text2.trim()) {
+ toast.error("Please enter text to compare");
+ return;
+ }
+
+ const lines1 = text1.split("\n");
+ const lines2 = text2.split("\n");
+ const result: DiffLine[] = [];
+
+ const maxLines = Math.max(lines1.length, lines2.length);
+
+ for (let i = 0; i < maxLines; i++) {
+ const line1 = lines1[i] || "";
+ const line2 = lines2[i] || "";
+
+ if (line1 === line2) {
+ if (line1) {
+ result.push({ line: i + 1, type: "same", content: line1 });
+ }
+ } else if (!line1 && line2) {
+ result.push({ line: i + 1, type: "added", content: line2 });
+ } else if (line1 && !line2) {
+ result.push({ line: i + 1, type: "removed", content: line1 });
+ } else {
+ result.push({ line: i + 1, type: "modified", content: line2, oldContent: line1 });
+ }
+ }
+
+ setDiffs(result);
+ toast.success("Comparison complete!");
+ };
+
+ const copyStats = () => {
+ const stats = {
+ totalLines: diffs.length,
+ added: diffs.filter((d) => d.type === "added").length,
+ removed: diffs.filter((d) => d.type === "removed").length,
+ modified: diffs.filter((d) => d.type === "modified").length,
+ unchanged: diffs.filter((d) => d.type === "same").length,
+ };
+ navigator.clipboard.writeText(JSON.stringify(stats, null, 2));
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("Statistics copied!");
+ };
+
+ const getDiffColor = (type: DiffLine["type"]) => {
+ switch (type) {
+ case "added":
+ return "bg-green-500/10 border-green-500/30";
+ case "removed":
+ return "bg-red-500/10 border-red-500/30";
+ case "modified":
+ return "bg-yellow-500/10 border-yellow-500/30";
+ default:
+ return "";
+ }
+ };
+
+ const getDiffBadge = (type: DiffLine["type"]) => {
+ switch (type) {
+ case "added":
+ return Added ;
+ case "removed":
+ return Removed ;
+ case "modified":
+ return Modified ;
+ default:
+ return null;
+ }
+ };
+
+ const stats = {
+ totalLines: diffs.length,
+ added: diffs.filter((d) => d.type === "added").length,
+ removed: diffs.filter((d) => d.type === "removed").length,
+ modified: diffs.filter((d) => d.type === "modified").length,
+ unchanged: diffs.filter((d) => d.type === "same").length,
+ };
+
+ return (
+
+
+
+
+ Original Text
+ Enter the first text to compare
+
+
+
+
+
+
+
+ Modified Text
+ Enter the second text to compare
+
+
+
+
+
+
+
+
+ {diffs.length > 0 && (
+ <>
+
+
+
+ Comparison Results
+
+ {copied ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy Stats
+ >
+ )}
+
+
+ Line by line comparison
+
+
+
+
+
{stats.totalLines}
+
Total Lines
+
+
+
{stats.added}
+
Added
+
+
+
{stats.removed}
+
Removed
+
+
+
{stats.modified}
+
Modified
+
+
+
+
+ {diffs.map((diff, index) => (
+
+
+ Line {diff.line}
+ {getDiffBadge(diff.type)}
+
+ {diff.type === "modified" && diff.oldContent && (
+
+ {diff.oldContent}
+
+ )}
+
{diff.content || "(empty line)"}
+
+ ))}
+
+
+
+ >
+ )}
+
+ );
+}
diff --git a/src/components/tools/TimestampConverter.tsx b/src/components/tools/TimestampConverter.tsx
new file mode 100644
index 00000000..1e2ea6c9
--- /dev/null
+++ b/src/components/tools/TimestampConverter.tsx
@@ -0,0 +1,213 @@
+import { useState, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { Copy, Check, Clock } from "lucide-react";
+import { toast } from "sonner";
+
+export function TimestampConverter() {
+ const [timestamp, setTimestamp] = useState("");
+ const [dateString, setDateString] = useState("");
+ const [currentTimestamp, setCurrentTimestamp] = useState(Math.floor(Date.now() / 1000));
+ const [copied, setCopied] = useState(null);
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setCurrentTimestamp(Math.floor(Date.now() / 1000));
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ const timestampToDate = () => {
+ if (!timestamp.trim()) {
+ toast.error("Please enter a timestamp");
+ return;
+ }
+
+ const ts = parseInt(timestamp);
+ if (isNaN(ts)) {
+ toast.error("Invalid timestamp");
+ return;
+ }
+
+ const date = new Date(ts * 1000);
+ setDateString(formatDate(date));
+ toast.success("Converted to date!");
+ };
+
+ const dateToTimestamp = () => {
+ if (!dateString.trim()) {
+ toast.error("Please enter a date string");
+ return;
+ }
+
+ const date = new Date(dateString);
+ if (isNaN(date.getTime())) {
+ toast.error("Invalid date format");
+ return;
+ }
+
+ const ts = Math.floor(date.getTime() / 1000);
+ setTimestamp(ts.toString());
+ toast.success("Converted to timestamp!");
+ };
+
+ const formatDate = (date: Date) => {
+ return date.toLocaleString("en-US", {
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ hour12: false,
+ });
+ };
+
+ const useCurrentTime = () => {
+ const now = Math.floor(Date.now() / 1000);
+ setTimestamp(now.toString());
+ const date = new Date();
+ setDateString(formatDate(date));
+ };
+
+ const copyToClipboard = (value: string, label: string) => {
+ navigator.clipboard.writeText(value);
+ setCopied(label);
+ setTimeout(() => setCopied(null), 2000);
+ toast.success(`${label} copied!`);
+ };
+
+ return (
+
+ {/* Current Time Display */}
+
+
+
+
+ Current Unix Timestamp
+
+
+
+
+
{currentTimestamp}
+
{formatDate(new Date())}
+
+ Use Current Time
+
+
+
+
+
+
+
+ Timestamp to Date
+ Date to Timestamp
+
+
+
+
+
+ Timestamp to Date
+ Convert Unix timestamp to human-readable date
+
+
+
+
Unix Timestamp
+
+ setTimestamp(e.target.value)}
+ className="font-mono"
+ />
+
+
+
+
+
+
+ {dateString && (
+
+
Date Output
+
+
+ {dateString}
+ copyToClipboard(dateString, "Date")}
+ variant="ghost"
+ size="sm"
+ >
+ {copied === "Date" ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ )}
+
+
+
+
+
+
+
+ Date to Timestamp
+ Convert human-readable date to Unix timestamp
+
+
+
+
Date String
+
+ setDateString(e.target.value)}
+ step="1"
+ />
+
+
+
+
+
+ Format: YYYY-MM-DD HH:MM:SS
+
+
+
+ {timestamp && (
+
+
Timestamp Output
+
+
+ {timestamp}
+ copyToClipboard(timestamp, "Timestamp")}
+ variant="ghost"
+ size="sm"
+ >
+ {copied === "Timestamp" ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ )}
+
+
+
+
+
+ );
+}
diff --git a/src/components/tools/UnitConverter.tsx b/src/components/tools/UnitConverter.tsx
new file mode 100644
index 00000000..fae2fb0c
--- /dev/null
+++ b/src/components/tools/UnitConverter.tsx
@@ -0,0 +1,205 @@
+import { useState, useEffect } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+import { ArrowRight } from "lucide-react";
+import { toast } from "sonner";
+
+interface ConversionUnit {
+ name: string;
+ symbol: string;
+ toBase: (value: number) => number;
+ fromBase: (value: number) => number;
+}
+
+const conversions: Record }> = {
+ length: {
+ category: "Length",
+ units: {
+ meter: { name: "Meter", symbol: "m", toBase: (v) => v, fromBase: (v) => v },
+ kilometer: { name: "Kilometer", symbol: "km", toBase: (v) => v * 1000, fromBase: (v) => v / 1000 },
+ centimeter: { name: "Centimeter", symbol: "cm", toBase: (v) => v / 100, fromBase: (v) => v * 100 },
+ millimeter: { name: "Millimeter", symbol: "mm", toBase: (v) => v / 1000, fromBase: (v) => v * 1000 },
+ mile: { name: "Mile", symbol: "mi", toBase: (v) => v * 1609.344, fromBase: (v) => v / 1609.344 },
+ yard: { name: "Yard", symbol: "yd", toBase: (v) => v * 0.9144, fromBase: (v) => v / 0.9144 },
+ foot: { name: "Foot", symbol: "ft", toBase: (v) => v * 0.3048, fromBase: (v) => v / 0.3048 },
+ inch: { name: "Inch", symbol: "in", toBase: (v) => v * 0.0254, fromBase: (v) => v / 0.0254 },
+ },
+ },
+ weight: {
+ category: "Weight",
+ units: {
+ kilogram: { name: "Kilogram", symbol: "kg", toBase: (v) => v, fromBase: (v) => v },
+ gram: { name: "Gram", symbol: "g", toBase: (v) => v / 1000, fromBase: (v) => v * 1000 },
+ milligram: { name: "Milligram", symbol: "mg", toBase: (v) => v / 1000000, fromBase: (v) => v * 1000000 },
+ pound: { name: "Pound", symbol: "lb", toBase: (v) => v * 0.453592, fromBase: (v) => v / 0.453592 },
+ ounce: { name: "Ounce", symbol: "oz", toBase: (v) => v * 0.0283495, fromBase: (v) => v / 0.0283495 },
+ },
+ },
+ temperature: {
+ category: "Temperature",
+ units: {
+ celsius: { name: "Celsius", symbol: "°C", toBase: (v) => v, fromBase: (v) => v },
+ fahrenheit: {
+ name: "Fahrenheit",
+ symbol: "°F",
+ toBase: (v) => (v - 32) * 5 / 9,
+ fromBase: (v) => v * 9 / 5 + 32,
+ },
+ kelvin: { name: "Kelvin", symbol: "K", toBase: (v) => v - 273.15, fromBase: (v) => v + 273.15 },
+ },
+ },
+ data: {
+ category: "Data",
+ units: {
+ byte: { name: "Byte", symbol: "B", toBase: (v) => v, fromBase: (v) => v },
+ kilobyte: { name: "Kilobyte", symbol: "KB", toBase: (v) => v * 1024, fromBase: (v) => v / 1024 },
+ megabyte: { name: "Megabyte", symbol: "MB", toBase: (v) => v * 1024 * 1024, fromBase: (v) => v / (1024 * 1024) },
+ gigabyte: { name: "Gigabyte", symbol: "GB", toBase: (v) => v * 1024 * 1024 * 1024, fromBase: (v) => v / (1024 * 1024 * 1024) },
+ },
+ },
+};
+
+export function UnitConverter() {
+ const [category, setCategory] = useState("length");
+ const [fromUnit, setFromUnit] = useState("meter");
+ const [toUnit, setToUnit] = useState("kilometer");
+ const [fromValue, setFromValue] = useState("1");
+ const [toValue, setToValue] = useState("");
+
+ const currentConversion = conversions[category];
+
+ useEffect(() => {
+ setFromUnit(Object.keys(currentConversion.units)[0]);
+ setToUnit(Object.keys(currentConversion.units)[1] || Object.keys(currentConversion.units)[0]);
+ }, [category]);
+
+ useEffect(() => {
+ if (!fromValue || isNaN(Number(fromValue))) {
+ setToValue("");
+ return;
+ }
+
+ const value = parseFloat(fromValue);
+ const from = currentConversion.units[fromUnit];
+ const to = currentConversion.units[toUnit];
+
+ // Convert to base unit, then to target unit
+ const baseValue = from.toBase(value);
+ const result = to.fromBase(baseValue);
+
+ // Format the result
+ if (Number.isInteger(result)) {
+ setToValue(result.toString());
+ } else {
+ setToValue(result.toFixed(6).replace(/\.?0+$/, ""));
+ }
+ }, [fromValue, fromUnit, toUnit, category]);
+
+ const swapUnits = () => {
+ const temp = fromUnit;
+ setFromUnit(toUnit);
+ setToUnit(temp);
+ if (toValue) {
+ setFromValue(toValue);
+ }
+ };
+
+ return (
+
+
+
+ Unit Converter
+ Convert between different units of measurement
+
+
+
+ Category
+
+
+
+
+
+ {Object.values(conversions).map((conv) => (
+
+ {conv.category}
+
+ ))}
+
+
+
+
+
+
+ From
+
+
+
+
+
+ {Object.entries(currentConversion.units).map(([key, unit]) => (
+
+ {unit.name} ({unit.symbol})
+
+ ))}
+
+
+
+
+
+
+
+
+
+ To
+
+
+
+
+
+ {Object.entries(currentConversion.units).map(([key, unit]) => (
+
+ {unit.name} ({unit.symbol})
+
+ ))}
+
+
+
+
+
+
+
+
+
+ {fromValue} {currentConversion.units[fromUnit].name} = {toValue} {currentConversion.units[toUnit].name}
+
+
+
+
+
+ );
+}
diff --git a/src/components/tools/UrlEncoder.tsx b/src/components/tools/UrlEncoder.tsx
new file mode 100644
index 00000000..4bb836eb
--- /dev/null
+++ b/src/components/tools/UrlEncoder.tsx
@@ -0,0 +1,173 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { Label } from "@/components/ui/label";
+import { ArrowRight, Copy, Check } from "lucide-react";
+import { toast } from "sonner";
+
+export function UrlEncoder() {
+ const [input, setInput] = useState("");
+ const [output, setOutput] = useState("");
+ const [copied, setCopied] = useState(false);
+
+ const encode = () => {
+ if (!input.trim()) {
+ toast.error("Please enter text to encode");
+ return;
+ }
+ try {
+ const encoded = encodeURIComponent(input);
+ setOutput(encoded);
+ toast.success("Encoded successfully!");
+ } catch (error) {
+ toast.error("Failed to encode URL");
+ }
+ };
+
+ const decode = () => {
+ if (!input.trim()) {
+ toast.error("Please enter text to decode");
+ return;
+ }
+ try {
+ const decoded = decodeURIComponent(input);
+ setOutput(decoded);
+ toast.success("Decoded successfully!");
+ } catch (error) {
+ toast.error("Invalid URL encoding");
+ }
+ };
+
+ const copyOutput = () => {
+ navigator.clipboard.writeText(output);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ toast.success("Copied to clipboard!");
+ };
+
+ const clearAll = () => {
+ setInput("");
+ setOutput("");
+ };
+
+ return (
+
+
+
+ Encode
+ Decode
+
+
+
+
+
+ URL Encode
+ Convert text to URL-safe encoded format
+
+
+
+ Input Text
+
+
+
+
+ Encode
+
+
+ {output && (
+
+ Encoded Output
+
+
+ {copied ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy Output
+ >
+ )}
+
+
+ )}
+
+
+
+
+
+
+
+ URL Decode
+ Convert URL-encoded text back to original
+
+
+
+ Encoded Text
+
+
+
+
+ Decode
+
+
+ {output && (
+
+ Decoded Output
+
+
+ {copied ? (
+ <>
+
+ Copied!
+ >
+ ) : (
+ <>
+
+ Copy Output
+ >
+ )}
+
+
+ )}
+
+
+
+
+
+ {output && (
+
+ Clear All
+
+ )}
+
+ );
+}
diff --git a/src/components/tools/UuidGenerator.tsx b/src/components/tools/UuidGenerator.tsx
new file mode 100644
index 00000000..6840e95b
--- /dev/null
+++ b/src/components/tools/UuidGenerator.tsx
@@ -0,0 +1,243 @@
+import { useState } from "react";
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { Copy, RefreshCw } from "lucide-react";
+import { toast } from "sonner";
+
+type UUIDVersion = "1" | "3" | "4" | "5" | "6" | "7" | "ulid";
+
+export function UUIDGenerator() {
+ const [version, setVersion] = useState("4");
+ const [count, setCount] = useState(5);
+ const [output, setOutput] = useState("");
+
+ const generateUUIDv4 = (): string => {
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
+ const r = (Math.random() * 16) | 0;
+ const v = c === "x" ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ });
+ };
+
+ const generateUUIDv1 = (): string => {
+ const timestamp = Date.now();
+ const timestampHex = timestamp.toString(16);
+
+ const randomBytes = [];
+ for (let i = 0; i < 16; i++) {
+ randomBytes.push(Math.floor(Math.random() * 256).toString(16).padStart(2, "0"));
+ }
+
+ const timeLow = timestampHex.padStart(8, "0").substring(0, 8);
+ const timeMid = timestampHex.padStart(8, "0").substring(0, 4);
+ const timeHi = "1" + timestampHex.padStart(8, "0").substring(0, 3);
+
+ const clockSeq = randomBytes.slice(8, 10).join("");
+ const node = randomBytes.slice(10, 16).join("");
+
+ return `${timeLow}-${timeMid}-${timeHi}-${clockSeq}-${node}`;
+ };
+
+ const generateUUIDv6 = (): string => {
+ const timestamp = Date.now();
+ const timestampHex = (timestamp + 0x01b21dd213814000).toString(16).padStart(24, "0");
+
+ const timeHiVer = "6" + timestampHex.substring(0, 3);
+ const timeMid = timestampHex.substring(3, 7);
+ const timeLow = timestampHex.substring(7, 15);
+
+ const randomBytes = [];
+ for (let i = 0; i < 8; i++) {
+ randomBytes.push(Math.floor(Math.random() * 256).toString(16).padStart(2, "0"));
+ }
+
+ const clockSeq = "8" + randomBytes[0].substring(1) + randomBytes[1];
+ const node = randomBytes.slice(2, 8).join("");
+
+ return `${timeLow}-${timeMid}-${timeHiVer}-${clockSeq}-${node}`;
+ };
+
+ const generateUUIDv7 = (): string => {
+ const timestamp = Math.floor(Date.now() / 1000);
+ const timestampHex = timestamp.toString(16).padStart(12, "0");
+ const randomHex = Array.from({ length: 10 }, () =>
+ Math.floor(Math.random() * 16).toString(16)
+ ).join("");
+
+ const timeHiVer = "7" + timestampHex.substring(0, 3);
+ const timeMid = timestampHex.substring(3, 7);
+ const timeLow = timestampHex.substring(7, 12);
+ const randB = randomHex.substring(0, 4);
+ const clockSeq = "8" + randomHex.substring(4, 7);
+ const node = randomHex.substring(7, 18);
+
+ return `${timeLow}-${timeMid}-${timeHiVer}-${clockSeq}${randB}-${node}`;
+ };
+
+ const generateULID = (): string => {
+ const encoding = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
+ const timestamp = Date.now();
+
+ let timestampEncoded = "";
+ let remainingTime = timestamp;
+
+ for (let i = 0; i < 10; i++) {
+ const remainder = remainingTime % 32;
+ timestampEncoded = encoding[remainder] + timestampEncoded;
+ remainingTime = Math.floor(remainingTime / 32);
+ }
+
+ let randomEncoded = "";
+ for (let i = 0; i < 16; i++) {
+ randomEncoded += encoding[Math.floor(Math.random() * 32)];
+ }
+
+ return timestampEncoded + randomEncoded;
+ };
+
+ const generateUUIDv3 = (): string => {
+ // Simplified UUID v3 using namespace and name
+ const namespace = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
+ const name = "example.com";
+ const hash = simpleHash(namespace + name);
+ return formatUUIDFromHash(hash, "3");
+ };
+
+ const generateUUIDv5 = (): string => {
+ // Simplified UUID v5 using namespace and name
+ const namespace = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
+ const name = "example.com";
+ const hash = simpleHash(namespace + name);
+ return formatUUIDFromHash(hash, "5");
+ };
+
+ const simpleHash = (str: string): string => {
+ let hash = 0;
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+ hash = ((hash << 5) - hash) + char;
+ hash = hash & hash;
+ }
+ return Math.abs(hash).toString(16).padStart(32, "0");
+ };
+
+ const formatUUIDFromHash = (hash: string, ver: string): string => {
+ const hex = hash.substring(0, 32);
+ const timeLow = hex.substring(0, 8);
+ const timeMid = hex.substring(8, 12);
+ const timeHiVer = ver + hex.substring(13, 16);
+ const clockSeq = "8" + hex.substring(17, 20);
+ const node = hex.substring(20, 32);
+
+ return `${timeLow}-${timeMid}-${timeHiVer}-${clockSeq}-${node}`;
+ };
+
+ const generateUUIDs = () => {
+ if (count < 1 || count > 100) {
+ toast.error("Please enter a count between 1 and 100.");
+ return;
+ }
+
+ const uuids: string[] = [];
+
+ for (let i = 0; i < count; i++) {
+ let uuid = "";
+ switch (version) {
+ case "1":
+ uuid = generateUUIDv1();
+ break;
+ case "3":
+ uuid = generateUUIDv3();
+ break;
+ case "4":
+ uuid = generateUUIDv4();
+ break;
+ case "5":
+ uuid = generateUUIDv5();
+ break;
+ case "6":
+ uuid = generateUUIDv6();
+ break;
+ case "7":
+ uuid = generateUUIDv7();
+ break;
+ case "ulid":
+ uuid = generateULID();
+ break;
+ }
+ uuids.push(uuid);
+ }
+
+ setOutput(uuids.join("\n"));
+ toast.success(`Generated ${count} ${version.toUpperCase()}!`);
+ };
+
+ const copyToClipboard = () => {
+ if (output) {
+ navigator.clipboard.writeText(output);
+ toast.success("Copied to clipboard!");
+ }
+ };
+
+ return (
+
+ {/* Options */}
+ {/* Options */}
+
+
+ Version
+ setVersion(e.target.value as UUIDVersion)}
+ className="w-full h-10 rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary"
+ >
+ UUID v4 (Random)
+ UUID v1 (Time-based)
+ UUID v7 (Time-ordered)
+ UUID v6 (Time-ordered)
+ UUID v3 (Name-based MD5)
+ UUID v5 (Name-based SHA-1)
+ ULID
+
+
+
+
+ Count
+ setCount(parseInt(e.target.value) || 1)}
+ className="w-full"
+ />
+
+
+
+ {/* Generate Button */}
+
+
+ Generate {count} {version.toUpperCase()}
+
+
+ {/* Output */}
+ {output && (
+
+
+ Output
+
+
+ Copy All
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx
new file mode 100644
index 00000000..9ec9a1a0
--- /dev/null
+++ b/src/components/ui/badge.tsx
@@ -0,0 +1,36 @@
+import * as React from "react";
+import { cva, type VariantProps } from "class-variance-authority";
+
+import { cn } from "@/lib/utils";
+
+const badgeVariants = cva(
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
+ {
+ variants: {
+ variant: {
+ default:
+ "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
+ secondary:
+ "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ destructive:
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
+ outline: "text-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+);
+
+export interface BadgeProps
+ extends React.HTMLAttributes,
+ VariantProps {}
+
+function Badge({ className, variant, ...props }: BadgeProps) {
+ return (
+
+ );
+}
+
+export { Badge, badgeVariants };
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
new file mode 100644
index 00000000..49435d70
--- /dev/null
+++ b/src/components/ui/button.tsx
@@ -0,0 +1,57 @@
+import * as React from "react";
+import { Slot } from "@radix-ui/react-slot";
+import { cva, type VariantProps } from "class-variance-authority";
+
+import { cn } from "@/lib/utils";
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary-foreground shadow hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2",
+ sm: "h-8 rounded-md px-3 text-xs",
+ lg: "h-10 rounded-md px-8",
+ icon: "h-9 w-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+);
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean;
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : "button";
+ return (
+
+ );
+ }
+);
+Button.displayName = "Button";
+
+export { Button, buttonVariants };
diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx
new file mode 100644
index 00000000..b375b06d
--- /dev/null
+++ b/src/components/ui/card.tsx
@@ -0,0 +1,79 @@
+import * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+Card.displayName = "Card";
+
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardHeader.displayName = "CardHeader";
+
+const CardTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardTitle.displayName = "CardTitle";
+
+const CardDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardDescription.displayName = "CardDescription";
+
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardContent.displayName = "CardContent";
+
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardFooter.displayName = "CardFooter";
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx
new file mode 100644
index 00000000..c1683252
--- /dev/null
+++ b/src/components/ui/input.tsx
@@ -0,0 +1,25 @@
+import * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ );
+ }
+);
+Input.displayName = "Input";
+
+export { Input };
diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx
new file mode 100644
index 00000000..144d6fb3
--- /dev/null
+++ b/src/components/ui/label.tsx
@@ -0,0 +1,23 @@
+import * as React from "react";
+import * as LabelPrimitive from "@radix-ui/react-label";
+import { cva, type VariantProps } from "class-variance-authority";
+import { cn } from "@/lib/utils";
+
+const labelVariants = cva(
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
+);
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+));
+Label.displayName = LabelPrimitive.Root.displayName;
+
+export { Label };
diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx
new file mode 100644
index 00000000..b7ff1052
--- /dev/null
+++ b/src/components/ui/select.tsx
@@ -0,0 +1,158 @@
+import * as React from "react";
+import * as SelectPrimitive from "@radix-ui/react-select";
+import { Check, ChevronDown, ChevronUp } from "lucide-react";
+
+import { cn } from "@/lib/utils";
+
+const Select = SelectPrimitive.Root;
+
+const SelectGroup = SelectPrimitive.Group;
+
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName;
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = "popper", ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+));
+SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+
+ {children}
+
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+export {
+ Select,
+ SelectGroup,
+ SelectValue,
+ SelectTrigger,
+ SelectContent,
+ SelectLabel,
+ SelectItem,
+ SelectSeparator,
+ SelectScrollUpButton,
+ SelectScrollDownButton,
+};
diff --git a/src/components/ui/slider.tsx b/src/components/ui/slider.tsx
new file mode 100644
index 00000000..cfff7793
--- /dev/null
+++ b/src/components/ui/slider.tsx
@@ -0,0 +1,22 @@
+import * as React from "react";
+import * as SliderPrimitive from "@radix-ui/react-slider";
+import { cn } from "@/lib/utils";
+
+const Slider = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+
+));
+Slider.displayName = SliderPrimitive.Root.displayName;
+
+export { Slider };
diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx
new file mode 100644
index 00000000..69108b59
--- /dev/null
+++ b/src/components/ui/sonner.tsx
@@ -0,0 +1,25 @@
+import { Toaster as Sonner } from "sonner";
+
+type ToasterProps = React.ComponentProps;
+
+const Toaster = ({ ...props }: ToasterProps) => {
+ return (
+
+ );
+};
+
+export { Toaster };
diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx
new file mode 100644
index 00000000..83a6dc1a
--- /dev/null
+++ b/src/components/ui/switch.tsx
@@ -0,0 +1,27 @@
+import * as React from "react";
+import * as SwitchPrimitives from "@radix-ui/react-switch";
+
+import { cn } from "@/lib/utils";
+
+const Switch = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+Switch.displayName = SwitchPrimitives.Root.displayName;
+
+export { Switch };
diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx
new file mode 100644
index 00000000..86bc65f6
--- /dev/null
+++ b/src/components/ui/tabs.tsx
@@ -0,0 +1,52 @@
+import * as React from "react";
+import * as TabsPrimitive from "@radix-ui/react-tabs";
+import { cn } from "@/lib/utils";
+
+const Tabs = TabsPrimitive.Root;
+
+const TabsList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsList.displayName = TabsPrimitive.List.displayName;
+
+const TabsTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
+
+const TabsContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsContent.displayName = TabsPrimitive.Content.displayName;
+
+export { Tabs, TabsList, TabsTrigger, TabsContent };
diff --git a/src/components/ui/textarea.tsx b/src/components/ui/textarea.tsx
new file mode 100644
index 00000000..0f3eac65
--- /dev/null
+++ b/src/components/ui/textarea.tsx
@@ -0,0 +1,24 @@
+import * as React from "react";
+
+import { cn } from "@/lib/utils";
+
+export interface TextareaProps
+ extends React.TextareaHTMLAttributes {}
+
+const Textarea = React.forwardRef(
+ ({ className, ...props }, ref) => {
+ return (
+
+ );
+ }
+);
+Textarea.displayName = "Textarea";
+
+export { Textarea };
diff --git a/src/components/ui/toast.tsx b/src/components/ui/toast.tsx
new file mode 100644
index 00000000..86aaf49a
--- /dev/null
+++ b/src/components/ui/toast.tsx
@@ -0,0 +1,127 @@
+import * as React from "react";
+import * as ToastPrimitives from "@radix-ui/react-toast";
+import { cva, type VariantProps } from "class-variance-authority";
+import { X } from "lucide-react";
+
+import { cn } from "@/lib/utils";
+
+const ToastProvider = ToastPrimitives.Provider;
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
+
+const toastVariants = cva(
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
+ {
+ variants: {
+ variant: {
+ default: "border bg-background text-foreground",
+ destructive:
+ "destructive group border-destructive bg-destructive text-destructive-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+);
+
+const Toast = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ );
+});
+Toast.displayName = ToastPrimitives.Root.displayName;
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastAction.displayName = ToastPrimitives.Action.displayName;
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+ToastClose.displayName = ToastPrimitives.Close.displayName;
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastTitle.displayName = ToastPrimitives.Title.displayName;
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastDescription.displayName = ToastPrimitives.Description.displayName;
+
+type ToastProps = React.ComponentPropsWithoutRef;
+
+type ToastActionElement = React.ReactElement;
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction,
+};
diff --git a/src/components/ui/toaster.tsx b/src/components/ui/toaster.tsx
new file mode 100644
index 00000000..252b1ede
--- /dev/null
+++ b/src/components/ui/toaster.tsx
@@ -0,0 +1,34 @@
+import {
+ Toast,
+ ToastClose,
+ ToastDescription,
+ ToastProvider,
+ ToastTitle,
+ ToastViewport,
+} from "@/components/ui/toast";
+
+import { useToast } from "@/hooks/use-toast";
+
+export function Toaster() {
+ const { toasts } = useToast();
+
+ return (
+
+ {toasts.map(function ({ id, title, description, action, ...props }) {
+ return (
+
+
+ {title && {title} }
+ {description && (
+ {description}
+ )}
+
+ {action}
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx
new file mode 100644
index 00000000..13a05434
--- /dev/null
+++ b/src/components/ui/tooltip.tsx
@@ -0,0 +1,28 @@
+import * as React from "react";
+import * as TooltipPrimitive from "@radix-ui/react-tooltip";
+
+import { cn } from "@/lib/utils";
+
+const TooltipProvider = TooltipPrimitive.Provider;
+
+const Tooltip = TooltipPrimitive.Root;
+
+const TooltipTrigger = TooltipPrimitive.Trigger;
+
+const TooltipContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+));
+TooltipContent.displayName = TooltipPrimitive.Content.displayName;
+
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
diff --git a/src/hooks/use-toast.ts b/src/hooks/use-toast.ts
new file mode 100644
index 00000000..82ea34b9
--- /dev/null
+++ b/src/hooks/use-toast.ts
@@ -0,0 +1,186 @@
+import * as React from "react";
+
+import type { ToastActionElement, ToastProps } from "@/components/ui/toast";
+
+const TOAST_LIMIT = 1;
+const TOAST_REMOVE_DELAY = 1000000;
+
+type ToasterToast = ToastProps & {
+ id: string;
+ title?: React.ReactNode;
+ description?: React.ReactNode;
+ action?: ToastActionElement;
+};
+
+const actionTypes = {
+ ADD_TOAST: "ADD_TOAST",
+ UPDATE_TOAST: "UPDATE_TOAST",
+ DISMISS_TOAST: "DISMISS_TOAST",
+ REMOVE_TOAST: "REMOVE_TOAST",
+} as const;
+
+let count = 0;
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
+ return count.toString();
+}
+
+type ActionType = typeof actionTypes;
+
+type Action =
+ | {
+ type: ActionType["ADD_TOAST"];
+ toast: ToasterToast;
+ }
+ | {
+ type: ActionType["UPDATE_TOAST"];
+ toast: Partial;
+ }
+ | {
+ type: ActionType["DISMISS_TOAST"];
+ toastId?: ToasterToast["id"];
+ }
+ | {
+ type: ActionType["REMOVE_TOAST"];
+ toastId?: ToasterToast["id"];
+ };
+
+interface State {
+ toasts: ToasterToast[];
+}
+
+const toastTimeouts = new Map>();
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId);
+ dispatch({
+ type: "REMOVE_TOAST",
+ toastId: toastId,
+ });
+ }, TOAST_REMOVE_DELAY);
+
+ toastTimeouts.set(toastId, timeout);
+};
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case "ADD_TOAST":
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+ };
+
+ case "UPDATE_TOAST":
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ ),
+ };
+
+ case "DISMISS_TOAST": {
+ const { toastId } = action;
+
+ if (toastId) {
+ addToRemoveQueue(toastId);
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id);
+ });
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false,
+ }
+ : t
+ ),
+ };
+ }
+ case "REMOVE_TOAST":
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: [],
+ };
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
+ };
+ }
+};
+
+const listeners: Array<(state: State) => void> = [];
+
+let memoryState: State = { toasts: [] };
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action);
+ listeners.forEach((listener) => {
+ listener(memoryState);
+ });
+}
+
+type Toast = Omit;
+
+function toast({ ...props }: Toast) {
+ const id = genId();
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: "UPDATE_TOAST",
+ toast: { ...props, id },
+ });
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id });
+
+ dispatch({
+ type: "ADD_TOAST",
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss();
+ },
+ },
+ });
+
+ return {
+ id: id,
+ dismiss,
+ update,
+ };
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState);
+
+ React.useEffect(() => {
+ listeners.push(setState);
+ return () => {
+ const index = listeners.indexOf(setState);
+ if (index > -1) {
+ listeners.splice(index, 1);
+ }
+ };
+ }, [state]);
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
+ };
+}
+
+export { useToast, toast };
diff --git a/src/index.css b/src/index.css
new file mode 100644
index 00000000..99950f9b
--- /dev/null
+++ b/src/index.css
@@ -0,0 +1,75 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 0 0% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 0 0% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 0 0% 3.9%;
+ --primary: 0 72.2% 50.6%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 0 0% 96.1%;
+ --secondary-foreground: 0 0% 9%;
+ --muted: 0 0% 96.1%;
+ --muted-foreground: 0 0% 45.1%;
+ --accent: 0 0% 96.1%;
+ --accent-foreground: 0 0% 9%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 89.8%;
+ --input: 0 0% 89.8%;
+ --ring: 0 72.2% 50.6%;
+ --radius: 0.5rem;
+ --sidebar-background: 0 0% 98%;
+ --sidebar-foreground: 0 0% 9%;
+ --sidebar-primary: 0 0% 9%;
+ --sidebar-primary-foreground: 0 0% 98%;
+ --sidebar-accent: 0 0% 96.1%;
+ --sidebar-accent-foreground: 0 0% 9%;
+ --sidebar-border: 0 0% 89.8%;
+ --sidebar-ring: 0 72.2% 50.6%;
+ }
+
+ .dark {
+ --background: 0 0% 10%;
+ --foreground: 0 0% 98%;
+ --card: 0 0% 10%;
+ --card-foreground: 0 0% 98%;
+ --popover: 0 0% 10%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 0 72.2% 50.6%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 0 0% 14.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 14.9%;
+ --muted-foreground: 0 0% 63.9%;
+ --accent: 0 0% 14.9%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 14.9%;
+ --input: 0 0% 14.9%;
+ --ring: 0 72.2% 50.6%;
+ --sidebar-background: 0 0% 10%;
+ --sidebar-foreground: 0 0% 98%;
+ --sidebar-primary: 0 0% 98%;
+ --sidebar-primary-foreground: 0 0% 9%;
+ --sidebar-accent: 0 0% 14.9%;
+ --sidebar-accent-foreground: 0 0% 98%;
+ --sidebar-border: 0 0% 14.9%;
+ --sidebar-ring: 0 72.2% 50.6%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
new file mode 100644
index 00000000..365058ce
--- /dev/null
+++ b/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/src/main.js b/src/main.js
deleted file mode 100644
index c56d1c11..00000000
--- a/src/main.js
+++ /dev/null
@@ -1,188 +0,0 @@
-const { app, BrowserWindow, Menu, shell, ipcMain } = require('electron');
-const path = require('path');
-const fs = require('fs');
-
-let mainWindow;
-
-const isDev = process.argv.includes('--dev');
-
-function createWindow() {
- mainWindow = new BrowserWindow({
- width: 1200,
- height: 800,
- minWidth: 800,
- minHeight: 600,
- webPreferences: {
- nodeIntegration: true,
- contextIsolation: false,
- enableRemoteModule: true
- },
- titleBarStyle: 'default',
- show: false
- });
-
- mainWindow.loadFile('src/renderer/index.html');
-
- if (isDev) {
- mainWindow.webContents.openDevTools();
- }
-
- mainWindow.once('ready-to-show', () => {
- mainWindow.show();
- });
-
- mainWindow.on('closed', () => {
- mainWindow = null;
- });
-
- createMenu();
-}
-
-function createMenu() {
- const template = [
- {
- label: 'File',
- submenu: [
- {
- label: 'New Window',
- accelerator: 'CmdOrCtrl+N',
- click: () => {
- createWindow();
- }
- },
- { type: 'separator' },
- {
- label: 'Quit',
- accelerator: process.platform === 'darwin' ? 'Cmd+Q' : 'Ctrl+Q',
- click: () => {
- app.quit();
- }
- }
- ]
- },
- {
- label: 'Edit',
- submenu: [
- { role: 'undo' },
- { role: 'redo' },
- { type: 'separator' },
- { role: 'cut' },
- { role: 'copy' },
- { role: 'paste' },
- { role: 'selectall' }
- ]
- },
- {
- label: 'View',
- submenu: [
- { role: 'reload' },
- { role: 'forceReload' },
- { role: 'toggleDevTools' },
- { type: 'separator' },
- { role: 'resetZoom' },
- { role: 'zoomIn' },
- { role: 'zoomOut' },
- { type: 'separator' },
- { role: 'togglefullscreen' }
- ]
- },
- {
- label: 'Tools',
- submenu: [
- { label: 'JSON Viewer', click: () => mainWindow.webContents.send('navigate-to', 'json-viewer') },
- { label: 'Text Compare', click: () => mainWindow.webContents.send('navigate-to', 'text-compare') },
- { label: 'Case Converter', click: () => mainWindow.webContents.send('navigate-to', 'case-converter') },
- { label: 'UUID Generator', click: () => mainWindow.webContents.send('navigate-to', 'uuid-generator') },
- { label: 'Base64 Converter', click: () => mainWindow.webContents.send('navigate-to', 'base64-converter') },
- { label: 'JWT Decoder', click: () => mainWindow.webContents.send('navigate-to', 'jwt-decoder') },
- { type: 'separator' },
- { label: 'SQL Formatter', click: () => mainWindow.webContents.send('navigate-to', 'sql-formatter') },
- { label: 'Markdown Editor', click: () => mainWindow.webContents.send('navigate-to', 'markdown-editor') },
- { label: 'Code Playground', click: () => mainWindow.webContents.send('navigate-to', 'code-playground') },
- { type: 'separator' },
- { label: 'Hash Generator', click: () => mainWindow.webContents.send('navigate-to', 'hash-generator') },
- { label: 'QR Code Generator', click: () => mainWindow.webContents.send('navigate-to', 'qr-generator') }
- ]
- },
- {
- label: 'Help',
- submenu: [
- {
- label: 'About',
- click: () => {
- shell.openExternal('https://github.com');
- }
- }
- ]
- }
- ];
-
- if (process.platform === 'darwin') {
- template.unshift({
- label: app.getName(),
- submenu: [
- { role: 'about' },
- { type: 'separator' },
- { role: 'services', submenu: [] },
- { type: 'separator' },
- { role: 'hide' },
- { role: 'hideothers' },
- { role: 'unhide' },
- { type: 'separator' },
- { role: 'quit' }
- ]
- });
- }
-
- const menu = Menu.buildFromTemplate(template);
- Menu.setApplicationMenu(menu);
-}
-
-app.whenReady().then(createWindow);
-
-app.on('window-all-closed', () => {
- if (process.platform !== 'darwin') {
- app.quit();
- }
-});
-
-app.on('activate', () => {
- if (BrowserWindow.getAllWindows().length === 0) {
- createWindow();
- }
-});
-
-ipcMain.handle('save-file', async (event, data) => {
- const { dialog } = require('electron');
- const result = await dialog.showSaveDialog(mainWindow, {
- filters: data.filters || []
- });
-
- if (!result.canceled && result.filePath) {
- try {
- fs.writeFileSync(result.filePath, data.content);
- return { success: true, path: result.filePath };
- } catch (error) {
- return { success: false, error: error.message };
- }
- }
- return { success: false, error: 'Save cancelled' };
-});
-
-ipcMain.handle('open-file', async (event, filters) => {
- const { dialog } = require('electron');
- const result = await dialog.showOpenDialog(mainWindow, {
- filters: filters || [],
- properties: ['openFile']
- });
-
- if (!result.canceled && result.filePaths.length > 0) {
- try {
- const content = fs.readFileSync(result.filePaths[0], 'utf8');
- return { success: true, content, path: result.filePaths[0] };
- } catch (error) {
- return { success: false, error: error.message };
- }
- }
- return { success: false, error: 'Open cancelled' };
-});
\ No newline at end of file
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 00000000..ef474bf6
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from "react";
+import { createRoot } from "react-dom/client";
+import App from "./App.tsx";
+import "./index.css";
+
+createRoot(document.getElementById("root")!).render(
+
+
+ ,
+);
diff --git a/src/renderer/index.html b/src/renderer/index.html
deleted file mode 100644
index d902bbca..00000000
--- a/src/renderer/index.html
+++ /dev/null
@@ -1,1691 +0,0 @@
-
-
-
-
-
- Dev Tools Desktop - Professional Developer Toolkit
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/renderer/js/main.js b/src/renderer/js/main.js
deleted file mode 100644
index 5ad6dfbe..00000000
--- a/src/renderer/js/main.js
+++ /dev/null
@@ -1,408 +0,0 @@
-// Check if we're in Electron or browser environment
-const isElectron =
- typeof require !== 'undefined' &&
- window.process &&
- window.process.type === 'renderer';
-const ipcRenderer = isElectron ? require('electron').ipcRenderer : null;
-
-class DevToolsApp {
- constructor() {
- this.currentTool = 'home';
- this.searchTimeout = null;
- this.init();
- }
-
- init() {
- this.setupNavigation();
- this.setupMenuListeners();
- this.setupToolCards();
- this.setupSearch();
- this.setupCategories();
- }
-
- setupNavigation() {
- const navLinks = document.querySelectorAll('.nav-link[data-tool]');
-
- navLinks.forEach((link) => {
- link.addEventListener('click', (e) => {
- e.preventDefault();
- const tool = link.dataset.tool;
- this.switchTool(tool);
- });
- });
- }
-
- setupMenuListeners() {
- if (ipcRenderer) {
- ipcRenderer.on('navigate-to', (_, tool) => {
- this.switchTool(tool);
- });
- }
- }
-
- setupToolCards() {
- const toolCards = document.querySelectorAll('.tool-card');
-
- toolCards.forEach((card) => {
- card.addEventListener('click', () => {
- const tool = card.dataset.tool;
- this.switchTool(tool);
- });
- });
- }
-
- setupSearch() {
- const searchInput = document.getElementById('menu-search');
- const clearButton = document.getElementById('clear-search');
- const searchResults = document.getElementById('search-results');
-
- searchInput.addEventListener('input', (e) => {
- clearTimeout(this.searchTimeout);
- const query = e.target.value.trim();
-
- if (query.length > 0) {
- clearButton.classList.add('visible');
- this.searchTimeout = setTimeout(() => {
- this.performSearch(query);
- }, 200);
- } else {
- clearButton.classList.remove('visible');
- this.clearSearch();
- }
- });
-
- clearButton.addEventListener('click', () => {
- searchInput.value = '';
- clearButton.classList.remove('visible');
- this.clearSearch();
- searchInput.focus();
- });
-
- // Hide search results when clicking outside
- document.addEventListener('click', (e) => {
- if (!e.target.closest('.menu-search-container')) {
- searchResults.style.display = 'none';
- }
- });
-
- // Focus search input with Ctrl/Cmd + K
- document.addEventListener('keydown', (e) => {
- if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
- e.preventDefault();
- searchInput.focus();
- searchInput.select();
- }
- });
- }
-
- setupCategories() {
- const categoryHeaders = document.querySelectorAll('.category-header');
-
- categoryHeaders.forEach((header) => {
- header.addEventListener('click', () => {
- const category = header.dataset.category;
- const menu = document.getElementById(`${category}-menu`);
-
- header.classList.toggle('expanded');
- menu.classList.toggle('expanded');
- });
- });
-
- // Expand first category by default
- const firstCategory = document.querySelector('.category-header');
- if (firstCategory) {
- firstCategory.click();
- }
- }
-
- performSearch(query) {
- const navLinks = document.querySelectorAll('.nav-link[data-tool]');
- const searchResults = document.getElementById('search-results');
-
- // Create search index with tool information
- const tools = Array.from(navLinks).map(link => ({
- element: link,
- name: link.textContent.trim(),
- tool: link.dataset.tool,
- category: this.getToolCategory(link)
- }));
-
- // Filter tools based on search query
- const filteredTools = tools.filter(tool =>
- tool.name.toLowerCase().includes(query.toLowerCase())
- );
-
- if (filteredTools.length > 0) {
- // Show search results dropdown
- searchResults.innerHTML = '';
- filteredTools.forEach((tool, index) => {
- const resultItem = document.createElement('div');
- resultItem.className = 'search-result-item';
-
- // Get icon class from the original link
- const iconElement = tool.element.querySelector('i');
- const iconClass = iconElement ? iconElement.className : 'fas fa-tools';
-
- resultItem.innerHTML = `
-
- ${tool.name}
- `;
-
- resultItem.addEventListener('click', () => {
- this.switchTool(tool.tool);
- this.clearSearch();
- document.getElementById('menu-search').value = '';
- });
-
- // Highlight first result
- if (index === 0) {
- resultItem.classList.add('highlighted');
- }
-
- searchResults.appendChild(resultItem);
- });
- searchResults.style.display = 'block';
-
- // Add keyboard navigation
- this.setupSearchKeyboardNavigation(searchResults);
- } else {
- searchResults.innerHTML = 'No tools found
';
- searchResults.style.display = 'block';
- }
- }
-
- setupSearchKeyboardNavigation(searchResults) {
- const items = searchResults.querySelectorAll('.search-result-item');
- const clickableItems = Array.from(items).filter(item =>
- item.textContent.trim() !== 'No tools found'
- );
- let currentIndex = 0;
-
- const handleKeyDown = (e) => {
- if (clickableItems.length === 0) return;
-
- if (e.key === 'ArrowDown') {
- e.preventDefault();
- clickableItems[currentIndex]?.classList.remove('highlighted');
- currentIndex = (currentIndex + 1) % clickableItems.length;
- clickableItems[currentIndex]?.classList.add('highlighted');
- clickableItems[currentIndex]?.scrollIntoView({ block: 'nearest' });
- } else if (e.key === 'ArrowUp') {
- e.preventDefault();
- clickableItems[currentIndex]?.classList.remove('highlighted');
- currentIndex = currentIndex === 0 ? clickableItems.length - 1 : currentIndex - 1;
- clickableItems[currentIndex]?.classList.add('highlighted');
- clickableItems[currentIndex]?.scrollIntoView({ block: 'nearest' });
- } else if (e.key === 'Enter') {
- e.preventDefault();
- if (clickableItems[currentIndex]) {
- clickableItems[currentIndex].click();
- }
- }
- };
-
- document.addEventListener('keydown', handleKeyDown);
-
- // Remove event listener when search is cleared
- setTimeout(() => {
- document.removeEventListener('keydown', handleKeyDown);
- }, 5000);
- }
-
- getToolCategory(link) {
- const categoryMenu = link.closest('.category-menu');
- if (categoryMenu) {
- return categoryMenu.id.replace('-menu', '');
- }
- return 'general';
- }
-
- clearSearch() {
- const searchResults = document.getElementById('search-results');
- searchResults.style.display = 'none';
- searchResults.innerHTML = '';
- }
-
- switchTool(toolName) {
- document.querySelectorAll('.tool-container').forEach((container) => {
- container.classList.remove('active');
- });
-
- document.querySelectorAll('.nav-link').forEach((link) => {
- link.classList.remove('active');
- });
-
- const targetContainer = document.getElementById(toolName);
- const targetNavLink = document.querySelector(`[data-tool="${toolName}"]`);
-
- if (targetContainer) {
- targetContainer.classList.add('active');
- this.currentTool = toolName;
- }
-
- if (targetNavLink) {
- targetNavLink.classList.add('active');
- }
-
- if (toolName === 'uuid-generator' && window.UUIDGenerator) {
- window.UUIDGenerator.init();
- }
- if (toolName === 'json-viewer' && window.JSONViewer) {
- window.JSONViewer.init();
- }
- if (toolName === 'lorem-generator' && window.LoremGenerator) {
- console.log('Lorem Generator activated - reinitializing');
- window.LoremGenerator.init();
- }
-
- /**
- * Initialize DateDifference tool if it's activated
- * and the class is available in the global scope.
- */
- if (toolName === 'date-difference' && window.DateDifference) {
- window.DateDifference.init();
- }
- }
-
- async saveFile(content, filters = []) {
- if (!ipcRenderer) {
- console.log('Save functionality not available in browser mode');
- return { success: false, error: 'Not available in browser' };
- }
-
- try {
- const result = await ipcRenderer.invoke('save-file', {
- content,
- filters,
- });
- return result;
- } catch (error) {
- console.error('Error saving file:', error);
- return { success: false, error: error.message };
- }
- }
-
- async openFile(filters = []) {
- if (!ipcRenderer) {
- console.log('Open file functionality not available in browser mode');
- return { success: false, error: 'Not available in browser' };
- }
-
- try {
- const result = await ipcRenderer.invoke('open-file', filters);
- return result;
- } catch (error) {
- console.error('Error opening file:', error);
- return { success: false, error: error.message };
- }
- }
-
- showMessage(message, type = 'info') {
- const messageDiv = document.createElement('div');
- messageDiv.className = `notification notification-${type}`;
-
- const icon =
- {
- success: 'fa-check-circle',
- error: 'fa-exclamation-circle',
- warning: 'fa-exclamation-triangle',
- info: 'fa-info-circle',
- }[type] || 'fa-info-circle';
-
- messageDiv.innerHTML = `
-
- ${message}
-
-
-
- `;
-
- messageDiv.style.cssText = `
- position: fixed;
- top: 20px;
- right: 20px;
- padding: 16px 20px;
- border-radius: 8px;
- z-index: 10000;
- min-width: 300px;
- max-width: 400px;
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
- display: flex;
- align-items: center;
- gap: 12px;
- animation: slideIn 0.3s ease;
- backdrop-filter: blur(10px);
- font-weight: 500;
- `;
-
- const colors = {
- success: {
- bg: 'linear-gradient(135deg, rgba(45, 206, 137, 0.95), rgba(45, 206, 137, 0.85))',
- color: 'white',
- },
- error: {
- bg: 'linear-gradient(135deg, rgba(245, 54, 92, 0.95), rgba(245, 54, 92, 0.85))',
- color: 'white',
- },
- warning: {
- bg: 'linear-gradient(135deg, rgba(251, 99, 64, 0.95), rgba(251, 99, 64, 0.85))',
- color: 'white',
- },
- info: {
- bg: 'linear-gradient(135deg, rgba(94, 114, 228, 0.95), rgba(94, 114, 228, 0.85))',
- color: 'white',
- },
- };
-
- const colorScheme = colors[type] || colors.info;
- messageDiv.style.background = colorScheme.bg;
- messageDiv.style.color = colorScheme.color;
-
- const style = document.createElement('style');
- style.textContent = `
- @keyframes slideIn {
- from {
- transform: translateX(100%);
- opacity: 0;
- }
- to {
- transform: translateX(0);
- opacity: 1;
- }
- }
- .notification-close {
- background: none;
- border: none;
- color: white;
- cursor: pointer;
- margin-left: auto;
- padding: 4px;
- opacity: 0.8;
- transition: opacity 0.2s;
- }
- .notification-close:hover {
- opacity: 1;
- }
- `;
- if (!document.querySelector('#notification-styles')) {
- style.id = 'notification-styles';
- document.head.appendChild(style);
- }
-
- document.body.appendChild(messageDiv);
-
- setTimeout(() => {
- messageDiv.style.animation = 'slideOut 0.3s ease';
- setTimeout(() => messageDiv.remove(), 300);
- }, 4000);
- }
-}
-
-// Initialize app when DOM is ready
-document.addEventListener('DOMContentLoaded', () => {
- window.app = new DevToolsApp();
-});
-
-document.addEventListener('DOMContentLoaded', () => {
- console.log('Dev Tools Desktop loaded successfully');
-});
diff --git a/src/renderer/js/tools/api-response-formatter.js b/src/renderer/js/tools/api-response-formatter.js
deleted file mode 100644
index 5dcff9a7..00000000
--- a/src/renderer/js/tools/api-response-formatter.js
+++ /dev/null
@@ -1,623 +0,0 @@
-/**
- * API Response Formatter - Format REST/GraphQL responses with tree view
- *
- * Features:
- * - Interactive tree view with expand/collapse
- * - Real-time search with highlighting and navigation
- * - JSON and GraphQL response support
- * - Syntax highlighting and validation
- * - Copy/export functionality
- *
- * @version 1.0.1 - Fixed multi-character search bug with DOM normalization
- */
-class APIResponseFormatter {
- constructor() {
- this.currentData = null;
- this.currentType = 'json';
- this.searchResults = [];
- this.currentSearchIndex = 0;
- this.searchDebounceTimer = null;
- this.bindEvents();
- }
-
- bindEvents() {
- const formatBtn = document.getElementById('format-response');
- const validateBtn = document.getElementById('validate-response');
- const expandAllBtn = document.getElementById('expand-all');
- const collapseAllBtn = document.getElementById('collapse-all');
- const copyBtn = document.getElementById('copy-response');
- const clearBtn = document.getElementById('clear-response');
- const typeSelect = document.getElementById('response-type');
- const searchInput = document.getElementById('search-response');
- const searchPrevBtn = document.getElementById('search-prev');
- const searchNextBtn = document.getElementById('search-next');
-
- if (formatBtn)
- formatBtn.addEventListener('click', () => this.formatResponse());
- if (validateBtn)
- validateBtn.addEventListener('click', () => this.validateResponse());
- if (expandAllBtn)
- expandAllBtn.addEventListener('click', () => this.expandAll());
- if (collapseAllBtn)
- collapseAllBtn.addEventListener('click', () => this.collapseAll());
- if (copyBtn)
- copyBtn.addEventListener('click', () => this.copyToClipboard());
- if (clearBtn) clearBtn.addEventListener('click', () => this.clearAll());
- if (typeSelect)
- typeSelect.addEventListener('change', () => this.onTypeChange());
- if (searchInput) {
- searchInput.addEventListener('input', () =>
- this.onSearchInputDebounced()
- );
- searchInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter') {
- e.preventDefault();
- this.searchNext();
- }
- });
- }
- if (searchPrevBtn)
- searchPrevBtn.addEventListener('click', () => this.searchPrev());
- if (searchNextBtn)
- searchNextBtn.addEventListener('click', () => this.searchNext());
-
- // Bind tree toggle events using event delegation
- const output = document.getElementById('response-output');
- if (output) {
- output.addEventListener('click', (e) => {
- if (e.target.closest('.tree-toggle')) {
- this.toggleTreeNode(e.target.closest('.tree-toggle'));
- }
- });
- }
- }
-
- formatResponse() {
- this.clearButtonStates(); // Clear all active button states
- this.setButtonActive('format-response'); // Set this button as active
-
- const input = document.getElementById('response-input').value;
- const typeSelect = document.getElementById('response-type');
- const output = document.getElementById('response-output');
- const responseType = typeSelect ? typeSelect.value : 'json';
-
- if (!input.trim()) {
- this.showError('Please enter API response data to format.');
- return;
- }
-
- try {
- this.currentData = window.APIFormatterUtils.parseResponse(
- input,
- responseType
- );
- this.currentType = responseType;
-
- const treeHTML = window.APIFormatterUtils.generateTreeHTML(
- this.currentData
- );
- const info = window.APIFormatterUtils.getResponseInfo(this.currentData);
-
- output.innerHTML = `
-
-
- Type:
- ${info.type}
-
-
- Size:
- ${info.size}
-
-
- Keys:
- ${info.keys}
-
-
- Depth:
- ${info.depth}
-
-
-
- ${treeHTML}
-
- `;
-
- this.clearErrors();
- this.updateSearchResults();
- window.app?.showMessage(
- `${responseType.toUpperCase()} formatted successfully!`,
- 'success'
- );
- } catch (error) {
- this.showError(error.message);
- this.currentData = null;
- }
- }
-
- validateResponse() {
- this.clearButtonStates(); // Clear all active button states
- this.setButtonActive('validate-response'); // Set this button as active
-
- const input = document.getElementById('response-input').value;
- const typeSelect = document.getElementById('response-type');
- const output = document.getElementById('response-output');
- const responseType = typeSelect ? typeSelect.value : 'json';
-
- if (!input.trim()) {
- this.showError('Please enter API response data to validate.');
- return;
- }
-
- try {
- const data = window.APIFormatterUtils.parseResponse(input, responseType);
- const info = window.APIFormatterUtils.getResponseInfo(data);
-
- let validationMessage = '';
- if (responseType === 'graphql') {
- validationMessage = this.validateGraphQLStructure(data);
- }
-
- output.innerHTML = `
-
-
✅ Valid ${responseType.toUpperCase()}
- ${validationMessage ? `
${validationMessage}
` : ''}
-
-
- Type:
- ${info.type}
-
-
- Size:
- ${info.size}
-
-
- Keys:
- ${info.keys}
-
-
- Depth:
- ${info.depth}
-
-
-
- `;
-
- this.clearErrors();
- window.app?.showMessage(
- `${responseType.toUpperCase()} is valid!`,
- 'success'
- );
- } catch (error) {
- this.showError(error.message);
- output.innerHTML = `
-
-
❌ Invalid ${responseType.toUpperCase()}
-
${error.message}
-
- `;
- }
- }
-
- validateGraphQLStructure(data) {
- const messages = [];
-
- if (data.data) {
- messages.push('Contains data field');
- }
-
- if (data.errors && Array.isArray(data.errors)) {
- messages.push(`Contains ${data.errors.length} error(s)`);
- }
-
- if (data.extensions) {
- messages.push('Contains extensions field');
- }
-
- return messages.join(', ');
- }
-
- expandAll() {
- this.clearButtonStates(); // Clear button states
- this.setButtonActive('expand-all');
-
- const toggles = document.querySelectorAll(
- '.tree-toggle i.fa-chevron-right'
- );
- toggles.forEach((toggle) => {
- const toggleBtn = toggle.parentElement;
- this.expandTreeNode(toggleBtn);
- });
-
- window.app?.showMessage('All nodes expanded', 'info');
-
- // Clear active state after a short delay
- setTimeout(() => this.clearButtonStates(), 1000);
- }
-
- collapseAll() {
- this.clearButtonStates(); // Clear button states
- this.setButtonActive('collapse-all');
-
- const toggles = document.querySelectorAll('.tree-toggle i.fa-chevron-down');
- toggles.forEach((toggle) => {
- const toggleBtn = toggle.parentElement;
- this.collapseTreeNode(toggleBtn);
- });
-
- window.app?.showMessage('All nodes collapsed', 'info');
-
- // Clear active state after a short delay
- setTimeout(() => this.clearButtonStates(), 1000);
- }
-
- toggleTreeNode(toggleBtn) {
- const icon = toggleBtn.querySelector('i');
- const target = document.getElementById(toggleBtn.dataset.target);
-
- if (!target) return;
-
- if (icon.classList.contains('fa-chevron-down')) {
- this.collapseTreeNode(toggleBtn);
- } else {
- this.expandTreeNode(toggleBtn);
- }
- }
-
- expandTreeNode(toggleBtn) {
- const icon = toggleBtn.querySelector('i');
- const target = document.getElementById(toggleBtn.dataset.target);
-
- if (!target) return;
-
- icon.classList.remove('fa-chevron-right');
- icon.classList.add('fa-chevron-down');
- target.style.display = 'block';
- }
-
- collapseTreeNode(toggleBtn) {
- const icon = toggleBtn.querySelector('i');
- const target = document.getElementById(toggleBtn.dataset.target);
-
- if (!target) return;
-
- icon.classList.remove('fa-chevron-down');
- icon.classList.add('fa-chevron-right');
- target.style.display = 'none';
- }
-
- onSearchInputDebounced() {
- // Clear any existing timer
- if (this.searchDebounceTimer) {
- clearTimeout(this.searchDebounceTimer);
- }
-
- const searchInput = document.getElementById('search-response');
- const searchTerm = searchInput ? searchInput.value : '';
-
- // For very short queries (1-2 characters), use shorter debounce
- // For longer queries, use longer debounce to avoid too many searches while typing
- const debounceDelay = searchTerm.length <= 2 ? 150 : 300;
-
- // Set a new timer to perform search after debounce delay
- this.searchDebounceTimer = setTimeout(() => {
- this.performSearch();
- }, debounceDelay);
- }
-
- performSearch() {
- const searchInput = document.getElementById('search-response');
- const searchTerm = searchInput ? searchInput.value : '';
-
- // Clear previous highlights
- this.clearSearchHighlights();
-
- if (!searchTerm.trim()) {
- this.searchResults = [];
- this.currentSearchIndex = 0;
- this.updateSearchStats();
- return;
- }
-
- // Highlight results and count them
- const highlightedCount = this.highlightSearchResults(searchTerm);
-
- // For now, create a simple results array for navigation
- this.searchResults = Array.from({ length: highlightedCount }, (_, i) => ({
- index: i,
- }));
- this.currentSearchIndex = 0;
-
- this.updateSearchStats();
-
- if (this.searchResults.length > 0) {
- this.updateCurrentSearchResult(0);
- }
- }
-
- searchNext() {
- if (this.searchResults.length === 0) return;
-
- this.currentSearchIndex =
- (this.currentSearchIndex + 1) % this.searchResults.length;
- this.updateCurrentSearchResult(this.currentSearchIndex);
- this.updateSearchStats();
- }
-
- searchPrev() {
- if (this.searchResults.length === 0) return;
-
- this.currentSearchIndex =
- this.currentSearchIndex === 0
- ? this.searchResults.length - 1
- : this.currentSearchIndex - 1;
- this.updateCurrentSearchResult(this.currentSearchIndex);
- this.updateSearchStats();
- }
-
- highlightSearchResults(searchTerm) {
- const output = document.getElementById('response-output');
- if (!output) return 0;
-
- // Clear previous highlights first
- this.clearSearchHighlights();
-
- if (!searchTerm || !searchTerm.trim()) return 0;
-
- // Use a safer approach: find text nodes and highlight matches
- return this.highlightInTextNodes(output, searchTerm.toLowerCase());
- }
-
- /**
- * Clear all search highlighting from the formatted output.
- *
- * CRITICAL: This method includes DOM normalization to prevent TreeWalker
- * issues when replacing highlight elements with text nodes. Without
- * normalization, adjacent text nodes created during highlight removal
- * can fragment the DOM and break subsequent search functionality.
- *
- * Fix for: Multi-character search queries failing after first character
- * @since 1.0.1
- */
- clearSearchHighlights() {
- const highlights = document.querySelectorAll(
- '.search-highlight, .search-current'
- );
- const parents = new Set();
-
- highlights.forEach((highlight) => {
- const text = highlight.textContent;
- const parent = highlight.parentNode;
- parents.add(parent);
- parent.replaceChild(document.createTextNode(text), highlight);
- });
-
- // Normalize adjacent text nodes to prevent TreeWalker issues
- parents.forEach((parent) => {
- if (parent && parent.normalize) {
- parent.normalize();
- }
- });
- }
-
- highlightInTextNodes(element, searchTerm) {
- const walker = document.createTreeWalker(
- element,
- NodeFilter.SHOW_TEXT,
- null,
- false
- );
-
- const textNodes = [];
- let node;
- while ((node = walker.nextNode())) {
- if (node.textContent.toLowerCase().includes(searchTerm)) {
- textNodes.push(node);
- }
- }
-
- let highlightCount = 0;
-
- textNodes.forEach((textNode) => {
- const parent = textNode.parentNode;
- if (
- parent &&
- !parent.classList.contains('search-highlight') &&
- !parent.classList.contains('search-current')
- ) {
- const text = textNode.textContent;
- const lowerText = text.toLowerCase();
- let currentIndex = 0;
- let searchIndex = lowerText.indexOf(searchTerm, currentIndex);
-
- if (searchIndex !== -1) {
- const fragment = document.createDocumentFragment();
-
- while (searchIndex !== -1) {
- // Add text before the match
- if (searchIndex > currentIndex) {
- const beforeText = text.substring(currentIndex, searchIndex);
- fragment.appendChild(document.createTextNode(beforeText));
- }
-
- // Add the highlighted match
- const matchText = text.substring(
- searchIndex,
- searchIndex + searchTerm.length
- );
- const highlight = document.createElement('mark');
- highlight.className = 'search-highlight';
- highlight.textContent = matchText;
- fragment.appendChild(highlight);
- highlightCount++;
-
- // Move to next potential match
- currentIndex = searchIndex + searchTerm.length;
- searchIndex = lowerText.indexOf(searchTerm, currentIndex);
- }
-
- // Add any remaining text
- if (currentIndex < text.length) {
- const afterText = text.substring(currentIndex);
- fragment.appendChild(document.createTextNode(afterText));
- }
-
- parent.replaceChild(fragment, textNode);
- }
- }
- });
-
- return highlightCount;
- }
-
- updateCurrentSearchResult(index) {
- // Remove previous current highlighting
- const currentHighlights = document.querySelectorAll('.search-current');
- currentHighlights.forEach((highlight) => {
- highlight.classList.remove('search-current');
- highlight.classList.add('search-highlight');
- });
-
- // Add current highlighting to new result
- const highlights = document.querySelectorAll('.search-highlight');
- if (highlights[index]) {
- highlights[index].classList.remove('search-highlight');
- highlights[index].classList.add('search-current');
- highlights[index].scrollIntoView({ behavior: 'smooth', block: 'center' });
- }
- }
-
- updateSearchStats() {
- const searchStats = document.getElementById('search-stats');
- if (!searchStats) return;
-
- if (this.searchResults.length === 0) {
- searchStats.textContent = '';
- } else {
- searchStats.textContent = `${this.currentSearchIndex + 1} of ${
- this.searchResults.length
- }`;
- }
- }
-
- updateSearchResults() {
- // Clear search when data changes
- const searchInput = document.getElementById('search-response');
- if (searchInput) {
- searchInput.value = '';
- }
- this.searchResults = [];
- this.currentSearchIndex = 0;
- this.updateSearchStats();
- }
-
- copyToClipboard() {
- this.clearButtonStates(); // Clear button states
- this.setButtonActive('copy-response');
-
- if (!this.currentData) {
- this.showError('No formatted data to copy.');
- setTimeout(() => this.clearButtonStates(), 1000);
- return;
- }
-
- try {
- const formatted = JSON.stringify(this.currentData, null, 2);
- navigator.clipboard
- .writeText(formatted)
- .then(() => {
- window.app?.showMessage(
- 'Formatted response copied to clipboard!',
- 'success'
- );
- setTimeout(() => this.clearButtonStates(), 1000);
- })
- .catch(() => {
- // Fallback for older browsers
- const textarea = document.createElement('textarea');
- textarea.value = formatted;
- document.body.appendChild(textarea);
- textarea.select();
- document.execCommand('copy');
- document.body.removeChild(textarea);
- window.app?.showMessage(
- 'Formatted response copied to clipboard!',
- 'success'
- );
- setTimeout(() => this.clearButtonStates(), 1000);
- });
- } catch (error) {
- this.showError('Failed to copy to clipboard.');
- setTimeout(() => this.clearButtonStates(), 1000);
- }
- }
-
- onTypeChange() {
- // Clear output when type changes
- this.clearOutput();
- this.currentData = null;
- this.updateSearchResults();
- }
-
- clearAll() {
- this.clearButtonStates(); // Clear button states
- this.setButtonActive('clear-response');
-
- const input = document.getElementById('response-input');
- const searchInput = document.getElementById('search-response');
-
- if (input) input.value = '';
- if (searchInput) searchInput.value = '';
-
- this.clearOutput();
- this.currentData = null;
- this.searchResults = [];
-
- window.app?.showMessage('All data cleared!', 'info');
- setTimeout(() => this.clearButtonStates(), 1000);
- }
-
- clearOutput() {
- const output = document.getElementById('response-output');
- if (output) output.innerHTML = '';
- }
-
- showError(message) {
- const output = document.getElementById('response-output');
- if (output) {
- output.innerHTML = `${message}
`;
- }
- }
-
- clearErrors() {
- const existingErrors = document.querySelectorAll('.error');
- existingErrors.forEach((error) => error.remove());
- }
-
- // Button state management methods
- clearButtonStates() {
- const buttons = [
- 'format-response',
- 'validate-response',
- 'expand-all',
- 'collapse-all',
- 'copy-response',
- 'clear-response',
- ];
-
- buttons.forEach((buttonId) => {
- const button = document.getElementById(buttonId);
- if (button) {
- button.classList.remove('active');
- }
- });
- }
-
- setButtonActive(buttonId) {
- const button = document.getElementById(buttonId);
- if (button) {
- button.classList.add('active');
- }
- }
-}
-
-window.APIResponseFormatter = new APIResponseFormatter();
diff --git a/src/renderer/js/tools/base64-converter.js b/src/renderer/js/tools/base64-converter.js
deleted file mode 100644
index 80f39d4e..00000000
--- a/src/renderer/js/tools/base64-converter.js
+++ /dev/null
@@ -1,114 +0,0 @@
-class Base64Converter {
- constructor() {
- this.init();
- }
-
- init() {
- const container = document.getElementById('base64-converter');
- const tabButtons = container.querySelectorAll('.tab-btn');
- const encodeBtn = document.getElementById('encode-btn');
- const decodeBtn = document.getElementById('decode-btn');
-
- tabButtons.forEach(button => {
- button.addEventListener('click', () => {
- this.switchTab(button.dataset.tab);
- });
- });
-
- if (encodeBtn) {
- encodeBtn.addEventListener('click', () => this.encodeToBase64());
- }
-
- if (decodeBtn) {
- decodeBtn.addEventListener('click', () => this.decodeFromBase64());
- }
-
- const textInputs = document.querySelectorAll('#text-to-encode, #base64-to-decode');
- textInputs.forEach(input => {
- input.addEventListener('input', () => this.clearOutputs());
- });
- }
-
- switchTab(tabName) {
- const container = document.getElementById('base64-converter');
-
- container.querySelectorAll('.tab-btn').forEach(btn => {
- btn.classList.remove('active');
- });
- container.querySelectorAll('.tab-content').forEach(content => {
- content.classList.remove('active');
- });
-
- container.querySelector(`[data-tab="${tabName}"]`).classList.add('active');
- document.getElementById(`${tabName}-tab`).classList.add('active');
-
- this.clearOutputs();
- }
-
- encodeToBase64() {
- const input = document.getElementById('text-to-encode').value;
- const output = document.getElementById('encoded-output');
-
- if (!input.trim()) {
- window.app?.showMessage('Please enter text to encode.', 'error');
- return;
- }
-
- try {
- const encoded = btoa(unescape(encodeURIComponent(input)));
- output.value = encoded;
- window.app?.showMessage('Text encoded to Base64!', 'success');
- this.selectOutput('encoded-output');
- } catch (error) {
- window.app?.showMessage('Error encoding text: ' + error.message, 'error');
- output.value = '';
- }
- }
-
- decodeFromBase64() {
- const input = document.getElementById('base64-to-decode').value;
- const output = document.getElementById('decoded-output');
-
- if (!input.trim()) {
- window.app?.showMessage('Please enter Base64 to decode.', 'error');
- return;
- }
-
- try {
- if (!this.isValidBase64(input.trim())) {
- throw new Error('Invalid Base64 format');
- }
-
- const decoded = decodeURIComponent(escape(atob(input.trim())));
- output.value = decoded;
- window.app?.showMessage('Base64 decoded successfully!', 'success');
- this.selectOutput('decoded-output');
- } catch (error) {
- window.app?.showMessage('Error decoding Base64: Invalid format or corrupted data', 'error');
- output.value = '';
- }
- }
-
- isValidBase64(str) {
- try {
- return btoa(atob(str)) === str;
- } catch (err) {
- return false;
- }
- }
-
- selectOutput(outputId) {
- const output = document.getElementById(outputId);
- setTimeout(() => {
- output.select();
- output.setSelectionRange(0, 99999);
- }, 100);
- }
-
- clearOutputs() {
- document.getElementById('encoded-output').value = '';
- document.getElementById('decoded-output').value = '';
- }
-}
-
-window.Base64Converter = new Base64Converter();
\ No newline at end of file
diff --git a/src/renderer/js/tools/case-converter.js b/src/renderer/js/tools/case-converter.js
deleted file mode 100644
index af82bd10..00000000
--- a/src/renderer/js/tools/case-converter.js
+++ /dev/null
@@ -1,123 +0,0 @@
-class CaseConverter {
- constructor() {
- this.init();
- }
-
- init() {
- const inputTextarea = document.getElementById('case-input');
- const outputTextarea = document.getElementById('case-output');
- const caseButtons = document.querySelectorAll('.case-btn');
-
- if (caseButtons.length > 0) {
- caseButtons.forEach(button => {
- button.addEventListener('click', () => {
- const caseType = button.dataset.case;
- this.convertCase(caseType);
- });
- });
- }
-
- if (inputTextarea) {
- inputTextarea.addEventListener('input', () => {
- outputTextarea.value = '';
- });
- }
- }
-
- convertCase(caseType) {
- const input = document.getElementById('case-input').value;
- const output = document.getElementById('case-output');
-
- if (!input.trim()) {
- window.app?.showMessage('Please enter text to convert.', 'error');
- return;
- }
-
- let convertedText = '';
-
- switch (caseType) {
- case 'camel':
- convertedText = this.toCamelCase(input);
- break;
- case 'pascal':
- convertedText = this.toPascalCase(input);
- break;
- case 'snake':
- convertedText = this.toSnakeCase(input);
- break;
- case 'kebab':
- convertedText = this.toKebabCase(input);
- break;
- case 'upper':
- convertedText = input.toUpperCase();
- break;
- case 'lower':
- convertedText = input.toLowerCase();
- break;
- case 'title':
- convertedText = this.toTitleCase(input);
- break;
- default:
- convertedText = input;
- }
-
- output.value = convertedText;
- window.app?.showMessage(`Text converted to ${caseType} case!`, 'success');
-
- this.selectOutput();
- }
-
- toCamelCase(str) {
- return str
- .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => {
- return index === 0 ? word.toLowerCase() : word.toUpperCase();
- })
- .replace(/\s+/g, '')
- .replace(/[^a-zA-Z0-9]/g, '');
- }
-
- toPascalCase(str) {
- return str
- .replace(/(?:^\w|[A-Z]|\b\w)/g, (word) => {
- return word.toUpperCase();
- })
- .replace(/\s+/g, '')
- .replace(/[^a-zA-Z0-9]/g, '');
- }
-
- toSnakeCase(str) {
- return str
- .replace(/\W+/g, ' ')
- .split(/ |\B(?=[A-Z])/)
- .map(word => word.toLowerCase())
- .join('_')
- .replace(/_{2,}/g, '_')
- .replace(/^_|_$/g, '');
- }
-
- toKebabCase(str) {
- return str
- .replace(/\W+/g, ' ')
- .split(/ |\B(?=[A-Z])/)
- .map(word => word.toLowerCase())
- .join('-')
- .replace(/-{2,}/g, '-')
- .replace(/^-|-$/g, '');
- }
-
- toTitleCase(str) {
- return str.replace(/\w\S*/g, (txt) => {
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
- });
- }
-
- selectOutput() {
- const output = document.getElementById('case-output');
- setTimeout(() => {
- output.select();
- output.setSelectionRange(0, 99999);
- }, 100);
- }
-}
-
-window.CaseConverter = new CaseConverter();
\ No newline at end of file
diff --git a/src/renderer/js/tools/code-playground.js b/src/renderer/js/tools/code-playground.js
deleted file mode 100644
index b1bf5e51..00000000
--- a/src/renderer/js/tools/code-playground.js
+++ /dev/null
@@ -1,847 +0,0 @@
-class CodePlayground {
- constructor() {
- this.consoleHistory = [];
- this.init();
- }
-
- init() {
- const runBtn = document.getElementById('run-code');
- const clearBtn = document.getElementById('clear-code');
- const formatBtn = document.getElementById('format-code');
- const languageSelect = document.getElementById('code-language');
- const outputTabs = document.querySelectorAll('.output-tab');
- const codeInput = document.getElementById('code-input');
-
- if (runBtn) {
- runBtn.addEventListener('click', () => this.runCode());
- }
-
- if (clearBtn) {
- clearBtn.addEventListener('click', () => this.clearCode());
- }
-
- if (formatBtn) {
- formatBtn.addEventListener('click', () => this.formatCode());
- }
-
- if (languageSelect) {
- languageSelect.addEventListener('change', () => this.updateLanguage());
- }
-
- if (codeInput) {
- codeInput.addEventListener('input', () => this.highlightSyntax());
- codeInput.addEventListener('scroll', () => this.syncScroll());
- }
-
- outputTabs.forEach(tab => {
- tab.addEventListener('click', () => {
- this.switchOutputTab(tab.dataset.tab);
- });
- });
-
- this.setupConsoleCapture();
- this.setupSyntaxHighlighting();
- this.updateLanguage();
- }
-
- runCode() {
- const code = document.getElementById('code-input').value;
- const language = document.getElementById('code-language').value;
-
- if (!code.trim()) {
- window.app?.showMessage('Please enter code to run.', 'error');
- return;
- }
-
- this.clearOutput();
- this.switchOutputTab('result');
-
- try {
- switch (language) {
- case 'javascript':
- this.runJavaScript(code);
- break;
- case 'html':
- this.runHTML(code);
- break;
- case 'css':
- this.runCSS(code);
- break;
- case 'json':
- this.validateJSON(code);
- break;
- case 'markdown':
- this.renderMarkdown(code);
- break;
- default:
- this.displayCode(code, language);
- }
- window.app?.showMessage('Code executed successfully!', 'success');
- } catch (error) {
- this.displayError(error.message);
- window.app?.showMessage('Error executing code: ' + error.message, 'error');
- }
- }
-
- runJavaScript(code) {
- const iframe = document.getElementById('result-frame');
- const html = `
-
-
-
-
-
-
-
-
-
- `;
-
- iframe.srcdoc = html;
- }
-
- runHTML(code) {
- const iframe = document.getElementById('result-frame');
- iframe.srcdoc = code;
- }
-
- runCSS(code) {
- const iframe = document.getElementById('result-frame');
- const html = `
-
-
-
-
-
-
- Heading 1
- Heading 2
- This is a paragraph with bold text and italic text .
-
-
Box 1
-
Box 2
-
Box 3
-
-
- List item 1
- List item 2
- List item 3
-
- Button
-
-
-
- `;
-
- iframe.srcdoc = html;
- }
-
- validateJSON(code) {
- try {
- const parsed = JSON.parse(code);
- const formatted = JSON.stringify(parsed, null, 2);
- this.displayCode(formatted, 'json');
- } catch (error) {
- throw new Error('Invalid JSON: ' + error.message);
- }
- }
-
- renderMarkdown(code) {
- const iframe = document.getElementById('result-frame');
- const html = `
-
-
-
-
-
-
- ${this.markdownToHtml(code)}
-
-
- `;
-
- iframe.srcdoc = html;
- }
-
- displayCode(code, language) {
- const iframe = document.getElementById('result-frame');
- const html = `
-
-
-
-
-
-
- ${language.toUpperCase()}
- ${this.escapeHtml(code)}
-
-
- `;
-
- iframe.srcdoc = html;
- }
-
- displayError(message) {
- const iframe = document.getElementById('result-frame');
- const html = `
-
-
-
-
-
-
-
- Error: ${this.escapeHtml(message)}
-
-
-
- `;
-
- iframe.srcdoc = html;
- }
-
- formatCode() {
- const code = document.getElementById('code-input').value;
- const language = document.getElementById('code-language').value;
-
- if (!code.trim()) {
- window.app?.showMessage('Please enter code to format.', 'error');
- return;
- }
-
- try {
- let formatted;
- switch (language) {
- case 'json':
- const parsed = JSON.parse(code);
- formatted = JSON.stringify(parsed, null, 2);
- break;
- case 'html':
- formatted = this.formatHTML(code);
- break;
- case 'css':
- formatted = this.formatCSS(code);
- break;
- case 'javascript':
- formatted = this.formatJavaScript(code);
- break;
- default:
- formatted = code;
- }
-
- document.getElementById('code-input').value = formatted;
- window.app?.showMessage('Code formatted!', 'success');
- } catch (error) {
- window.app?.showMessage('Error formatting code: ' + error.message, 'error');
- }
- }
-
- formatHTML(html) {
- return html.replace(/>\n<')
- .replace(/\n\s*\n/g, '\n')
- .trim();
- }
-
- formatCSS(css) {
- return css.replace(/\{/g, ' {\n ')
- .replace(/\}/g, '\n}\n')
- .replace(/;/g, ';\n ')
- .replace(/\n\s*\n/g, '\n')
- .trim();
- }
-
- formatJavaScript(js) {
- return js.replace(/\{/g, ' {\n ')
- .replace(/\}/g, '\n}')
- .replace(/;/g, ';\n')
- .replace(/\n\s*\n/g, '\n')
- .trim();
- }
-
- setupConsoleCapture() {
- window.addEventListener('message', (event) => {
- if (event.data.type === 'console') {
- this.addToConsole(event.data.method, event.data.args);
- }
- });
- }
-
- addToConsole(method, args) {
- const consoleLog = document.getElementById('console-log');
- const entry = document.createElement('div');
- entry.className = `console-entry console-${method}`;
-
- const timestamp = new Date().toLocaleTimeString();
- entry.innerHTML = `
- ${timestamp}
- ${args.map(arg =>
- typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)
- ).join(' ')}
- `;
-
- consoleLog.appendChild(entry);
- consoleLog.scrollTop = consoleLog.scrollHeight;
- }
-
- switchOutputTab(tab) {
- document.querySelectorAll('.output-tab').forEach(t => t.classList.remove('active'));
- document.querySelectorAll('.output-content').forEach(c => c.classList.remove('active'));
-
- document.querySelector(`[data-tab="${tab}"]`).classList.add('active');
- document.getElementById(`${tab}-output`).classList.add('active');
- }
-
- clearCode() {
- document.getElementById('code-input').value = '';
- this.clearOutput();
- window.app?.showMessage('Code cleared!', 'info');
- }
-
- clearOutput() {
- const iframe = document.getElementById('result-frame');
- iframe.srcdoc = '';
- document.getElementById('console-log').innerHTML = '';
- }
-
- updateLanguage() {
- const language = document.getElementById('code-language').value;
- const codeInput = document.getElementById('code-input');
-
- const examples = {
- javascript: 'console.log("Hello, World!");\n\nfunction greet(name) {\n return `Hello, ${name}!`;\n}\n\nconsole.log(greet("JavaScript"));',
- html: '\n\n\n Hello World \n\n\n Hello, World! \n This is a sample HTML document.
\n\n',
- css: 'body {\n font-family: Arial, sans-serif;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n text-align: center;\n padding: 50px;\n}\n\n.container {\n display: flex;\n gap: 20px;\n justify-content: center;\n}\n\n.box {\n background: rgba(255,255,255,0.1);\n padding: 20px;\n border-radius: 10px;\n}',
- json: '{\n "name": "Dev Tools",\n "version": "1.0.0",\n "description": "A collection of developer tools",\n "features": [\n "JSON Viewer",\n "Text Compare",\n "Base64 Converter"\n ],\n "settings": {\n "theme": "dark",\n "autoSave": true\n }\n}',
- markdown: '# Markdown Example\n\nThis is a **markdown** document with *italic* text.\n\n## Features\n\n- Lists\n- Links: [GitHub](https://github.com)\n- Code: `console.log("Hello")`\n\n```javascript\nfunction hello() {\n return "Hello, World!";\n}\n```\n\n> This is a blockquote\n\n---\n\nThat\'s all!'
- };
-
- if (!codeInput.value.trim() && examples[language]) {
- codeInput.value = examples[language];
- }
-
- setTimeout(() => this.highlightSyntax(), 100);
- }
-
- markdownToHtml(markdown) {
- let html = markdown;
-
- html = html.replace(/```(\w+)?\n([\s\S]*?)\n```/g, (_, lang, code) => {
- return `${this.escapeHtml(code)} `;
- });
-
- html = html.replace(/`([^`]+)`/g, '$1');
- html = html.replace(/^### (.*$)/gim, '$1 ');
- html = html.replace(/^## (.*$)/gim, '$1 ');
- html = html.replace(/^# (.*$)/gim, '$1 ');
- html = html.replace(/\*\*(.*?)\*\*/g, '$1 ');
- html = html.replace(/\*(.*?)\*/g, '$1 ');
- html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ');
- html = html.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, ' ');
- html = html.replace(/^- (.*$)/gim, '$1 ');
- html = html.replace(/(.*<\/li>)/s, '');
- html = html.replace(/^\d+\. (.*$)/gim, ' $1 ');
- html = html.replace(/^> (.*$)/gim, '$1 ');
- html = html.replace(/---/g, ' ');
-
- const paragraphs = html.split(/\n\s*\n/);
- html = paragraphs.map(paragraph => {
- paragraph = paragraph.trim();
- if (paragraph && !paragraph.match(/^<(h[1-6]|ul|ol|li|blockquote|pre|hr)/)) {
- return `${paragraph}
`;
- }
- return paragraph;
- }).join('\n\n');
-
- return html;
- }
-
- escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-
- setupSyntaxHighlighting() {
- const codeEditor = document.querySelector('.code-editor');
- if (!codeEditor) return;
-
- this.highlightContainer = document.createElement('div');
- this.highlightContainer.className = 'syntax-highlight';
- codeEditor.appendChild(this.highlightContainer);
- }
-
- highlightSyntax() {
- if (!this.highlightContainer) return;
-
- const code = document.getElementById('code-input').value;
- const language = document.getElementById('code-language').value;
-
- let highlighted = this.escapeHtml(code);
-
- switch (language) {
- case 'javascript':
- highlighted = this.highlightJavaScript(highlighted);
- break;
- case 'css':
- highlighted = this.highlightCSS(highlighted);
- break;
- case 'json':
- highlighted = this.highlightJSON(highlighted);
- break;
- case 'html':
- highlighted = this.highlightHTML(highlighted);
- break;
- }
-
- this.highlightContainer.innerHTML = highlighted;
- }
-
- highlightJavaScript(code) {
- const keywords = ['const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue', 'try', 'catch', 'finally', 'throw', 'new', 'this', 'class', 'extends', 'import', 'export', 'default', 'async', 'await', 'true', 'false', 'null', 'undefined'];
-
- return code
- .replace(new RegExp(`\\b(${keywords.join('|')})\\b`, 'g'), '$1 ')
- .replace(/("([^"\\]|\\.)*"|'([^'\\]|\\.)*'|`([^`\\]|\\.)*`)/g, '$1 ')
- .replace(/\b\d+\.?\d*\b/g, '$& ')
- .replace(/(\/\/.*$|\/\*[\s\S]*?\*\/)/gm, '')
- .replace(/\b([a-zA-Z_$][a-zA-Z0-9_$]*)\s*(?=\()/g, '$1 ')
- .replace(/[+\-*/%=<>!&|^~?:]/g, '$& ');
- }
-
- highlightCSS(code) {
- return code
- .replace(/([a-zA-Z-]+)\s*:/g, '$1 :')
- .replace(/("([^"\\]|\\.)*"|'([^'\\]|\\.)*')/g, '$1 ')
- .replace(/\b\d+\.?\d*(px|em|rem|%|vh|vw|pt|pc|in|cm|mm|ex|ch|fr|vmin|vmax)?\b/g, '$& ')
- .replace(/(\/\*[\s\S]*?\*\/)/g, '');
- }
-
- highlightJSON(code) {
- return code
- .replace(/("([^"\\]|\\.)*")\s*:/g, '$1 :')
- .replace(/:\s*("([^"\\]|\\.)*")/g, ': $1 ')
- .replace(/:\s*\b\d+\.?\d*\b/g, ': $& ')
- .replace(/:\s*\b(true|false|null)\b/g, ': $1 ');
- }
-
- highlightHTML(code) {
- return code
- .replace(/(<\/?[a-zA-Z][^>]*>)/g, '$1 ')
- .replace(/("([^"\\]|\\.)*"|'([^'\\]|\\.)*')/g, '$1 ')
- .replace(/(<!--[\s\S]*?-->)/g, '');
- }
-
- syncScroll() {
- if (!this.highlightContainer) return;
-
- const codeInput = document.getElementById('code-input');
- this.highlightContainer.scrollTop = codeInput.scrollTop;
- this.highlightContainer.scrollLeft = codeInput.scrollLeft;
- }
-}
-
-window.CodePlayground = new CodePlayground();
-
-const playgroundStyles = `
-.playground-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 20px;
- flex-wrap: wrap;
- gap: 15px;
- min-height: 40px;
-}
-
-.language-selector {
- display: flex;
- align-items: center;
- gap: 10px;
- flex: 1;
- max-width: 300px;
-}
-
-.language-selector label {
- font-weight: 500;
- color: #32325d;
- white-space: nowrap;
- margin-bottom: 0;
-}
-
-.language-selector select {
- padding: 10px 12px;
- border: 2px solid #e3e8f0;
- border-radius: 6px;
- font-size: 14px;
- background: white;
- color: #32325d;
- outline: none;
- transition: border-color 0.2s ease;
- flex: 1;
- min-width: 120px;
- height: 40px;
- box-sizing: border-box;
-}
-
-.language-selector select:focus {
- border-color: #5e72e4;
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.playground-controls {
- display: flex;
- gap: 10px;
- flex-wrap: wrap;
-}
-
-.playground-container {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 20px;
- min-height: 500px;
-}
-
-.code-editor,
-.code-output {
- border: 2px solid #e3e8f0;
- border-radius: 8px;
- overflow: hidden;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
- transition: border-color 0.2s ease;
-}
-
-.code-editor:focus-within {
- border-color: #5e72e4;
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-#code-input {
- width: 100%;
- height: 500px;
- border: none;
- outline: none;
- padding: 20px;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', 'Courier New', monospace;
- font-size: 14px;
- line-height: 1.6;
- resize: none;
- background: #f8f9fc;
- color: #32325d;
- tab-size: 2;
- box-sizing: border-box;
-}
-
-#code-input::placeholder {
- color: #8898aa;
- font-style: italic;
-}
-
-.output-tabs {
- display: flex;
- background: #f8f9fa;
- border-bottom: 1px solid #e3e8f0;
- border-top-left-radius: 8px;
- border-top-right-radius: 8px;
- overflow: hidden;
-}
-
-.output-tab {
- background: transparent;
- border: none;
- padding: 12px 20px;
- cursor: pointer;
- font-size: 14px;
- font-weight: 500;
- color: #8898aa;
- border-bottom: 3px solid transparent;
- transition: all 0.2s ease;
- position: relative;
-}
-
-.output-tab:hover {
- color: #5e72e4;
- background: rgba(94, 114, 228, 0.05);
-}
-
-.output-tab.active {
- color: #5e72e4;
- border-bottom-color: #5e72e4;
- background: white;
- box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05);
-}
-
-.output-content {
- display: none;
- height: 460px;
-}
-
-.output-content.active {
- display: block;
-}
-
-#result-frame {
- width: 100%;
- height: 100%;
- border: none;
- background: white;
- box-sizing: border-box;
-}
-
-#console-log {
- height: 100%;
- overflow-y: auto;
- padding: 15px;
- background: #1a1a1a;
- color: #e8e8e8;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 13px;
- line-height: 1.5;
- box-sizing: border-box;
-}
-
-#console-log::-webkit-scrollbar {
- width: 8px;
-}
-
-#console-log::-webkit-scrollbar-track {
- background: #2a2a2a;
-}
-
-#console-log::-webkit-scrollbar-thumb {
- background: #555;
- border-radius: 4px;
-}
-
-#console-log::-webkit-scrollbar-thumb:hover {
- background: #777;
-}
-
-.console-entry {
- margin: 5px 0;
- padding: 5px 0;
- border-bottom: 1px solid #333;
-}
-
-.console-timestamp {
- color: #888;
- font-size: 11px;
- margin-right: 10px;
-}
-
-.console-content {
- white-space: pre-wrap;
-}
-
-.console-log .console-content {
- color: #4CAF50;
-}
-
-.console-error .console-content {
- color: #f44336;
-}
-
-/* Syntax highlighting styles */
-.code-editor {
- position: relative;
-}
-
-#code-input {
- position: relative;
- z-index: 1;
- background: transparent;
-}
-
-.syntax-highlight {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- padding: 20px;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', 'Courier New', monospace;
- font-size: 14px;
- line-height: 1.6;
- white-space: pre-wrap;
- word-wrap: break-word;
- overflow: hidden;
- pointer-events: none;
- background: #f8f9fc;
- color: transparent;
- z-index: 0;
-}
-
-.syntax-highlight .keyword {
- color: #8b5cf6;
- font-weight: 600;
-}
-
-.syntax-highlight .string {
- color: #10b981;
-}
-
-.syntax-highlight .number {
- color: #f59e0b;
-}
-
-.syntax-highlight .comment {
- color: #6b7280;
- font-style: italic;
-}
-
-.syntax-highlight .function {
- color: #3b82f6;
- font-weight: 500;
-}
-
-.syntax-highlight .operator {
- color: #ef4444;
-}
-
-.syntax-highlight .property {
- color: #8b5cf6;
-}
-
-@media (max-width: 1024px) {
- .playground-container {
- grid-template-columns: 1fr;
- }
-
- #code-input,
- .output-content {
- height: 300px;
- }
-
- .syntax-highlight {
- padding: 20px;
- }
-}
-`;
-
-const codePlaygroundStyle = document.createElement('style');
-codePlaygroundStyle.textContent = playgroundStyles;
-document.head.appendChild(codePlaygroundStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/color-palette.js b/src/renderer/js/tools/color-palette.js
deleted file mode 100644
index 85087b5a..00000000
--- a/src/renderer/js/tools/color-palette.js
+++ /dev/null
@@ -1,528 +0,0 @@
-class ColorPalette {
- constructor() {
- this.currentPalette = [];
- this.init();
- }
-
- init() {
- const generateBtn = document.getElementById('generate-palette');
- const baseColorPicker = document.getElementById('base-color');
- const baseColorHex = document.getElementById('base-color-hex');
- const paletteType = document.getElementById('palette-type');
-
- if (generateBtn) {
- generateBtn.addEventListener('click', () => this.generatePalette());
- }
-
- if (baseColorPicker) {
- baseColorPicker.addEventListener('input', (e) => {
- baseColorHex.value = e.target.value;
- });
- }
-
- if (baseColorHex) {
- baseColorHex.addEventListener('input', (e) => {
- if (this.isValidHexColor(e.target.value)) {
- baseColorPicker.value = e.target.value;
- }
- });
- }
-
- if (paletteType) {
- paletteType.addEventListener('change', () => {
- if (this.currentPalette.length > 0) {
- this.generatePalette();
- }
- });
- }
- }
-
- generatePalette() {
- const baseColor = document.getElementById('base-color').value;
- const paletteType = document.getElementById('palette-type').value;
-
- try {
- const palette = this.createPalette(baseColor, paletteType);
- this.displayPalette(palette);
- this.displayColorFormats(palette);
- this.currentPalette = palette;
- window.app?.showMessage(`${paletteType} palette generated!`, 'success');
- } catch (error) {
- window.app?.showMessage('Error generating palette: ' + error.message, 'error');
- }
- }
-
- createPalette(baseColor, type) {
- const baseHsl = this.hexToHsl(baseColor);
- const [h, s, l] = baseHsl;
- const colors = [];
-
- switch (type) {
- case 'monochromatic':
- colors.push(...this.createMonochromatic(baseHsl));
- break;
- case 'analogous':
- colors.push(...this.createAnalogous(h, s, l));
- break;
- case 'complementary':
- colors.push(...this.createComplementary(h, s, l));
- break;
- case 'triadic':
- colors.push(...this.createTriadic(h, s, l));
- break;
- case 'tetradic':
- colors.push(...this.createTetradic(h, s, l));
- break;
- default:
- colors.push(baseHsl);
- }
-
- return colors.map(hsl => ({
- hex: this.hslToHex(hsl),
- hsl: hsl,
- rgb: this.hslToRgb(hsl)
- }));
- }
-
- createMonochromatic([h, s, l]) {
- return [
- [h, s, Math.max(0, l - 0.3)],
- [h, s, Math.max(0, l - 0.15)],
- [h, s, l],
- [h, s, Math.min(1, l + 0.15)],
- [h, s, Math.min(1, l + 0.3)]
- ];
- }
-
- createAnalogous(h, s, l) {
- return [
- [(h - 60 + 360) % 360, s, l],
- [(h - 30 + 360) % 360, s, l],
- [h, s, l],
- [(h + 30) % 360, s, l],
- [(h + 60) % 360, s, l]
- ];
- }
-
- createComplementary(h, s, l) {
- const complement = (h + 180) % 360;
- return [
- [h, s, l],
- [complement, s, l],
- [h, s * 0.7, l * 0.9],
- [complement, s * 0.7, l * 0.9],
- [h, s * 0.3, l * 1.1]
- ];
- }
-
- createTriadic(h, s, l) {
- return [
- [h, s, l],
- [(h + 120) % 360, s, l],
- [(h + 240) % 360, s, l],
- [h, s * 0.6, l * 0.8],
- [(h + 120) % 360, s * 0.6, l * 0.8]
- ];
- }
-
- createTetradic(h, s, l) {
- return [
- [h, s, l],
- [(h + 90) % 360, s, l],
- [(h + 180) % 360, s, l],
- [(h + 270) % 360, s, l],
- [h, s * 0.5, l * 0.9]
- ];
- }
-
- displayPalette(palette) {
- const container = document.getElementById('palette-colors');
- container.innerHTML = '';
-
- palette.forEach((color) => {
- const colorDiv = document.createElement('div');
- colorDiv.className = 'palette-color';
- colorDiv.style.backgroundColor = color.hex;
-
- colorDiv.innerHTML = `
-
- `;
-
- colorDiv.addEventListener('click', () => this.copyColor(color.hex));
-
- container.appendChild(colorDiv);
- });
-
- document.getElementById('color-palette-display').style.display = 'block';
- }
-
- displayColorFormats(palette) {
- const container = document.getElementById('color-format-list');
- container.innerHTML = '';
-
- palette.forEach((color) => {
- const formatDiv = document.createElement('div');
- formatDiv.className = 'color-formats-item';
-
- formatDiv.innerHTML = `
-
-
-
- HEX:
- ${color.hex}
-
-
- RGB:
- rgb(${color.rgb[0]}, ${color.rgb[1]}, ${color.rgb[2]})
-
-
- HSL:
- hsl(${Math.round(color.hsl[0])}, ${Math.round(color.hsl[1] * 100)}%, ${Math.round(color.hsl[2] * 100)}%)
-
-
- `;
-
- container.appendChild(formatDiv);
- });
- }
-
- copyColor(hex) {
- this.copyText(hex);
- }
-
- copyText(text) {
- navigator.clipboard.writeText(text).then(() => {
- window.app?.showMessage(`${text} copied to clipboard!`, 'success');
- });
- }
-
- hexToHsl(hex) {
- const r = parseInt(hex.slice(1, 3), 16) / 255;
- const g = parseInt(hex.slice(3, 5), 16) / 255;
- const b = parseInt(hex.slice(5, 7), 16) / 255;
-
- const max = Math.max(r, g, b);
- const min = Math.min(r, g, b);
- let h, s, l = (max + min) / 2;
-
- if (max === min) {
- h = s = 0;
- } else {
- const d = max - min;
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
- switch (max) {
- case r: h = (g - b) / d + (g < b ? 6 : 0); break;
- case g: h = (b - r) / d + 2; break;
- case b: h = (r - g) / d + 4; break;
- }
- h /= 6;
- }
-
- return [h * 360, s, l];
- }
-
- hslToRgb([h, s, l]) {
- h /= 360;
- const hue2rgb = (p, q, t) => {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1/6) return p + (q - p) * 6 * t;
- if (t < 1/2) return q;
- if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
- return p;
- };
-
- let r, g, b;
- if (s === 0) {
- r = g = b = l;
- } else {
- const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- const p = 2 * l - q;
- r = hue2rgb(p, q, h + 1/3);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1/3);
- }
-
- return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
- }
-
- hslToHex([h, s, l]) {
- const [r, g, b] = this.hslToRgb([h, s, l]);
- const toHex = (n) => {
- const hex = n.toString(16);
- return hex.length === 1 ? '0' + hex : hex;
- };
- return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
- }
-
- isValidHexColor(hex) {
- return /^#[0-9A-F]{6}$/i.test(hex);
- }
-
- exportPalette() {
- if (this.currentPalette.length === 0) {
- window.app?.showMessage('Please generate a palette first.', 'error');
- return;
- }
-
- const data = {
- palette: this.currentPalette,
- timestamp: new Date().toISOString(),
- type: document.getElementById('palette-type').value
- };
-
- const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = 'color-palette.json';
- a.click();
- URL.revokeObjectURL(url);
- }
-}
-
-window.ColorPalette = new ColorPalette();
-
-const colorPaletteStyles = `
-.color-input {
- margin-bottom: 30px;
-}
-
-.color-picker-group {
- margin-bottom: 20px;
-}
-
-.color-picker-group label {
- display: block;
- font-weight: 500;
- color: #1d1d1f;
- margin-bottom: 8px;
-}
-
-.color-input-container {
- display: flex;
- gap: 15px;
- align-items: center;
-}
-
-#base-color {
- width: 60px;
- height: 40px;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- cursor: pointer;
-}
-
-#base-color-hex {
- flex: 1;
- padding: 10px 15px;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
- max-width: 150px;
-}
-
-#base-color-hex:focus {
- outline: none;
- border-color: #667eea;
-}
-
-.palette-type {
- margin-bottom: 20px;
-}
-
-.palette-type label {
- display: block;
- font-weight: 500;
- color: #1d1d1f;
- margin-bottom: 8px;
-}
-
-.palette-type select {
- padding: 10px 15px;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- font-size: 14px;
- min-width: 200px;
-}
-
-.palette-type select:focus {
- outline: none;
- border-color: #667eea;
-}
-
-.color-palette-display {
- margin-top: 30px;
-}
-
-.palette-colors {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
- gap: 15px;
- margin-bottom: 30px;
-}
-
-.palette-color {
- height: 120px;
- border-radius: 12px;
- cursor: pointer;
- position: relative;
- overflow: hidden;
- transition: transform 0.3s ease, box-shadow 0.3s ease;
- border: 1px solid rgba(0,0,0,0.1);
-}
-
-.palette-color:hover {
- transform: translateY(-5px);
- box-shadow: 0 8px 30px rgba(0,0,0,0.15);
-}
-
-.color-overlay {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(0,0,0,0.7);
- color: white;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- opacity: 0;
- transition: opacity 0.3s ease;
- gap: 10px;
-}
-
-.palette-color:hover .color-overlay {
- opacity: 1;
-}
-
-.color-hex {
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
- font-weight: bold;
-}
-
-.copy-color {
- background: rgba(255,255,255,0.2);
- border: 1px solid rgba(255,255,255,0.3);
- color: white;
- padding: 8px 12px;
- border-radius: 6px;
- cursor: pointer;
- font-size: 12px;
- transition: all 0.3s ease;
-}
-
-.copy-color:hover {
- background: rgba(255,255,255,0.3);
- border-color: rgba(255,255,255,0.5);
-}
-
-.color-formats {
- background: #f8f9fa;
- border-radius: 12px;
- padding: 20px;
-}
-
-.color-formats h3 {
- margin-top: 0;
- margin-bottom: 20px;
- color: #1d1d1f;
-}
-
-.color-formats-item {
- display: flex;
- align-items: flex-start;
- gap: 20px;
- padding: 15px;
- background: white;
- border-radius: 8px;
- margin: 15px 0;
- border: 1px solid #e0e0e0;
-}
-
-.color-sample {
- width: 60px;
- height: 60px;
- border-radius: 8px;
- border: 1px solid rgba(0,0,0,0.1);
- flex-shrink: 0;
-}
-
-.color-values {
- flex: 1;
-}
-
-.format-row {
- display: flex;
- align-items: center;
- margin: 8px 0;
- gap: 15px;
-}
-
-.format-label {
- font-weight: 500;
- color: #666;
- min-width: 50px;
- font-size: 14px;
-}
-
-.format-value {
- font-family: 'Monaco', 'Consolas', monospace;
- background: #f4f4f4;
- padding: 4px 8px;
- border-radius: 4px;
- cursor: pointer;
- transition: background-color 0.3s ease;
- font-size: 13px;
- color: #333;
-}
-
-.format-value:hover {
- background: #e0e0e0;
-}
-
-@media (max-width: 768px) {
- .color-input-container {
- flex-direction: column;
- align-items: stretch;
- }
-
- #base-color-hex {
- max-width: none;
- }
-
- .palette-colors {
- grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
- gap: 10px;
- }
-
- .palette-color {
- height: 100px;
- }
-
- .color-formats-item {
- flex-direction: column;
- gap: 15px;
- }
-
- .color-sample {
- width: 100%;
- height: 40px;
- }
-}
-`;
-
-const colorPaletteStyle = document.createElement('style');
-colorPaletteStyle.textContent = colorPaletteStyles;
-document.head.appendChild(colorPaletteStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/cron-calculator.js b/src/renderer/js/tools/cron-calculator.js
deleted file mode 100644
index bbe3f2ff..00000000
--- a/src/renderer/js/tools/cron-calculator.js
+++ /dev/null
@@ -1,372 +0,0 @@
-class CronCalculator {
- constructor() {
- this.init();
- }
-
- init() {
- const generateBtn = document.getElementById('generate-cron');
- const parseBtn = document.getElementById('parse-cron');
- const cronFields = document.querySelectorAll('#cron-minute, #cron-hour, #cron-day, #cron-month, #cron-dow');
- const expressionInput = document.getElementById('cron-expression');
-
- if (generateBtn) {
- generateBtn.addEventListener('click', () => this.generateExpression());
- }
-
- if (parseBtn) {
- parseBtn.addEventListener('click', () => this.parseExpression());
- }
-
- cronFields.forEach(field => {
- field.addEventListener('input', () => this.updateFromFields());
- });
-
- if (expressionInput) {
- expressionInput.addEventListener('input', () => this.updateDescription());
- }
- }
-
- generateExpression() {
- const minute = document.getElementById('cron-minute').value.trim() || '*';
- const hour = document.getElementById('cron-hour').value.trim() || '*';
- const day = document.getElementById('cron-day').value.trim() || '*';
- const month = document.getElementById('cron-month').value.trim() || '*';
- const dow = document.getElementById('cron-dow').value.trim() || '*';
-
- const expression = `${minute} ${hour} ${day} ${month} ${dow}`;
- document.getElementById('cron-expression').value = expression;
-
- this.updateDescription();
- this.calculateNextRuns();
- window.app?.showMessage('Cron expression generated!', 'success');
- }
-
- parseExpression() {
- const expression = document.getElementById('cron-expression').value.trim();
-
- if (!expression) {
- window.app?.showMessage('Please enter a cron expression to parse.', 'error');
- return;
- }
-
- const parts = expression.split(/\s+/);
- if (parts.length !== 5) {
- window.app?.showMessage('Invalid cron expression. Must have 5 fields.', 'error');
- return;
- }
-
- document.getElementById('cron-minute').value = parts[0];
- document.getElementById('cron-hour').value = parts[1];
- document.getElementById('cron-day').value = parts[2];
- document.getElementById('cron-month').value = parts[3];
- document.getElementById('cron-dow').value = parts[4];
-
- this.updateDescription();
- this.calculateNextRuns();
- window.app?.showMessage('Cron expression parsed!', 'success');
- }
-
- updateFromFields() {
- this.generateExpression();
- }
-
- updateDescription() {
- const expression = document.getElementById('cron-expression').value.trim();
- const descriptionElement = document.getElementById('cron-description-text');
-
- if (!expression) {
- descriptionElement.textContent = 'Enter a cron expression to see description';
- return;
- }
-
- try {
- const description = this.describeCronExpression(expression);
- descriptionElement.textContent = description;
- } catch (error) {
- descriptionElement.textContent = 'Invalid cron expression';
- }
- }
-
- describeCronExpression(expression) {
- const parts = expression.split(/\s+/);
- if (parts.length !== 5) {
- throw new Error('Invalid expression');
- }
-
- const [minute, hour, day, month, dow] = parts;
-
- let description = 'Runs ';
-
- const minuteDesc = this.describeField(minute, 'minute', ['past the hour', 'every minute']);
- const hourDesc = this.describeField(hour, 'hour', ['', 'every hour']);
- const dayDesc = this.describeField(day, 'day', ['on day', 'every day']);
- const monthDesc = this.describeField(month, 'month', ['in', 'every month']);
- const dowDesc = this.describeField(dow, 'weekday', ['on', 'every day']);
-
- if (minute === '*' && hour === '*' && day === '*' && month === '*' && dow === '*') {
- return 'Runs every minute';
- }
-
- if (dow !== '*' && day === '*') {
- description += `${dowDesc} at ${this.formatTime(hour, minute)}`;
- } else if (day !== '*' && dow === '*') {
- description += `${dayDesc} of ${monthDesc} at ${this.formatTime(hour, minute)}`;
- } else if (day === '*' && dow === '*') {
- description += `${hourDesc} ${minuteDesc} ${monthDesc}`;
- } else {
- description += `${dayDesc} of ${monthDesc} and ${dowDesc} at ${this.formatTime(hour, minute)}`;
- }
-
- return description;
- }
-
- describeField(field, type, prefixes) {
- if (field === '*') {
- return prefixes[1];
- }
-
- if (field.includes(',')) {
- const values = field.split(',');
- return `${prefixes[0]} ${values.join(', ')}`;
- }
-
- if (field.includes('-')) {
- const [start, end] = field.split('-');
- return `${prefixes[0]} ${start} through ${end}`;
- }
-
- if (field.includes('/')) {
- const [base, step] = field.split('/');
- if (base === '*') {
- return `every ${step} ${type}${step > 1 ? 's' : ''}`;
- }
- return `every ${step} ${type}${step > 1 ? 's' : ''} starting at ${base}`;
- }
-
- return `${prefixes[0]} ${field}`;
- }
-
- formatTime(hour, minute) {
- if (hour === '*' && minute === '*') {
- return 'every minute';
- }
- if (hour === '*') {
- return `minute ${minute} of every hour`;
- }
- if (minute === '*') {
- return `every minute of hour ${hour}`;
- }
-
- const h = parseInt(hour);
- const m = parseInt(minute);
- const period = h >= 12 ? 'PM' : 'AM';
- const displayHour = h === 0 ? 12 : h > 12 ? h - 12 : h;
- const displayMinute = m.toString().padStart(2, '0');
-
- return `${displayHour}:${displayMinute} ${period}`;
- }
-
- calculateNextRuns() {
- const expression = document.getElementById('cron-expression').value.trim();
- const nextRunsList = document.getElementById('next-runs-list');
-
- if (!expression) {
- nextRunsList.innerHTML = 'Enter a cron expression ';
- return;
- }
-
- try {
- const nextRuns = this.getNextRuns(expression, 5);
- nextRunsList.innerHTML = nextRuns.map(date =>
- `${date.toLocaleString()} `
- ).join('');
- } catch (error) {
- nextRunsList.innerHTML = 'Invalid cron expression ';
- }
- }
-
- getNextRuns(expression, count) {
- const parts = expression.split(/\s+/);
- if (parts.length !== 5) {
- throw new Error('Invalid expression');
- }
-
- const [minutePattern, hourPattern, dayPattern, monthPattern, dowPattern] = parts;
- const runs = [];
- let currentDate = new Date();
- currentDate.setSeconds(0, 0);
- currentDate.setMinutes(currentDate.getMinutes() + 1);
-
- let attempts = 0;
- const maxAttempts = 10000;
-
- while (runs.length < count && attempts < maxAttempts) {
- attempts++;
-
- if (this.matchesCronPattern(currentDate, minutePattern, hourPattern, dayPattern, monthPattern, dowPattern)) {
- runs.push(new Date(currentDate));
- }
-
- currentDate.setMinutes(currentDate.getMinutes() + 1);
- }
-
- return runs;
- }
-
- matchesCronPattern(date, minute, hour, day, month, dow) {
- const dateMinute = date.getMinutes();
- const dateHour = date.getHours();
- const dateDay = date.getDate();
- const dateMonth = date.getMonth() + 1;
- const dateDow = date.getDay();
-
- return this.matchesPattern(dateMinute, minute, 0, 59) &&
- this.matchesPattern(dateHour, hour, 0, 23) &&
- this.matchesPattern(dateDay, day, 1, 31) &&
- this.matchesPattern(dateMonth, month, 1, 12) &&
- this.matchesPattern(dateDow, dow, 0, 7);
- }
-
- matchesPattern(value, pattern, min, max) {
- if (pattern === '*') {
- return true;
- }
-
- if (pattern.includes(',')) {
- return pattern.split(',').some(p => this.matchesPattern(value, p.trim(), min, max));
- }
-
- if (pattern.includes('-')) {
- const [start, end] = pattern.split('-').map(x => parseInt(x.trim()));
- return value >= start && value <= end;
- }
-
- if (pattern.includes('/')) {
- const [base, step] = pattern.split('/');
- const stepNum = parseInt(step);
-
- if (base === '*') {
- return (value - min) % stepNum === 0;
- } else {
- const baseNum = parseInt(base);
- return value >= baseNum && (value - baseNum) % stepNum === 0;
- }
- }
-
- return value === parseInt(pattern);
- }
-}
-
-window.CronCalculator = new CronCalculator();
-
-const cronStyles = `
-.cron-fields {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
- margin-bottom: 20px;
-}
-
-.cron-field {
- display: flex;
- flex-direction: column;
- gap: 5px;
-}
-
-.cron-field label {
- font-weight: 500;
- color: #1d1d1f;
- font-size: 14px;
-}
-
-.cron-field input {
- padding: 8px 12px;
- border: 2px solid #f0f0f0;
- border-radius: 6px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
- transition: border-color 0.3s ease;
-}
-
-.cron-field input:focus {
- outline: none;
- border-color: #667eea;
-}
-
-.cron-expression {
- margin: 20px 0;
-}
-
-.cron-expression label {
- display: block;
- font-weight: 500;
- color: #1d1d1f;
- margin-bottom: 8px;
-}
-
-#cron-expression {
- width: 100%;
- padding: 12px 15px;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 16px;
- font-weight: bold;
- text-align: center;
- background: #f8f9fa;
-}
-
-#cron-expression:focus {
- outline: none;
- border-color: #667eea;
-}
-
-.cron-description,
-.next-runs {
- background: #f8f9fa;
- border-radius: 8px;
- padding: 20px;
- margin: 20px 0;
-}
-
-.cron-description h3,
-.next-runs h3 {
- margin-top: 0;
- margin-bottom: 15px;
- color: #1d1d1f;
-}
-
-#cron-description-text {
- color: #333;
- line-height: 1.5;
- font-size: 15px;
-}
-
-#next-runs-list {
- list-style: none;
- padding: 0;
- margin: 0;
-}
-
-#next-runs-list li {
- background: white;
- padding: 10px 15px;
- margin: 8px 0;
- border-radius: 6px;
- border: 1px solid #e0e0e0;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
- color: #333;
-}
-
-.controls {
- display: flex;
- gap: 15px;
- margin: 20px 0;
- flex-wrap: wrap;
-}
-`;
-
-const cronCalculatorStyle = document.createElement('style');
-style.textContent = cronStyles;
-document.head.appendChild(cronCalculatorStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/csv-json.js b/src/renderer/js/tools/csv-json.js
deleted file mode 100644
index 2234d0e9..00000000
--- a/src/renderer/js/tools/csv-json.js
+++ /dev/null
@@ -1,300 +0,0 @@
-class CSVJSONConverter {
- constructor() {
- this.init();
- }
-
- init() {
- const tabButtons = document.querySelectorAll('#csv-json .tab-btn');
- const csvToJsonBtn = document.getElementById('csv-to-json-btn');
- const jsonToCsvBtn = document.getElementById('json-to-csv-btn');
-
- tabButtons.forEach(button => {
- button.addEventListener('click', () => {
- this.switchTab(button.dataset.tab);
- });
- });
-
- if (csvToJsonBtn) {
- csvToJsonBtn.addEventListener('click', () => this.convertCSVToJSON());
- }
-
- if (jsonToCsvBtn) {
- jsonToCsvBtn.addEventListener('click', () => this.convertJSONToCSV());
- }
-
- const inputs = document.querySelectorAll('#csv-input, #json-for-csv-input');
- inputs.forEach(input => {
- input.addEventListener('input', () => this.clearOutputs());
- });
- }
-
- switchTab(tabName) {
- const container = document.getElementById('csv-json');
-
- container.querySelectorAll('.tab-btn').forEach(btn => {
- btn.classList.remove('active');
- });
- container.querySelectorAll('.tab-content').forEach(content => {
- content.classList.remove('active');
- });
-
- container.querySelector(`[data-tab="${tabName}"]`).classList.add('active');
- container.getElementById(`${tabName}-tab`).classList.add('active');
-
- this.clearOutputs();
- }
-
- convertCSVToJSON() {
- const input = document.getElementById('csv-input').value.trim();
- const output = document.getElementById('json-from-csv-output');
- const hasHeaders = document.getElementById('has-headers').checked;
- const delimiter = document.getElementById('csv-delimiter').value;
-
- if (!input) {
- window.app?.showMessage('Please enter CSV data to convert.', 'error');
- return;
- }
-
- try {
- const jsonResult = this.csvToJson(input, delimiter, hasHeaders);
- output.textContent = JSON.stringify(jsonResult, null, 2);
- window.app?.showMessage('CSV converted to JSON successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Error converting CSV: ' + error.message, 'error');
- output.textContent = '';
- }
- }
-
- convertJSONToCSV() {
- const input = document.getElementById('json-for-csv-input').value.trim();
- const output = document.getElementById('csv-from-json-output');
-
- if (!input) {
- window.app?.showMessage('Please enter JSON array to convert.', 'error');
- return;
- }
-
- try {
- const jsonData = JSON.parse(input);
- if (!Array.isArray(jsonData)) {
- throw new Error('JSON must be an array of objects');
- }
-
- const csvResult = this.jsonToCsv(jsonData);
- output.value = csvResult;
- window.app?.showMessage('JSON converted to CSV successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Error converting JSON: ' + error.message, 'error');
- output.value = '';
- }
- }
-
- csvToJson(csvString, delimiter = ',', hasHeaders = true) {
- const lines = this.parseCSVLines(csvString);
- if (lines.length === 0) {
- throw new Error('No data found');
- }
-
- const result = [];
- let headers = [];
-
- if (hasHeaders) {
- headers = this.parseCSVLine(lines[0], delimiter);
- for (let i = 1; i < lines.length; i++) {
- const values = this.parseCSVLine(lines[i], delimiter);
- if (values.length > 0) {
- const obj = {};
- headers.forEach((header, index) => {
- obj[header] = values[index] || '';
- });
- result.push(obj);
- }
- }
- } else {
- for (let i = 0; i < lines.length; i++) {
- const values = this.parseCSVLine(lines[i], delimiter);
- if (values.length > 0) {
- result.push(values);
- }
- }
- }
-
- return result;
- }
-
- jsonToCsv(jsonArray) {
- if (jsonArray.length === 0) {
- return '';
- }
-
- const headers = Object.keys(jsonArray[0]);
- const csvLines = [];
-
- csvLines.push(headers.map(header => this.escapeCSVValue(header)).join(','));
-
- jsonArray.forEach(obj => {
- const values = headers.map(header => {
- const value = obj[header];
- return this.escapeCSVValue(value !== undefined ? String(value) : '');
- });
- csvLines.push(values.join(','));
- });
-
- return csvLines.join('\n');
- }
-
- parseCSVLines(csvString) {
- return csvString.split(/\r?\n/).filter(line => line.trim());
- }
-
- parseCSVLine(line, delimiter = ',') {
- const result = [];
- let current = '';
- let inQuotes = false;
- let quoteChar = '"';
-
- for (let i = 0; i < line.length; i++) {
- const char = line[i];
- const nextChar = line[i + 1];
-
- if (char === quoteChar && !inQuotes) {
- inQuotes = true;
- } else if (char === quoteChar && inQuotes) {
- if (nextChar === quoteChar) {
- current += quoteChar;
- i++;
- } else {
- inQuotes = false;
- }
- } else if (char === delimiter && !inQuotes) {
- result.push(current.trim());
- current = '';
- } else {
- current += char;
- }
- }
-
- result.push(current.trim());
- return result;
- }
-
- escapeCSVValue(value) {
- if (value.includes(',') || value.includes('"') || value.includes('\n')) {
- return '"' + value.replace(/"/g, '""') + '"';
- }
- return value;
- }
-
- clearOutputs() {
- document.getElementById('json-from-csv-output').textContent = '';
- document.getElementById('csv-from-json-output').value = '';
- }
-
- downloadCSV() {
- const output = document.getElementById('csv-from-json-output');
- if (output.value.trim()) {
- const blob = new Blob([output.value], { type: 'text/csv' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = 'converted.csv';
- a.click();
- URL.revokeObjectURL(url);
- }
- }
-
- downloadJSON() {
- const output = document.getElementById('json-from-csv-output');
- if (output.textContent.trim()) {
- const blob = new Blob([output.textContent], { type: 'application/json' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = 'converted.json';
- a.click();
- URL.revokeObjectURL(url);
- }
- }
-}
-
-window.CSVJSONConverter = new CSVJSONConverter();
-
-const csvJsonStyles = `
-.csv-options {
- display: flex;
- gap: 20px;
- margin-bottom: 15px;
- flex-wrap: wrap;
- align-items: center;
-}
-
-.csv-options label {
- display: flex;
- align-items: center;
- gap: 8px;
- font-size: 14px;
- color: #1d1d1f;
- white-space: nowrap;
-}
-
-.csv-options select {
- padding: 4px 8px;
- border: 1px solid #d0d0d0;
- border-radius: 4px;
- font-size: 14px;
-}
-
-.csv-options input[type="checkbox"] {
- margin: 0;
-}
-
-#csv-input,
-#json-for-csv-input {
- min-height: 150px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 13px;
-}
-
-#json-from-csv-output {
- background-color: #f8f9fa;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- padding: 15px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 12px;
- line-height: 1.4;
- white-space: pre;
- overflow: auto;
- max-height: 400px;
- min-height: 150px;
-}
-
-#csv-from-json-output {
- min-height: 150px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 13px;
-}
-
-.converter-tabs {
- border-bottom: 2px solid #f0f0f0;
- margin-bottom: 20px;
-}
-
-.tab-content {
- display: none;
-}
-
-.tab-content.active {
- display: block;
-}
-
-.tab-content textarea,
-.tab-content pre {
- width: 100%;
- margin: 15px 0;
-}
-`;
-
-const csvJsonStyle = document.createElement('style');
-csvJsonStyle.textContent = csvJsonStyles;
-document.head.appendChild(csvJsonStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/date-difference.js b/src/renderer/js/tools/date-difference.js
deleted file mode 100644
index 77a9278a..00000000
--- a/src/renderer/js/tools/date-difference.js
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * DateDifference class
- * This class provides functionality to calculate the difference between two dates
- * and the difference between two times. It initializes the date difference calculator
- * and sets up event listeners for user interactions.
- * It calculates the difference in years, months, weeks, days, hours, minutes, and seconds.
- * @class
- * @author MsM Robin
- * @version 1.0.0
- * @date 2025-08-23
- */
-class DateDifference {
- /**
- * Constructor for the DateDifference class.
- * Initializes the date difference calculator and sets up event listeners.
- * It binds the input fields and buttons to their respective DOM elements.
- * @constructor
- * @this {DateDifference}
- * @return {void}
- */
- constructor() {
- this.init();
- }
-
- init() {
- this.fromDateInput = document.getElementById('fromDate');
- this.toDateInput = document.getElementById('toDate');
- this.calculateButton = document.getElementById('calculate');
- this.resultDiv = document.getElementById('result');
-
- // Time Difference Dom
- this.time1Input = document.getElementById('time1');
- this.time2Input = document.getElementById('time2');
- this.calculateTimeButton = document.getElementById('timeCalculate');
- this.timeResultDiv = document.getElementById('timeResult');
-
- this.setupEventListeners();
- }
-
- /**
- * Sets up event listeners for the date difference calculator.
- * This method binds the click events for the calculate buttons to their respective functions.
- * It also initializes the time difference calculator with its own event listeners.
- * @return {void}
- */
- setupEventListeners() {
- this.calculateButton.addEventListener('click', () => {
- this.calculateDifference();
- });
-
- this.calculateTimeButton.addEventListener('click', () => {
- this.calculateTimeDifference();
- });
-
- // Make date inputs show calendar when clicked
- this.fromDateInput.addEventListener('click', () => {
- this.showCalendar(this.fromDateInput);
- });
-
- this.toDateInput.addEventListener('click', () => {
- this.showCalendar(this.toDateInput);
- });
-
- // Make time inputs show time picker when clicked
- this.time1Input.addEventListener('click', () => {
- this.showTimePicker(this.time1Input);
- });
-
- this.time2Input.addEventListener('click', () => {
- this.showTimePicker(this.time2Input);
- });
-
- // Add double-click fallback for browsers that restrict picker triggering
- this.fromDateInput.addEventListener('dblclick', () => {
- this.fromDateInput.focus();
- });
-
- this.toDateInput.addEventListener('dblclick', () => {
- this.toDateInput.focus();
- });
-
- this.time1Input.addEventListener('dblclick', () => {
- this.time1Input.focus();
- });
-
- this.time2Input.addEventListener('dblclick', () => {
- this.time2Input.focus();
- });
- }
-
- /**
- * Shows the calendar for date inputs by triggering the native date picker
- * @param {HTMLInputElement} input - The date input element
- */
- showCalendar(input) {
- if (input.type === 'date') {
- // Try modern showPicker API first
- if (typeof input.showPicker === 'function') {
- input.showPicker();
- } else {
- // Fallback: focus and click to trigger native picker
- input.focus();
- // Simulate a click on the calendar icon area
- const rect = input.getBoundingClientRect();
- const event = new MouseEvent('click', {
- view: window,
- bubbles: true,
- cancelable: true,
- clientX: rect.right - 20,
- clientY: rect.top + rect.height / 2
- });
- input.dispatchEvent(event);
- }
- }
- }
-
- /**
- * Shows the time picker for time inputs by triggering the native time picker
- * @param {HTMLInputElement} input - The time input element
- */
- showTimePicker(input) {
- if (input.type === 'time') {
- // Try modern showPicker API first
- if (typeof input.showPicker === 'function') {
- input.showPicker();
- } else {
- // Fallback: focus and click to trigger native picker
- input.focus();
- // Simulate a click on the time picker icon area
- const rect = input.getBoundingClientRect();
- const event = new MouseEvent('click', {
- view: window,
- bubbles: true,
- cancelable: true,
- clientX: rect.right - 20,
- clientY: rect.top + rect.height / 2
- });
- input.dispatchEvent(event);
- }
- }
- }
-
- /**
- * Calculates the difference between two dates.
- * It retrieves the values from the input fields, converts them to Date objects,
- * and calculates the absolute difference in milliseconds.
- * The difference is then converted into years, months, weeks, and days.
- * The result is displayed in the resultDiv element.
- * @return {void}
- */
- calculateDifference() {
- const fromDate = new Date(this.fromDateInput.value);
- const toDate = new Date(this.toDateInput.value);
-
- if (isNaN(fromDate.getTime()) || isNaN(toDate.getTime())) {
- this.resultDiv.textContent = 'Please enter valid dates.';
- this.resultDiv.style.display = 'block';
- return;
- }
-
- let diff = Math.abs(fromDate.getTime() - toDate.getTime());
-
- const years = Math.floor(diff / (1000 * 60 * 60 * 24 * 365));
- diff -= years * (1000 * 60 * 60 * 24 * 365);
-
- const months = Math.floor(diff / (1000 * 60 * 60 * 24 * 30));
- diff -= months * (1000 * 60 * 60 * 24 * 30);
-
- const weeks = Math.floor(diff / (1000 * 60 * 60 * 24 * 7));
- diff -= weeks * (1000 * 60 * 60 * 24 * 7);
-
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
- diff -= days * (1000 * 60 * 60 * 24);
-
- this.resultDiv.innerHTML = `
- Years: ${years}
- Months: ${months}
- Weeks: ${weeks}
- Days: ${days}
- `;
- this.resultDiv.style.display = 'block';
- }
-
-
- /**
- * Calculates the difference between two times.
- * It retrieves the values from the time input fields, splits them into hours, minutes,
- * and seconds, and converts them into Date objects.
- * @return {void}
- */
- calculateTimeDifference() {
- const time1 = this.time1Input.value.split(':').map(Number);
- const time2 = this.time2Input.value.split(':').map(Number);
-
- if (time1.length !== 2 || time2.length !== 2) {
- this.timeResultDiv.textContent = 'Please enter valid times in HH:MM:SS format.';
- this.timeResultDiv.style.display = 'block';
- return;
- }
-
- const date1 = new Date(0, 0, 0, ...time1);
- const date2 = new Date(0, 0, 0, ...time2);
-
- let diff = Math.abs(date1.getTime() - date2.getTime());
-
- const hours = Math.floor(diff / (1000 * 60 * 60));
- diff -= hours * (1000 * 60 * 60);
-
- const minutes = Math.floor(diff / (1000 * 60));
- diff -= minutes * (1000 * 60);
-
- const seconds = Math.floor(diff / 1000);
-
- this.timeResultDiv.innerHTML = `
- Hours: ${hours}
- Minutes: ${minutes}
- Seconds: ${seconds}
- `;
- this.timeResultDiv.style.display = 'block';
- }
-}
-
-window.DateDifference = new DateDifference();
\ No newline at end of file
diff --git a/src/renderer/js/tools/image-converter.js b/src/renderer/js/tools/image-converter.js
deleted file mode 100644
index ca82b281..00000000
--- a/src/renderer/js/tools/image-converter.js
+++ /dev/null
@@ -1,295 +0,0 @@
-class ImageConverter {
- constructor() {
- this.currentImage = null;
- this.init();
- }
-
- init() {
- const dropZone = document.getElementById('image-drop-zone');
- const fileInput = document.getElementById('image-file-input');
- const convertBtn = document.getElementById('convert-image');
- const formatSelect = document.getElementById('output-format');
- const qualitySlider = document.getElementById('quality-slider');
- const qualityValue = document.getElementById('quality-value');
-
- if (dropZone) {
- dropZone.addEventListener('click', () => fileInput?.click());
- dropZone.addEventListener('dragover', (e) => this.handleDragOver(e));
- dropZone.addEventListener('drop', (e) => this.handleDrop(e));
- dropZone.addEventListener('dragleave', (e) => this.handleDragLeave(e));
- }
-
- if (fileInput) {
- fileInput.addEventListener('change', (e) => this.handleFileSelect(e));
- }
-
- if (convertBtn) {
- convertBtn.addEventListener('click', () => this.convertImage());
- }
-
- if (formatSelect) {
- formatSelect.addEventListener('change', () => this.toggleQualityOptions());
- }
-
- if (qualitySlider) {
- qualitySlider.addEventListener('input', (e) => {
- qualityValue.textContent = e.target.value;
- });
- }
- }
-
- handleDragOver(e) {
- e.preventDefault();
- e.stopPropagation();
- e.currentTarget.style.backgroundColor = '#f0f8ff';
- e.currentTarget.style.borderColor = '#667eea';
- }
-
- handleDragLeave(e) {
- e.preventDefault();
- e.stopPropagation();
- e.currentTarget.style.backgroundColor = '';
- e.currentTarget.style.borderColor = '';
- }
-
- handleDrop(e) {
- e.preventDefault();
- e.stopPropagation();
- e.currentTarget.style.backgroundColor = '';
- e.currentTarget.style.borderColor = '';
-
- const files = e.dataTransfer.files;
- if (files.length > 0) {
- this.processFile(files[0]);
- }
- }
-
- handleFileSelect(e) {
- const files = e.target.files;
- if (files.length > 0) {
- this.processFile(files[0]);
- }
- }
-
- processFile(file) {
- if (!file.type.startsWith('image/')) {
- window.app?.showMessage('Please select a valid image file.', 'error');
- return;
- }
-
- if (file.size > 50 * 1024 * 1024) {
- window.app?.showMessage('File size should be less than 50MB.', 'error');
- return;
- }
-
- const reader = new FileReader();
- reader.onload = (e) => {
- this.loadImage(e.target.result, file);
- };
- reader.readAsDataURL(file);
- }
-
- loadImage(dataUrl, file) {
- const img = new Image();
- img.onload = () => {
- this.currentImage = {
- img,
- dataUrl,
- file,
- width: img.width,
- height: img.height
- };
- this.showImagePreview();
- this.showConversionOptions();
- };
- img.src = dataUrl;
- }
-
- showImagePreview() {
- const preview = document.getElementById('image-preview');
- const previewImg = document.getElementById('preview-image');
- const imageName = document.getElementById('image-name');
- const imageSize = document.getElementById('image-size');
- const imageDimensions = document.getElementById('image-dimensions');
-
- previewImg.src = this.currentImage.dataUrl;
- imageName.textContent = this.currentImage.file.name;
- imageSize.textContent = this.formatFileSize(this.currentImage.file.size);
- imageDimensions.textContent = `${this.currentImage.width} × ${this.currentImage.height}`;
-
- preview.style.display = 'block';
- }
-
- showConversionOptions() {
- const options = document.getElementById('conversion-options');
- options.style.display = 'block';
- this.toggleQualityOptions();
- }
-
- toggleQualityOptions() {
- const format = document.getElementById('output-format').value;
- const qualityOptions = document.getElementById('quality-options');
-
- if (format === 'jpeg' || format === 'webp') {
- qualityOptions.style.display = 'block';
- } else {
- qualityOptions.style.display = 'none';
- }
- }
-
- convertImage() {
- if (!this.currentImage) {
- window.app?.showMessage('Please select an image first.', 'error');
- return;
- }
-
- const format = document.getElementById('output-format').value;
- const quality = document.getElementById('quality-slider').value / 100;
-
- const canvas = document.createElement('canvas');
- const ctx = canvas.getContext('2d');
-
- canvas.width = this.currentImage.width;
- canvas.height = this.currentImage.height;
-
- if (format === 'jpeg') {
- ctx.fillStyle = 'white';
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- }
-
- ctx.drawImage(this.currentImage.img, 0, 0);
-
- let mimeType = 'image/' + format;
- if (format === 'jpeg') {
- mimeType = 'image/jpeg';
- }
-
- const convertedDataUrl = canvas.toDataURL(mimeType, quality);
- this.downloadImage(convertedDataUrl, format);
- }
-
- downloadImage(dataUrl, format) {
- const link = document.createElement('a');
- const originalName = this.currentImage.file.name.split('.')[0];
-
- link.download = `${originalName}.${format}`;
- link.href = dataUrl;
- link.click();
-
- window.app?.showMessage(`Image converted and downloaded as ${format.toUpperCase()}!`, 'success');
- }
-
- formatFileSize(bytes) {
- if (bytes === 0) return '0 Bytes';
-
- const k = 1024;
- const sizes = ['Bytes', 'KB', 'MB', 'GB'];
- const i = Math.floor(Math.log(bytes) / Math.log(k));
-
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
- }
-}
-
-window.ImageConverter = new ImageConverter();
-
-const imageStyles = `
-.file-drop-zone {
- border: 2px dashed #d0d0d0;
- border-radius: 8px;
- padding: 40px 20px;
- text-align: center;
- cursor: pointer;
- transition: all 0.3s ease;
- background-color: #fafafa;
-}
-
-.file-drop-zone:hover {
- border-color: #667eea;
- background-color: #f0f8ff;
-}
-
-.file-drop-zone i {
- font-size: 3rem;
- color: #86868b;
- margin-bottom: 15px;
-}
-
-.file-drop-zone p {
- color: #86868b;
- margin: 0;
- font-size: 16px;
-}
-
-.image-preview {
- margin: 20px 0;
- text-align: center;
-}
-
-#preview-image {
- max-width: 100%;
- max-height: 300px;
- border-radius: 8px;
- box-shadow: 0 4px 20px rgba(0,0,0,0.1);
-}
-
-.image-info {
- display: flex;
- justify-content: center;
- gap: 20px;
- margin-top: 15px;
- flex-wrap: wrap;
-}
-
-.image-info span {
- background: #f0f0f0;
- padding: 5px 12px;
- border-radius: 20px;
- font-size: 12px;
- color: #666;
-}
-
-.conversion-options {
- background: #f8f9fa;
- border-radius: 8px;
- padding: 20px;
- margin-top: 20px;
-}
-
-.format-options,
-.quality-options {
- display: flex;
- align-items: center;
- gap: 15px;
- margin-bottom: 15px;
- flex-wrap: wrap;
-}
-
-.format-options label,
-.quality-options label {
- font-weight: 500;
- color: #1d1d1f;
-}
-
-.format-options select {
- padding: 8px 12px;
- border: 2px solid #f0f0f0;
- border-radius: 6px;
- font-size: 14px;
-}
-
-#quality-slider {
- flex: 1;
- min-width: 150px;
-}
-
-#quality-value {
- min-width: 35px;
- text-align: right;
- font-weight: bold;
- color: #667eea;
-}
-`;
-
-const imageConverterStyle = document.createElement('style');
-style.textContent = imageStyles;
-document.head.appendChild(imageConverterStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/json-to-ts.js b/src/renderer/js/tools/json-to-ts.js
deleted file mode 100644
index f573326b..00000000
--- a/src/renderer/js/tools/json-to-ts.js
+++ /dev/null
@@ -1,142 +0,0 @@
-class JSONToTypeScript {
- constructor() {
- this.init();
- }
-
- init() {
- const convertBtn = document.getElementById('convert-to-ts');
- const clearBtn = document.getElementById('clear-ts');
- const inputTextarea = document.getElementById('json-to-ts-input');
-
- if (convertBtn) {
- convertBtn.addEventListener('click', () => this.convertToTypeScript());
- }
-
- if (clearBtn) {
- clearBtn.addEventListener('click', () => this.clearAll());
- }
-
- if (inputTextarea) {
- inputTextarea.addEventListener('input', () => this.clearOutput());
- }
- }
-
- convertToTypeScript() {
- const input = document.getElementById('json-to-ts-input').value.trim();
- const output = document.getElementById('typescript-output');
-
- if (!input) {
- window.app?.showMessage('Please enter JSON data to convert.', 'error');
- return;
- }
-
- try {
- const parsed = JSON.parse(input);
- const typescript = this.generateTypeScript(parsed, 'RootObject');
- output.textContent = typescript;
- window.app?.showMessage('JSON converted to TypeScript!', 'success');
- } catch (error) {
- window.app?.showMessage('Error: Invalid JSON format', 'error');
- output.textContent = '';
- }
- }
-
- generateTypeScript(obj, interfaceName = 'RootObject', level = 0) {
- const indent = ' '.repeat(level);
- let result = '';
-
- if (Array.isArray(obj)) {
- if (obj.length === 0) {
- return 'any[]';
- }
- const firstItem = obj[0];
- if (typeof firstItem === 'object' && firstItem !== null) {
- const itemInterface = this.generateTypeScript(firstItem, interfaceName + 'Item', level + 1);
- return itemInterface + '\n' + indent + `type ${interfaceName} = ${interfaceName}Item[];`;
- } else {
- return `${this.getTypeScriptType(firstItem)}[]`;
- }
- }
-
- if (typeof obj === 'object' && obj !== null) {
- result += `${indent}interface ${interfaceName} {\n`;
-
- const nestedInterfaces = [];
-
- for (const [key, value] of Object.entries(obj)) {
- const safeKey = this.makeSafePropertyName(key);
- const optional = this.shouldBeOptional(value) ? '?' : '';
-
- if (Array.isArray(value)) {
- if (value.length === 0) {
- result += `${indent} ${safeKey}${optional}: any[];\n`;
- } else {
- const firstItem = value[0];
- if (typeof firstItem === 'object' && firstItem !== null) {
- const itemInterfaceName = this.capitalizeFirst(safeKey) + 'Item';
- const itemInterface = this.generateTypeScript(firstItem, itemInterfaceName, level + 1);
- nestedInterfaces.push(itemInterface);
- result += `${indent} ${safeKey}${optional}: ${itemInterfaceName}[];\n`;
- } else {
- result += `${indent} ${safeKey}${optional}: ${this.getTypeScriptType(firstItem)}[];\n`;
- }
- }
- } else if (typeof value === 'object' && value !== null) {
- const nestedInterfaceName = this.capitalizeFirst(safeKey);
- const nestedInterface = this.generateTypeScript(value, nestedInterfaceName, level + 1);
- nestedInterfaces.push(nestedInterface);
- result += `${indent} ${safeKey}${optional}: ${nestedInterfaceName};\n`;
- } else {
- result += `${indent} ${safeKey}${optional}: ${this.getTypeScriptType(value)};\n`;
- }
- }
-
- result += `${indent}}\n`;
-
- if (nestedInterfaces.length > 0) {
- result = nestedInterfaces.join('\n') + '\n' + result;
- }
-
- return result;
- }
-
- return this.getTypeScriptType(obj);
- }
-
- getTypeScriptType(value) {
- if (value === null) return 'any';
- if (typeof value === 'string') return 'string';
- if (typeof value === 'number') return 'number';
- if (typeof value === 'boolean') return 'boolean';
- if (Array.isArray(value)) return 'any[]';
- if (typeof value === 'object') return 'object';
- return 'any';
- }
-
- makeSafePropertyName(key) {
- if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {
- return key;
- }
- return `"${key}"`;
- }
-
- shouldBeOptional(value) {
- return value === null || value === undefined;
- }
-
- capitalizeFirst(str) {
- return str.charAt(0).toUpperCase() + str.slice(1);
- }
-
- clearAll() {
- document.getElementById('json-to-ts-input').value = '';
- this.clearOutput();
- window.app?.showMessage('Cleared!', 'info');
- }
-
- clearOutput() {
- document.getElementById('typescript-output').textContent = '';
- }
-}
-
-window.JSONToTypeScript = new JSONToTypeScript();
\ No newline at end of file
diff --git a/src/renderer/js/tools/json-viewer.js b/src/renderer/js/tools/json-viewer.js
deleted file mode 100644
index 62b96f5d..00000000
--- a/src/renderer/js/tools/json-viewer.js
+++ /dev/null
@@ -1,146 +0,0 @@
-class JSONViewer {
- constructor() {
- this.init();
- }
-
- init() {
- const formatBtn = document.getElementById('format-json');
- const minifyBtn = document.getElementById('minify-json');
- const validateBtn = document.getElementById('validate-json');
- const inputTextarea = document.getElementById('json-input');
- const outputPre = document.getElementById('json-output');
-
- if (formatBtn) {
- formatBtn.addEventListener('click', () => this.formatJSON());
- }
-
- if (minifyBtn) {
- minifyBtn.addEventListener('click', () => this.minifyJSON());
- }
-
- if (validateBtn) {
- validateBtn.addEventListener('click', () => this.validateJSON());
- }
-
- if (inputTextarea) {
- inputTextarea.addEventListener('input', () => this.clearOutput());
- }
- }
-
- formatJSON() {
- const input = document.getElementById('json-input').value;
- const output = document.getElementById('json-output');
-
- if (!input.trim()) {
- this.showError('Please enter JSON data to format.');
- return;
- }
-
- try {
- const parsed = JSON.parse(input);
- const formatted = JSON.stringify(parsed, null, 2);
- output.textContent = formatted;
- output.className = 'formatted-json';
- this.clearErrors();
- window.app?.showMessage('JSON formatted successfully!', 'success');
- } catch (error) {
- this.showError(`Invalid JSON: ${error.message}`);
- }
- }
-
- minifyJSON() {
- const input = document.getElementById('json-input').value;
- const output = document.getElementById('json-output');
-
- if (!input.trim()) {
- this.showError('Please enter JSON data to minify.');
- return;
- }
-
- try {
- const parsed = JSON.parse(input);
- const minified = JSON.stringify(parsed);
- output.textContent = minified;
- output.className = 'minified-json';
- this.clearErrors();
- window.app?.showMessage('JSON minified successfully!', 'success');
- } catch (error) {
- this.showError(`Invalid JSON: ${error.message}`);
- }
- }
-
- validateJSON() {
- const input = document.getElementById('json-input').value;
- const output = document.getElementById('json-output');
-
- if (!input.trim()) {
- this.showError('Please enter JSON data to validate.');
- return;
- }
-
- try {
- const parsed = JSON.parse(input);
- const info = this.getJSONInfo(parsed);
- output.innerHTML = `✅ Valid JSON Type: ${info.type}
Size: ${info.size} characters
Keys: ${info.keys}
Depth: ${info.depth}
`;
- this.clearErrors();
- window.app?.showMessage('JSON is valid!', 'success');
- } catch (error) {
- this.showError(`Invalid JSON: ${error.message}`);
- output.innerHTML = `❌ Invalid JSON ${error.message}
`;
- }
- }
-
- getJSONInfo(obj) {
- const type = Array.isArray(obj) ? 'Array' : typeof obj;
- const size = JSON.stringify(obj).length;
- const keys = this.countKeys(obj);
- const depth = this.getMaxDepth(obj);
-
- return { type, size, keys, depth };
- }
-
- countKeys(obj) {
- if (typeof obj !== 'object' || obj === null) return 0;
- if (Array.isArray(obj)) return obj.length;
-
- let count = 0;
- for (let key in obj) {
- if (obj.hasOwnProperty(key)) {
- count++;
- if (typeof obj[key] === 'object' && obj[key] !== null) {
- count += this.countKeys(obj[key]);
- }
- }
- }
- return count;
- }
-
- getMaxDepth(obj, depth = 0) {
- if (typeof obj !== 'object' || obj === null) return depth;
-
- let maxDepth = depth;
- for (let key in obj) {
- if (obj.hasOwnProperty(key)) {
- maxDepth = Math.max(maxDepth, this.getMaxDepth(obj[key], depth + 1));
- }
- }
- return maxDepth;
- }
-
- showError(message) {
- const output = document.getElementById('json-output');
- output.innerHTML = `${message}
`;
- }
-
- clearErrors() {
- const existingErrors = document.querySelectorAll('.error');
- existingErrors.forEach(error => error.remove());
- }
-
- clearOutput() {
- const output = document.getElementById('json-output');
- output.textContent = '';
- }
-}
-
-window.JSONViewer = new JSONViewer();
\ No newline at end of file
diff --git a/src/renderer/js/tools/jwt-decoder.js b/src/renderer/js/tools/jwt-decoder.js
deleted file mode 100644
index dafaf7b2..00000000
--- a/src/renderer/js/tools/jwt-decoder.js
+++ /dev/null
@@ -1,121 +0,0 @@
-class JWTDecoder {
- constructor() {
- this.init();
- }
-
- init() {
- const decodeBtn = document.getElementById('decode-jwt');
- const jwtInput = document.getElementById('jwt-input');
-
- if (decodeBtn) {
- decodeBtn.addEventListener('click', () => this.decodeJWT());
- }
-
- if (jwtInput) {
- jwtInput.addEventListener('input', () => this.clearOutput());
- }
- }
-
- decodeJWT() {
- const input = document.getElementById('jwt-input').value.trim();
- const headerOutput = document.getElementById('jwt-header');
- const payloadOutput = document.getElementById('jwt-payload');
- const signatureOutput = document.getElementById('jwt-signature');
-
- if (!input) {
- window.app?.showMessage('Please enter a JWT token to decode.', 'error');
- return;
- }
-
- try {
- const parts = input.split('.');
-
- if (parts.length !== 3) {
- throw new Error('Invalid JWT format. JWT should have 3 parts separated by dots.');
- }
-
- const [headerPart, payloadPart, signaturePart] = parts;
-
- const header = this.decodeJWTPart(headerPart);
- const payload = this.decodeJWTPart(payloadPart);
-
- headerOutput.textContent = JSON.stringify(header, null, 2);
- payloadOutput.textContent = JSON.stringify(payload, null, 2);
- signatureOutput.textContent = signaturePart;
-
- this.highlightClaimsInfo(payload);
-
- window.app?.showMessage('JWT decoded successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Error decoding JWT: ' + error.message, 'error');
- this.clearOutput();
- }
- }
-
- decodeJWTPart(part) {
- try {
- const base64 = part.replace(/-/g, '+').replace(/_/g, '/');
- const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, '=');
- const decoded = atob(padded);
- return JSON.parse(decoded);
- } catch (error) {
- throw new Error('Failed to decode JWT part: ' + error.message);
- }
- }
-
- highlightClaimsInfo(payload) {
- const payloadOutput = document.getElementById('jwt-payload');
- let infoHtml = JSON.stringify(payload, null, 2);
-
- if (payload.exp) {
- const expDate = new Date(payload.exp * 1000);
- const now = new Date();
- const isExpired = expDate < now;
-
- infoHtml += `\n\n/* Token Information */\n`;
- infoHtml += `/* Expires: ${expDate.toLocaleString()} */\n`;
- infoHtml += `/* Status: ${isExpired ? '🔴 EXPIRED' : '🟢 VALID'} */\n`;
-
- if (payload.iat) {
- const iatDate = new Date(payload.iat * 1000);
- infoHtml += `/* Issued: ${iatDate.toLocaleString()} */\n`;
- }
-
- if (payload.nbf) {
- const nbfDate = new Date(payload.nbf * 1000);
- infoHtml += `/* Not Before: ${nbfDate.toLocaleString()} */\n`;
- }
- }
-
- if (payload.iss) {
- infoHtml += `/* Issuer: ${payload.iss} */\n`;
- }
-
- if (payload.aud) {
- infoHtml += `/* Audience: ${Array.isArray(payload.aud) ? payload.aud.join(', ') : payload.aud} */\n`;
- }
-
- if (payload.sub) {
- infoHtml += `/* Subject: ${payload.sub} */\n`;
- }
-
- payloadOutput.textContent = infoHtml;
- }
-
- clearOutput() {
- document.getElementById('jwt-header').textContent = '';
- document.getElementById('jwt-payload').textContent = '';
- document.getElementById('jwt-signature').textContent = '';
- }
-
- copySection(section) {
- const element = document.getElementById(`jwt-${section}`);
- if (element && element.textContent.trim()) {
- navigator.clipboard.writeText(element.textContent).then(() => {
- window.app?.showMessage(`JWT ${section} copied to clipboard!`, 'success');
- });
- }
- }
-}
-
-window.JWTDecoder = new JWTDecoder();
\ No newline at end of file
diff --git a/src/renderer/js/tools/lorem-generator.js b/src/renderer/js/tools/lorem-generator.js
deleted file mode 100644
index 83cabf64..00000000
--- a/src/renderer/js/tools/lorem-generator.js
+++ /dev/null
@@ -1,430 +0,0 @@
-class LoremGenerator {
- constructor() {
- // Use the same word list as our tested utils
- this.LOREM_WORDS = [
- 'lorem',
- 'ipsum',
- 'dolor',
- 'sit',
- 'amet',
- 'consectetur',
- 'adipiscing',
- 'elit',
- 'sed',
- 'do',
- 'eiusmod',
- 'tempor',
- 'incididunt',
- 'ut',
- 'labore',
- 'et',
- 'dolore',
- 'magna',
- 'aliqua',
- 'enim',
- 'ad',
- 'minim',
- 'veniam',
- 'quis',
- 'nostrud',
- 'exercitation',
- 'ullamco',
- 'laboris',
- 'nisi',
- 'aliquip',
- 'ex',
- 'ea',
- 'commodo',
- 'consequat',
- 'duis',
- 'aute',
- 'irure',
- 'in',
- 'reprehenderit',
- 'voluptate',
- 'velit',
- 'esse',
- 'cillum',
- 'fugiat',
- 'nulla',
- 'pariatur',
- 'excepteur',
- 'sint',
- 'occaecat',
- 'cupidatat',
- 'non',
- 'proident',
- 'sunt',
- 'culpa',
- 'qui',
- 'officia',
- 'deserunt',
- 'mollit',
- 'anim',
- 'id',
- 'est',
- 'laborum',
- 'at',
- 'vero',
- 'eos',
- 'accusamus',
- 'accusantium',
- 'doloremque',
- 'laudantium',
- 'totam',
- 'rem',
- 'aperiam',
- 'eaque',
- 'ipsa',
- 'quae',
- 'ab',
- 'illo',
- 'inventore',
- 'veritatis',
- 'et',
- 'quasi',
- 'architecto',
- 'beatae',
- 'vitae',
- 'dicta',
- 'sunt',
- 'explicabo',
- 'nemo',
- 'ipsam',
- 'voluptatem',
- 'quia',
- 'voluptas',
- 'aspernatur',
- 'aut',
- 'odit',
- 'fugit',
- 'sed',
- 'quia',
- 'consequuntur',
- 'magni',
- 'dolores',
- 'ratione',
- 'sequi',
- 'nesciunt',
- 'neque',
- 'porro',
- 'quisquam',
- 'dolorem',
- 'adipisci',
- 'numquam',
- 'eius',
- 'modi',
- 'tempora',
- 'incidunt',
- 'magnam',
- 'quaerat',
- 'voluptatem',
- 'laudantium',
- 'doloremque',
- 'laudantium',
- ];
- this.init();
- }
-
- init() {
- const generateBtn = document.getElementById('generate-lorem');
- const typeSelect = document.getElementById('lorem-type');
- const countInput = document.getElementById('lorem-count');
-
- console.log('LoremGenerator init:', {
- generateBtn: !!generateBtn,
- typeSelect: !!typeSelect,
- countInput: !!countInput,
- });
-
- // Alert for debugging in case console isn't visible
- if (!generateBtn || !typeSelect || !countInput) {
- window.app?.showMessage(
- 'Lorem Generator: Some elements not found!',
- 'error'
- );
- }
-
- if (generateBtn) {
- generateBtn.addEventListener('click', (e) => {
- console.log('Generate lorem button clicked');
- window.app?.showMessage('Button clicked!', 'info');
- this.generateLorem();
- });
- } else {
- console.error('Generate button not found!');
- window.app?.showMessage('Generate button not found!', 'error');
- }
-
- if (typeSelect) {
- typeSelect.addEventListener('change', () => this.clearOutput());
- }
-
- if (countInput) {
- countInput.addEventListener('input', () => this.clearOutput());
- }
- }
-
- generateLorem() {
- const typeElement = document.getElementById('lorem-type');
- const countElement = document.getElementById('lorem-count');
- const output = document.getElementById('lorem-output');
-
- if (!typeElement || !countElement || !output) {
- console.error('Lorem generator: Required elements not found', {
- typeElement: !!typeElement,
- countElement: !!countElement,
- output: !!output,
- });
- return;
- }
-
- const type = typeElement.value;
- const count = parseInt(countElement.value);
-
- if (isNaN(count) || count < 1 || count > 50) {
- window.app?.showMessage(
- 'Please enter a count between 1 and 50.',
- 'error'
- );
- return;
- }
-
- try {
- let result = '';
-
- switch (type) {
- case 'paragraphs':
- result = this.generateParagraphs(count);
- break;
- case 'sentences':
- result = this.generateSentences(count);
- break;
- case 'words':
- result = this.generateWords(count);
- break;
- default:
- result = this.generateParagraphs(count);
- }
-
- output.value = result;
- window.app?.showMessage(`Generated ${count} ${type}!`, 'success');
- this.selectOutput();
- } catch (error) {
- console.error('Error generating lorem text:', error);
- window.app?.showMessage(
- 'Error generating lorem text: ' + error.message,
- 'error'
- );
- }
- }
-
- generateParagraphs(count) {
- if (count < 1) {
- throw new Error('Paragraph count must be at least 1');
- }
-
- const paragraphs = [];
- for (let i = 0; i < count; i++) {
- const sentences = this.generateSentences(this.randomBetween(3, 7));
- paragraphs.push(sentences);
- }
- return paragraphs.join('\n\n');
- }
-
- generateSentences(count) {
- if (count < 1) {
- throw new Error('Sentence count must be at least 1');
- }
-
- const sentences = [];
- for (let i = 0; i < count; i++) {
- const wordCount = this.randomBetween(8, 20);
- const words = this.generateWords(wordCount).split(' ');
-
- words[0] = this.capitalizeFirst(words[0]);
-
- let sentence = words.join(' ');
-
- if (Math.random() < 0.1) {
- sentence += '!';
- } else if (Math.random() < 0.1) {
- sentence += '?';
- } else {
- sentence += '.';
- }
-
- sentences.push(sentence);
- }
- return sentences.join(' ');
- }
-
- generateWords(count) {
- if (count < 1) {
- throw new Error('Word count must be at least 1');
- }
-
- const words = [];
- for (let i = 0; i < count; i++) {
- const word =
- this.LOREM_WORDS[Math.floor(Math.random() * this.LOREM_WORDS.length)];
- words.push(word);
- }
- return words.join(' ');
- }
-
- randomBetween(min, max) {
- return Math.floor(Math.random() * (max - min + 1)) + min;
- }
-
- capitalizeFirst(str) {
- return str.charAt(0).toUpperCase() + str.slice(1);
- }
-
- selectOutput() {
- const output = document.getElementById('lorem-output');
- setTimeout(() => {
- output.select();
- output.setSelectionRange(0, 99999);
- }, 100);
- }
-
- clearOutput() {
- document.getElementById('lorem-output').value = '';
- }
-
- copyToClipboard() {
- const output = document.getElementById('lorem-output');
- if (output.value.trim()) {
- navigator.clipboard.writeText(output.value).then(() => {
- window.app?.showMessage('Lorem text copied to clipboard!', 'success');
- });
- }
- }
-
- // Test method that can be called directly
- testGeneration() {
- window.app?.showMessage('Testing lorem generation...', 'info');
- try {
- const words = this.generateWords(5);
- window.app?.showMessage(`Generated words: ${words}`, 'success');
- return words;
- } catch (error) {
- window.app?.showMessage(`Error: ${error.message}`, 'error');
- return null;
- }
- }
-
- // Direct method to test DOM elements
- testDOMElements() {
- const generateBtn = document.getElementById('generate-lorem');
- const typeSelect = document.getElementById('lorem-type');
- const countInput = document.getElementById('lorem-count');
- const output = document.getElementById('lorem-output');
-
- const results = {
- generateBtn: !!generateBtn,
- typeSelect: !!typeSelect,
- countInput: !!countInput,
- output: !!output,
- generateBtnVisible: generateBtn
- ? window.getComputedStyle(generateBtn).display !== 'none'
- : false,
- containerActive: !!document.querySelector('#lorem-generator.active'),
- };
-
- console.log('DOM Elements Test:', results);
- window.app?.showMessage(`DOM test: ${JSON.stringify(results)}`, 'info');
- return results;
- }
-}
-
-window.LoremGenerator = new LoremGenerator();
-
-// Also ensure initialization happens when DOM is fully loaded
-document.addEventListener('DOMContentLoaded', () => {
- if (window.LoremGenerator) {
- console.log('DOM loaded, reinitializing LoremGenerator');
- window.LoremGenerator.init();
- }
-});
-
-// Add event delegation as backup
-document.addEventListener('click', (e) => {
- if (e.target && e.target.id === 'generate-lorem') {
- console.log('Generate lorem clicked via delegation');
- window.app?.showMessage('Clicked via delegation!', 'info');
- if (window.LoremGenerator) {
- window.LoremGenerator.generateLorem();
- }
- }
-});
-
-// Global test functions for debugging
-window.testLoremGeneration = function () {
- if (window.LoremGenerator) {
- return window.LoremGenerator.testGeneration();
- }
- return 'LoremGenerator not found';
-};
-
-window.testLoremDOM = function () {
- if (window.LoremGenerator) {
- return window.LoremGenerator.testDOMElements();
- }
- return 'LoremGenerator not found';
-};
-
-window.forceLoremGeneration = function () {
- if (window.LoremGenerator) {
- window.app?.showMessage('Force generating lorem...', 'info');
- window.LoremGenerator.generateLorem();
- return 'Forced generation attempted';
- }
- return 'LoremGenerator not found';
-};
-
-const loremStyles = `
-.lorem-controls {
- display: flex;
- align-items: end;
- gap: 20px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-.lorem-controls .control-group {
- display: flex;
- flex-direction: column;
- gap: 5px;
-}
-
-.lorem-controls label {
- font-weight: 500;
- color: #1d1d1f;
-}
-
-.lorem-controls select,
-.lorem-controls input {
- padding: 8px 12px;
- border: 2px solid #f0f0f0;
- border-radius: 6px;
- font-size: 14px;
- transition: border-color 0.3s ease;
-}
-
-.lorem-controls select:focus,
-.lorem-controls input:focus {
- outline: none;
- border-color: #667eea;
-}
-
-#lorem-output {
- min-height: 300px;
- line-height: 1.6;
-}
-`;
-
-const loremStyleElement = document.createElement('style');
-loremStyleElement.textContent = loremStyles;
-document.head.appendChild(loremStyleElement);
diff --git a/src/renderer/js/tools/markdown-editor.js b/src/renderer/js/tools/markdown-editor.js
deleted file mode 100644
index baa0a319..00000000
--- a/src/renderer/js/tools/markdown-editor.js
+++ /dev/null
@@ -1,403 +0,0 @@
-class MarkdownEditor {
- constructor() {
- this.previewMode = 'split';
- this.init();
- }
-
- init() {
- const toolbarButtons = document.querySelectorAll('.toolbar-btn');
- const togglePreviewBtn = document.getElementById('toggle-preview');
- const markdownInput = document.getElementById('markdown-input');
-
- toolbarButtons.forEach(button => {
- button.addEventListener('click', () => {
- const action = button.dataset.action;
- this.handleToolbarAction(action);
- });
- });
-
- if (togglePreviewBtn) {
- togglePreviewBtn.addEventListener('click', () => this.togglePreview());
- }
-
- if (markdownInput) {
- markdownInput.addEventListener('input', () => this.updatePreview());
- markdownInput.addEventListener('scroll', () => this.syncScroll());
- }
-
- this.updatePreview();
- }
-
- handleToolbarAction(action) {
- const textarea = document.getElementById('markdown-input');
- const start = textarea.selectionStart;
- const end = textarea.selectionEnd;
- const selectedText = textarea.value.substring(start, end);
- let replacement = '';
- let newCursorPos = start;
-
- switch (action) {
- case 'bold':
- replacement = `**${selectedText || 'bold text'}**`;
- newCursorPos = start + (selectedText ? 2 : 2);
- break;
- case 'italic':
- replacement = `*${selectedText || 'italic text'}*`;
- newCursorPos = start + (selectedText ? 1 : 1);
- break;
- case 'heading':
- replacement = `## ${selectedText || 'Heading'}`;
- newCursorPos = start + 3;
- break;
- case 'link':
- replacement = `[${selectedText || 'link text'}](https://example.com)`;
- newCursorPos = start + 1;
- break;
- case 'code':
- if (selectedText.includes('\n')) {
- replacement = `\`\`\`\n${selectedText || 'code'}\n\`\`\``;
- newCursorPos = start + 4;
- } else {
- replacement = `\`${selectedText || 'code'}\``;
- newCursorPos = start + 1;
- }
- break;
- case 'list':
- const lines = selectedText.split('\n');
- replacement = lines.map(line => `- ${line}`).join('\n') || '- List item';
- newCursorPos = start + 2;
- break;
- }
-
- textarea.value = textarea.value.substring(0, start) + replacement + textarea.value.substring(end);
- textarea.focus();
- textarea.setSelectionRange(newCursorPos, newCursorPos);
-
- this.updatePreview();
- }
-
- togglePreview() {
- const input = document.querySelector('.markdown-input');
- const preview = document.querySelector('.markdown-preview');
- const button = document.getElementById('toggle-preview');
-
- switch (this.previewMode) {
- case 'split':
- this.previewMode = 'preview';
- input.style.display = 'none';
- preview.style.width = '100%';
- button.textContent = 'Show Editor';
- break;
- case 'preview':
- this.previewMode = 'editor';
- preview.style.display = 'none';
- input.style.width = '100%';
- button.textContent = 'Show Preview';
- break;
- case 'editor':
- this.previewMode = 'split';
- input.style.display = 'flex';
- input.style.width = '50%';
- preview.style.display = 'block';
- preview.style.width = '50%';
- button.textContent = 'Toggle Preview';
- break;
- }
- }
-
- updatePreview() {
- const input = document.getElementById('markdown-input').value;
- const preview = document.getElementById('preview-content');
-
- if (input.trim() === '') {
- preview.innerHTML = 'Preview will appear here...
';
- return;
- }
-
- const html = this.markdownToHtml(input);
- preview.innerHTML = html;
- }
-
- markdownToHtml(markdown) {
- let html = markdown;
-
- html = html.replace(/```(\w+)?\n([\s\S]*?)\n```/g, (_, lang, code) => {
- return `${this.escapeHtml(code)} `;
- });
-
- html = html.replace(/`([^`]+)`/g, '$1');
-
- html = html.replace(/^### (.*$)/gim, '$1 ');
- html = html.replace(/^## (.*$)/gim, '$1 ');
- html = html.replace(/^# (.*$)/gim, '$1 ');
-
- html = html.replace(/\*\*(.*?)\*\*/g, '$1 ');
- html = html.replace(/\*(.*?)\*/g, '$1 ');
-
- html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ');
-
- html = html.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, ' ');
-
- html = html.replace(/^- (.*$)/gim, '$1 ');
- html = html.replace(/(.*<\/li>)/s, '');
-
- html = html.replace(/^\d+\. (.*$)/gim, ' $1 ');
-
- html = html.replace(/^> (.*$)/gim, '$1 ');
-
- html = html.replace(/---/g, ' ');
-
- const paragraphs = html.split(/\n\s*\n/);
- html = paragraphs.map(paragraph => {
- paragraph = paragraph.trim();
- if (paragraph && !paragraph.match(/^<(h[1-6]|ul|ol|li|blockquote|pre|hr)/)) {
- return `${paragraph}
`;
- }
- return paragraph;
- }).join('\n\n');
-
- return html;
- }
-
- escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-
- syncScroll() {
- const input = document.getElementById('markdown-input');
- const preview = document.getElementById('preview-content');
-
- if (this.previewMode === 'split') {
- const percentage = input.scrollTop / (input.scrollHeight - input.clientHeight);
- preview.scrollTop = percentage * (preview.scrollHeight - preview.clientHeight);
- }
- }
-
- exportMarkdown() {
- const content = document.getElementById('markdown-input').value;
- if (content.trim()) {
- const blob = new Blob([content], { type: 'text/markdown' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = 'document.md';
- a.click();
- URL.revokeObjectURL(url);
- }
- }
-
- exportHTML() {
- const markdown = document.getElementById('markdown-input').value;
- if (markdown.trim()) {
- const html = `
-
-
-
- Exported Document
-
-
-
-${this.markdownToHtml(markdown)}
-
-`;
-
- const blob = new Blob([html], { type: 'text/html' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = 'document.html';
- a.click();
- URL.revokeObjectURL(url);
- }
- }
-}
-
-window.MarkdownEditor = new MarkdownEditor();
-
-const markdownStyles = `
-.markdown-toolbar {
- display: flex;
- align-items: center;
- gap: 5px;
- padding: 10px;
- background: #f8f9fa;
- border-radius: 8px 8px 0 0;
- border-bottom: 1px solid #e0e0e0;
- flex-wrap: wrap;
-}
-
-.toolbar-btn {
- background: none;
- border: 1px solid #d0d0d0;
- border-radius: 4px;
- padding: 8px 10px;
- cursor: pointer;
- color: #666;
- font-size: 14px;
- transition: all 0.3s ease;
-}
-
-.toolbar-btn:hover {
- background: #667eea;
- color: white;
- border-color: #667eea;
-}
-
-.toolbar-divider {
- width: 1px;
- height: 20px;
- background: #d0d0d0;
- margin: 0 10px;
-}
-
-.markdown-container {
- display: flex;
- border: 2px solid #f0f0f0;
- border-radius: 0 0 8px 8px;
- min-height: 400px;
-}
-
-.markdown-input,
-.markdown-preview {
- flex: 1;
- overflow: auto;
-}
-
-.markdown-input {
- display: flex;
- flex-direction: column;
- border-right: 1px solid #e0e0e0;
-}
-
-#markdown-input {
- width: 100%;
- height: 400px;
- border: none;
- outline: none;
- padding: 20px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
- line-height: 1.5;
- resize: none;
- background: #fafafa;
-}
-
-.markdown-preview {
- background: white;
-}
-
-#preview-content {
- padding: 20px;
- height: 400px;
- overflow-y: auto;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- line-height: 1.6;
-}
-
-#preview-content h1,
-#preview-content h2,
-#preview-content h3 {
- color: #1d1d1f;
- margin-top: 0;
- margin-bottom: 16px;
-}
-
-#preview-content h1 { font-size: 2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 10px; }
-#preview-content h2 { font-size: 1.5rem; }
-#preview-content h3 { font-size: 1.2rem; }
-
-#preview-content p {
- margin-bottom: 16px;
- color: #333;
-}
-
-#preview-content code {
- background: #f4f4f4;
- padding: 2px 6px;
- border-radius: 3px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 13px;
-}
-
-#preview-content pre {
- background: #f8f9fa;
- padding: 16px;
- border-radius: 6px;
- overflow-x: auto;
- margin: 16px 0;
- border: 1px solid #e0e0e0;
-}
-
-#preview-content pre code {
- background: none;
- padding: 0;
-}
-
-#preview-content blockquote {
- border-left: 4px solid #667eea;
- margin: 16px 0;
- padding-left: 16px;
- color: #666;
- font-style: italic;
-}
-
-#preview-content ul,
-#preview-content ol {
- padding-left: 20px;
- margin: 16px 0;
-}
-
-#preview-content li {
- margin: 4px 0;
-}
-
-#preview-content a {
- color: #667eea;
- text-decoration: none;
-}
-
-#preview-content a:hover {
- text-decoration: underline;
-}
-
-#preview-content hr {
- border: none;
- height: 1px;
- background: #e0e0e0;
- margin: 20px 0;
-}
-
-.empty-preview {
- color: #86868b;
- font-style: italic;
- text-align: center;
- margin-top: 50px;
-}
-
-@media (max-width: 768px) {
- .markdown-container {
- flex-direction: column;
- }
-
- .markdown-input {
- border-right: none;
- border-bottom: 1px solid #e0e0e0;
- }
-
- #markdown-input,
- #preview-content {
- height: 300px;
- }
-}
-`;
-
-const markdownEditorStyle = document.createElement('style');
-style.textContent = markdownStyles;
-document.head.appendChild(markdownEditorStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/number-base.js b/src/renderer/js/tools/number-base.js
deleted file mode 100644
index 5caa052d..00000000
--- a/src/renderer/js/tools/number-base.js
+++ /dev/null
@@ -1,224 +0,0 @@
-class NumberBaseConverter {
- constructor() {
- this.init();
- }
-
- init() {
- const inputs = document.querySelectorAll(
- '#decimal-input, #binary-input, #octal-input, #hex-input'
- );
- const clearBtn = document.getElementById('clear-bases');
-
- inputs.forEach((input) => {
- input.addEventListener('input', (e) => this.convertFromInput(e.target));
- });
-
- if (clearBtn) {
- clearBtn.addEventListener('click', () => this.clearAll());
- }
- }
-
- convertFromInput(sourceInput) {
- const value = sourceInput.value.trim();
- if (!value) {
- this.clearOtherInputs(sourceInput.id);
- return;
- }
-
- try {
- let decimalValue;
-
- switch (sourceInput.id) {
- case 'decimal-input':
- decimalValue = this.parseDecimal(value);
- break;
- case 'binary-input':
- decimalValue = this.parseBinary(value);
- break;
- case 'octal-input':
- decimalValue = this.parseOctal(value);
- break;
- case 'hex-input':
- decimalValue = this.parseHex(value);
- break;
- default:
- return;
- }
-
- if (decimalValue === null) {
- this.showError(sourceInput.id, 'Invalid format');
- return;
- }
-
- this.updateAllFields(decimalValue, sourceInput.id);
- this.clearError(sourceInput.id);
- } catch (error) {
- this.showError(sourceInput.id, error.message);
- }
- }
-
- parseDecimal(value) {
- const num = parseInt(value, 10);
- if (isNaN(num) || num < 0) return null;
- return num;
- }
-
- parseBinary(value) {
- if (!/^[01]+$/.test(value)) return null;
- return parseInt(value, 2);
- }
-
- parseOctal(value) {
- if (!/^[0-7]+$/.test(value)) return null;
- return parseInt(value, 8);
- }
-
- parseHex(value) {
- const cleaned = value.replace(/^0x/i, '');
- if (!/^[0-9a-f]+$/i.test(cleaned)) return null;
- return parseInt(cleaned, 16);
- }
-
- updateAllFields(decimalValue, sourceInputId) {
- if (sourceInputId !== 'decimal-input') {
- document.getElementById('decimal-input').value = decimalValue.toString();
- }
-
- if (sourceInputId !== 'binary-input') {
- document.getElementById('binary-input').value = decimalValue.toString(2);
- }
-
- if (sourceInputId !== 'octal-input') {
- document.getElementById('octal-input').value = decimalValue.toString(8);
- }
-
- if (sourceInputId !== 'hex-input') {
- document.getElementById('hex-input').value = decimalValue
- .toString(16)
- .toUpperCase();
- }
- }
-
- clearOtherInputs(sourceInputId) {
- const inputs = [
- 'decimal-input',
- 'binary-input',
- 'octal-input',
- 'hex-input',
- ];
- inputs.forEach((inputId) => {
- if (inputId !== sourceInputId) {
- document.getElementById(inputId).value = '';
- }
- });
- }
-
- showError(inputId, message) {
- const input = document.getElementById(inputId);
- input.style.borderColor = '#dc3545';
- input.title = message;
-
- let errorSpan = input.parentNode.querySelector('.error-message');
- if (!errorSpan) {
- errorSpan = document.createElement('span');
- errorSpan.className = 'error-message';
- errorSpan.style.cssText =
- 'color: #dc3545; font-size: 12px; display: block; margin-top: 5px;';
- input.parentNode.appendChild(errorSpan);
- }
- errorSpan.textContent = message;
- }
-
- clearError(inputId) {
- const input = document.getElementById(inputId);
- input.style.borderColor = '#f0f0f0';
- input.title = '';
-
- const errorSpan = input.parentNode.querySelector('.error-message');
- if (errorSpan) {
- errorSpan.remove();
- }
- }
-
- clearAll() {
- const inputs = [
- 'decimal-input',
- 'binary-input',
- 'octal-input',
- 'hex-input',
- ];
- inputs.forEach((inputId) => {
- document.getElementById(inputId).value = '';
- this.clearError(inputId);
- });
- window.app?.showMessage('All fields cleared!', 'info');
- }
-
- copyValue(inputId) {
- const input = document.getElementById(inputId);
- if (input.value.trim()) {
- navigator.clipboard.writeText(input.value).then(() => {
- window.app?.showMessage('Value copied to clipboard!', 'success');
- });
- }
- }
-}
-
-window.NumberBaseConverter = new NumberBaseConverter();
-
-const baseStyles = `
-.base-inputs {
- display: grid;
- gap: 20px;
- margin-bottom: 20px;
-}
-
-.base-input-group {
- display: flex;
- flex-direction: column;
- gap: 8px;
-}
-
-.base-input-group label {
- font-weight: 500;
- color: #1d1d1f;
- font-size: 14px;
-}
-
-.base-input-group input {
- padding: 12px 15px;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
- transition: border-color 0.3s ease;
-}
-
-.base-input-group input:focus {
- outline: none;
- border-color: #667eea;
-}
-
-.base-input-group input:invalid {
- border-color: #dc3545;
-}
-
-@media (min-width: 768px) {
- .base-inputs {
- grid-template-columns: 1fr 1fr;
- }
-}
-
-.error-message {
- animation: fadeIn 0.3s ease;
-}
-
-@keyframes fadeIn {
- from { opacity: 0; transform: translateY(-5px); }
- to { opacity: 1; transform: translateY(0); }
-}
-`;
-
-const numberBaseStyle = document.createElement('style');
-numberBaseStyle.textContent = numberBaseStyles;
-document.head.appendChild(numberBaseStyle);
diff --git a/src/renderer/js/tools/password-generator.js b/src/renderer/js/tools/password-generator.js
deleted file mode 100644
index 44489d5f..00000000
--- a/src/renderer/js/tools/password-generator.js
+++ /dev/null
@@ -1,472 +0,0 @@
-/**
- * Password utilities for generating secure passwords and passphrases
- * Browser-compatible version without require()
- */
-class PasswordUtils {
- static LOWERCASE = 'abcdefghijklmnopqrstuvwxyz';
- static UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- static NUMBERS = '0123456789';
- static SYMBOLS = '!@#$%^&*()_+-=[]{};\':"|,.<>?';
- static AMBIGUOUS = '0OIl1';
-
- // Word list for passphrases (subset for testing)
- static WORDS = [
- 'apple',
- 'brave',
- 'chair',
- 'dream',
- 'eagle',
- 'flame',
- 'grape',
- 'house',
- 'image',
- 'judge',
- 'knife',
- 'lemon',
- 'magic',
- 'novel',
- 'ocean',
- 'piano',
- 'queen',
- 'river',
- 'stone',
- 'table',
- 'unity',
- 'value',
- 'water',
- 'youth',
- 'zebra',
- 'beach',
- 'cloud',
- 'dance',
- 'earth',
- 'field',
- 'green',
- 'happy',
- 'light',
- 'mouse',
- 'night',
- 'party',
- 'quick',
- 'smile',
- 'trust',
- 'voice',
- ];
-
- static generatePassword(options = {}) {
- const {
- length = 12,
- includeLowercase = true,
- includeUppercase = true,
- includeNumbers = true,
- includeSymbols = false,
- excludeAmbiguous = false,
- } = options;
-
- let charset = '';
-
- // Build character set based on options
- if (includeLowercase) charset += this.LOWERCASE;
- if (includeUppercase) charset += this.UPPERCASE;
- if (includeNumbers) charset += this.NUMBERS;
- if (includeSymbols) charset += this.SYMBOLS;
-
- if (!charset) {
- throw new Error('At least one character set must be selected');
- }
-
- // Remove ambiguous characters if requested
- if (excludeAmbiguous) {
- for (const char of this.AMBIGUOUS) {
- charset = charset.replace(new RegExp(char, 'g'), '');
- }
- }
-
- // Generate password
- let password = '';
- for (let i = 0; i < length; i++) {
- const randomIndex = Math.floor(Math.random() * charset.length);
- password += charset[randomIndex];
- }
-
- return password;
- }
-
- static generateMultiplePasswords(count, options = {}) {
- const passwords = [];
- for (let i = 0; i < count; i++) {
- passwords.push(this.generatePassword(options));
- }
- return passwords;
- }
-
- static calculatePasswordStrength(password) {
- if (!password) {
- return {
- score: 0,
- strength: 'Very Weak',
- feedback: ['Password is required'],
- entropy: 0,
- };
- }
-
- let score = 0;
- let feedback = [];
-
- // Length check
- if (password.length >= 12) score += 2;
- else if (password.length >= 8) score += 1;
- else feedback.push('Use at least 8 characters');
-
- // Character variety checks
- if (/[a-z]/.test(password)) score += 1;
- else feedback.push('Add lowercase letters');
-
- if (/[A-Z]/.test(password)) score += 1;
- else feedback.push('Add uppercase letters');
-
- if (/[0-9]/.test(password)) score += 1;
- else feedback.push('Add numbers');
-
- if (/[^a-zA-Z0-9]/.test(password)) score += 1;
- else feedback.push('Add symbols');
-
- // Common pattern penalties
- if (/(.)\1{2,}/.test(password)) {
- score -= 1;
- feedback.push('Avoid repeated characters');
- }
-
- if (
- /123|234|345|456|567|678|789|abc|bcd|cde|def/.test(password.toLowerCase())
- ) {
- score -= 1;
- feedback.push('Avoid sequential characters');
- }
-
- // Calculate entropy
- let charset = 0;
- if (/[a-z]/.test(password)) charset += 26;
- if (/[A-Z]/.test(password)) charset += 26;
- if (/[0-9]/.test(password)) charset += 10;
- if (/[^a-zA-Z0-9]/.test(password)) charset += 32;
-
- const entropy = Math.log2(Math.pow(charset, password.length));
-
- // Determine strength label
- let strength;
- if (score < 1) strength = 'Very Weak';
- else if (score < 2) strength = 'Weak';
- else if (score < 4) strength = 'Fair';
- else if (score < 6) strength = 'Good';
- else strength = 'Strong';
-
- return {
- score: Math.max(0, score),
- strength,
- feedback,
- entropy: Math.round(entropy),
- };
- }
-
- static generatePassphrase(options = {}) {
- const {
- wordCount = 4,
- separator = '-',
- capitalize = false,
- includeNumbers = false,
- } = options;
-
- const selectedWords = [];
-
- // Select random words
- for (let i = 0; i < wordCount; i++) {
- const randomIndex = Math.floor(Math.random() * this.WORDS.length);
- let word = this.WORDS[randomIndex];
-
- if (capitalize) {
- word = word.charAt(0).toUpperCase() + word.slice(1);
- }
-
- selectedWords.push(word);
- }
-
- let passphrase = selectedWords.join(separator);
-
- // Add numbers if requested
- if (includeNumbers) {
- const randomNum = Math.floor(Math.random() * 1000);
- passphrase += randomNum;
- }
-
- return passphrase;
- }
-}
-
-class PasswordGenerator {
- constructor() {
- this.init();
- }
-
- init() {
- // Initialize UI event listeners
- const generateBtn = document.getElementById('generate-password');
- const lengthSlider = document.getElementById('password-length');
- const lengthDisplay = document.getElementById('length-display');
- const copyBtn = document.getElementById('copy-password');
- const copyPassphraseBtn = document.getElementById('copy-passphrase');
- const regenerateBtn = document.getElementById('regenerate-password');
- const generateMultipleBtn = document.getElementById('generate-multiple');
- const passphraseBtn = document.getElementById('generate-passphrase');
- const passwordInput = document.getElementById('password-strength-input');
-
- // Tab functionality
- const tabButtons = document.querySelectorAll(
- '#password-generator .tab-btn'
- );
- tabButtons.forEach((button) => {
- button.addEventListener('click', () => {
- this.switchTab(button.dataset.tab);
- });
- });
-
- if (generateBtn) {
- generateBtn.addEventListener('click', () => this.generatePassword());
- }
-
- if (lengthSlider) {
- lengthSlider.addEventListener('input', (e) => {
- lengthDisplay.textContent = e.target.value;
- });
- }
-
- if (copyBtn) {
- copyBtn.addEventListener('click', () => this.copyToClipboard());
- }
-
- if (copyPassphraseBtn) {
- copyPassphraseBtn.addEventListener('click', () =>
- this.copyPassphraseToClipboard()
- );
- }
-
- if (regenerateBtn) {
- regenerateBtn.addEventListener('click', () => this.generatePassword());
- }
-
- if (generateMultipleBtn) {
- generateMultipleBtn.addEventListener('click', () =>
- this.generateMultiplePasswords()
- );
- }
-
- if (passphraseBtn) {
- passphraseBtn.addEventListener('click', () => this.generatePassphrase());
- }
-
- if (passwordInput) {
- passwordInput.addEventListener('input', (e) =>
- this.checkPasswordStrength(e.target.value, '2')
- );
- }
- }
-
- switchTab(tabName) {
- // Remove active class from all tabs and content
- document.querySelectorAll('#password-generator .tab-btn').forEach((btn) => {
- btn.classList.remove('active');
- });
- document
- .querySelectorAll('#password-generator .tab-content')
- .forEach((content) => {
- content.classList.remove('active');
- });
-
- // Add active class to selected tab and content
- document
- .querySelector(`#password-generator [data-tab="${tabName}"]`)
- .classList.add('active');
- document.getElementById(`${tabName}-tab`).classList.add('active');
- }
-
- generatePassword() {
- try {
- const options = this.getPasswordOptions();
- const password = PasswordUtils.generatePassword(options);
-
- this.displayPassword(password);
- this.checkPasswordStrength(password);
-
- window.app?.showMessage('Password generated successfully!', 'success');
- } catch (error) {
- window.app?.showMessage(error.message, 'error');
- }
- }
-
- generateMultiplePasswords() {
- try {
- const options = this.getPasswordOptions();
- const count =
- parseInt(document.getElementById('password-count').value) || 5;
- const passwords = PasswordUtils.generateMultiplePasswords(count, options);
-
- const output = document.getElementById('multiple-passwords-output');
- if (output) {
- output.value = passwords.join('\n');
- output.style.height = Math.min(passwords.length * 25, 200) + 'px';
- }
-
- window.app?.showMessage(`Generated ${count} passwords!`, 'success');
- } catch (error) {
- window.app?.showMessage(error.message, 'error');
- }
- }
-
- generatePassphrase() {
- try {
- const options = this.getPassphraseOptions();
- const passphrase = PasswordUtils.generatePassphrase(options);
-
- this.displayPassphrase(passphrase);
- this.checkPasswordStrength(passphrase);
-
- window.app?.showMessage('Passphrase generated successfully!', 'success');
- } catch (error) {
- window.app?.showMessage(error.message, 'error');
- }
- }
-
- getPasswordOptions() {
- return {
- length: parseInt(document.getElementById('password-length').value) || 12,
- includeLowercase: document.getElementById('include-lowercase').checked,
- includeUppercase: document.getElementById('include-uppercase').checked,
- includeNumbers: document.getElementById('include-numbers').checked,
- includeSymbols: document.getElementById('include-symbols').checked,
- excludeAmbiguous: document.getElementById('exclude-ambiguous').checked,
- };
- }
-
- getPassphraseOptions() {
- return {
- wordCount:
- parseInt(document.getElementById('passphrase-words').value) || 4,
- separator: document.getElementById('passphrase-separator').value || '-',
- capitalize: document.getElementById('passphrase-capitalize').checked,
- includeNumbers: document.getElementById('passphrase-numbers').checked,
- };
- }
-
- displayPassword(password) {
- const output = document.getElementById('password-output');
- if (output) {
- output.value = password;
- output.style.color = this.getPasswordStrengthColor(password);
- }
- }
-
- displayPassphrase(passphrase) {
- const output = document.getElementById('passphrase-output');
- if (output) {
- output.value = passphrase;
- output.style.color = this.getPasswordStrengthColor(passphrase);
- }
- }
-
- checkPasswordStrength(password, suffix = '') {
- if (!password) return;
-
- const result = PasswordUtils.calculatePasswordStrength(password);
-
- // Update strength indicator
- const strengthIndicator = document.getElementById(
- 'strength-indicator' + (suffix ? '-' + suffix : '')
- );
- const strengthText = document.getElementById(
- 'strength-text' + (suffix ? '-' + suffix : '')
- );
- const entropyText = document.getElementById(
- 'entropy-text' + (suffix ? '-' + suffix : '')
- );
- const feedbackList = document.getElementById(
- 'strength-feedback' + (suffix ? '-' + suffix : '')
- );
-
- if (strengthIndicator) {
- strengthIndicator.className = `strength-indicator ${result.strength
- .toLowerCase()
- .replace(' ', '-')}`;
- strengthIndicator.style.width = `${(result.score / 6) * 100}%`;
- }
-
- if (strengthText) {
- strengthText.textContent = result.strength;
- strengthText.className = `strength-text ${result.strength
- .toLowerCase()
- .replace(' ', '-')}`;
- }
-
- if (entropyText) {
- entropyText.textContent = `${result.entropy} bits`;
- }
-
- if (feedbackList) {
- feedbackList.innerHTML = '';
- result.feedback.forEach((feedback) => {
- const li = document.createElement('li');
- li.textContent = feedback;
- feedbackList.appendChild(li);
- });
- }
- }
-
- getPasswordStrengthColor(password) {
- const result = PasswordUtils.calculatePasswordStrength(password);
- const colorMap = {
- 'Very Weak': '#ff4757',
- Weak: '#ff6b81',
- Fair: '#ffa502',
- Good: '#2ed573',
- Strong: '#1e90ff',
- };
- return colorMap[result.strength] || '#666';
- }
-
- copyToClipboard() {
- const output = document.getElementById('password-output');
- if (output && output.value) {
- navigator.clipboard
- .writeText(output.value)
- .then(() => {
- window.app?.showMessage('Password copied to clipboard!', 'success');
- })
- .catch(() => {
- window.app?.showMessage('Failed to copy password', 'error');
- });
- }
- }
-
- copyPassphraseToClipboard() {
- const output = document.getElementById('passphrase-output');
- if (output && output.value) {
- navigator.clipboard
- .writeText(output.value)
- .then(() => {
- window.app?.showMessage('Passphrase copied to clipboard!', 'success');
- })
- .catch(() => {
- window.app?.showMessage('Failed to copy passphrase', 'error');
- });
- }
- }
-
- selectAllPasswords() {
- const output = document.getElementById('multiple-passwords-output');
- if (output && output.value) {
- output.select();
- output.setSelectionRange(0, 99999);
- }
- }
-}
-
-window.PasswordGenerator = new PasswordGenerator();
diff --git a/src/renderer/js/tools/qr-generator.js b/src/renderer/js/tools/qr-generator.js
deleted file mode 100644
index 46cdec19..00000000
--- a/src/renderer/js/tools/qr-generator.js
+++ /dev/null
@@ -1,382 +0,0 @@
-class QRGenerator {
- constructor() {
- this.init();
- }
-
- init() {
- const generateBtn = document.getElementById('generate-qr');
- const downloadBtn = document.getElementById('download-qr');
- const textInput = document.getElementById('qr-text');
-
- if (generateBtn) {
- generateBtn.addEventListener('click', () => this.generateQR());
- }
-
- if (downloadBtn) {
- downloadBtn.addEventListener('click', () => this.downloadQR());
- }
-
- if (textInput) {
- textInput.addEventListener('input', () => this.onInputChange());
- }
- }
-
- generateQR() {
- const text = document.getElementById('qr-text').value.trim();
- const size = parseInt(document.getElementById('qr-size').value);
- const errorLevel = document.getElementById('error-level').value;
-
- if (!text) {
- window.app?.showMessage('Please enter text to generate QR code.', 'error');
- return;
- }
-
- try {
- this.createQRCode(text, size, errorLevel);
- document.getElementById('download-qr').disabled = false;
- window.app?.showMessage('QR code generated successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Error generating QR code: ' + error.message, 'error');
- }
- }
-
- createQRCode(text, size, errorLevel) {
- const canvas = document.getElementById('qr-canvas');
- const ctx = canvas.getContext('2d');
-
- canvas.width = size;
- canvas.height = size;
-
- ctx.fillStyle = 'white';
- ctx.fillRect(0, 0, size, size);
-
- const qr = this.generateQRMatrix(text, errorLevel);
- const moduleSize = Math.floor(size / qr.length);
- const offset = (size - (qr.length * moduleSize)) / 2;
-
- ctx.fillStyle = 'black';
- for (let row = 0; row < qr.length; row++) {
- for (let col = 0; col < qr[row].length; col++) {
- if (qr[row][col]) {
- ctx.fillRect(
- offset + col * moduleSize,
- offset + row * moduleSize,
- moduleSize,
- moduleSize
- );
- }
- }
- }
-
- document.getElementById('qr-preview').style.display = 'block';
- }
-
- generateQRMatrix(text, errorLevel) {
- const version = this.determineVersion(text);
- const size = 17 + 4 * version;
- const matrix = Array(size).fill().map(() => Array(size).fill(false));
-
- this.addFinderPatterns(matrix, size);
- this.addSeparators(matrix, size);
- this.addDarkModule(matrix, version);
- this.addTimingPatterns(matrix, size);
-
- if (version >= 2) {
- this.addAlignmentPatterns(matrix, version);
- }
-
- if (version >= 7) {
- this.addVersionInfo(matrix, version);
- }
-
- const data = this.encodeData(text, version, errorLevel);
- this.addDataToMatrix(matrix, data);
-
- return matrix;
- }
-
- determineVersion(text) {
- const length = text.length;
- if (length <= 17) return 1;
- if (length <= 32) return 2;
- if (length <= 53) return 3;
- if (length <= 78) return 4;
- return 5;
- }
-
- addFinderPatterns(matrix, size) {
- const pattern = [
- [1,1,1,1,1,1,1],
- [1,0,0,0,0,0,1],
- [1,0,1,1,1,0,1],
- [1,0,1,1,1,0,1],
- [1,0,1,1,1,0,1],
- [1,0,0,0,0,0,1],
- [1,1,1,1,1,1,1]
- ];
-
- const positions = [
- [0, 0],
- [0, size - 7],
- [size - 7, 0]
- ];
-
- positions.forEach(([startRow, startCol]) => {
- for (let row = 0; row < 7; row++) {
- for (let col = 0; col < 7; col++) {
- matrix[startRow + row][startCol + col] = pattern[row][col] === 1;
- }
- }
- });
- }
-
- addSeparators(matrix, size) {
- for (let i = 0; i < 8; i++) {
- matrix[7][i] = false;
- matrix[i][7] = false;
- matrix[7][size - 8 + i] = false;
- matrix[i][size - 8] = false;
- matrix[size - 8][i] = false;
- matrix[size - 8 + i][7] = false;
- }
- }
-
- addDarkModule(matrix, version) {
- const size = matrix.length;
- matrix[4 * version + 9][8] = true;
- }
-
- addTimingPatterns(matrix, size) {
- for (let i = 8; i < size - 8; i++) {
- matrix[6][i] = (i % 2) === 0;
- matrix[i][6] = (i % 2) === 0;
- }
- }
-
- addAlignmentPatterns(matrix, version) {
- const positions = this.getAlignmentPatternPositions(version);
-
- positions.forEach(pos => {
- const [centerRow, centerCol] = pos;
- const pattern = [
- [1,1,1,1,1],
- [1,0,0,0,1],
- [1,0,1,0,1],
- [1,0,0,0,1],
- [1,1,1,1,1]
- ];
-
- for (let row = 0; row < 5; row++) {
- for (let col = 0; col < 5; col++) {
- const matrixRow = centerRow - 2 + row;
- const matrixCol = centerCol - 2 + col;
- if (matrixRow >= 0 && matrixRow < matrix.length &&
- matrixCol >= 0 && matrixCol < matrix.length) {
- matrix[matrixRow][matrixCol] = pattern[row][col] === 1;
- }
- }
- }
- });
- }
-
- getAlignmentPatternPositions(version) {
- const positions = {
- 2: [[6, 18]],
- 3: [[6, 22]],
- 4: [[6, 26]],
- 5: [[6, 30]]
- };
- return positions[version] || [];
- }
-
- addVersionInfo() {
- }
-
- encodeData(text, version, errorLevel) {
- const mode = '0100';
- const charCount = text.length.toString(2).padStart(8, '0');
-
- let data = mode + charCount;
-
- for (let i = 0; i < text.length; i++) {
- data += text.charCodeAt(i).toString(2).padStart(8, '0');
- }
-
- data += '0000';
-
- const capacities = {
- 1: { L: 152, M: 128, Q: 104, H: 72 },
- 2: { L: 272, M: 224, Q: 176, H: 128 },
- 3: { L: 440, M: 352, Q: 272, H: 208 },
- 4: { L: 640, M: 512, Q: 384, H: 288 },
- 5: { L: 864, M: 688, Q: 496, H: 368 }
- };
-
- const capacity = capacities[version][errorLevel];
-
- while (data.length < capacity) {
- data += data.length % 16 < 8 ? '11101100' : '00010001';
- }
-
- return data.substring(0, capacity);
- }
-
- addDataToMatrix(matrix, data) {
- let bitIndex = 0;
- let up = true;
- const size = matrix.length;
-
- for (let col = size - 1; col > 0; col -= 2) {
- if (col === 6) col--;
-
- for (let i = 0; i < size; i++) {
- for (let c = 0; c < 2; c++) {
- const currentCol = col - c;
- const currentRow = up ? size - 1 - i : i;
-
- if (!this.isReserved(matrix, currentRow, currentCol, size)) {
- if (bitIndex < data.length) {
- matrix[currentRow][currentCol] = data[bitIndex] === '1';
- bitIndex++;
- }
- }
- }
- }
- up = !up;
- }
- }
-
- isReserved(_, row, col, size) {
- if (row < 9 && col < 9) return true;
- if (row < 9 && col >= size - 8) return true;
- if (row >= size - 8 && col < 9) return true;
- if (row === 6 || col === 6) return true;
- if (row === 4 * Math.floor((size - 17) / 4) + 9 && col === 8) return true;
-
- return false;
- }
-
- downloadQR() {
- const canvas = document.getElementById('qr-canvas');
- if (!canvas.width) {
- window.app?.showMessage('Please generate a QR code first.', 'error');
- return;
- }
-
- const link = document.createElement('a');
- link.download = 'qrcode.png';
- link.href = canvas.toDataURL();
- link.click();
-
- window.app?.showMessage('QR code downloaded!', 'success');
- }
-
- onInputChange() {
- document.getElementById('download-qr').disabled = true;
- document.getElementById('qr-preview').style.display = 'none';
- }
-
- generateQRFromUrl(url) {
- document.getElementById('qr-text').value = url;
- this.generateQR();
- }
-}
-
-window.QRGenerator = new QRGenerator();
-
-const qrStyles = `
-#qr-text {
- width: 100%;
- min-height: 100px;
- padding: 15px;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- font-size: 14px;
- line-height: 1.5;
- resize: vertical;
- margin-bottom: 20px;
-}
-
-#qr-text:focus {
- outline: none;
- border-color: #667eea;
-}
-
-.qr-options {
- display: flex;
- gap: 30px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-.option-group {
- display: flex;
- flex-direction: column;
- gap: 8px;
-}
-
-.option-group label {
- font-weight: 500;
- color: #1d1d1f;
- font-size: 14px;
-}
-
-.option-group select {
- padding: 8px 12px;
- border: 2px solid #f0f0f0;
- border-radius: 6px;
- font-size: 14px;
- min-width: 150px;
-}
-
-.option-group select:focus {
- outline: none;
- border-color: #667eea;
-}
-
-.qr-preview {
- text-align: center;
- margin-top: 30px;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
- border: 1px solid #e0e0e0;
-}
-
-#qr-canvas {
- border: 1px solid #d0d0d0;
- border-radius: 8px;
- background: white;
- max-width: 100%;
- height: auto;
-}
-
-.controls {
- display: flex;
- gap: 15px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-#download-qr:disabled {
- opacity: 0.5;
- cursor: not-allowed;
-}
-
-@media (max-width: 768px) {
- .qr-options {
- flex-direction: column;
- gap: 15px;
- }
-
- .option-group select {
- min-width: auto;
- width: 100%;
- }
-}
-`;
-
-const qrGeneratorStyle = document.createElement('style');
-style.textContent = qrStyles;
-document.head.appendChild(qrGeneratorStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/regex-generator.js b/src/renderer/js/tools/regex-generator.js
deleted file mode 100644
index 89108004..00000000
--- a/src/renderer/js/tools/regex-generator.js
+++ /dev/null
@@ -1,503 +0,0 @@
-class RegexGenerator {
- constructor() {
- this.init();
- }
-
- init() {
- const testBtn = document.getElementById('test-regex');
- const clearBtn = document.getElementById('clear-regex');
- const patternInput = document.getElementById('regex-pattern');
- const flagsInput = document.getElementById('regex-flags');
- const testInput = document.getElementById('test-string');
-
- if (testBtn) {
- testBtn.addEventListener('click', () => this.testRegex());
- }
-
- if (clearBtn) {
- clearBtn.addEventListener('click', () => this.clearAll());
- }
-
- if (patternInput || flagsInput || testInput) {
- [patternInput, flagsInput, testInput].forEach(input => {
- if (input) {
- input.addEventListener('input', () => this.clearResults());
- }
- });
- }
- }
-
- testRegex() {
- const pattern = document.getElementById('regex-pattern').value;
- const flags = document.getElementById('regex-flags').value;
- const testString = document.getElementById('test-string').value;
-
- if (!pattern) {
- window.app?.showMessage('Please enter a regex pattern.', 'error');
- return;
- }
-
- if (!testString) {
- window.app?.showMessage('Please enter text to test against.', 'error');
- return;
- }
-
- try {
- const regex = new RegExp(pattern, flags);
- this.displayMatches(regex, testString);
- this.displayExplanation(pattern, flags);
- window.app?.showMessage('Regex tested successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Invalid regex pattern: ' + error.message, 'error');
- this.clearResults();
- }
- }
-
- displayMatches(regex, testString) {
- const matchesContainer = document.getElementById('matches-list');
- const matchesSection = document.getElementById('regex-matches');
- const highlightedSection = document.getElementById('highlighted-section');
- const highlightedText = document.getElementById('highlighted-text');
-
- const matches = [];
-
- if (regex.global) {
- let match;
- while ((match = regex.exec(testString)) !== null) {
- matches.push({
- match: match[0],
- index: match.index,
- groups: match.slice(1)
- });
-
- if (match.index === regex.lastIndex) {
- break;
- }
- }
- } else {
- const match = regex.exec(testString);
- if (match) {
- matches.push({
- match: match[0],
- index: match.index,
- groups: match.slice(1)
- });
- }
- }
-
- // Show the sections
- matchesSection.style.display = 'block';
- highlightedSection.style.display = 'block';
-
- if (matches.length === 0) {
- matchesContainer.innerHTML = 'No matches found
';
- highlightedText.textContent = testString;
- return;
- }
-
- // Create highlighted text version
- let highlightedHTML = '';
- let lastIndex = 0;
-
- matches.forEach(match => {
- highlightedHTML += this.escapeHtml(testString.slice(lastIndex, match.index));
- highlightedHTML += `${this.escapeHtml(match.match)} `;
- lastIndex = match.index + match.match.length;
- });
-
- highlightedHTML += this.escapeHtml(testString.slice(lastIndex));
- highlightedText.innerHTML = highlightedHTML;
-
- // Create matches list
- let html = `${matches.length} match${matches.length > 1 ? 'es' : ''} found
`;
-
- matches.forEach((match, index) => {
- html += `
-
-
-
${this.escapeHtml(match.match)}
- `;
-
- if (match.groups.length > 0) {
- html += '
';
- match.groups.forEach((group, groupIndex) => {
- if (group !== undefined) {
- html += `Group ${groupIndex + 1}: "${this.escapeHtml(group)}" `;
- }
- });
- html += '
';
- }
-
- html += '
';
- });
-
- matchesContainer.innerHTML = html;
- }
-
-
- displayExplanation(pattern, flags) {
- const explanationContainer = document.getElementById('explanation-text');
- const explanationSection = document.getElementById('regex-explanation');
-
- // Show the explanation section
- explanationSection.style.display = 'block';
-
- let explanation = ``;
- explanation += `Pattern: /${pattern}/${flags || ''} `;
- explanation += `Flags: ${this.explainFlags(flags)}`;
- explanation += `
`;
-
- explanation += this.explainPattern(pattern);
-
- explanationContainer.innerHTML = explanation;
- }
-
- explainFlags(flags) {
- if (!flags) return 'None';
-
- const flagExplanations = {
- 'g': 'Global (find all matches)',
- 'i': 'Case insensitive',
- 'm': 'Multiline',
- 's': 'Dot matches newlines',
- 'u': 'Unicode',
- 'y': 'Sticky'
- };
-
- return flags.split('').map(flag => flagExplanations[flag] || flag).join(', ');
- }
-
- explainPattern(pattern) {
- let result = '';
-
- const tokens = this.tokenizePattern(pattern);
- tokens.forEach(token => {
- const explanation = this.getTokenExplanation(token);
- result += `
- ${this.escapeHtml(token)}
- ${explanation}
-
`;
- });
-
- result += '
';
- return result;
- }
-
- tokenizePattern(pattern) {
- const tokens = [];
- let i = 0;
-
- while (i < pattern.length) {
- const char = pattern[i];
-
- if (char === '\\' && i + 1 < pattern.length) {
- tokens.push(pattern.slice(i, i + 2));
- i += 2;
- } else if (char === '[') {
- let j = i + 1;
- while (j < pattern.length && pattern[j] !== ']') {
- if (pattern[j] === '\\') j++;
- j++;
- }
- tokens.push(pattern.slice(i, j + 1));
- i = j + 1;
- } else if (char === '(') {
- let j = i + 1;
- let depth = 1;
- while (j < pattern.length && depth > 0) {
- if (pattern[j] === '\\') {
- j++;
- } else if (pattern[j] === '(') {
- depth++;
- } else if (pattern[j] === ')') {
- depth--;
- }
- j++;
- }
- tokens.push(pattern.slice(i, j));
- i = j;
- } else {
- tokens.push(char);
- i++;
- }
- }
-
- return tokens;
- }
-
- getTokenExplanation(token) {
- const explanations = {
- '.': 'Matches any character except newline',
- '*': 'Matches zero or more of the preceding element',
- '+': 'Matches one or more of the preceding element',
- '?': 'Matches zero or one of the preceding element',
- '^': 'Matches the start of a string',
- '$': 'Matches the end of a string',
- '|': 'Alternation - matches either expression before or after',
- '\\d': 'Matches any digit (0-9)',
- '\\D': 'Matches any non-digit',
- '\\w': 'Matches any word character (a-z, A-Z, 0-9, _)',
- '\\W': 'Matches any non-word character',
- '\\s': 'Matches any whitespace character',
- '\\S': 'Matches any non-whitespace character',
- '\\b': 'Word boundary',
- '\\B': 'Non-word boundary',
- '\\n': 'Newline character',
- '\\t': 'Tab character',
- '\\r': 'Carriage return'
- };
-
- if (explanations[token]) {
- return explanations[token];
- }
-
- if (token.startsWith('[') && token.endsWith(']')) {
- return `Character class: matches any character in the set`;
- }
-
- if (token.startsWith('(') && token.endsWith(')')) {
- return `Capturing group`;
- }
-
- if (token.startsWith('{') && token.endsWith('}')) {
- return `Quantifier: specifies number of matches`;
- }
-
- if (token.startsWith('\\')) {
- return `Escaped character: ${token.slice(1)}`;
- }
-
- return `Literal character: ${token}`;
- }
-
- escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-
- clearResults() {
- document.getElementById('matches-list').innerHTML = '';
- document.getElementById('explanation-text').innerHTML = '';
- document.getElementById('highlighted-text').innerHTML = '';
-
- // Hide the result sections
- document.getElementById('regex-matches').style.display = 'none';
- document.getElementById('regex-explanation').style.display = 'none';
- document.getElementById('highlighted-section').style.display = 'none';
- }
-
- clearAll() {
- document.getElementById('regex-pattern').value = '';
- document.getElementById('regex-flags').value = '';
- document.getElementById('test-string').value = '';
- this.clearResults();
- window.app?.showMessage('Regex cleared!', 'info');
- }
-}
-
-window.RegexGenerator = new RegexGenerator();
-
-const regexStyles = `
-.regex-input-group {
- display: flex;
- align-items: center;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- overflow: hidden;
- margin-bottom: 15px;
-}
-
-.regex-delimiter {
- background: #f8f9fa;
- padding: 12px 8px;
- color: #666;
- font-family: 'Monaco', 'Consolas', monospace;
- font-weight: bold;
- font-size: 16px;
-}
-
-#regex-pattern {
- flex: 1;
- border: none;
- outline: none;
- padding: 12px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
-}
-
-#regex-flags {
- border: none;
- outline: none;
- padding: 12px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 14px;
- background: #fafafa;
-}
-
-.regex-input-group:focus-within {
- border-color: #667eea;
-}
-
-.test-input label,
-.regex-input label {
- display: block;
- font-weight: 500;
- color: #1d1d1f;
- margin-bottom: 8px;
-}
-
-#test-string {
- position: relative;
- z-index: 2;
- background: transparent;
-}
-
-.regex-results {
- margin-top: 30px;
-}
-
-.regex-results h3 {
- margin-top: 0;
- margin-bottom: 15px;
- color: #1d1d1f;
-}
-
-.matches,
-.explanation {
- background: #f8f9fa;
- border-radius: 8px;
- padding: 20px;
- margin: 20px 0;
-}
-
-.no-matches {
- color: #86868b;
- font-style: italic;
- margin: 0;
-}
-
-.match-count {
- color: #155724;
- font-weight: 500;
- margin: 0 0 15px 0;
-}
-
-.match-item {
- background: white;
- border: 1px solid #e0e0e0;
- border-radius: 6px;
- margin: 10px 0;
- padding: 15px;
-}
-
-.match-header {
- font-weight: 500;
- color: #666;
- font-size: 12px;
- margin-bottom: 8px;
-}
-
-.match-text {
- font-family: 'Monaco', 'Consolas', monospace;
- background: #e8f4fd;
- padding: 8px 12px;
- border-radius: 4px;
- border-left: 3px solid #667eea;
- word-break: break-all;
-}
-
-.match-groups {
- margin-top: 10px;
- font-size: 14px;
-}
-
-.group {
- display: inline-block;
- background: #f0f8ff;
- padding: 2px 8px;
- border-radius: 12px;
- margin: 2px 5px 2px 0;
- font-size: 12px;
- color: #0066cc;
- border: 1px solid #cce7ff;
-}
-
-.regex-match {
- background-color: #fff3cd;
- border: 1px solid #ffeaa7;
- border-radius: 2px;
- padding: 1px 2px;
-}
-
-.pattern-info {
- background: white;
- padding: 15px;
- border-radius: 6px;
- border: 1px solid #e0e0e0;
- margin-bottom: 15px;
- line-height: 1.5;
-}
-
-.pattern-breakdown {
- background: white;
- border: 1px solid #e0e0e0;
- border-radius: 6px;
- padding: 15px;
-}
-
-.token-explanation {
- display: flex;
- align-items: flex-start;
- padding: 8px 0;
- border-bottom: 1px solid #f0f0f0;
-}
-
-.token-explanation:last-child {
- border-bottom: none;
-}
-
-.token {
- background: #f4f4f4;
- padding: 2px 6px;
- border-radius: 3px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 13px;
- margin-right: 15px;
- min-width: 50px;
- text-align: center;
-}
-
-.token-desc {
- color: #555;
- flex: 1;
-}
-
-.cheatsheet-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 10px;
- margin-top: 15px;
-}
-
-.cheat-item {
- background: white;
- padding: 8px 12px;
- border-radius: 4px;
- border: 1px solid #e0e0e0;
- font-size: 13px;
-}
-
-.cheat-item code {
- background: #f4f4f4;
- padding: 2px 4px;
- border-radius: 2px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-weight: bold;
- color: #d73a49;
-}
-`;
-
-const regexGeneratorStyle = document.createElement('style');
-style.textContent = regexStyles;
-document.head.appendChild(regexGeneratorStyle);
\ No newline at end of file
diff --git a/src/renderer/js/tools/sql-formatter.js b/src/renderer/js/tools/sql-formatter.js
deleted file mode 100644
index c24e0a31..00000000
--- a/src/renderer/js/tools/sql-formatter.js
+++ /dev/null
@@ -1,301 +0,0 @@
-class SQLFormatter {
- constructor() {
- this.keywords = [
- 'SELECT',
- 'FROM',
- 'WHERE',
- 'INSERT',
- 'UPDATE',
- 'DELETE',
- 'CREATE',
- 'DROP',
- 'ALTER',
- 'TABLE',
- 'INDEX',
- 'VIEW',
- 'DATABASE',
- 'SCHEMA',
- 'PROCEDURE',
- 'FUNCTION',
- 'TRIGGER',
- 'CONSTRAINT',
- 'PRIMARY',
- 'FOREIGN',
- 'KEY',
- 'REFERENCES',
- 'UNIQUE',
- 'NOT',
- 'NULL',
- 'DEFAULT',
- 'CHECK',
- 'INNER',
- 'LEFT',
- 'RIGHT',
- 'FULL',
- 'OUTER',
- 'JOIN',
- 'ON',
- 'USING',
- 'UNION',
- 'ALL',
- 'GROUP',
- 'BY',
- 'ORDER',
- 'HAVING',
- 'LIMIT',
- 'OFFSET',
- 'AS',
- 'ASC',
- 'DESC',
- 'DISTINCT',
- 'COUNT',
- 'SUM',
- 'AVG',
- 'MIN',
- 'MAX',
- 'CASE',
- 'WHEN',
- 'THEN',
- 'ELSE',
- 'END',
- 'IF',
- 'EXISTS',
- 'IN',
- 'LIKE',
- 'BETWEEN',
- 'AND',
- 'OR',
- 'IS',
- 'TRUE',
- 'FALSE',
- 'CAST',
- 'CONVERT',
- 'INT',
- 'INTEGER',
- 'VARCHAR',
- 'CHAR',
- 'TEXT',
- 'DATE',
- 'DATETIME',
- 'TIMESTAMP',
- 'DECIMAL',
- 'FLOAT',
- 'DOUBLE',
- 'BOOLEAN',
- 'BLOB',
- 'CLOB',
- ];
- this.init();
- }
-
- init() {
- const formatBtn = document.getElementById('format-sql');
- const minifyBtn = document.getElementById('minify-sql');
- const clearBtn = document.getElementById('clear-sql');
- const inputTextarea = document.getElementById('sql-input');
-
- if (formatBtn) {
- formatBtn.addEventListener('click', () => this.formatSQL());
- }
-
- if (minifyBtn) {
- minifyBtn.addEventListener('click', () => this.minifySQL());
- }
-
- if (clearBtn) {
- clearBtn.addEventListener('click', () => this.clearAll());
- }
-
- if (inputTextarea) {
- inputTextarea.addEventListener('input', () => this.clearOutput());
- }
- }
-
- formatSQL() {
- const input = document.getElementById('sql-input').value.trim();
- const output = document.getElementById('sql-output');
- const uppercaseKeywords =
- document.getElementById('uppercase-keywords').checked;
- const useTabs = document.getElementById('indent-tabs').checked;
-
- if (!input) {
- window.app?.showMessage('Please enter SQL to format.', 'error');
- return;
- }
-
- try {
- const formatted = this.formatSQLQuery(input, {
- uppercaseKeywords,
- useTabs,
- });
- output.textContent = formatted;
- window.app?.showMessage('SQL formatted successfully!', 'success');
- } catch (error) {
- window.app?.showMessage(
- 'Error formatting SQL: ' + error.message,
- 'error'
- );
- }
- }
-
- minifySQL() {
- const input = document.getElementById('sql-input').value.trim();
- const output = document.getElementById('sql-output');
-
- if (!input) {
- window.app?.showMessage('Please enter SQL to minify.', 'error');
- return;
- }
-
- try {
- const minified = this.minifySQLQuery(input);
- output.textContent = minified;
- window.app?.showMessage('SQL minified successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Error minifying SQL: ' + error.message, 'error');
- }
- }
-
- formatSQLQuery(sql, options = {}) {
- const { uppercaseKeywords = true, useTabs = true } = options;
- const indent = useTabs ? '\t' : ' ';
-
- let formatted = sql;
- let indentLevel = 0;
-
- formatted = formatted.replace(/\s+/g, ' ').trim();
-
- if (uppercaseKeywords) {
- this.keywords.forEach((keyword) => {
- const regex = new RegExp('\\b' + keyword + '\\b', 'gi');
- formatted = formatted.replace(regex, keyword.toUpperCase());
- });
- }
-
- formatted = formatted.replace(
- /\s*,\s*/g,
- ',\n' + indent.repeat(indentLevel + 1)
- );
-
- formatted = formatted.replace(/\bSELECT\b/gi, '\nSELECT');
- formatted = formatted.replace(/\bFROM\b/gi, '\nFROM');
- formatted = formatted.replace(/\bWHERE\b/gi, '\nWHERE');
- formatted = formatted.replace(/\bINNER\s+JOIN\b/gi, '\nINNER JOIN');
- formatted = formatted.replace(/\bLEFT\s+JOIN\b/gi, '\nLEFT JOIN');
- formatted = formatted.replace(/\bRIGHT\s+JOIN\b/gi, '\nRIGHT JOIN');
- formatted = formatted.replace(
- /\bFULL\s+OUTER\s+JOIN\b/gi,
- '\nFULL OUTER JOIN'
- );
- formatted = formatted.replace(/\bGROUP\s+BY\b/gi, '\nGROUP BY');
- formatted = formatted.replace(/\bORDER\s+BY\b/gi, '\nORDER BY');
- formatted = formatted.replace(/\bHAVING\b/gi, '\nHAVING');
- formatted = formatted.replace(/\bUNION\b/gi, '\nUNION');
- formatted = formatted.replace(/\bINSERT\s+INTO\b/gi, '\nINSERT INTO');
- formatted = formatted.replace(/\bUPDATE\b/gi, '\nUPDATE');
- formatted = formatted.replace(/\bSET\b/gi, '\nSET');
- formatted = formatted.replace(/\bDELETE\s+FROM\b/gi, '\nDELETE FROM');
-
- formatted = formatted.replace(/\bAND\b/gi, '\n' + indent + 'AND');
- formatted = formatted.replace(/\bOR\b/gi, '\n' + indent + 'OR');
-
- formatted = formatted.replace(/\(\s*/g, '(\n' + indent);
- formatted = formatted.replace(/\s*\)/g, '\n)');
-
- const lines = formatted.split('\n');
- let result = [];
- let currentIndent = 0;
-
- for (let line of lines) {
- line = line.trim();
- if (!line) continue;
-
- if (
- line.endsWith('(') ||
- line.match(/\b(SELECT|FROM|WHERE|JOIN|GROUP BY|ORDER BY|HAVING)\b/i)
- ) {
- result.push(indent.repeat(currentIndent) + line);
- if (line.endsWith('(')) {
- currentIndent++;
- }
- } else if (line === ')') {
- currentIndent = Math.max(0, currentIndent - 1);
- result.push(indent.repeat(currentIndent) + line);
- } else if (line.startsWith('AND') || line.startsWith('OR')) {
- result.push(indent.repeat(currentIndent + 1) + line);
- } else {
- result.push(indent.repeat(currentIndent) + line);
- }
- }
-
- return result
- .join('\n')
- .replace(/\n{3,}/g, '\n\n')
- .trim();
- }
-
- minifySQLQuery(sql) {
- return sql
- .replace(/\s+/g, ' ')
- .replace(/\s*,\s*/g, ',')
- .replace(/\s*\(\s*/g, '(')
- .replace(/\s*\)\s*/g, ')')
- .replace(/\s*=\s*/g, '=')
- .replace(/\s*<\s*/g, '<')
- .replace(/\s*>\s*/g, '>')
- .replace(/\s*;\s*/g, ';')
- .trim();
- }
-
- clearAll() {
- document.getElementById('sql-input').value = '';
- this.clearOutput();
- window.app?.showMessage('SQL cleared!', 'info');
- }
-
- clearOutput() {
- document.getElementById('sql-output').textContent = '';
- }
-}
-
-window.SQLFormatter = new SQLFormatter();
-
-const sqlStyles = `
-.sql-options {
- display: flex;
- gap: 20px;
- margin: 15px 0;
- flex-wrap: wrap;
-}
-
-.sql-options label {
- display: flex;
- align-items: center;
- gap: 8px;
- font-size: 14px;
- color: #1d1d1f;
- cursor: pointer;
-}
-
-.sql-options input[type="checkbox"] {
- margin: 0;
-}
-
-#sql-output {
- background-color: #f8f9fa;
- border: 2px solid #f0f0f0;
- border-radius: 8px;
- padding: 15px;
- font-family: 'Monaco', 'Consolas', monospace;
- font-size: 13px;
- line-height: 1.4;
- white-space: pre;
- overflow: auto;
- max-height: 400px;
- min-height: 200px;
-}
-`;
-
-const sqlFormatterStyle = document.createElement('style');
-sqlFormatterStyle.textContent = sqlFormatterStyles;
-document.head.appendChild(sqlFormatterStyle);
diff --git a/src/renderer/js/tools/text-compare.js b/src/renderer/js/tools/text-compare.js
deleted file mode 100644
index 4520ba2f..00000000
--- a/src/renderer/js/tools/text-compare.js
+++ /dev/null
@@ -1,372 +0,0 @@
-class TextCompare {
- constructor() {
- this.init();
- }
-
- init() {
- const compareBtn = document.getElementById('compare-texts');
- const clearBtn = document.getElementById('clear-comparison');
-
- if (compareBtn) {
- compareBtn.addEventListener('click', () => this.compareTexts());
- }
-
- if (clearBtn) {
- clearBtn.addEventListener('click', () => this.clearComparison());
- }
- }
-
- compareTexts() {
- const text1 = document.getElementById('text1').value;
- const text2 = document.getElementById('text2').value;
- const caseSensitive = document.getElementById('case-sensitive').checked;
- const ignoreWhitespace = document.getElementById('ignore-whitespace').checked;
- const resultDiv = document.getElementById('comparison-result');
-
- if (!text1.trim() && !text2.trim()) {
- resultDiv.innerHTML = 'Please enter text in both fields to compare.
';
- return;
- }
-
- if (!text1.trim() || !text2.trim()) {
- resultDiv.innerHTML = 'Please enter text in both fields to compare.
';
- return;
- }
-
- const options = { caseSensitive, ignoreWhitespace };
- const differences = this.getDifferences(text1, text2, options);
- const stats = this.getComparisonStats(text1, text2, differences, options);
-
- if (differences.length === 0) {
- resultDiv.innerHTML = `
-
-
Comparison Results
-
-
- Text 1 Length
- ${stats.text1Length} characters
-
-
- Text 2 Length
- ${stats.text2Length} characters
-
-
- Similarity
- ${stats.similarity}%
-
-
- Status
- Identical
-
-
-
-
-
Texts are identical!
-
No differences were found between the two texts.
-
- `;
- } else {
- resultDiv.innerHTML = `
-
-
Comparison Results
-
-
- Text 1 Length
- ${stats.text1Length} characters
-
-
- Text 2 Length
- ${stats.text2Length} characters
-
-
- Similarity
- ${stats.similarity}%
-
-
- Differences
- ${differences.length} changes
-
-
-
-
-
-
Text 1
-
${this.highlightDifferences(text1, differences, 'left')}
-
-
-
Text 2
-
${this.highlightDifferences(text2, differences, 'right')}
-
-
- `;
- }
-
- window.app?.showMessage('Text comparison completed!', 'success');
- }
-
- getDifferences(text1, text2, options = {}) {
- let processedText1 = text1;
- let processedText2 = text2;
-
- // Apply preprocessing based on options
- if (!options.caseSensitive) {
- processedText1 = processedText1.toLowerCase();
- processedText2 = processedText2.toLowerCase();
- }
-
- if (options.ignoreWhitespace) {
- processedText1 = processedText1.replace(/\s+/g, ' ').trim();
- processedText2 = processedText2.replace(/\s+/g, ' ').trim();
- }
-
- const lines1 = processedText1.split('\n');
- const lines2 = processedText2.split('\n');
- const originalLines1 = text1.split('\n');
- const originalLines2 = text2.split('\n');
- const differences = [];
-
- const maxLines = Math.max(lines1.length, lines2.length);
-
- for (let i = 0; i < maxLines; i++) {
- const line1 = lines1[i] || '';
- const line2 = lines2[i] || '';
- const originalLine1 = originalLines1[i] || '';
- const originalLine2 = originalLines2[i] || '';
-
- if (line1 !== line2) {
- differences.push({
- line: i,
- text1: originalLine1,
- text2: originalLine2,
- type: this.getDifferenceType(originalLine1, originalLine2)
- });
- }
- }
-
- return differences;
- }
-
- getDifferenceType(line1, line2) {
- if (!line1) return 'added';
- if (!line2) return 'removed';
- return 'modified';
- }
-
- getComparisonStats(text1, text2, differences, options = {}) {
- const text1Length = text1.length;
- const text2Length = text2.length;
-
- let processedText1 = text1;
- let processedText2 = text2;
-
- // Apply same preprocessing for similarity calculation
- if (!options.caseSensitive) {
- processedText1 = processedText1.toLowerCase();
- processedText2 = processedText2.toLowerCase();
- }
-
- if (options.ignoreWhitespace) {
- processedText1 = processedText1.replace(/\s+/g, ' ').trim();
- processedText2 = processedText2.replace(/\s+/g, ' ').trim();
- }
-
- const similarity = this.calculateSimilarity(processedText1, processedText2);
-
- return {
- text1Length,
- text2Length,
- similarity: Math.round(similarity * 100),
- differences: differences.length
- };
- }
-
- calculateSimilarity(text1, text2) {
- const longer = text1.length > text2.length ? text1 : text2;
- const shorter = text1.length > text2.length ? text2 : text1;
-
- if (longer.length === 0) {
- return 1.0;
- }
-
- const editDistance = this.levenshteinDistance(longer, shorter);
- return (longer.length - editDistance) / longer.length;
- }
-
- levenshteinDistance(str1, str2) {
- const matrix = [];
-
- for (let i = 0; i <= str2.length; i++) {
- matrix[i] = [i];
- }
-
- for (let j = 0; j <= str1.length; j++) {
- matrix[0][j] = j;
- }
-
- for (let i = 1; i <= str2.length; i++) {
- for (let j = 1; j <= str1.length; j++) {
- if (str2.charAt(i - 1) === str1.charAt(j - 1)) {
- matrix[i][j] = matrix[i - 1][j - 1];
- } else {
- matrix[i][j] = Math.min(
- matrix[i - 1][j - 1] + 1,
- matrix[i][j - 1] + 1,
- matrix[i - 1][j] + 1
- );
- }
- }
- }
-
- return matrix[str2.length][str1.length];
- }
-
- highlightDifferences(text, differences, side) {
- const lines = text.split('\n');
- const highlightedLines = [];
-
- for (let i = 0; i < lines.length; i++) {
- const diff = differences.find(d => d.line === i);
- if (diff) {
- let className = '';
- let lineContent = '';
-
- if (diff.type === 'added' && side === 'right') {
- className = 'diff-added';
- lineContent = this.escapeHtml(lines[i] || '');
- } else if (diff.type === 'removed' && side === 'left') {
- className = 'diff-removed';
- lineContent = this.escapeHtml(lines[i] || '');
- } else if (diff.type === 'modified') {
- className = 'diff-modified';
- // For modified lines, highlight character-level differences
- const currentLine = lines[i] || '';
- const otherLine = side === 'left' ? diff.text2 : diff.text1;
- lineContent = this.highlightCharacterDifferences(currentLine, otherLine);
- }
-
- const lineNumber = `${i + 1}`.padStart(3, ' ');
- highlightedLines.push(`${lineNumber} ${lineContent}
`);
- } else {
- const lineNumber = `${i + 1}`.padStart(3, ' ');
- highlightedLines.push(`${lineNumber} ${this.escapeHtml(lines[i] || '')}
`);
- }
- }
-
- return highlightedLines.join('');
- }
-
- highlightCharacterDifferences(currentLine, otherLine) {
- if (!currentLine && !otherLine) return '';
- if (!currentLine) return this.escapeHtml(currentLine);
- if (!otherLine) return this.escapeHtml(currentLine);
-
- // Use a more sophisticated approach to find the longest common subsequence
- const matrix = this.buildDiffMatrix(currentLine, otherLine);
- const diffs = this.extractDiffs(currentLine, otherLine, matrix);
-
- return this.renderCharacterDiffs(diffs);
- }
-
- buildDiffMatrix(str1, str2) {
- const matrix = [];
- const len1 = str1.length;
- const len2 = str2.length;
-
- // Initialize matrix
- for (let i = 0; i <= len1; i++) {
- matrix[i] = [];
- for (let j = 0; j <= len2; j++) {
- matrix[i][j] = 0;
- }
- }
-
- // Fill the matrix
- for (let i = 1; i <= len1; i++) {
- for (let j = 1; j <= len2; j++) {
- if (str1[i - 1] === str2[j - 1]) {
- matrix[i][j] = matrix[i - 1][j - 1] + 1;
- } else {
- matrix[i][j] = Math.max(matrix[i - 1][j], matrix[i][j - 1]);
- }
- }
- }
-
- return matrix;
- }
-
- extractDiffs(str1, str2, matrix) {
- const diffs = [];
- let i = str1.length;
- let j = str2.length;
-
- while (i > 0 || j > 0) {
- if (i > 0 && j > 0 && str1[i - 1] === str2[j - 1]) {
- diffs.unshift({ type: 'equal', char: str1[i - 1] });
- i--;
- j--;
- } else if (j > 0 && (i === 0 || matrix[i][j - 1] >= matrix[i - 1][j])) {
- diffs.unshift({ type: 'insert', char: str2[j - 1] });
- j--;
- } else if (i > 0) {
- diffs.unshift({ type: 'delete', char: str1[i - 1] });
- i--;
- }
- }
-
- return diffs;
- }
-
- renderCharacterDiffs(diffs) {
- const result = [];
- let inDiffGroup = false;
- let diffGroup = [];
-
- for (let i = 0; i < diffs.length; i++) {
- const diff = diffs[i];
-
- if (diff.type === 'equal') {
- // If we were in a diff group, close it
- if (inDiffGroup) {
- if (diffGroup.length > 0) {
- result.push(`${diffGroup.join('')} `);
- }
- diffGroup = [];
- inDiffGroup = false;
- }
- result.push(this.escapeHtml(diff.char));
- } else {
- // Start or continue a diff group
- if (!inDiffGroup) {
- inDiffGroup = true;
- }
-
- if (diff.type === 'delete') {
- diffGroup.push(this.escapeHtml(diff.char));
- }
- // For 'insert' type, we don't add to current line (it belongs to the other line)
- }
- }
-
- // Close any remaining diff group
- if (inDiffGroup && diffGroup.length > 0) {
- result.push(`${diffGroup.join('')} `);
- }
-
- return result.join('');
- }
-
- escapeHtml(text) {
- const div = document.createElement('div');
- div.textContent = text;
- return div.innerHTML;
- }
-
- clearComparison() {
- document.getElementById('text1').value = '';
- document.getElementById('text2').value = '';
- document.getElementById('comparison-result').innerHTML = '';
- window.app?.showMessage('Comparison cleared!', 'info');
- }
-}
-
-window.TextCompare = new TextCompare();
\ No newline at end of file
diff --git a/src/renderer/js/tools/timestamp.js b/src/renderer/js/tools/timestamp.js
deleted file mode 100644
index 9ffa25b5..00000000
--- a/src/renderer/js/tools/timestamp.js
+++ /dev/null
@@ -1,219 +0,0 @@
-class TimestampConverter {
- constructor() {
- this.init();
- this.updateCurrentTime();
- this.startClock();
- }
-
- init() {
- const tabButtons = document.querySelectorAll('#timestamp .tab-btn');
- const refreshBtn = document.getElementById('refresh-time');
- const convertTsBtn = document.getElementById('convert-ts-to-date');
- const convertDateBtn = document.getElementById('convert-date-to-ts');
-
- tabButtons.forEach((button) => {
- button.addEventListener('click', () => {
- this.switchTab(button.dataset.tab);
- });
- });
-
- if (refreshBtn) {
- refreshBtn.addEventListener('click', () => this.updateCurrentTime());
- }
-
- if (convertTsBtn) {
- convertTsBtn.addEventListener('click', () =>
- this.convertTimestampToDate()
- );
- }
-
- if (convertDateBtn) {
- convertDateBtn.addEventListener('click', () =>
- this.convertDateToTimestamp()
- );
- }
-
- const inputs = document.querySelectorAll('#timestamp-input, #date-input');
- inputs.forEach((input) => {
- input.addEventListener('input', () => this.clearOutputs());
- });
- }
-
- startClock() {
- this.clockInterval = setInterval(() => {
- this.updateCurrentTime();
- }, 1000);
- }
-
- updateCurrentTime() {
- const now = new Date();
- const timestamp = Math.floor(now.getTime() / 1000);
- const dateString = now.toLocaleString();
-
- document.getElementById('current-timestamp').textContent = timestamp;
- document.getElementById('current-date').textContent = dateString;
- }
-
- switchTab(tabName) {
- const container = document.getElementById('timestamp');
-
- container.querySelectorAll('.tab-btn').forEach((btn) => {
- btn.classList.remove('active');
- });
- container.querySelectorAll('.tab-content').forEach((content) => {
- content.classList.remove('active');
- });
-
- container.querySelector(`[data-tab="${tabName}"]`).classList.add('active');
- container.getElementById(`${tabName}-tab`).classList.add('active');
-
- this.clearOutputs();
- }
-
- convertTimestampToDate() {
- const input = document.getElementById('timestamp-input').value;
- const output = document.getElementById('date-output');
-
- if (!input.trim()) {
- window.app?.showMessage('Please enter a timestamp.', 'error');
- return;
- }
-
- try {
- let timestamp = parseInt(input);
-
- if (timestamp.toString().length === 10) {
- timestamp = timestamp * 1000;
- } else if (timestamp.toString().length !== 13) {
- throw new Error('Invalid timestamp format');
- }
-
- const date = new Date(timestamp);
-
- if (isNaN(date.getTime())) {
- throw new Error('Invalid timestamp');
- }
-
- const result = `
-Local Time: ${date.toLocaleString()}
-UTC Time: ${date.toUTCString()}
-ISO String: ${date.toISOString()}
-Date Only: ${date.toDateString()}
-Time Only: ${date.toTimeString()}
-
-Timestamp (seconds): ${Math.floor(timestamp / 1000)}
-Timestamp (milliseconds): ${timestamp}
- `.trim();
-
- output.value = result;
- window.app?.showMessage('Timestamp converted successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Error: ' + error.message, 'error');
- output.value = '';
- }
- }
-
- convertDateToTimestamp() {
- const input = document.getElementById('date-input').value;
- const output = document.getElementById('timestamp-output');
-
- if (!input.trim()) {
- window.app?.showMessage('Please select a date and time.', 'error');
- return;
- }
-
- try {
- const date = new Date(input);
-
- if (isNaN(date.getTime())) {
- throw new Error('Invalid date');
- }
-
- const timestamp = date.getTime();
- const timestampSeconds = Math.floor(timestamp / 1000);
-
- const result = `
-Date: ${date.toLocaleString()}
-UTC: ${date.toUTCString()}
-ISO: ${date.toISOString()}
-
-Timestamp (seconds): ${timestampSeconds}
-Timestamp (milliseconds): ${timestamp}
- `.trim();
-
- output.value = result;
- window.app?.showMessage('Date converted successfully!', 'success');
- } catch (error) {
- window.app?.showMessage('Error: ' + error.message, 'error');
- output.value = '';
- }
- }
-
- clearOutputs() {
- document.getElementById('date-output').value = '';
- document.getElementById('timestamp-output').value = '';
- }
-
- destroy() {
- if (this.clockInterval) {
- clearInterval(this.clockInterval);
- }
- }
-}
-
-window.TimestampConverter = new TimestampConverter();
-
-const timestampStyles = `
-.timestamp-section {
- background: #f8f9fa;
- border-radius: 8px;
- padding: 20px;
- margin-bottom: 20px;
-}
-
-.current-time {
- display: flex;
- align-items: center;
- justify-content: space-between;
- flex-wrap: wrap;
- gap: 15px;
-}
-
-.time-display {
- display: flex;
- flex-direction: column;
- gap: 5px;
-}
-
-.time-display strong {
- font-size: 1.5rem;
- color: #667eea;
- font-family: 'Monaco', 'Consolas', monospace;
-}
-
-.time-display span {
- color: #86868b;
- font-size: 0.9rem;
-}
-
-#timestamp-input,
-#date-input {
- width: 100%;
- padding: 10px 15px;
- border: 2px solid #f0f0f0;
- border-radius: 6px;
- font-size: 14px;
- margin-bottom: 15px;
- transition: border-color 0.3s ease;
-}
-
-#timestamp-input:focus,
-#date-input:focus {
- outline: none;
- border-color: #667eea;
-}
-`;
-
-const timestampStyle = document.createElement('style');
-timestampStyle.textContent = timestampStyles;
-document.head.appendChild(timestampStyle);
diff --git a/src/renderer/js/tools/unit-converter.js b/src/renderer/js/tools/unit-converter.js
deleted file mode 100644
index 714b3501..00000000
--- a/src/renderer/js/tools/unit-converter.js
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * Unit Converter Tool
- * Converts between different units of measurement including:
- * - Length (mm, cm, m, km, in, ft, yd, mi)
- * - Weight (mg, g, kg, oz, lb, st, t)
- * - Temperature (C, F, K)
- * - Currency (USD, EUR, GBP, JPY, CAD, AUD)
- */
-
-class UnitConverter {
- constructor() {
- this.currentCategory = 'length';
- this.init();
- }
-
- init() {
- // Set up event listeners
- const categorySelect = document.getElementById('unit-category');
- const convertBtn = document.getElementById('convert-units');
- const swapBtn = document.getElementById('swap-units');
- const inputField = document.getElementById('unit-input');
-
- if (categorySelect) {
- categorySelect.addEventListener('change', () => this.onCategoryChange());
- }
-
- if (convertBtn) {
- convertBtn.addEventListener('click', () => this.convertUnits());
- }
-
- if (swapBtn) {
- swapBtn.addEventListener('click', () => this.swapUnits());
- }
-
- if (inputField) {
- inputField.addEventListener('input', () => {
- this.clearErrors();
- this.convertUnits();
- });
- inputField.addEventListener('keypress', (e) => {
- if (e.key === 'Enter') {
- this.convertUnits();
- }
- });
- }
-
- // Initialize the form
- this.initializeCategories();
- this.onCategoryChange();
- }
-
- initializeCategories() {
- const categorySelect = document.getElementById('unit-category');
- if (!categorySelect) return;
-
- // Clear existing options
- categorySelect.innerHTML = '';
-
- // Add categories
- const categories = this.getCategories();
- categories.forEach((category) => {
- const option = document.createElement('option');
- option.value = category;
- option.textContent = this.getCategoryName(category);
- categorySelect.appendChild(option);
- });
-
- categorySelect.value = this.currentCategory;
- }
-
- onCategoryChange() {
- const categorySelect = document.getElementById('unit-category');
- if (!categorySelect) return;
-
- this.currentCategory = categorySelect.value;
- this.populateUnitSelects();
- this.clearResults();
- this.clearErrors();
-
- // Show currency disclaimer for currency conversions
- this.showCurrencyDisclaimer();
- }
-
- populateUnitSelects() {
- const fromSelect = document.getElementById('unit-from');
- const toSelect = document.getElementById('unit-to');
-
- if (!fromSelect || !toSelect) return;
-
- const units = this.getUnitsForCategory(this.currentCategory);
- const unitKeys = Object.keys(units);
-
- // Clear existing options
- fromSelect.innerHTML = '';
- toSelect.innerHTML = '';
-
- // Populate both selects
- unitKeys.forEach((unitKey) => {
- const fromOption = document.createElement('option');
- fromOption.value = unitKey;
- fromOption.textContent = units[unitKey];
- fromSelect.appendChild(fromOption);
-
- const toOption = document.createElement('option');
- toOption.value = unitKey;
- toOption.textContent = units[unitKey];
- toSelect.appendChild(toOption);
- });
-
- // Set default selections
- if (unitKeys.length >= 2) {
- fromSelect.value = unitKeys[0];
- toSelect.value = unitKeys[1];
- }
- }
-
- convertUnits() {
- const inputValue = document.getElementById('unit-input').value;
- const fromUnit = document.getElementById('unit-from').value;
- const toUnit = document.getElementById('unit-to').value;
- const outputField = document.getElementById('unit-output');
-
- if (!inputValue.trim()) {
- this.clearResults();
- return;
- }
-
- try {
- const result = this.convert(
- inputValue,
- this.currentCategory,
- fromUnit,
- toUnit
- );
-
- if (outputField) {
- outputField.value = result.toString();
- }
-
- this.clearErrors();
- this.updateConversionInfo(inputValue, fromUnit, toUnit, result);
- } catch (error) {
- this.showError(error.message);
- this.clearResults();
- }
- }
-
- swapUnits() {
- const fromSelect = document.getElementById('unit-from');
- const toSelect = document.getElementById('unit-to');
- const inputField = document.getElementById('unit-input');
- const outputField = document.getElementById('unit-output');
-
- if (!fromSelect || !toSelect) return;
-
- // Swap the unit selections
- const tempValue = fromSelect.value;
- fromSelect.value = toSelect.value;
- toSelect.value = tempValue;
-
- // Swap the input/output values if they exist
- if (inputField && outputField && inputField.value && outputField.value) {
- const tempInput = inputField.value;
- inputField.value = outputField.value;
- outputField.value = tempInput;
- }
-
- // Convert with new values
- this.convertUnits();
- }
-
- updateConversionInfo(inputValue, fromUnit, toUnit, result) {
- const infoDiv = document.getElementById('conversion-info');
- if (!infoDiv) return;
-
- const fromUnitName = this.getUnitsForCategory(this.currentCategory)[
- fromUnit
- ];
- const toUnitName = this.getUnitsForCategory(this.currentCategory)[toUnit];
-
- infoDiv.innerHTML = `
-
- ${inputValue} ${fromUnitName} =
- ${result} ${toUnitName}
-
- `;
- infoDiv.style.display = 'block';
- }
-
- showCurrencyDisclaimer() {
- const disclaimerDiv = document.getElementById('currency-disclaimer');
- if (!disclaimerDiv) return;
-
- if (this.currentCategory === 'currency') {
- disclaimerDiv.style.display = 'block';
- } else {
- disclaimerDiv.style.display = 'none';
- }
- }
-
- clearResults() {
- const outputField = document.getElementById('unit-output');
- const infoDiv = document.getElementById('conversion-info');
-
- if (outputField) {
- outputField.value = '';
- }
-
- if (infoDiv) {
- infoDiv.style.display = 'none';
- }
- }
-
- showError(message) {
- const errorDiv = document.getElementById('unit-converter-error');
- if (errorDiv) {
- errorDiv.textContent = message;
- errorDiv.style.display = 'block';
- }
- }
-
- clearErrors() {
- const errorDiv = document.getElementById('unit-converter-error');
- if (errorDiv) {
- errorDiv.style.display = 'none';
- }
- }
-
- // Utility methods that delegate to UnitConverterUtils
- convert(value, category, fromUnit, toUnit) {
- // Check if we're in browser environment and need to use embedded utils
- if (typeof UnitConverterUtils !== 'undefined') {
- return UnitConverterUtils.convert(value, category, fromUnit, toUnit);
- }
-
- // Fallback error if utils not available
- throw new Error('Unit conversion utilities not available');
- }
-
- getUnitsForCategory(category) {
- if (typeof UnitConverterUtils !== 'undefined') {
- return UnitConverterUtils.getUnitsForCategory(category);
- }
- return {};
- }
-
- getCategories() {
- if (typeof UnitConverterUtils !== 'undefined') {
- return UnitConverterUtils.getCategories();
- }
- return [];
- }
-
- getCategoryName(category) {
- if (typeof UnitConverterUtils !== 'undefined') {
- return UnitConverterUtils.getCategoryName(category);
- }
- return category;
- }
-}
-
-// Global instance registration
-window.UnitConverter = new UnitConverter();
-
-// Export for Node.js testing
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = UnitConverter;
-}
diff --git a/src/renderer/js/tools/url-encoder.js b/src/renderer/js/tools/url-encoder.js
deleted file mode 100644
index 3e5fc5e9..00000000
--- a/src/renderer/js/tools/url-encoder.js
+++ /dev/null
@@ -1,183 +0,0 @@
-class URLEncoder {
- constructor() {
- this.init();
- }
-
- init() {
- const tabButtons = document.querySelectorAll('#url-encoder .tab-btn');
- const encodeBtn = document.getElementById('url-encode-btn');
- const decodeBtn = document.getElementById('url-decode-btn');
- const copyEncodedBtn = document.getElementById('copy-encoded');
- const copyDecodedBtn = document.getElementById('copy-decoded');
- const clearEncodeBtn = document.getElementById('clear-encode');
- const clearDecodeBtn = document.getElementById('clear-decode');
-
- tabButtons.forEach(button => {
- button.addEventListener('click', () => {
- this.switchTab(button.dataset.tab);
- });
- });
-
- if (encodeBtn) {
- encodeBtn.addEventListener('click', () => this.encodeURL());
- }
-
- if (decodeBtn) {
- decodeBtn.addEventListener('click', () => this.decodeURL());
- }
-
- if (copyEncodedBtn) {
- copyEncodedBtn.addEventListener('click', () => this.copyToClipboard('url-encoded-output'));
- }
-
- if (copyDecodedBtn) {
- copyDecodedBtn.addEventListener('click', () => this.copyToClipboard('url-decoded-output'));
- }
-
- if (clearEncodeBtn) {
- clearEncodeBtn.addEventListener('click', () => this.clearEncode());
- }
-
- if (clearDecodeBtn) {
- clearDecodeBtn.addEventListener('click', () => this.clearDecode());
- }
-
- // Add Enter key support
- const encodeInput = document.getElementById('url-to-encode');
- const decodeInput = document.getElementById('url-to-decode');
-
- if (encodeInput) {
- encodeInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter' && e.ctrlKey) {
- this.encodeURL();
- }
- });
- }
-
- if (decodeInput) {
- decodeInput.addEventListener('keypress', (e) => {
- if (e.key === 'Enter' && e.ctrlKey) {
- this.decodeURL();
- }
- });
- }
- }
-
- switchTab(tabName) {
- const encoder = document.getElementById('url-encoder');
-
- encoder.querySelectorAll('.tab-btn').forEach(btn => {
- btn.classList.remove('active');
- });
- encoder.querySelectorAll('.tab-content').forEach(content => {
- content.classList.remove('active');
- });
-
- encoder.querySelector(`[data-tab="${tabName}"]`).classList.add('active');
- document.getElementById(`${tabName}-tab`).classList.add('active');
-
- this.clearOutputs();
- }
-
- encodeURL() {
- const input = document.getElementById('url-to-encode').value;
- const output = document.getElementById('url-encoded-output');
-
- if (!input.trim()) {
- window.app?.showMessage('Please enter URL or text to encode.', 'error');
- return;
- }
-
- try {
- // Use encodeURIComponent for full encoding
- const encoded = encodeURIComponent(input);
- output.value = encoded;
-
- // Show some stats
- const originalLength = input.length;
- const encodedLength = encoded.length;
- const message = `URL encoded successfully! (${originalLength} → ${encodedLength} characters)`;
-
- window.app?.showMessage(message, 'success');
- this.selectOutput('url-encoded-output');
- } catch (error) {
- window.app?.showMessage('Error encoding URL: ' + error.message, 'error');
- output.value = '';
- }
- }
-
- decodeURL() {
- const input = document.getElementById('url-to-decode').value;
- const output = document.getElementById('url-decoded-output');
-
- if (!input.trim()) {
- window.app?.showMessage('Please enter encoded URL to decode.', 'error');
- return;
- }
-
- try {
- const decoded = decodeURIComponent(input);
- output.value = decoded;
-
- // Show some stats
- const originalLength = input.length;
- const decodedLength = decoded.length;
- const message = `URL decoded successfully! (${originalLength} → ${decodedLength} characters)`;
-
- window.app?.showMessage(message, 'success');
- this.selectOutput('url-decoded-output');
- } catch (error) {
- window.app?.showMessage('Error decoding URL: Invalid URL encoding format', 'error');
- output.value = '';
- }
- }
-
- selectOutput(outputId) {
- const output = document.getElementById(outputId);
- setTimeout(() => {
- output.select();
- output.setSelectionRange(0, 99999);
- }, 100);
- }
-
- copyToClipboard(outputId) {
- const output = document.getElementById(outputId);
-
- if (!output.value.trim()) {
- window.app?.showMessage('Nothing to copy - please encode/decode some text first.', 'warning');
- return;
- }
-
- try {
- navigator.clipboard.writeText(output.value).then(() => {
- window.app?.showMessage('Copied to clipboard!', 'success');
- }).catch(() => {
- // Fallback for older browsers
- output.select();
- document.execCommand('copy');
- window.app?.showMessage('Copied to clipboard!', 'success');
- });
- } catch (error) {
- window.app?.showMessage('Failed to copy to clipboard.', 'error');
- }
- }
-
- clearEncode() {
- document.getElementById('url-to-encode').value = '';
- document.getElementById('url-encoded-output').value = '';
- window.app?.showMessage('Encoder cleared!', 'info');
- }
-
- clearDecode() {
- document.getElementById('url-to-decode').value = '';
- document.getElementById('url-decoded-output').value = '';
- window.app?.showMessage('Decoder cleared!', 'info');
- }
-
- clearOutputs() {
- document.getElementById('url-encoded-output').value = '';
- document.getElementById('url-decoded-output').value = '';
- }
-}
-
-window.URLEncoder = new URLEncoder();
\ No newline at end of file
diff --git a/src/renderer/js/tools/uuid-generator.js b/src/renderer/js/tools/uuid-generator.js
deleted file mode 100644
index 888a1ec2..00000000
--- a/src/renderer/js/tools/uuid-generator.js
+++ /dev/null
@@ -1,226 +0,0 @@
-class UUIDGenerator {
- constructor() {
- this.init();
- }
-
- init() {
- const generateBtn = document.getElementById('generate-uuid');
- const outputTextarea = document.getElementById('uuid-output');
-
- if (generateBtn) {
- generateBtn.addEventListener('click', () => this.generateUUIDs());
- }
-
- if (outputTextarea) {
- outputTextarea.addEventListener('click', () => this.selectAllUUIDs());
- }
- }
-
- generateUUIDs() {
- const version = document.getElementById('uuid-version').value;
- const count = parseInt(document.getElementById('uuid-count').value);
- const output = document.getElementById('uuid-output');
-
- if (count < 1 || count > 100) {
- window.app?.showMessage('Please enter a count between 1 and 100.', 'error');
- return;
- }
-
- const uuids = [];
-
- for (let i = 0; i < count; i++) {
- let uuid = '';
-
- if (version === '4') {
- uuid = this.generateUUIDv4();
- } else if (version === '1') {
- uuid = this.generateUUIDv1();
- } else if (version === '3') {
- uuid = this.generateUUIDv3();
- } else if (version === '5') {
- uuid = this.generateUUIDv5();
- } else if (version === '6') {
- uuid = this.generateUUIDv6();
- } else if (version === '7') {
- uuid = this.generateUUIDv7();
- } else if (version === 'ulid') {
- uuid = this.generateULID();
- }
-
- uuids.push(uuid);
- }
-
- output.value = uuids.join('\n');
- window.app?.showMessage(`Generated ${count} UUID${count > 1 ? 's' : ''}!`, 'success');
-
- this.selectAllUUIDs();
- }
-
- generateUUIDv4() {
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
- const r = Math.random() * 16 | 0;
- const v = c == 'x' ? r : (r & 0x3 | 0x8);
- return v.toString(16);
- });
- }
-
- generateUUIDv1() {
- const timestamp = Date.now();
- const timestampHex = timestamp.toString(16);
-
- const randomBytes = [];
- for (let i = 0; i < 16; i++) {
- randomBytes.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));
- }
-
- const timeLow = timestampHex.padStart(8, '0').substring(0, 8);
- const timeMid = timestampHex.padStart(8, '0').substring(0, 4);
- const timeHi = '1' + timestampHex.padStart(8, '0').substring(0, 3);
-
- const clockSeq = randomBytes.slice(8, 10).join('');
- const node = randomBytes.slice(10, 16).join('');
-
- return `${timeLow}-${timeMid}-${timeHi}-${clockSeq}-${node}`;
- }
-
- generateUUIDv3() {
- // UUID v3 using MD5 hash - simplified implementation
- const namespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; // DNS namespace
- const name = 'example.com'; // Default name
- const hash = this.md5(namespace + name);
- return this.formatUUIDFromHash(hash, 3);
- }
-
- generateUUIDv5() {
- // UUID v5 using SHA-1 hash - simplified implementation
- const namespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; // DNS namespace
- const name = 'example.com'; // Default name
- const hash = this.sha1(namespace + name);
- return this.formatUUIDFromHash(hash, 5);
- }
-
- generateUUIDv6() {
- // UUID v6 - Gregorian time, reordered for sorting
- const timestamp = Date.now();
- const timestampHex = (timestamp + 0x01b21dd213814000).toString(16).padStart(24, '0');
-
- const timeHiVer = '6' + timestampHex.substring(0, 3);
- const timeMid = timestampHex.substring(3, 7);
- const timeLow = timestampHex.substring(7, 15);
-
- const randomBytes = [];
- for (let i = 0; i < 8; i++) {
- randomBytes.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));
- }
-
- const clockSeq = '8' + randomBytes[0].substring(1) + randomBytes[1];
- const node = randomBytes.slice(2, 8).join('');
-
- return `${timeLow}-${timeMid}-${timeHiVer}-${clockSeq}-${node}`;
- }
-
- generateUUIDv7() {
- // UUID v7 - Random-based with Unix timestamp
- const timestamp = Math.floor(Date.now() / 1000);
- const timestampHex = timestamp.toString(16).padStart(12, '0');
- const randomHex = Array.from({length: 10}, () =>
- Math.floor(Math.random() * 16).toString(16)
- ).join('');
-
- const timeHiVer = '7' + timestampHex.substring(0, 3);
- const timeMid = timestampHex.substring(3, 7);
- const timeLow = timestampHex.substring(7, 12);
- const randB = randomHex.substring(0, 4);
- const clockSeq = '8' + randomHex.substring(4, 7);
- const node = randomHex.substring(7, 18);
-
- return `${timeLow}-${timeMid}-${timeHiVer}-${clockSeq}${randB}-${node}`;
- }
-
- generateULID() {
- // ULID implementation (26 chars: 10 timestamp + 16 random)
- const encoding = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; // Crockford's Base32
-
- // Get current timestamp in milliseconds since Unix epoch
- const timestamp = Date.now();
-
- // Convert timestamp to base32 (first 10 characters)
- let timestampEncoded = '';
- let remainingTime = timestamp;
-
- for (let i = 0; i < 10; i++) {
- const remainder = remainingTime % 32;
- timestampEncoded = encoding[remainder] + timestampEncoded;
- remainingTime = Math.floor(remainingTime / 32);
- }
-
- // Generate random part (16 characters)
- let randomEncoded = '';
- const randomBytes = [];
- for (let i = 0; i < 16; i++) {
- randomBytes.push(Math.floor(Math.random() * 32));
- }
-
- for (const byte of randomBytes) {
- randomEncoded += encoding[byte];
- }
-
- return timestampEncoded + randomEncoded;
- }
-
- // Helper methods for hash functions (simplified)
- md5(str) {
- // Simplified MD5-like hash for demonstration
- let hash = 0;
- for (let i = 0; i < str.length; i++) {
- const char = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + char;
- hash = hash & hash; // Convert to 32bit integer
- }
- return Math.abs(hash).toString(16).padStart(32, '0');
- }
-
- sha1(str) {
- // Simplified SHA-1-like hash for demonstration
- let hash = 0;
- for (let i = 0; i < str.length; i++) {
- const char = str.charCodeAt(i);
- hash = ((hash << 5) - hash) + char;
- hash = hash & hash;
- }
- return Math.abs(hash).toString(16).padStart(40, '0');
- }
-
- formatUUIDFromHash(hash, version) {
- // Format hash into UUID structure
- const hex = hash.substring(0, 32);
- const timeLow = hex.substring(0, 8);
- const timeMid = hex.substring(8, 12);
- const timeHiVer = version.toString() + hex.substring(13, 16);
- const clockSeq = '8' + hex.substring(17, 20);
- const node = hex.substring(20, 32);
-
- return `${timeLow}-${timeMid}-${timeHiVer}-${clockSeq}-${node}`;
- }
-
- selectAllUUIDs() {
- const output = document.getElementById('uuid-output');
- if (output.value.trim()) {
- setTimeout(() => {
- output.select();
- output.setSelectionRange(0, 99999);
- }, 100);
- }
- }
-
- copyToClipboard() {
- const output = document.getElementById('uuid-output');
- if (output.value.trim()) {
- navigator.clipboard.writeText(output.value).then(() => {
- window.app?.showMessage('UUIDs copied to clipboard!', 'success');
- });
- }
- }
-}
-
-window.UUIDGenerator = new UUIDGenerator();
\ No newline at end of file
diff --git a/src/renderer/styles/grid.css b/src/renderer/styles/grid.css
deleted file mode 100644
index 80e7db55..00000000
--- a/src/renderer/styles/grid.css
+++ /dev/null
@@ -1,1264 +0,0 @@
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-:root {
- --primary-color: #5E72E4;
- --primary-dark: #4C63D2;
- --primary-light: #8896FF;
- --secondary-color: #F5365C;
- --success-color: #2DCE89;
- --warning-color: #FB6340;
- --info-color: #11CDEF;
- --dark-color: #172B4D;
- --gray-dark: #32325D;
- --gray: #8898AA;
- --gray-light: #E9ECEF;
- --white: #FFFFFF;
- --background: #F7F8FC;
- --surface: #FFFFFF;
- --border-color: #E3E8F0;
- --text-primary: #32325D;
- --text-secondary: #525F7F;
- --text-muted: #8898AA;
- --shadow-sm: 0 0 0.5rem rgba(0, 0, 0, 0.075);
- --shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15);
- --shadow-lg: 0 0 3rem rgba(0, 0, 0, 0.175);
- --border-radius: 0.375rem;
- --border-radius-lg: 0.5rem;
- --border-radius-xl: 0.75rem;
- --transition: all 0.15s ease;
-}
-
-body {
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
- background-color: var(--background);
- color: var(--text-primary);
- height: 100vh;
- overflow: hidden;
- font-size: 0.9375rem;
- line-height: 1.6;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-.app-container {
- display: flex;
- height: 100vh;
-}
-
-.sidebar {
- width: 260px;
- background: linear-gradient(180deg, #5E72E4 0%, #825EE4 100%);
- color: white;
- overflow-y: auto;
- overflow-x: hidden;
- box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15);
- scrollbar-width: thin;
- scrollbar-color: rgba(255,255,255,0.2) transparent;
-}
-
-.sidebar::-webkit-scrollbar {
- width: 6px;
-}
-
-.sidebar::-webkit-scrollbar-track {
- background: transparent;
-}
-
-.sidebar::-webkit-scrollbar-thumb {
- background-color: rgba(255,255,255,0.2);
- border-radius: 3px;
-}
-
-.sidebar::-webkit-scrollbar-thumb:hover {
- background-color: rgba(255,255,255,0.3);
-}
-
-.sidebar-header {
- padding: 1.5rem;
- border-bottom: 1px solid rgba(255,255,255,0.08);
- background: rgba(0,0,0,0.1);
-}
-
-.sidebar-header h1 {
- font-size: 1.25rem;
- font-weight: 700;
- letter-spacing: -0.025em;
- display: flex;
- align-items: center;
- gap: 0.75rem;
-}
-
-.sidebar-header h1 i {
- font-size: 1.125rem;
- opacity: 0.9;
-}
-
-.sidebar-subtitle {
- font-size: 0.75rem;
- opacity: 0.7;
- text-transform: uppercase;
- letter-spacing: 0.1em;
- margin-top: 0.25rem;
- margin-left: 2rem;
-}
-
-.nav-menu {
- list-style: none;
- padding: 0.5rem 0;
-}
-
-.nav-menu li {
- margin: 0;
-}
-
-.nav-link {
- display: flex;
- align-items: center;
- padding: 0.75rem 1.5rem;
- color: rgba(255,255,255,0.8);
- text-decoration: none;
- transition: var(--transition);
- position: relative;
- font-size: 0.875rem;
- font-weight: 500;
-}
-
-.nav-link:hover {
- background-color: rgba(255,255,255,0.08);
- color: white;
-}
-
-.nav-link.active {
- background-color: rgba(255,255,255,0.15);
- color: white;
-}
-
-.nav-link.active::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 3px;
- background: white;
-}
-
-.nav-link i {
- margin-right: 0.75rem;
- width: 1.25rem;
- text-align: center;
- font-size: 0.875rem;
- opacity: 0.9;
-}
-
-.main-content {
- flex: 1;
- padding: 2rem;
- overflow-y: auto;
- background-color: var(--background);
- scrollbar-width: thin;
- scrollbar-color: var(--gray-light) transparent;
-}
-
-.main-content::-webkit-scrollbar {
- width: 8px;
-}
-
-.main-content::-webkit-scrollbar-track {
- background: transparent;
-}
-
-.main-content::-webkit-scrollbar-thumb {
- background-color: var(--gray-light);
- border-radius: 4px;
-}
-
-.main-content::-webkit-scrollbar-thumb:hover {
- background-color: var(--gray);
-}
-
-.tool-container {
- display: none;
- max-width: 1200px;
- margin: 0 auto;
- animation: fadeIn 0.3s ease;
-}
-
-.tool-container.active {
- display: block;
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- transform: translateY(10px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.tool-container h2 {
- margin-bottom: 2rem;
- color: var(--text-primary);
- font-size: 1.75rem;
- font-weight: 700;
- letter-spacing: -0.025em;
- display: flex;
- align-items: center;
- gap: 0.75rem;
-}
-
-.tool-container h2 i {
- font-size: 1.5rem;
- color: var(--primary-color);
- background: linear-gradient(135deg, var(--primary-color), var(--primary-light));
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
-}
-
-.home-content {
- padding: 2rem 0;
-}
-
-.home-hero {
- text-align: center;
- margin-bottom: 3rem;
- padding: 2rem 0;
-}
-
-.home-hero h1 {
- font-size: 3rem;
- margin-bottom: 1rem;
- color: var(--text-primary);
- font-weight: 800;
- letter-spacing: -0.03em;
- background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-light) 100%);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- line-height: 1.2;
-}
-
-.home-hero p {
- font-size: 1.25rem;
- margin-bottom: 2rem;
- color: var(--text-secondary);
- max-width: 600px;
- margin-left: auto;
- margin-right: auto;
- line-height: 1.6;
-}
-
-.home-stats {
- display: flex;
- justify-content: center;
- gap: 3rem;
- margin-top: 2rem;
- flex-wrap: wrap;
-}
-
-.stat-item {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- color: var(--text-secondary);
- font-weight: 600;
- font-size: 0.9375rem;
-}
-
-.stat-item i {
- color: var(--primary-color);
- font-size: 1.125rem;
-}
-
-.tools-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
- gap: 1.5rem;
- margin-top: 2rem;
-}
-
-.tool-card {
- background: var(--surface);
- padding: 1.75rem;
- border-radius: var(--border-radius-xl);
- box-shadow: var(--shadow-sm);
- border: 1px solid var(--border-color);
- cursor: pointer;
- transition: var(--transition);
- position: relative;
- overflow: hidden;
-}
-
-.tool-card::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 3px;
- background: linear-gradient(90deg, var(--primary-color), var(--primary-light));
- transform: scaleX(0);
- transition: transform 0.3s ease;
-}
-
-.tool-card:hover {
- transform: translateY(-4px);
- box-shadow: var(--shadow);
- border-color: var(--primary-color);
-}
-
-.tool-card:hover::before {
- transform: scaleX(1);
-}
-
-.tool-icon {
- width: 3.5rem;
- height: 3.5rem;
- background: linear-gradient(135deg, var(--primary-color), var(--primary-light));
- border-radius: var(--border-radius-lg);
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: 1rem;
- transition: var(--transition);
-}
-
-.tool-card:hover .tool-icon {
- transform: scale(1.1) rotate(5deg);
-}
-
-.tool-icon i {
- font-size: 1.5rem;
- color: white;
-}
-
-.tool-badge {
- position: absolute;
- top: 1rem;
- right: 1rem;
- background: linear-gradient(135deg, var(--primary-color), var(--primary-light));
- color: white;
- padding: 0.25rem 0.625rem;
- border-radius: 1rem;
- font-size: 0.625rem;
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.05em;
-}
-
-.tool-card h3 {
- font-size: 1.125rem;
- margin-bottom: 0.5rem;
- color: var(--text-primary);
- font-weight: 600;
- letter-spacing: -0.01em;
-}
-
-.tool-card p {
- color: var(--text-muted);
- line-height: 1.5;
- font-size: 0.875rem;
-}
-
-.tool-content {
- background: var(--surface);
- border-radius: var(--border-radius-xl);
- padding: 2rem;
- box-shadow: var(--shadow);
- border: 1px solid var(--border-color);
-}
-
-.input-section,
-.output-section {
- margin-bottom: 1.5rem;
-}
-
-.input-section label,
-.output-section label {
- display: block;
- margin-bottom: 0.5rem;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
-}
-
-.input-section textarea,
-.output-section textarea {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- resize: vertical;
- background-color: var(--surface);
- transition: var(--transition);
- line-height: 1.6;
- box-sizing: border-box;
-}
-
-.input-section textarea:focus,
-.output-section textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- background-color: var(--surface);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.output-section pre {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background-color: var(--background);
- overflow: auto;
- white-space: pre-wrap;
- color: var(--text-primary);
- line-height: 1.6;
- margin: 0;
- box-sizing: border-box;
-}
-
-.controls {
- display: flex;
- gap: 0.75rem;
- margin: 1.5rem 0;
- flex-wrap: wrap;
- align-items: center;
-}
-
-.btn {
- display: inline-block;
- background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
- color: white;
- border: none;
- padding: 0.75rem 1.5rem;
- border-radius: var(--border-radius);
- cursor: pointer;
- font-size: 0.875rem;
- font-weight: 600;
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- transition: var(--transition);
- text-transform: uppercase;
- letter-spacing: 0.025em;
- position: relative;
- overflow: hidden;
- box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
- white-space: nowrap;
- line-height: 1.2;
- text-align: center;
- vertical-align: middle;
-}
-
-.btn::before {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- width: 0;
- height: 0;
- border-radius: 50%;
- background: rgba(255, 255, 255, 0.3);
- transform: translate(-50%, -50%);
- transition: width 0.6s ease, height 0.6s ease;
-}
-
-.btn:hover::before {
- width: 300px;
- height: 300px;
-}
-
-.btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 7px 14px rgba(50, 50, 93, 0.1), 0 3px 6px rgba(0, 0, 0, 0.08);
-}
-
-.btn:active {
- transform: translateY(0);
-}
-
-.btn-primary {
- background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
-}
-
-.btn-secondary {
- background: linear-gradient(135deg, var(--gray), var(--gray-dark));
-}
-
-.btn-info {
- background: linear-gradient(135deg, var(--info-color), #0DA5C0);
-}
-
-.btn-success {
- background: linear-gradient(135deg, var(--success-color), #26B56E);
-}
-
-.btn-warning {
- background: linear-gradient(135deg, var(--warning-color), #FA441D);
-}
-
-.btn-danger {
- background: linear-gradient(135deg, var(--secondary-color), #EC0C38);
-}
-
-.btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
- transform: none;
-}
-
-.btn:disabled:hover {
- transform: none;
- box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
-}
-
-.compare-inputs {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 1.5rem;
- margin-bottom: 1.5rem;
-}
-
-.input-group {
- display: flex;
- flex-direction: column;
-}
-
-.input-group label {
- margin-bottom: 0.5rem;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
-}
-
-.input-group input,
-.input-group select,
-.input-group textarea {
- padding: 0.75rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-size: 0.9375rem;
- transition: var(--transition);
- background: var(--background);
-}
-
-.input-group input:focus,
-.input-group select:focus,
-.input-group textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- background: var(--surface);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.case-options {
- display: flex;
- flex-wrap: wrap;
- gap: 0.5rem;
- margin: 1.5rem 0;
-}
-
-.case-btn {
- background: var(--surface);
- border: 2px solid var(--border-color);
- padding: 0.5rem 1rem;
- border-radius: var(--border-radius);
- cursor: pointer;
- font-size: 0.875rem;
- font-weight: 500;
- transition: var(--transition);
- color: var(--text-secondary);
-}
-
-.case-btn:hover {
- background: var(--primary-color);
- color: white;
- border-color: var(--primary-color);
- transform: translateY(-2px);
- box-shadow: var(--shadow-sm);
-}
-
-.uuid-controls {
- display: flex;
- align-items: flex-end;
- gap: 1rem;
- margin-bottom: 1.5rem;
- flex-wrap: wrap;
-}
-
-.uuid-controls .control-group {
- flex: 0 0 auto;
-}
-
-.uuid-controls select,
-.uuid-controls input {
- min-width: 150px;
-}
-
-.control-group {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
- min-width: 120px;
-}
-
-.control-group label {
- display: block;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.75rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
- margin-bottom: 0.25rem;
-}
-
-.converter-tabs {
- display: flex;
- margin-bottom: 1.5rem;
- background: var(--background);
- border-radius: var(--border-radius);
- padding: 0.25rem;
-}
-
-.tab-btn {
- flex: 1;
- background: transparent;
- border: none;
- padding: 0.625rem 1.25rem;
- cursor: pointer;
- font-size: 0.875rem;
- font-weight: 600;
- color: var(--text-muted);
- border-radius: var(--border-radius);
- transition: var(--transition);
- text-transform: uppercase;
- letter-spacing: 0.025em;
-}
-
-.tab-btn:hover {
- color: var(--text-secondary);
-}
-
-.tab-btn.active {
- background: var(--surface);
- color: var(--primary-color);
- box-shadow: var(--shadow-sm);
-}
-
-.tab-content {
- display: none;
- animation: fadeIn 0.3s ease;
-}
-
-.tab-content.active {
- display: block;
-}
-
-.tab-content textarea {
- width: 100%;
- min-height: 150px;
- margin: 1rem 0;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- resize: vertical;
- background: var(--surface);
- transition: var(--transition);
- box-sizing: border-box;
- line-height: 1.6;
-}
-
-.tab-content textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- background: var(--surface);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.tab-content .btn {
- margin-top: 0.5rem;
-}
-
-.jwt-sections {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
- gap: 1.5rem;
- margin-top: 1.5rem;
-}
-
-.jwt-section {
- background: var(--background);
- border-radius: var(--border-radius-lg);
- padding: 1.5rem;
- border: 1px solid var(--border-color);
-}
-
-.jwt-section h3 {
- margin-bottom: 1rem;
- color: var(--text-primary);
- font-size: 0.875rem;
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.025em;
-}
-
-.jwt-section pre {
- background: var(--surface);
- padding: 1rem;
- border-radius: var(--border-radius);
- border: 1px solid var(--border-color);
- overflow: auto;
- font-size: 0.75rem;
- line-height: 1.5;
- color: var(--text-primary);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
-}
-
-#comparison-result {
- margin-top: 1.5rem;
- padding: 1.5rem;
- background: var(--background);
- border-radius: var(--border-radius-lg);
- min-height: 100px;
- border: 1px solid var(--border-color);
-}
-
-.diff-added {
- background-color: rgba(45, 206, 137, 0.1);
- color: var(--success-color);
- padding: 0.125rem 0.25rem;
- border-radius: 0.125rem;
- font-weight: 500;
-}
-
-.diff-removed {
- background-color: rgba(245, 54, 92, 0.1);
- color: var(--secondary-color);
- padding: 0.125rem 0.25rem;
- border-radius: 0.125rem;
- text-decoration: line-through;
- font-weight: 500;
-}
-
-.error {
- color: var(--secondary-color);
- background-color: rgba(245, 54, 92, 0.1);
- border: 1px solid rgba(245, 54, 92, 0.2);
- padding: 0.75rem 1rem;
- border-radius: var(--border-radius);
- margin: 1rem 0;
- font-size: 0.875rem;
- font-weight: 500;
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.error::before {
- content: '⚠️';
-}
-
-.success {
- color: var(--success-color);
- background-color: rgba(45, 206, 137, 0.1);
- border: 1px solid rgba(45, 206, 137, 0.2);
- padding: 0.75rem 1rem;
- border-radius: var(--border-radius);
- margin: 1rem 0;
- font-size: 0.875rem;
- font-weight: 500;
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.success::before {
- content: '✓';
- display: inline-flex;
- width: 1.25rem;
- height: 1.25rem;
- background: var(--success-color);
- color: white;
- border-radius: 50%;
- align-items: center;
- justify-content: center;
- font-size: 0.75rem;
-}
-
-/* Global form element styles */
-input[type="text"],
-input[type="number"],
-input[type="email"],
-input[type="password"],
-input[type="search"],
-input[type="tel"],
-input[type="url"],
-input[type="date"],
-input[type="datetime-local"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-select,
-textarea {
- width: 100%;
- padding: 0.75rem 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-size: 0.9375rem;
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- background-color: var(--surface);
- color: var(--text-primary);
- transition: var(--transition);
- box-sizing: border-box;
- line-height: 1.5;
-}
-
-textarea {
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- resize: vertical;
- min-height: 100px;
-}
-
-input:focus,
-select:focus,
-textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-input::placeholder,
-textarea::placeholder {
- color: var(--text-muted);
- opacity: 0.7;
-}
-
-/* Select dropdown styling */
-select {
- appearance: none;
- background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238898AA' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: right 0.75rem center;
- background-size: 1rem;
- padding-right: 2.5rem;
- cursor: pointer;
-}
-
-input[type="checkbox"] {
- width: 1.125rem;
- height: 1.125rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- margin-right: 0.5rem;
- cursor: pointer;
- transition: var(--transition);
-}
-
-input[type="checkbox"]:checked {
- background: var(--primary-color);
- border-color: var(--primary-color);
-}
-
-input[type="color"] {
- width: 3rem;
- height: 3rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- cursor: pointer;
- padding: 0.25rem;
-}
-
-input[type="range"] {
- appearance: none;
- width: 100%;
- height: 0.5rem;
- background: var(--border-color);
- border-radius: 0.25rem;
- outline: none;
- transition: var(--transition);
-}
-
-input[type="range"]::-webkit-slider-thumb {
- appearance: none;
- width: 1.25rem;
- height: 1.25rem;
- background: var(--primary-color);
- border-radius: 50%;
- cursor: pointer;
- box-shadow: var(--shadow-sm);
- transition: var(--transition);
-}
-
-input[type="range"]::-webkit-slider-thumb:hover {
- transform: scale(1.1);
- box-shadow: var(--shadow);
-}
-
-/* Tooltips */
-[title] {
- position: relative;
-}
-
-[title]:hover::after {
- content: attr(title);
- position: absolute;
- bottom: 100%;
- left: 50%;
- transform: translateX(-50%);
- padding: 0.25rem 0.5rem;
- background: var(--dark-color);
- color: white;
- font-size: 0.75rem;
- border-radius: var(--border-radius);
- white-space: nowrap;
- z-index: 1000;
- pointer-events: none;
- margin-bottom: 0.25rem;
-}
-
-/* Loading state */
-.loading {
- position: relative;
- pointer-events: none;
- opacity: 0.7;
-}
-
-.loading::after {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 1.5rem;
- height: 1.5rem;
- border: 2px solid var(--primary-color);
- border-top-color: transparent;
- border-radius: 50%;
- animation: spin 0.6s linear infinite;
-}
-
-@keyframes spin {
- to { transform: translate(-50%, -50%) rotate(360deg); }
-}
-
-/* Empty states */
-.empty-state {
- text-align: center;
- padding: 3rem 1.5rem;
- color: var(--text-muted);
-}
-
-.empty-state i {
- font-size: 3rem;
- margin-bottom: 1rem;
- opacity: 0.5;
-}
-
-.empty-state h3 {
- color: var(--text-secondary);
- margin-bottom: 0.5rem;
-}
-
-.empty-state p {
- font-size: 0.875rem;
-}
-
-/* Badges */
-.badge {
- display: inline-flex;
- align-items: center;
- padding: 0.25rem 0.625rem;
- font-size: 0.75rem;
- font-weight: 600;
- border-radius: var(--border-radius);
- background: var(--primary-color);
- color: white;
- text-transform: uppercase;
- letter-spacing: 0.025em;
-}
-
-.badge-secondary {
- background: var(--gray);
-}
-
-.badge-success {
- background: var(--success-color);
-}
-
-.badge-warning {
- background: var(--warning-color);
-}
-
-.badge-danger {
- background: var(--secondary-color);
-}
-
-.badge-info {
- background: var(--info-color);
-}
-
-/* Cards */
-.card {
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- box-shadow: var(--shadow-sm);
- border: 1px solid var(--border-color);
- overflow: hidden;
-}
-
-.card-header {
- padding: 1.25rem;
- background: var(--background);
- border-bottom: 1px solid var(--border-color);
-}
-
-.card-body {
- padding: 1.25rem;
-}
-
-.card-footer {
- padding: 1.25rem;
- background: var(--background);
- border-top: 1px solid var(--border-color);
-}
-
-/* Margin Utilities */
-.m-2 { margin: 0.5rem !important; }
-.m-4 { margin: 1rem !important; }
-.m-6 { margin: 1.5rem !important; }
-.m-8 { margin: 2rem !important; }
-
-.mt-2 { margin-top: 0.5rem !important; }
-.mt-4 { margin-top: 1rem !important; }
-.mt-6 { margin-top: 1.5rem !important; }
-.mt-8 { margin-top: 2rem !important; }
-
-.mb-2 { margin-bottom: 0.5rem !important; }
-.mb-4 { margin-bottom: 1rem !important; }
-.mb-6 { margin-bottom: 1.5rem !important; }
-.mb-8 { margin-bottom: 2rem !important; }
-
-.mr-2 { margin-right: 0.5rem !important; }
-.mr-4 { margin-right: 1rem !important; }
-.mr-6 { margin-right: 1.5rem !important; }
-.mr-8 { margin-right: 2rem !important; }
-
-.ml-2 { margin-left: 0.5rem !important; }
-.ml-4 { margin-left: 1rem !important; }
-.ml-6 { margin-left: 1.5rem !important; }
-.ml-8 { margin-left: 2rem !important; }
-
-/* Padding Utilities */
-.p-2 { padding: 0.5rem !important; }
-.p-4 { padding: 1rem !important; }
-.p-6 { padding: 1.5rem !important; }
-.p-8 { padding: 2rem !important; }
-
-.pt-2 { padding-top: 0.5rem !important; }
-.pt-4 { padding-top: 1rem !important; }
-.pt-6 { padding-top: 1.5rem !important; }
-.pt-8 { padding-top: 2rem !important; }
-
-.pb-2 { padding-bottom: 0.5rem !important; }
-.pb-4 { padding-bottom: 1rem !important; }
-.pb-6 { padding-bottom: 1.5rem !important; }
-.pb-8 { padding-bottom: 2rem !important; }
-
-.pr-2 { padding-right: 0.5rem !important; }
-.pr-4 { padding-right: 1rem !important; }
-.pr-6 { padding-right: 1.5rem !important; }
-.pr-8 { padding-right: 2rem !important; }
-
-.pl-2 { padding-left: 0.5rem !important; }
-.pl-4 { padding-left: 1rem !important; }
-.pl-6 { padding-left: 1.5rem !important; }
-.pl-8 { padding-left: 2rem !important; }
-
-/* Button Sizing */
-.btn-sm {
- padding: 0.5rem 1rem;
- font-size: 0.75rem;
-}
-
-.btn-md {
- padding: 0.75rem 1.5rem;
- font-size: 0.875rem;
-}
-
-.btn-lg {
- padding: 1rem 2rem;
- font-size: 1rem;
-}
-
-/* Alert styling */
-.alert {
- position: relative;
- padding: 1rem 1rem;
- margin-bottom: 1rem;
- border: 1px solid transparent;
- border-radius: 0.25rem;
-}
-
-.alert-heading {
- color: inherit;
-}
-
-.alert-link {
- font-weight: 700;
-}
-
-.alert-dismissible {
- padding-right: 3rem;
-}
-.alert-dismissible .btn-close {
- position: absolute;
- top: 0;
- right: 0;
- z-index: 2;
- padding: 1.25rem 1rem;
-}
-
-.alert-primary {
- color: #084298;
- background-color: #cfe2ff;
- border-color: #b6d4fe;
-}
-.alert-primary .alert-link {
- color: #06357a;
-}
-
-.alert-secondary {
- color: #41464b;
- background-color: #e2e3e5;
- border-color: #d3d6d8;
-}
-.alert-secondary .alert-link {
- color: #34383c;
-}
-
-.alert-success {
- color: #0f5132;
- background-color: #d1e7dd;
- border-color: #badbcc;
-}
-.alert-success .alert-link {
- color: #0c4128;
-}
-
-.alert-info {
- color: #055160;
- background-color: #cff4fc;
- border-color: #b6effb;
-}
-.alert-info .alert-link {
- color: #04414d;
-}
-
-.alert-warning {
- color: #664d03;
- background-color: #fff3cd;
- border-color: #ffecb5;
-}
-.alert-warning .alert-link {
- color: #523e02;
-}
-
-.alert-danger {
- color: #842029;
- background-color: #f8d7da;
- border-color: #f5c2c7;
-}
-.alert-danger .alert-link {
- color: #6a1a21;
-}
-
-.alert-light {
- color: #636464;
- background-color: #fefefe;
- border-color: #fdfdfe;
-}
-.alert-light .alert-link {
- color: #4f5050;
-}
-
-.alert-dark {
- color: #141619;
- background-color: #d3d3d4;
- border-color: #bcbebf;
-}
-.alert-dark .alert-link {
- color: #101214;
-}
-
-/* Responsive Design */
-@media (max-width: 768px) {
- .app-container {
- flex-direction: column;
- }
-
- .sidebar {
- width: 100%;
- height: auto;
- max-height: 50vh;
- }
-
- .sidebar-header h1 {
- font-size: 1.125rem;
- }
-
- .nav-menu {
- padding: 0;
- }
-
- .nav-link {
- padding: 0.625rem 1.25rem;
- font-size: 0.8125rem;
- }
-
- .main-content {
- padding: 1rem;
- }
-
- .tool-container h2 {
- font-size: 1.5rem;
- }
-
- .home-content h1 {
- font-size: 2rem;
- }
-
- .tools-grid {
- grid-template-columns: 1fr;
- }
-
- .compare-inputs {
- grid-template-columns: 1fr;
- }
-
- .uuid-controls {
- flex-direction: column;
- align-items: stretch;
- }
-
- .jwt-sections {
- grid-template-columns: 1fr;
- }
-}
\ No newline at end of file
diff --git a/src/renderer/styles/main.css b/src/renderer/styles/main.css
deleted file mode 100644
index b0983f7e..00000000
--- a/src/renderer/styles/main.css
+++ /dev/null
@@ -1,2652 +0,0 @@
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-:root {
- --primary-color: #5e72e4;
- --primary-dark: #4c63d2;
- --primary-light: #8896ff;
- --secondary-color: #f5365c;
- --success-color: #2dce89;
- --warning-color: #fb6340;
- --info-color: #11cdef;
- --dark-color: #172b4d;
- --gray-dark: #32325d;
- --gray: #8898aa;
- --gray-light: #e9ecef;
- --white: #ffffff;
- --background: #f7f8fc;
- --surface: #ffffff;
- --border-color: #e3e8f0;
- --text-primary: #32325d;
- --text-secondary: #525f7f;
- --text-muted: #8898aa;
- --shadow-sm: 0 0 0.5rem rgba(0, 0, 0, 0.075);
- --shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15);
- --shadow-lg: 0 0 3rem rgba(0, 0, 0, 0.175);
- --border-radius: 0.375rem;
- --border-radius-lg: 0.5rem;
- --border-radius-xl: 0.75rem;
- --transition: all 0.15s ease;
-}
-
-body {
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
- 'Helvetica Neue', Arial, sans-serif;
- background-color: var(--background);
- color: var(--text-primary);
- height: 100vh;
- overflow: hidden;
- font-size: 0.9375rem;
- line-height: 1.6;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-.app-container {
- display: flex;
- height: 100vh;
-}
-
-.sidebar {
- width: 260px;
- background: linear-gradient(180deg, #5e72e4 0%, #825ee4 100%);
- color: white;
- overflow-y: auto;
- overflow-x: hidden;
- box-shadow: 0 0 2rem 0 rgba(136, 152, 170, 0.15);
- scrollbar-width: thin;
- scrollbar-color: rgba(255, 255, 255, 0.2) transparent;
-}
-
-.sidebar::-webkit-scrollbar {
- width: 6px;
-}
-
-.sidebar::-webkit-scrollbar-track {
- background: transparent;
-}
-
-.sidebar::-webkit-scrollbar-thumb {
- background-color: rgba(255, 255, 255, 0.2);
- border-radius: 3px;
-}
-
-.sidebar::-webkit-scrollbar-thumb:hover {
- background-color: rgba(255, 255, 255, 0.3);
-}
-
-.sidebar-header {
- padding: 1.5rem;
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
- background: rgba(0, 0, 0, 0.1);
-}
-
-.sidebar-header h1 {
- font-size: 1.25rem;
- font-weight: 700;
- letter-spacing: -0.025em;
- display: flex;
- align-items: center;
- gap: 0.75rem;
-}
-
-.sidebar-header h1 i {
- font-size: 1.125rem;
- opacity: 0.9;
-}
-
-.sidebar-subtitle {
- font-size: 0.75rem;
- opacity: 0.7;
- text-transform: uppercase;
- letter-spacing: 0.1em;
- margin-top: 0.25rem;
- margin-left: 2rem;
-}
-
-/* Menu Search Styles */
-.menu-search-container {
- padding: 1rem 1.5rem;
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
-}
-
-.search-input-wrapper {
- position: relative;
- display: flex;
- align-items: center;
- background: rgba(255, 255, 255, 0.1);
- border-radius: 8px;
- transition: var(--transition);
-}
-
-.search-input-wrapper:focus-within {
- background: rgba(255, 255, 255, 0.15);
-}
-
-.search-icon {
- position: absolute;
- left: 0.875rem;
- color: rgba(255, 255, 255, 0.6);
- font-size: 0.75rem;
- pointer-events: none;
-}
-
-.menu-search-input {
- width: 100%;
- padding: 0.625rem 2.25rem 0.625rem 2.25rem;
- background: transparent;
- border: none;
- color: white;
- font-size: 0.8125rem;
- outline: none;
-}
-
-.menu-search-input::placeholder {
- color: rgba(255, 255, 255, 0.5);
-}
-
-.clear-search-btn {
- position: absolute;
- right: 0.625rem;
- background: none;
- border: none;
- color: rgba(255, 255, 255, 0.5);
- cursor: pointer;
- padding: 0.25rem;
- border-radius: 4px;
- transition: var(--transition);
- opacity: 0;
-}
-
-.clear-search-btn.visible {
- opacity: 1;
-}
-
-.clear-search-btn:hover {
- color: rgba(255, 255, 255, 0.8);
- background: rgba(255, 255, 255, 0.1);
-}
-
-.search-results {
- margin-top: 0.5rem;
- max-height: 200px;
- overflow-y: auto;
- background: rgba(0, 0, 0, 0.2);
- border-radius: 6px;
-}
-
-.search-result-item {
- padding: 0.625rem 0.875rem;
- color: rgba(255, 255, 255, 0.9);
- cursor: pointer;
- transition: var(--transition);
- font-size: 0.8125rem;
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
- display: flex;
- align-items: center;
- gap: 0.625rem;
-}
-
-.search-result-item:last-child {
- border-bottom: none;
-}
-
-.search-result-item:hover {
- background: rgba(255, 255, 255, 0.08);
-}
-
-.search-result-item.highlighted {
- background: rgba(255, 255, 255, 0.15);
-}
-
-.search-result-item i {
- font-size: 0.75rem;
- width: 14px;
- text-align: center;
- opacity: 0.8;
-}
-
-.search-result-item.no-results {
- color: rgba(255, 255, 255, 0.5);
- font-style: italic;
- cursor: default;
- justify-content: center;
- padding: 0.75rem;
-}
-
-.search-result-item.no-results:hover {
- background: none;
-}
-
-/* Menu Category Styles */
-.nav-menu-container {
- padding: 0.5rem 0;
-}
-
-.menu-category {
- margin-bottom: 0.25rem;
-}
-
-.category-header {
- display: flex;
- align-items: center;
- padding: 0.5rem 1.5rem;
- color: rgba(255, 255, 255, 0.9);
- cursor: pointer;
- user-select: none;
- transition: var(--transition);
- font-size: 0.875rem;
- font-weight: 600;
-}
-
-.category-header:hover {
- background: rgba(255, 255, 255, 0.08);
-}
-
-.category-chevron {
- margin-right: 0.75rem;
- font-size: 0.75rem;
- transition: transform 0.2s ease;
-}
-
-.category-header.expanded .category-chevron {
- transform: rotate(90deg);
-}
-
-.category-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- max-height: 0;
- overflow: hidden;
- transition: max-height 0.3s ease;
-}
-
-.category-menu.expanded {
- max-height: 500px;
-}
-
-.category-menu .nav-link {
- padding-left: 3rem;
- font-size: 0.8125rem;
-}
-
-/* Hide menu items when search is active */
-.search-active .menu-category {
- display: none;
-}
-
-.search-active .nav-menu-container > .nav-menu {
- display: block;
-}
-
-.nav-menu {
- list-style: none;
- padding: 0.5rem 0;
-}
-
-.nav-menu li {
- margin: 0;
-}
-
-.nav-link {
- display: flex;
- align-items: center;
- padding: 0.75rem 1.5rem;
- color: rgba(255, 255, 255, 0.8);
- text-decoration: none;
- transition: var(--transition);
- position: relative;
- font-size: 0.875rem;
- font-weight: 500;
-}
-
-.nav-link:hover {
- background-color: rgba(255, 255, 255, 0.08);
- color: white;
-}
-
-.nav-link.active {
- background-color: rgba(255, 255, 255, 0.15);
- color: white;
-}
-
-.nav-link.active::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 3px;
- background: white;
-}
-
-.nav-link i {
- margin-right: 0.75rem;
- width: 1.25rem;
- text-align: center;
- font-size: 0.875rem;
- opacity: 0.9;
-}
-
-.main-content {
- flex: 1;
- padding: 2rem;
- overflow-y: auto;
- background-color: var(--background);
- scrollbar-width: thin;
- scrollbar-color: var(--gray-light) transparent;
-}
-
-.main-content::-webkit-scrollbar {
- width: 8px;
-}
-
-.main-content::-webkit-scrollbar-track {
- background: transparent;
-}
-
-.main-content::-webkit-scrollbar-thumb {
- background-color: var(--gray-light);
- border-radius: 4px;
-}
-
-.main-content::-webkit-scrollbar-thumb:hover {
- background-color: var(--gray);
-}
-
-.tool-container {
- display: none;
- max-width: 1200px;
- margin: 0 auto;
- animation: fadeIn 0.3s ease;
-}
-
-.tool-container.active {
- display: block;
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- transform: translateY(10px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-.tool-container h2 {
- margin-bottom: 2rem;
- color: var(--text-primary);
- font-size: 1.75rem;
- font-weight: 700;
- letter-spacing: -0.025em;
- display: flex;
- align-items: center;
- gap: 0.75rem;
-}
-
-.tool-container h2 i {
- font-size: 1.5rem;
- color: var(--primary-color);
- background: linear-gradient(
- 135deg,
- var(--primary-color),
- var(--primary-light)
- );
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
-}
-
-.home-content {
- padding: 2rem 0;
-}
-
-.home-hero {
- text-align: center;
- margin-bottom: 3rem;
- padding: 2rem 0;
-}
-
-.home-hero h1 {
- font-size: 3rem;
- margin-bottom: 1rem;
- color: var(--text-primary);
- font-weight: 800;
- letter-spacing: -0.03em;
- background: linear-gradient(
- 135deg,
- var(--primary-color) 0%,
- var(--primary-light) 100%
- );
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- line-height: 1.2;
-}
-
-.home-hero p {
- font-size: 1.25rem;
- margin-bottom: 2rem;
- color: var(--text-secondary);
- max-width: 600px;
- margin-left: auto;
- margin-right: auto;
- line-height: 1.6;
-}
-
-.home-stats {
- display: flex;
- justify-content: center;
- gap: 3rem;
- margin-top: 2rem;
- flex-wrap: wrap;
-}
-
-.stat-item {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- color: var(--text-secondary);
- font-weight: 600;
- font-size: 0.9375rem;
-}
-
-.stat-item i {
- color: var(--primary-color);
- font-size: 1.125rem;
-}
-
-.tools-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
- gap: 1.5rem;
- margin-top: 2rem;
-}
-
-.tool-card {
- background: var(--surface);
- padding: 1.75rem;
- border-radius: var(--border-radius-xl);
- box-shadow: var(--shadow-sm);
- border: 1px solid var(--border-color);
- cursor: pointer;
- transition: var(--transition);
- position: relative;
- overflow: hidden;
-}
-
-.tool-card::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 3px;
- background: linear-gradient(
- 90deg,
- var(--primary-color),
- var(--primary-light)
- );
- transform: scaleX(0);
- transition: transform 0.3s ease;
-}
-
-.tool-card:hover {
- transform: translateY(-4px);
- box-shadow: var(--shadow);
- border-color: var(--primary-color);
-}
-
-.tool-card:hover::before {
- transform: scaleX(1);
-}
-
-.tool-icon {
- width: 3.5rem;
- height: 3.5rem;
- background: linear-gradient(
- 135deg,
- var(--primary-color),
- var(--primary-light)
- );
- border-radius: var(--border-radius-lg);
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: 1rem;
- transition: var(--transition);
-}
-
-.tool-card:hover .tool-icon {
- transform: scale(1.1) rotate(5deg);
-}
-
-.tool-icon i {
- font-size: 1.5rem;
- color: white;
-}
-
-.tool-badge {
- position: absolute;
- top: 1rem;
- right: 1rem;
- background: linear-gradient(
- 135deg,
- var(--primary-color),
- var(--primary-light)
- );
- color: white;
- padding: 0.25rem 0.625rem;
- border-radius: 1rem;
- font-size: 0.625rem;
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.05em;
-}
-
-.tool-card h3 {
- font-size: 1.125rem;
- margin-bottom: 0.5rem;
- color: var(--text-primary);
- font-weight: 600;
- letter-spacing: -0.01em;
-}
-
-.tool-card p {
- color: var(--text-muted);
- line-height: 1.5;
- font-size: 0.875rem;
-}
-
-.tool-content {
- background: var(--surface);
- border-radius: var(--border-radius-xl);
- padding: 2rem;
- box-shadow: var(--shadow);
- border: 1px solid var(--border-color);
-}
-
-.input-section,
-.output-section {
- margin-bottom: 1.5rem;
-}
-
-.input-section label,
-.output-section label {
- display: block;
- margin-bottom: 0.5rem;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
-}
-
-.input-section textarea,
-.output-section textarea {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- resize: vertical;
- background-color: var(--surface);
- transition: var(--transition);
- line-height: 1.6;
- box-sizing: border-box;
-}
-
-.input-section textarea:focus,
-.output-section textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- background-color: var(--surface);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.output-section pre {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background-color: var(--background);
- overflow: auto;
- white-space: pre-wrap;
- color: var(--text-primary);
- line-height: 1.6;
- margin: 0;
- box-sizing: border-box;
-}
-
-.controls {
- display: flex;
- gap: 0.75rem;
- margin: 1.5rem 0;
- flex-wrap: wrap;
- align-items: center;
-}
-
-.btn {
- display: inline-block;
- background: linear-gradient(
- 135deg,
- var(--primary-color),
- var(--primary-dark)
- );
- color: white;
- border: none;
- padding: 0.75rem 1.5rem;
- border-radius: var(--border-radius);
- cursor: pointer;
- font-size: 0.875rem;
- font-weight: 600;
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
- sans-serif;
- transition: var(--transition);
- text-transform: uppercase;
- letter-spacing: 0.025em;
- position: relative;
- overflow: hidden;
- box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
- white-space: nowrap;
- line-height: 1.2;
- text-align: center;
- vertical-align: middle;
-}
-
-.btn::before {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- width: 0;
- height: 0;
- border-radius: 50%;
- background: rgba(255, 255, 255, 0.3);
- transform: translate(-50%, -50%);
- transition: width 0.6s ease, height 0.6s ease;
-}
-
-.btn:hover::before {
- width: 300px;
- height: 300px;
-}
-
-.btn:hover {
- transform: translateY(-2px);
- box-shadow: 0 7px 14px rgba(50, 50, 93, 0.1), 0 3px 6px rgba(0, 0, 0, 0.08);
-}
-
-.btn:active {
- transform: translateY(0);
-}
-
-.btn-primary {
- background: linear-gradient(
- 135deg,
- var(--primary-color),
- var(--primary-dark)
- );
-}
-
-.btn-secondary {
- background: linear-gradient(135deg, var(--gray), var(--gray-dark));
-}
-
-.btn-info {
- background: linear-gradient(135deg, var(--info-color), #0da5c0);
-}
-
-.btn-success {
- background: linear-gradient(135deg, var(--success-color), #26b56e);
-}
-
-.btn-warning {
- background: linear-gradient(135deg, var(--warning-color), #fa441d);
-}
-
-.btn-danger {
- background: linear-gradient(135deg, var(--secondary-color), #ec0c38);
-}
-
-.btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
- transform: none;
-}
-
-.btn:disabled:hover {
- transform: none;
- box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
-}
-
-.compare-inputs {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 1.5rem;
- margin-bottom: 1.5rem;
-}
-
-.input-group {
- display: flex;
- flex-direction: column;
-}
-
-.input-group label {
- margin-bottom: 0.5rem;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
-}
-
-.input-group input,
-.input-group select,
-.input-group textarea {
- padding: 0.75rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-size: 0.9375rem;
- transition: var(--transition);
- background: var(--background);
-}
-
-.input-group input:focus,
-.input-group select:focus,
-.input-group textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- background: var(--surface);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.case-options {
- display: flex;
- flex-wrap: wrap;
- gap: 0.5rem;
- margin: 1.5rem 0;
-}
-
-.case-btn {
- background: var(--surface);
- border: 2px solid var(--border-color);
- padding: 0.5rem 1rem;
- border-radius: var(--border-radius);
- cursor: pointer;
- font-size: 0.875rem;
- font-weight: 500;
- transition: var(--transition);
- color: var(--text-secondary);
-}
-
-.case-btn:hover {
- background: var(--primary-color);
- color: white;
- border-color: var(--primary-color);
- transform: translateY(-2px);
- box-shadow: var(--shadow-sm);
-}
-
-.uuid-controls {
- display: flex;
- align-items: flex-end;
- gap: 1rem;
- margin-bottom: 1.5rem;
- flex-wrap: wrap;
-}
-
-.uuid-controls .control-group {
- flex: 0 0 auto;
-}
-
-.uuid-controls select,
-.uuid-controls input {
- min-width: 150px;
-}
-
-.control-group {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
- min-width: 120px;
-}
-
-.control-group label {
- display: block;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.75rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
- margin-bottom: 0.25rem;
-}
-
-.converter-tabs {
- display: flex;
- margin-bottom: 1.5rem;
- background: var(--background);
- border-radius: var(--border-radius);
- padding: 0.25rem;
-}
-
-.tab-btn {
- flex: 1;
- background: transparent;
- border: none;
- padding: 0.625rem 1.25rem;
- cursor: pointer;
- font-size: 0.875rem;
- font-weight: 600;
- color: var(--text-muted);
- border-radius: var(--border-radius);
- transition: var(--transition);
- text-transform: uppercase;
- letter-spacing: 0.025em;
-}
-
-.tab-btn:hover {
- color: var(--text-secondary);
-}
-
-.tab-btn.active {
- background: var(--surface);
- color: var(--primary-color);
- box-shadow: var(--shadow-sm);
-}
-
-.tab-content {
- display: none;
- animation: fadeIn 0.3s ease;
-}
-
-.tab-content.active {
- display: block;
-}
-
-.tab-content textarea {
- width: 100%;
- min-height: 150px;
- margin: 1rem 0;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- resize: vertical;
- background: var(--surface);
- transition: var(--transition);
- box-sizing: border-box;
- line-height: 1.6;
-}
-
-.tab-content textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- background: var(--surface);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.tab-content .btn {
- margin-top: 0.5rem;
-}
-
-.jwt-sections {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
- gap: 1.5rem;
- margin-top: 1.5rem;
-}
-
-.jwt-section {
- background: var(--background);
- border-radius: var(--border-radius-lg);
- padding: 1.5rem;
- border: 1px solid var(--border-color);
-}
-
-.jwt-section h3 {
- margin-bottom: 1rem;
- color: var(--text-primary);
- font-size: 0.875rem;
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.025em;
-}
-
-.jwt-section pre {
- background: var(--surface);
- padding: 1rem;
- border-radius: var(--border-radius);
- border: 1px solid var(--border-color);
- overflow: auto;
- font-size: 0.75rem;
- line-height: 1.5;
- color: var(--text-primary);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
-}
-
-#comparison-result {
- margin-top: 1.5rem;
- padding: 1.5rem;
- background: var(--background);
- border-radius: var(--border-radius-lg);
- min-height: 100px;
- border: 1px solid var(--border-color);
-}
-
-.diff-added {
- background-color: rgba(45, 206, 137, 0.1);
- color: var(--success-color);
- padding: 0.125rem 0.25rem;
- border-radius: 0.125rem;
- font-weight: 500;
-}
-
-.diff-removed {
- background-color: rgba(245, 54, 92, 0.1);
- color: var(--secondary-color);
- padding: 0.125rem 0.25rem;
- border-radius: 0.125rem;
- text-decoration: line-through;
- font-weight: 500;
-}
-
-.error {
- color: var(--secondary-color);
- background-color: rgba(245, 54, 92, 0.1);
- border: 1px solid rgba(245, 54, 92, 0.2);
- padding: 0.75rem 1rem;
- border-radius: var(--border-radius);
- margin: 1rem 0;
- font-size: 0.875rem;
- font-weight: 500;
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.error::before {
- content: '⚠️';
-}
-
-.success {
- color: var(--success-color);
- background-color: rgba(45, 206, 137, 0.1);
- border: 1px solid rgba(45, 206, 137, 0.2);
- padding: 0.75rem 1rem;
- border-radius: var(--border-radius);
- margin: 1rem 0;
- font-size: 0.875rem;
- font-weight: 500;
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.success::before {
- content: '✓';
- display: inline-flex;
- width: 1.25rem;
- height: 1.25rem;
- background: var(--success-color);
- color: white;
- border-radius: 50%;
- align-items: center;
- justify-content: center;
- font-size: 0.75rem;
-}
-
-/* Global form element styles */
-input[type='text'],
-input[type='number'],
-input[type='email'],
-input[type='password'],
-input[type='search'],
-input[type='tel'],
-input[type='url'],
-input[type='date'],
-input[type='datetime-local'],
-input[type='month'],
-input[type='time'],
-input[type='week'],
-select,
-textarea {
- width: 100%;
- padding: 0.75rem 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-size: 0.9375rem;
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
- sans-serif;
- background-color: var(--surface);
- color: var(--text-primary);
- transition: var(--transition);
- box-sizing: border-box;
- line-height: 1.5;
-}
-
-textarea {
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- resize: vertical;
- min-height: 100px;
-}
-
-input:focus,
-select:focus,
-textarea:focus {
- outline: none;
- border-color: var(--primary-color);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-input::placeholder,
-textarea::placeholder {
- color: var(--text-muted);
- opacity: 0.7;
-}
-
-/* Select dropdown styling */
-select {
- appearance: none;
- background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238898AA' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: right 0.75rem center;
- background-size: 1rem;
- padding-right: 2.5rem;
- cursor: pointer;
-}
-
-input[type='checkbox'] {
- width: 1.125rem;
- height: 1.125rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- margin-right: 0.5rem;
- cursor: pointer;
- transition: var(--transition);
-}
-
-input[type='checkbox']:checked {
- background: var(--primary-color);
- border-color: var(--primary-color);
-}
-
-input[type='color'] {
- width: 3rem;
- height: 3rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- cursor: pointer;
- padding: 0.25rem;
-}
-
-input[type='range'] {
- appearance: none;
- width: 100%;
- height: 0.5rem;
- background: var(--border-color);
- border-radius: 0.25rem;
- outline: none;
- transition: var(--transition);
-}
-
-input[type='range']::-webkit-slider-thumb {
- appearance: none;
- width: 1.25rem;
- height: 1.25rem;
- background: var(--primary-color);
- border-radius: 50%;
- cursor: pointer;
- box-shadow: var(--shadow-sm);
- transition: var(--transition);
-}
-
-input[type='range']::-webkit-slider-thumb:hover {
- transform: scale(1.1);
- box-shadow: var(--shadow);
-}
-
-/* Tooltips */
-[title] {
- position: relative;
-}
-
-[title]:hover::after {
- content: attr(title);
- position: absolute;
- bottom: 100%;
- left: 50%;
- transform: translateX(-50%);
- padding: 0.25rem 0.5rem;
- background: var(--dark-color);
- color: white;
- font-size: 0.75rem;
- border-radius: var(--border-radius);
- white-space: nowrap;
- z-index: 1000;
- pointer-events: none;
- margin-bottom: 0.25rem;
-}
-
-/* Loading state */
-.loading {
- position: relative;
- pointer-events: none;
- opacity: 0.7;
-}
-
-.loading::after {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 1.5rem;
- height: 1.5rem;
- border: 2px solid var(--primary-color);
- border-top-color: transparent;
- border-radius: 50%;
- animation: spin 0.6s linear infinite;
-}
-
-@keyframes spin {
- to {
- transform: translate(-50%, -50%) rotate(360deg);
- }
-}
-
-/* Empty states */
-.empty-state {
- text-align: center;
- padding: 3rem 1.5rem;
- color: var(--text-muted);
-}
-
-.empty-state i {
- font-size: 3rem;
- margin-bottom: 1rem;
- opacity: 0.5;
-}
-
-.empty-state h3 {
- color: var(--text-secondary);
- margin-bottom: 0.5rem;
-}
-
-.empty-state p {
- font-size: 0.875rem;
-}
-
-/* Badges */
-.badge {
- display: inline-flex;
- align-items: center;
- padding: 0.25rem 0.625rem;
- font-size: 0.75rem;
- font-weight: 600;
- border-radius: var(--border-radius);
- background: var(--primary-color);
- color: white;
- text-transform: uppercase;
- letter-spacing: 0.025em;
-}
-
-.badge-secondary {
- background: var(--gray);
-}
-
-.badge-success {
- background: var(--success-color);
-}
-
-.badge-warning {
- background: var(--warning-color);
-}
-
-.badge-danger {
- background: var(--secondary-color);
-}
-
-.badge-info {
- background: var(--info-color);
-}
-
-/* Cards */
-.card {
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- box-shadow: var(--shadow-sm);
- border: 1px solid var(--border-color);
- overflow: hidden;
-}
-
-.card-header {
- padding: 1.25rem;
- background: var(--background);
- border-bottom: 1px solid var(--border-color);
-}
-
-.card-body {
- padding: 1.25rem;
-}
-
-.card-footer {
- padding: 1.25rem;
- background: var(--background);
- border-top: 1px solid var(--border-color);
-}
-
-/* Responsive Design */
-@media (max-width: 768px) {
- .app-container {
- flex-direction: column;
- }
-
- .sidebar {
- width: 100%;
- height: auto;
- max-height: 50vh;
- }
-
- .sidebar-header h1 {
- font-size: 1.125rem;
- }
-
- .nav-menu {
- padding: 0;
- }
-
- .nav-link {
- padding: 0.625rem 1.25rem;
- font-size: 0.8125rem;
- }
-
- .main-content {
- padding: 1rem;
- }
-
- .tool-container h2 {
- font-size: 1.5rem;
- }
-
- .home-content h1 {
- font-size: 2rem;
- }
-
- .tools-grid {
- grid-template-columns: 1fr;
- }
-
- .compare-inputs {
- grid-template-columns: 1fr;
- }
-
- .uuid-controls {
- flex-direction: column;
- align-items: stretch;
- }
-
- .jwt-sections {
- grid-template-columns: 1fr;
- }
-}
-
-/* Password Generator Styles */
-.password-tabs {
- display: flex;
- gap: 8px;
- margin-bottom: 20px;
- border-bottom: 2px solid var(--border-color);
- padding-bottom: 0;
-}
-
-.password-tabs .tab-btn {
- background: none;
- border: none;
- padding: 12px 20px;
- border-radius: 8px 8px 0 0;
- cursor: pointer;
- font-weight: 500;
- color: var(--text-secondary);
- border-bottom: 3px solid transparent;
- transition: var(--transition);
-}
-
-.password-tabs .tab-btn:hover {
- background-color: var(--gray-light);
- color: var(--text-primary);
-}
-
-.password-tabs .tab-btn.active {
- color: var(--primary-color);
- border-bottom-color: var(--primary-color);
- background-color: rgba(94, 114, 228, 0.1);
-}
-
-.password-options {
- display: flex;
- flex-direction: column;
- gap: 20px;
- margin-bottom: 20px;
-}
-
-.checkbox-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 15px;
- padding: 20px;
- background-color: var(--background);
- border-radius: var(--border-radius);
- border: 1px solid var(--border-color);
-}
-
-.checkbox-label {
- display: flex;
- align-items: center;
- gap: 10px;
- cursor: pointer;
- font-size: 0.9rem;
- color: var(--text-primary);
- transition: var(--transition);
-}
-
-.checkbox-label:hover {
- color: var(--primary-color);
-}
-
-.checkbox-label input[type='checkbox'] {
- width: 18px;
- height: 18px;
- accent-color: var(--primary-color);
- cursor: pointer;
-}
-
-.button-group {
- display: flex;
- gap: 10px;
- flex-wrap: wrap;
-}
-
-.strength-analysis {
- margin-top: 20px;
- padding: 20px;
- background-color: var(--surface);
- border-radius: var(--border-radius);
- border: 1px solid var(--border-color);
-}
-
-.strength-bar {
- width: 100%;
- height: 8px;
- background-color: var(--gray-light);
- border-radius: 4px;
- overflow: hidden;
- margin-bottom: 10px;
-}
-
-.strength-indicator {
- height: 100%;
- transition: all 0.3s ease;
- border-radius: 4px;
-}
-
-.strength-indicator.very-weak {
- background-color: #ff4757;
-}
-
-.strength-indicator.weak {
- background-color: #ff6b81;
-}
-
-.strength-indicator.fair {
- background-color: #ffa502;
-}
-
-.strength-indicator.good {
- background-color: #2ed573;
-}
-
-.strength-indicator.strong {
- background-color: #1e90ff;
-}
-
-.strength-info {
- display: flex;
- justify-content: space-between;
- margin-bottom: 15px;
- font-size: 0.9rem;
- color: var(--text-secondary);
-}
-
-.strength-text {
- font-weight: 600;
-}
-
-.strength-text.very-weak {
- color: #ff4757;
-}
-
-.strength-text.weak {
- color: #ff6b81;
-}
-
-.strength-text.fair {
- color: #ffa502;
-}
-
-.strength-text.good {
- color: #2ed573;
-}
-
-.strength-text.strong {
- color: #1e90ff;
-}
-
-.strength-feedback {
- list-style: none;
- padding: 0;
-}
-
-.strength-feedback li {
- padding: 5px 0;
- font-size: 0.85rem;
- color: var(--warning-color);
- position: relative;
- padding-left: 20px;
-}
-
-.strength-feedback li:before {
- content: '⚠';
- position: absolute;
- left: 0;
- color: var(--warning-color);
-}
-
-#password-output,
-#multiple-passwords-output {
- font-family: 'Monaco', 'Consolas', monospace;
- font-weight: 500;
- font-size: 16px;
- letter-spacing: 1px;
-}
-
-#password-strength-input {
- min-height: 100px;
- font-family: 'Monaco', 'Consolas', monospace;
-}
-
-/* Margin Utilities */
-.m-2 { margin: 0.5rem !important; }
-.m-4 { margin: 1rem !important; }
-.m-6 { margin: 1.5rem !important; }
-.m-8 { margin: 2rem !important; }
-
-.mt-2 { margin-top: 0.5rem !important; }
-.mt-4 { margin-top: 1rem !important; }
-.mt-6 { margin-top: 1.5rem !important; }
-.mt-8 { margin-top: 2rem !important; }
-
-.mb-2 { margin-bottom: 0.5rem !important; }
-.mb-4 { margin-bottom: 1rem !important; }
-.mb-6 { margin-bottom: 1.5rem !important; }
-.mb-8 { margin-bottom: 2rem !important; }
-
-.mr-2 { margin-right: 0.5rem !important; }
-.mr-4 { margin-right: 1rem !important; }
-.mr-6 { margin-right: 1.5rem !important; }
-.mr-8 { margin-right: 2rem !important; }
-
-.ml-2 { margin-left: 0.5rem !important; }
-.ml-4 { margin-left: 1rem !important; }
-.ml-6 { margin-left: 1.5rem !important; }
-.ml-8 { margin-left: 2rem !important; }
-
-/* Padding Utilities */
-.p-2 { padding: 0.5rem !important; }
-.p-4 { padding: 1rem !important; }
-.p-6 { padding: 1.5rem !important; }
-.p-8 { padding: 2rem !important; }
-
-.pt-2 { padding-top: 0.5rem !important; }
-.pt-4 { padding-top: 1rem !important; }
-.pt-6 { padding-top: 1.5rem !important; }
-.pt-8 { padding-top: 2rem !important; }
-
-.pb-2 { padding-bottom: 0.5rem !important; }
-.pb-4 { padding-bottom: 1rem !important; }
-.pb-6 { padding-bottom: 1.5rem !important; }
-.pb-8 { padding-bottom: 2rem !important; }
-
-.pr-2 { padding-right: 0.5rem !important; }
-.pr-4 { padding-right: 1rem !important; }
-.pr-6 { padding-right: 1.5rem !important; }
-.pr-8 { padding-right: 2rem !important; }
-
-.pl-2 { padding-left: 0.5rem !important; }
-.pl-4 { padding-left: 1rem !important; }
-.pl-6 { padding-left: 1.5rem !important; }
-.pl-8 { padding-left: 2rem !important; }
-
-/* Button Sizing */
-.btn-sm {
- padding: 0.5rem 1rem;
- font-size: 0.75rem;
-}
-
-.btn-md {
- padding: 0.75rem 1.5rem;
- font-size: 0.875rem;
-}
-
-.btn-lg {
- padding: 1rem 2rem;
- font-size: 1rem;
-}
-
-/* Alert styling */
-.alert {
- position: relative;
- padding: 1rem 1rem;
- margin-bottom: 1rem;
- border: 1px solid transparent;
- border-radius: 0.25rem;
-}
-
-.alert-heading {
- color: inherit;
-}
-
-.alert-link {
- font-weight: 700;
-}
-
-.alert-dismissible {
- padding-right: 3rem;
-}
-.alert-dismissible .btn-close {
- position: absolute;
- top: 0;
- right: 0;
- z-index: 2;
- padding: 1.25rem 1rem;
-}
-
-.alert-primary {
- color: #084298;
- background-color: #cfe2ff;
- border-color: #b6d4fe;
-}
-.alert-primary .alert-link {
- color: #06357a;
-}
-
-.alert-secondary {
- color: #41464b;
- background-color: #e2e3e5;
- border-color: #d3d6d8;
-}
-.alert-secondary .alert-link {
- color: #34383c;
-}
-
-.alert-success {
- color: #0f5132;
- background-color: #d1e7dd;
- border-color: #badbcc;
-}
-.alert-success .alert-link {
- color: #0c4128;
-}
-
-.alert-info {
- color: #055160;
- background-color: #cff4fc;
- border-color: #b6effb;
-}
-.alert-info .alert-link {
- color: #04414d;
-}
-
-.alert-warning {
- color: #664d03;
- background-color: #fff3cd;
- border-color: #ffecb5;
-}
-.alert-warning .alert-link {
- color: #523e02;
-}
-
-.alert-danger {
- color: #842029;
- background-color: #f8d7da;
- border-color: #f5c2c7;
-}
-.alert-danger .alert-link {
- color: #6a1a21;
-}
-
-.alert-light {
- color: #636464;
- background-color: #fefefe;
- border-color: #fdfdfe;
-}
-.alert-light .alert-link {
- color: #4f5050;
-}
-
-.alert-dark {
- color: #141619;
- background-color: #d3d3d4;
- border-color: #bcbebf;
-}
-.alert-dark .alert-link {
- color: #101214;
-}
-
-/* Responsive adjustments for password generator */
-@media (max-width: 768px) {
- .checkbox-grid {
- grid-template-columns: 1fr;
- gap: 12px;
- }
-
- .button-group {
- flex-direction: column;
- }
-
- .strength-info {
- flex-direction: column;
- gap: 8px;
- }
-
- .password-tabs {
- flex-wrap: wrap;
- }
-}
-
-/* API Response Formatter Styles */
-.input-controls {
- display: flex;
- align-items: baseline;
- gap: 10px;
- margin-bottom: 10px;
-}
-
-.input-controls label {
- font-weight: 500;
- color: var(--text-secondary);
- font-size: 0.8rem;
-}
-
-.input-controls select {
- padding: 8px 12px;
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius);
- background-color: var(--white);
- color: var(--text-primary);
- font-size: 0.875rem;
- transition: var(--transition);
- max-width: 120px;
- width: auto;
-}
-
-.input-controls select:focus {
- outline: none;
- border-color: var(--primary-color);
- box-shadow: 0 0 0 2px rgba(94, 114, 228, 0.1);
-}
-
-.search-controls {
- display: flex;
- align-items: center;
- gap: 10px;
- margin-bottom: 15px;
- padding: 10px;
- background-color: var(--gray-light);
- border-radius: var(--border-radius);
-}
-
-.search-input-group {
- display: flex;
- align-items: center;
- gap: 5px;
- flex: 1;
-}
-
-.search-input-group input {
- flex: 1;
- padding: 8px 12px;
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius);
- font-size: 0.875rem;
-}
-
-.search-input-group .btn {
- padding: 8px;
- min-width: auto;
-}
-
-.search-stats {
- font-size: 0.875rem;
- color: var(--text-muted);
- white-space: nowrap;
-}
-
-.tree-output {
- background-color: var(--white);
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius);
- padding: 15px;
- max-height: 500px;
- overflow-y: auto;
- font-family: 'Monaco', 'Consolas', 'Ubuntu Mono', monospace;
- font-size: 0.875rem;
- line-height: 1.5;
-}
-
-.response-info {
- display: flex;
- flex-wrap: wrap;
- gap: 20px;
- padding: 10px;
- background-color: var(--gray-light);
- border-radius: var(--border-radius);
- margin-bottom: 15px;
- font-size: 0.875rem;
-}
-
-.info-row {
- display: flex;
- gap: 5px;
-}
-
-.info-label {
- font-weight: 600;
- color: var(--text-secondary);
-}
-
-.info-value {
- color: var(--text-primary);
- font-family: 'Monaco', 'Consolas', monospace;
-}
-
-.tree-container {
- position: relative;
-}
-
-.tree-node {
- position: relative;
- margin: 2px 0;
-}
-
-.tree-toggle {
- display: inline-block;
- cursor: pointer;
- padding: 2px 4px;
- margin-right: 4px;
- color: var(--text-muted);
- transition: var(--transition);
- user-select: none;
- width: 16px;
- text-align: center;
-}
-
-.tree-toggle:hover {
- color: var(--primary-color);
- background-color: rgba(94, 114, 228, 0.1);
- border-radius: 2px;
-}
-
-.tree-toggle i {
- font-size: 0.75rem;
-}
-
-.tree-children {
- margin-left: 20px;
- border-left: 1px solid var(--border-color);
- padding-left: 10px;
-}
-
-.tree-item {
- margin: 2px 0;
- line-height: 1.4;
-}
-
-.tree-key {
- color: #0451a5;
- font-weight: 500;
-}
-
-.tree-colon {
- color: var(--text-muted);
- margin: 0 4px;
-}
-
-.tree-comma {
- color: var(--text-muted);
-}
-
-.tree-bracket {
- color: var(--text-muted);
- font-weight: 500;
-}
-
-.tree-array-bracket {
- color: #795e26;
-}
-
-.tree-object-bracket {
- color: #795e26;
-}
-
-.tree-count {
- color: var(--text-muted);
- font-size: 0.8rem;
- font-style: italic;
- margin-left: 5px;
-}
-
-.tree-index {
- color: #0451a5;
- font-weight: 500;
- margin-right: 5px;
-}
-
-.tree-value {
- display: inline;
-}
-
-.tree-string {
- color: #a31515;
-}
-
-.tree-number {
- color: #098658;
-}
-
-.tree-boolean {
- color: #0000ff;
- font-weight: 500;
-}
-
-.tree-null {
- color: #0000ff;
- font-style: italic;
-}
-
-.tree-undefined {
- color: #808080;
- font-style: italic;
-}
-
-.tree-unknown {
- color: var(--text-muted);
-}
-
-.search-highlight {
- background-color: #ffeb3b;
- color: #000;
- padding: 1px 2px;
- border-radius: 2px;
-}
-
-.search-current {
- background-color: #ff9800;
- color: #fff;
- padding: 1px 2px;
- border-radius: 2px;
- box-shadow: 0 0 3px rgba(255, 152, 0, 0.5);
-}
-
-.validation-success {
- color: var(--success-color);
- padding: 12px;
- background-color: rgba(45, 206, 137, 0.1);
- border-radius: var(--border-radius);
- border-left: 4px solid var(--success-color);
-}
-
-.validation-error {
- color: var(--secondary-color);
- padding: 12px;
- background-color: rgba(245, 54, 92, 0.1);
- border-radius: var(--border-radius);
- border-left: 4px solid var(--secondary-color);
-}
-
-.validation-success h3,
-.validation-error h3 {
- margin-bottom: 6px;
- font-size: 1.05rem;
-}
-
-.json-info {
- margin-top: 8px;
-}
-
-.json-info p {
- margin: 2px 0;
- line-height: 1.3;
- font-size: 0.9rem;
-}
-
-/* Responsive adjustments for API Response Formatter */
-@media (max-width: 768px) {
- .search-controls {
- flex-direction: column;
- align-items: stretch;
- }
-
- .search-input-group {
- justify-content: stretch;
- }
-
- .response-info {
- flex-direction: column;
- gap: 10px;
- }
-
- .tree-children {
- margin-left: 15px;
- padding-left: 8px;
- }
-
- .controls {
- flex-wrap: wrap;
- gap: 8px;
- }
-
- .controls .btn {
- flex: 1;
- min-width: 80px;
- padding: 0.4rem 0.6rem;
- font-size: 0.7rem;
- }
-}
-
-/* Regex Generator Styles */
-.regex-input {
- margin-bottom: 1.5rem;
-}
-
-.regex-input label {
- display: block;
- margin-bottom: 0.5rem;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
-}
-
-.regex-input-group {
- display: flex;
- align-items: center;
- gap: 0.25rem;
- background: var(--surface);
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- padding: 0.5rem;
- transition: var(--transition);
-}
-
-.regex-input-group:focus-within {
- border-color: var(--primary-color);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-.regex-delimiter {
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 1.125rem;
- font-weight: 600;
- color: var(--text-secondary);
- user-select: none;
-}
-
-.regex-input-group input[type="text"] {
- border: none;
- background: transparent;
- padding: 0.25rem 0.5rem;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.9375rem;
- color: var(--text-primary);
- outline: none;
- transition: var(--transition);
-}
-
-.regex-input-group input[type="text"]:focus {
- background: rgba(94, 114, 228, 0.05);
- border-radius: 0.25rem;
- box-shadow: none;
-}
-
-#regex-pattern {
- flex: 1;
- min-width: 200px;
-}
-
-#regex-flags {
- width: 80px !important;
- text-align: center;
- font-weight: 500;
-}
-
-#regex-flags::placeholder {
- font-size: 0.8rem;
- color: var(--text-muted);
-}
-
-.test-input {
- margin-bottom: 1.5rem;
-}
-
-.test-input label {
- display: block;
- margin-bottom: 0.5rem;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
- letter-spacing: 0.025em;
- text-transform: uppercase;
-}
-
-/* Regex Results Layout */
-.regex-results-container {
- margin-top: 1.5rem;
- display: grid;
- grid-template-columns: 1fr 280px;
- gap: 1.5rem;
- align-items: start;
-}
-
-.regex-main-results {
- display: flex;
- flex-direction: column;
- gap: 1.5rem;
-}
-
-.regex-sidebar {
- position: sticky;
- top: 1rem;
-}
-
-/* Highlighted Text Section */
-.highlighted-text-section {
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- padding: 1.5rem;
- border: 1px solid var(--border-color);
-}
-
-.highlighted-text-section h3 {
- margin: 0 0 1rem 0;
- color: var(--text-primary);
- font-size: 1rem;
- font-weight: 600;
-}
-
-.highlighted-text-container {
- background: var(--background);
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius);
- padding: 1rem;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- line-height: 1.6;
- white-space: pre-wrap;
- word-wrap: break-word;
- max-height: 200px;
- overflow-y: auto;
-}
-
-.highlighted-text mark {
- background-color: rgba(94, 114, 228, 0.2);
- color: var(--primary-color);
- border-radius: 2px;
- padding: 1px 2px;
- font-weight: 500;
-}
-
-/* Matches Section */
-.matches-section {
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- padding: 1.5rem;
- border: 1px solid var(--border-color);
-}
-
-.matches-section h3 {
- margin: 0 0 1rem 0;
- color: var(--text-primary);
- font-size: 1rem;
- font-weight: 600;
-}
-
-.match-count {
- color: var(--success-color);
- font-weight: 600;
- margin-bottom: 1rem;
- padding: 0.5rem 1rem;
- background: rgba(45, 206, 137, 0.1);
- border-radius: var(--border-radius);
- border-left: 3px solid var(--success-color);
-}
-
-.no-matches {
- color: var(--text-muted);
- font-style: italic;
- text-align: center;
- padding: 2rem;
- background: var(--background);
- border-radius: var(--border-radius);
-}
-
-.match-item {
- background: var(--background);
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius);
- padding: 1rem;
- margin-bottom: 0.75rem;
- transition: var(--transition);
-}
-
-.match-item:hover {
- border-color: var(--primary-color);
- box-shadow: 0 2px 8px rgba(94, 114, 228, 0.1);
-}
-
-.match-header {
- font-size: 0.75rem;
- font-weight: 600;
- color: var(--text-secondary);
- margin-bottom: 0.5rem;
- text-transform: uppercase;
- letter-spacing: 0.05em;
-}
-
-.match-text {
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- background: var(--primary-color);
- color: white;
- padding: 0.5rem 0.75rem;
- border-radius: var(--border-radius);
- font-weight: 500;
- word-break: break-all;
- font-size: 0.875rem;
-}
-
-.match-groups {
- margin-top: 0.75rem;
- display: flex;
- flex-wrap: wrap;
- gap: 0.5rem;
- align-items: center;
-}
-
-.match-groups::before {
- content: 'Groups:';
- font-size: 0.75rem;
- font-weight: 600;
- color: var(--text-secondary);
- margin-right: 0.25rem;
-}
-
-.group {
- background: var(--info-color);
- color: white;
- padding: 0.25rem 0.5rem;
- border-radius: 1rem;
- font-size: 0.75rem;
- font-weight: 500;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
-}
-
-/* Pattern Explanation Section */
-.explanation-section {
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- padding: 1.5rem;
- border: 1px solid var(--border-color);
-}
-
-.explanation-section h3 {
- margin: 0 0 1rem 0;
- color: var(--text-primary);
- font-size: 1rem;
- font-weight: 600;
-}
-
-.pattern-info {
- background: var(--background);
- padding: 1rem;
- border-radius: var(--border-radius);
- margin-bottom: 1rem;
- border-left: 3px solid var(--primary-color);
-}
-
-.pattern-info strong {
- color: var(--text-primary);
-}
-
-.pattern-info code {
- background: var(--primary-color);
- color: white;
- padding: 0.25rem 0.5rem;
- border-radius: 0.25rem;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
-}
-
-.pattern-breakdown {
- background: var(--background);
- border-radius: var(--border-radius);
- overflow: hidden;
-}
-
-.token-explanation {
- display: flex;
- align-items: center;
- padding: 0.75rem 1rem;
- border-bottom: 1px solid var(--border-color);
- transition: var(--transition);
-}
-
-.token-explanation:last-child {
- border-bottom: none;
-}
-
-.token-explanation:hover {
- background: rgba(94, 114, 228, 0.05);
-}
-
-.token {
- background: var(--primary-color);
- color: white;
- padding: 0.25rem 0.5rem;
- border-radius: 0.25rem;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.75rem;
- font-weight: 600;
- min-width: 60px;
- text-align: center;
- margin-right: 1rem;
-}
-
-.token-desc {
- color: var(--text-secondary);
- font-size: 0.875rem;
- flex: 1;
-}
-
-/* Quick Reference Sidebar */
-.regex-cheatsheet {
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- padding: 1.5rem;
- border: 1px solid var(--border-color);
- box-shadow: var(--shadow-sm);
-}
-
-.regex-cheatsheet h3 {
- margin: 0 0 1rem 0;
- color: var(--text-primary);
- font-size: 1rem;
- font-weight: 600;
-}
-
-.cheatsheet-grid {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-.cheat-item {
- background: var(--background);
- padding: 0.5rem 0.75rem;
- border-radius: var(--border-radius);
- border: 1px solid var(--border-color);
- font-size: 0.8125rem;
- transition: var(--transition);
-}
-
-.cheat-item:hover {
- border-color: var(--primary-color);
- background: rgba(94, 114, 228, 0.05);
-}
-
-.cheat-item code {
- background: var(--gray-dark);
- color: white;
- padding: 0.125rem 0.375rem;
- border-radius: 0.25rem;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.75rem;
- font-weight: 600;
- margin-right: 0.5rem;
-}
-
-/* Responsive design for regex generator */
-@media (max-width: 768px) {
- .regex-input-group {
- flex-wrap: wrap;
- }
-
- #regex-pattern {
- min-width: 150px;
- }
-
- #regex-flags {
- width: 60px !important;
- }
-
- .regex-results-container {
- grid-template-columns: 1fr;
- gap: 1rem;
- }
-
- .regex-sidebar {
- position: static;
- order: -1;
- }
-
- .cheatsheet-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
- gap: 0.5rem;
- }
-}
-
-/* Text Compare Styles */
-.compare-options {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin: 1.5rem 0;
- padding: 1rem;
- background: var(--background);
- border-radius: var(--border-radius-lg);
- border: 1px solid var(--border-color);
-}
-
-.compare-controls {
- display: flex;
- gap: 0.75rem;
-}
-
-.compare-settings {
- display: flex;
- gap: 1.5rem;
- align-items: center;
-}
-
-.checkbox-label {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- font-size: 0.875rem;
- font-weight: 500;
- color: var(--text-primary);
- cursor: pointer;
- user-select: none;
-}
-
-.checkbox-label input[type="checkbox"] {
- width: 1rem;
- height: 1rem;
- accent-color: var(--primary-color);
- cursor: pointer;
-}
-
-/* Comparison Results */
-.comparison-stats {
- margin-bottom: 1.5rem;
- padding: 1.5rem;
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- border: 1px solid var(--border-color);
- box-shadow: var(--shadow-sm);
-}
-
-.comparison-stats h3 {
- margin: 0 0 1rem 0;
- color: var(--text-primary);
- font-size: 1.125rem;
- font-weight: 600;
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.comparison-stats h3::before {
- content: '📊';
- font-size: 1.25rem;
-}
-
-.stats-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 1rem;
- margin-top: 1rem;
-}
-
-.stat {
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
- padding: 1rem;
- background: var(--background);
- border-radius: var(--border-radius);
- border: 1px solid var(--border-color);
- transition: var(--transition);
-}
-
-.stat:hover {
- border-color: var(--primary-color);
- box-shadow: 0 2px 8px rgba(94, 114, 228, 0.1);
-}
-
-.stat label {
- font-size: 0.75rem;
- font-weight: 600;
- color: var(--text-secondary);
- text-transform: uppercase;
- letter-spacing: 0.05em;
-}
-
-.stat span {
- font-size: 1.125rem;
- font-weight: 600;
- color: var(--text-primary);
-}
-
-.stat.similarity span {
- color: var(--success-color);
-}
-
-.stat.differences span {
- color: var(--warning-color);
-}
-
-/* Diff View */
-.diff-view {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 1.5rem;
- margin-top: 1.5rem;
-}
-
-.diff-column {
- background: var(--surface);
- border-radius: var(--border-radius-lg);
- border: 1px solid var(--border-color);
- overflow: hidden;
- box-shadow: var(--shadow-sm);
-}
-
-.diff-column h4 {
- margin: 0;
- padding: 1rem;
- background: var(--background);
- color: var(--text-primary);
- font-size: 0.875rem;
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- border-bottom: 1px solid var(--border-color);
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.diff-column:first-child h4::before {
- content: '📄';
-}
-
-.diff-column:last-child h4::before {
- content: '📄';
-}
-
-.diff-content {
- background: var(--white);
- max-height: 400px;
- overflow-y: auto;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.8125rem;
- line-height: 1.5;
-}
-
-.diff-line {
- padding: 0.5rem 1rem 0.5rem 3rem;
- border-bottom: 1px solid var(--border-color);
- white-space: pre-wrap;
- word-wrap: break-word;
- position: relative;
- transition: var(--transition);
-}
-
-.line-number {
- position: absolute;
- left: 0.5rem;
- top: 0.5rem;
- font-size: 0.75rem;
- color: var(--text-muted);
- font-weight: 500;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- user-select: none;
-}
-
-.diff-line:hover {
- background: var(--background);
-}
-
-.diff-line:last-child {
- border-bottom: none;
-}
-
-.diff-line.diff-added {
- background: rgba(45, 206, 137, 0.1);
- border-left: 3px solid var(--success-color);
- color: var(--success-color);
-}
-
-.diff-line.diff-added::before {
- content: '+';
- position: absolute;
- left: 0.25rem;
- font-weight: bold;
-}
-
-.diff-line.diff-removed {
- background: rgba(245, 54, 92, 0.1);
- border-left: 3px solid var(--secondary-color);
- color: var(--secondary-color);
-}
-
-.diff-line.diff-removed::before {
- content: '-';
- position: absolute;
- left: 0.25rem;
- font-weight: bold;
-}
-
-.diff-line.diff-modified {
- background: rgba(251, 99, 64, 0.1);
- border-left: 3px solid var(--warning-color);
- color: var(--warning-color);
-}
-
-.diff-line.diff-modified::before {
- content: '~';
- position: absolute;
- left: 0.25rem;
- font-weight: bold;
-}
-
-/* Character-level diff highlighting */
-.char-diff {
- background: rgba(255, 255, 255, 0.8);
- padding: 0.125rem 0.25rem;
- border-radius: 0.25rem;
- font-weight: 600;
- border: 1px solid currentColor;
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.5);
-}
-
-.no-differences {
- text-align: center;
- padding: 3rem 2rem;
- color: var(--text-muted);
- background: var(--background);
- border-radius: var(--border-radius-lg);
- border: 1px solid var(--border-color);
-}
-
-.no-differences::before {
- content: '✅';
- display: block;
- font-size: 3rem;
- margin-bottom: 1rem;
-}
-
-.no-differences h3 {
- color: var(--success-color);
- margin-bottom: 0.5rem;
-}
-
-/* Responsive design for text compare */
-@media (max-width: 768px) {
- .compare-options {
- flex-direction: column;
- gap: 1rem;
- align-items: stretch;
- }
-
- .compare-settings {
- justify-content: center;
- }
-
- .stats-grid {
- grid-template-columns: 1fr;
- }
-
- .diff-view {
- grid-template-columns: 1fr;
- }
-
- .diff-content {
- max-height: 250px;
- }
-}
diff --git a/src/renderer/styles/tool-fixes.css b/src/renderer/styles/tool-fixes.css
deleted file mode 100644
index d14c4047..00000000
--- a/src/renderer/styles/tool-fixes.css
+++ /dev/null
@@ -1,754 +0,0 @@
-/* Tool-specific UI fixes for consistent styling */
-
-/* JSON Viewer specific */
-#json-viewer .input-section {
- margin-bottom: 1.5rem;
-}
-
-#json-viewer .output-section {
- margin-top: 1.5rem;
-}
-
-#json-viewer #json-input {
- width: 100%;
- min-height: 250px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-#json-viewer #json-output {
- width: 100%;
- min-height: 300px;
- max-height: 500px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- background: var(--background);
- overflow: auto;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- line-height: 1.6;
- white-space: pre;
- margin: 0;
- box-sizing: border-box;
-}
-
-/* Text Compare specific */
-#text-compare .compare-inputs {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 1.5rem;
- margin-bottom: 1.5rem;
-}
-
-#text-compare textarea {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-/* Case Converter specific */
-#case-converter #case-input,
-#case-converter #case-output {
- width: 100%;
- min-height: 150px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
- margin-bottom: 1rem;
-}
-
-#case-converter #case-output {
- background: var(--background);
-}
-
-/* UUID Generator specific */
-#uuid-generator .uuid-controls {
- display: flex;
- align-items: flex-end;
- gap: 1rem;
- margin-bottom: 1.5rem;
- padding: 1.5rem;
- background: var(--background);
- border-radius: var(--border-radius-lg);
-}
-
-#uuid-generator .uuid-controls input,
-#uuid-generator .uuid-controls select {
- height: 42px;
- box-sizing: border-box;
- padding: 10px 12px;
-}
-
-#uuid-generator #generate-uuid {
- align-self: flex-end;
- margin-bottom: 0;
- height: 42px;
- padding: 10px 20px;
- box-sizing: border-box;
- line-height: 1.2;
-}
-
-
-#uuid-generator #uuid-output {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--background);
- resize: vertical;
- box-sizing: border-box;
- line-height: 1.8;
-}
-
-/* Base64 Converter specific */
-#base64-converter textarea {
- width: 100%;
- min-height: 150px;
- padding: 1rem;
- margin: 0.75rem 0;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-#base64-converter textarea[readonly] {
- background: var(--background);
-}
-
-/* JWT Decoder specific */
-#jwt-decoder #jwt-input {
- width: 100%;
- min-height: 120px;
- padding: 1rem;
- margin-bottom: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-/* JSON to TypeScript specific */
-#json-to-ts #json-to-ts-input {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- margin-bottom: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-#json-to-ts #typescript-output {
- width: 100%;
- min-height: 300px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- background: var(--background);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- line-height: 1.6;
- overflow: auto;
- white-space: pre;
- margin: 0;
- box-sizing: border-box;
-}
-
-/* Hash Generator specific */
-#hash-generator #hash-input {
- width: 100%;
- min-height: 120px;
- padding: 1rem;
- margin-bottom: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-#hash-generator .hash-result textarea {
- width: 100%;
- height: 60px;
- padding: 0.75rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.75rem;
- background: var(--background);
- resize: none;
- box-sizing: border-box;
-}
-
-/* URL Encoder specific */
-#url-encoder textarea {
- width: 100%;
- min-height: 120px;
- padding: 1rem;
- margin: 0.75rem 0;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-#url-encoder textarea[readonly] {
- background: var(--background);
-}
-
-/* Timestamp Converter specific */
-#timestamp input[type='number'],
-#timestamp input[type='datetime-local'] {
- width: 100%;
- padding: 0.75rem 1rem;
- margin-bottom: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-size: 0.9375rem;
- background: var(--surface);
- box-sizing: border-box;
-}
-
-#timestamp textarea {
- width: 100%;
- min-height: 150px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--background);
- resize: vertical;
- box-sizing: border-box;
-}
-
-/* Lorem Generator specific */
-#lorem-generator .lorem-controls {
- display: flex;
- align-items: flex-end;
- gap: 1rem;
- padding: 1.5rem;
- background: var(--background);
- border-radius: var(--border-radius-lg);
- margin-bottom: 1.5rem;
-}
-
-#lorem-generator #lorem-output {
- width: 100%;
- min-height: 300px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- font-size: 0.9375rem;
- background: var(--background);
- resize: vertical;
- box-sizing: border-box;
- line-height: 1.8;
-}
-
-/* SQL Formatter specific */
-#sql-formatter #sql-input {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- margin-bottom: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-#sql-formatter #sql-output {
- width: 100%;
- min-height: 300px;
- max-height: 500px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- background: var(--background);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- line-height: 1.6;
- overflow: auto;
- white-space: pre;
- margin: 0;
- box-sizing: border-box;
-}
-
-/* Number Base Converter specific */
-#number-base .base-input-group input {
- width: 100%;
- padding: 0.75rem 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.9375rem;
- background: var(--surface);
- box-sizing: border-box;
-}
-
-/* CSV JSON Converter specific */
-#csv-json textarea,
-#csv-json pre {
- width: 100%;
- min-height: 200px;
- padding: 1rem;
- margin: 0.75rem 0;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-#csv-json pre {
- background: var(--background);
- overflow: auto;
- white-space: pre;
-}
-
-/* QR Generator specific */
-#qr-generator #qr-text {
- width: 100%;
- min-height: 100px;
- padding: 1rem;
- margin-bottom: 1.5rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- font-size: 0.9375rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-/* Color Palette specific */
-#color-palette .color-input-container {
- display: flex;
- align-items: center;
- gap: 1rem;
-}
-
-#color-palette #base-color {
- width: 60px;
- height: 40px;
- padding: 0;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- cursor: pointer;
-}
-
-#color-palette #base-color-hex {
- flex: 0 0 150px;
- padding: 0.75rem 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.9375rem;
- background: var(--surface);
- text-transform: uppercase;
-}
-
-/* Markdown Editor specific */
-#markdown-editor #markdown-input {
- width: 100%;
- height: 400px;
- padding: 1.5rem;
- border: none;
- border-right: 1px solid var(--border-color);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: none;
- box-sizing: border-box;
- line-height: 1.8;
-}
-
-/* Cron Calculator specific */
-#cron-calculator .cron-field input {
- width: 100%;
- padding: 0.625rem 0.875rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- box-sizing: border-box;
-}
-
-#cron-calculator #cron-expression {
- width: 100%;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 1.125rem;
- font-weight: 600;
- text-align: center;
- background: var(--background);
- box-sizing: border-box;
-}
-
-/* Regex Generator specific */
-#regex-generator #regex-pattern {
- flex: 1;
- padding: 0.75rem 1rem;
- border: none;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.9375rem;
- background: transparent;
-}
-
-#regex-generator #regex-flags {
- width: 80px;
- padding: 0.75rem 0.5rem;
- border: none;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--background);
-}
-
-#regex-generator #test-string {
- width: 100%;
- min-height: 150px;
- padding: 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius-lg);
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: vertical;
- box-sizing: border-box;
-}
-
-/* Code Playground specific */
-#code-playground #code-input {
- width: 100%;
- height: 500px;
- padding: 1.5rem;
- border: none;
- font-family: 'JetBrains Mono', 'Monaco', 'Consolas', monospace;
- font-size: 0.875rem;
- background: var(--surface);
- resize: none;
- box-sizing: border-box;
- line-height: 1.6;
-}
-
-/* Image Converter specific */
-#image-converter .file-drop-zone {
- border: 2px dashed var(--border-color);
- border-radius: var(--border-radius-lg);
- padding: 3rem 2rem;
- text-align: center;
- cursor: pointer;
- transition: var(--transition);
- background: var(--background);
-}
-
-#image-converter .file-drop-zone:hover {
- border-color: var(--primary-color);
- background: var(--surface);
-}
-
-/* Global fixes for all tools */
-.tool-content {
- padding: 1.5rem;
-}
-
-.controls {
- display: flex;
- gap: 0.75rem;
- margin: 1rem 0;
- flex-wrap: wrap;
- align-items: center;
-}
-
-.controls .btn {
- margin: 0;
-}
-
-/* Fix for all labels */
-label {
- display: block;
- margin-bottom: 0.5rem;
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
-}
-
-/* Ensure consistent spacing */
-.input-section,
-.output-section {
- margin-bottom: 1.5rem;
-}
-
-.input-section:last-child,
-.output-section:last-child {
- margin-bottom: 0;
-}
-
-/* Fix checkbox alignment */
-input[type='checkbox'] {
- width: 1.125rem;
- height: 1.125rem;
- margin-right: 0.5rem;
- vertical-align: middle;
- cursor: pointer;
-}
-
-label input[type='checkbox'] {
- margin-right: 0.5rem;
-}
-
-/* Responsive fixes */
-@media (max-width: 768px) {
- .compare-inputs {
- grid-template-columns: 1fr !important;
- }
-
- .uuid-controls,
- .lorem-controls {
- flex-direction: column;
- align-items: stretch;
- }
-
- .control-group {
- width: 100%;
- }
-
- .controls {
- flex-direction: column;
- align-items: stretch;
- }
-
- .controls .btn {
- width: 100%;
- }
-}
-
-/* Unit Converter specific */
-#unit-converter .converter-controls {
- display: flex;
- flex-direction: column;
- gap: 1.5rem;
-}
-
-#unit-converter .category-selector {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-#unit-converter .category-selector label {
- font-weight: 600;
- color: var(--text-primary);
-}
-
-#unit-converter .conversion-row {
- display: grid;
- grid-template-columns: 1fr auto 1fr;
- gap: 1rem;
- align-items: end;
-}
-
-#unit-converter .conversion-input,
-#unit-converter .conversion-output {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-#unit-converter .conversion-input label,
-#unit-converter .conversion-output label {
- font-weight: 600;
- color: var(--text-primary);
-}
-
-#unit-converter .input-group {
- display: flex;
- gap: 0.5rem;
-}
-
-#unit-converter .input-group input {
- flex: 2;
-}
-
-#unit-converter .input-group select {
- flex: 1;
- min-width: 120px;
-}
-
-#unit-converter .swap-button-container {
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: 1.5rem;
-}
-
-#unit-converter .swap-btn {
- padding: 0.75rem;
- border-radius: 50%;
- background: var(--accent);
- color: white;
- border: none;
- cursor: pointer;
- transition: all 0.2s ease;
- width: 3rem;
- height: 3rem;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-#unit-converter .swap-btn:hover {
- background: var(--accent-hover);
- transform: rotate(180deg);
-}
-
-#unit-converter .converter-actions {
- text-align: center;
-}
-
-#unit-converter .conversion-info {
- margin-top: 1.5rem;
- padding: 1rem;
- background: var(--surface);
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius);
-}
-
-#unit-converter .conversion-summary {
- text-align: center;
- font-size: 1.1rem;
- color: var(--text-primary);
-}
-
-#unit-converter .disclaimer {
- margin-top: 1rem;
- padding: 1rem;
- background: #fff3cd;
- border: 1px solid #ffeaa7;
- border-radius: var(--border-radius);
- color: #856404;
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-#unit-converter .disclaimer i {
- color: #f39c12;
-}
-
-/* Responsive design for unit converter */
-@media (max-width: 768px) {
- #unit-converter .conversion-row {
- grid-template-columns: 1fr;
- gap: 1.5rem;
- }
-
- #unit-converter .swap-button-container {
- order: 2;
- margin-bottom: 0;
- }
-
- #unit-converter .conversion-output {
- order: 3;
- }
-
- #unit-converter .input-group {
- flex-direction: column;
- }
-
- #unit-converter .input-group input,
- #unit-converter .input-group select {
- flex: 1;
- }
-}
-
-/* Date Difference specific styles */
-#date-difference .input-container {
- margin-bottom: 1rem;
-}
-
-/* Ensure date and time inputs are fully clickable */
-#date-difference input[type="date"],
-#date-difference input[type="time"] {
- cursor: pointer;
- width: 100%;
- padding: 0.75rem 1rem;
- border: 2px solid var(--border-color);
- border-radius: var(--border-radius);
- font-size: 0.9375rem;
- background-color: var(--surface);
- color: var(--text-primary);
- transition: var(--transition);
- box-sizing: border-box;
- line-height: 1.5;
-}
-
-#date-difference input[type="date"]:focus,
-#date-difference input[type="time"]:focus {
- outline: none;
- border-color: var(--primary-color);
- box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1);
-}
-
-#date-difference input[type="date"]::-webkit-calendar-picker-indicator,
-#date-difference input[type="time"]::-webkit-calendar-picker-indicator {
- cursor: pointer;
- padding: 0.25rem;
- border-radius: var(--border-radius);
- opacity: 0.7;
- transition: var(--transition);
-}
-
-#date-difference input[type="date"]::-webkit-calendar-picker-indicator:hover,
-#date-difference input[type="time"]::-webkit-calendar-picker-indicator:hover {
- opacity: 1;
- background-color: rgba(94, 114, 228, 0.1);
-}
diff --git a/src/utils/api-formatter-utils.js b/src/utils/api-formatter-utils.js
deleted file mode 100644
index ab6efc0b..00000000
--- a/src/utils/api-formatter-utils.js
+++ /dev/null
@@ -1,372 +0,0 @@
-/**
- * Utility class for API response formatting with tree view functionality
- */
-class APIFormatterUtils {
- static parseResponse(input, responseType = 'json') {
- if (!input || !input.trim()) {
- throw new Error('Input cannot be empty');
- }
-
- const trimmedInput = input.trim();
-
- try {
- switch (responseType.toLowerCase()) {
- case 'json':
- return JSON.parse(trimmedInput);
- case 'graphql':
- // GraphQL responses are JSON format
- const parsed = JSON.parse(trimmedInput);
- this.validateGraphQLResponse(parsed);
- return parsed;
- default:
- throw new Error('Unsupported response type');
- }
- } catch (error) {
- if (
- error.message.includes('Unexpected token') ||
- error.message.includes('Expected')
- ) {
- throw new Error(
- `Invalid ${responseType.toUpperCase()} format: ${error.message}`
- );
- }
- throw error;
- }
- }
-
- static validateGraphQLResponse(response) {
- // GraphQL response should have data and/or errors fields
- if (typeof response !== 'object' || response === null) {
- throw new Error('GraphQL response must be an object');
- }
-
- if (
- !response.hasOwnProperty('data') &&
- !response.hasOwnProperty('errors')
- ) {
- throw new Error(
- 'GraphQL response must contain either "data" or "errors" field'
- );
- }
- }
-
- static generateTreeHTML(data, path = '', level = 0) {
- if (data === null) {
- return `null `;
- }
-
- if (typeof data === 'undefined') {
- return `undefined `;
- }
-
- if (typeof data === 'string') {
- const escaped = this.escapeHtml(data);
- return `"${escaped}" `;
- }
-
- if (typeof data === 'number') {
- return `${data} `;
- }
-
- if (typeof data === 'boolean') {
- return `${data} `;
- }
-
- if (Array.isArray(data)) {
- return this.generateArrayHTML(data, path, level);
- }
-
- if (typeof data === 'object') {
- return this.generateObjectHTML(data, path, level);
- }
-
- return `${String(data)} `;
- }
-
- static generateArrayHTML(array, path, level) {
- if (array.length === 0) {
- return `[] `;
- }
-
- const itemId = `array_${path.replace(
- /[^a-zA-Z0-9]/g,
- '_'
- )}_${level}_${Date.now()}`;
- const isCollapsible = array.length > 0;
-
- let html = ``;
-
- if (isCollapsible) {
- html += `
-
-
-
- `;
- }
-
- html += `
[ `;
- html += `
${array.length} item${
- array.length !== 1 ? 's' : ''
- } `;
-
- if (isCollapsible) {
- html += `
`;
-
- array.forEach((item, index) => {
- const itemPath = `${path}[${index}]`;
- html += `
-
- ${index}:
- ${this.generateTreeHTML(item, itemPath, level + 1)}
-
- `;
- });
-
- html += `
`;
- }
-
- html += `
] `;
- html += `
`;
-
- return html;
- }
-
- static generateObjectHTML(obj, path, level) {
- const keys = Object.keys(obj);
-
- if (keys.length === 0) {
- return `{} `;
- }
-
- const itemId = `object_${path.replace(
- /[^a-zA-Z0-9]/g,
- '_'
- )}_${level}_${Date.now()}`;
- const isCollapsible = keys.length > 0;
-
- let html = ``;
-
- if (isCollapsible) {
- html += `
-
-
-
- `;
- }
-
- html += `
{ `;
- html += `
${keys.length} key${
- keys.length !== 1 ? 's' : ''
- } `;
-
- if (isCollapsible) {
- html += `
`;
-
- keys.forEach((key, index) => {
- const keyPath = path ? `${path}.${key}` : key;
- const isLast = index === keys.length - 1;
-
- html += `
-
- "${this.escapeHtml(key)}"
- :
- ${this.generateTreeHTML(obj[key], keyPath, level + 1)}
- ${!isLast ? ', ' : ''}
-
- `;
- });
-
- html += `
`;
- }
-
- html += `
} `;
- html += `
`;
-
- return html;
- }
-
- static escapeHtml(text) {
- try {
- if (typeof document !== 'undefined' && document.createElement) {
- const div = document.createElement('div');
- if (div && typeof div.textContent !== 'undefined') {
- div.textContent = text;
- return div.innerHTML;
- }
- }
- } catch (e) {
- // Fall through to manual escaping
- }
-
- // Fallback for testing environments without DOM or when DOM fails
- return text
- .replace(/&/g, '&')
- .replace(//g, '>')
- .replace(/"/g, '"')
- .replace(/'/g, ''');
- }
-
- static getResponseInfo(data) {
- const jsonString = JSON.stringify(data);
- return {
- type: Array.isArray(data) ? 'Array' : typeof data,
- size: this.formatBytes(new Blob([jsonString]).size),
- keys: this.countKeys(data),
- depth: this.getMaxDepth(data),
- charactersCount: jsonString.length,
- };
- }
-
- static countKeys(obj) {
- if (typeof obj !== 'object' || obj === null) {
- return 0;
- }
-
- if (Array.isArray(obj)) {
- return obj.length;
- }
-
- let count = 0;
- for (let key in obj) {
- if (obj.hasOwnProperty(key)) {
- count++;
- if (typeof obj[key] === 'object' && obj[key] !== null) {
- count += this.countKeys(obj[key]);
- }
- }
- }
- return count;
- }
-
- static getMaxDepth(obj, depth = 0) {
- if (typeof obj !== 'object' || obj === null) {
- return depth;
- }
-
- let maxDepth = depth;
-
- if (Array.isArray(obj)) {
- for (let item of obj) {
- maxDepth = Math.max(maxDepth, this.getMaxDepth(item, depth + 1));
- }
- } else {
- for (let key in obj) {
- if (obj.hasOwnProperty(key)) {
- maxDepth = Math.max(maxDepth, this.getMaxDepth(obj[key], depth + 1));
- }
- }
- }
-
- return maxDepth;
- }
-
- static formatBytes(bytes) {
- if (bytes === 0) return '0 B';
-
- const k = 1024;
- const sizes = ['B', 'KB', 'MB', 'GB'];
- const i = Math.floor(Math.log(bytes) / Math.log(k));
-
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
- }
-
- static searchInData(data, searchTerm, path = '') {
- const results = [];
-
- if (!searchTerm || !searchTerm.trim()) {
- return results;
- }
-
- const term = searchTerm.toLowerCase();
-
- if (typeof data === 'string' && data.toLowerCase().includes(term)) {
- results.push({
- path: path || 'root',
- type: 'value',
- value: data,
- match: 'content',
- });
- }
-
- if (typeof data === 'object' && data !== null) {
- if (Array.isArray(data)) {
- data.forEach((item, index) => {
- const itemPath = path ? `${path}[${index}]` : `[${index}]`;
- results.push(...this.searchInData(item, searchTerm, itemPath));
- });
- } else {
- for (let key in data) {
- if (data.hasOwnProperty(key)) {
- const keyPath = path ? `${path}.${key}` : key;
-
- // Check if key matches
- if (key.toLowerCase().includes(term)) {
- results.push({
- path: keyPath,
- type: 'key',
- value: key,
- match: 'key',
- });
- }
-
- // Search in value
- results.push(...this.searchInData(data[key], searchTerm, keyPath));
- }
- }
- }
- }
-
- return results;
- }
-
- static highlightSearchResults(html, searchTerm) {
- if (!searchTerm || !searchTerm.trim()) {
- return html;
- }
-
- // Escape regex special characters and HTML entities
- const term = this.escapeHtml(searchTerm).replace(
- /[.*+?^${}()|[\]\\]/g,
- '\\$&'
- );
- const regex = new RegExp(`(${term})`, 'gi');
-
- return html.replace(regex, '$1 ');
- }
-
- static expandToPath(path) {
- // Generate selectors to expand all nodes in the path
- const pathParts = path.split(/[\.\[\]]/g).filter((part) => part !== '');
- const selectors = [];
-
- let currentPath = '';
- pathParts.forEach((part, index) => {
- if (index === 0) {
- currentPath = part;
- } else {
- currentPath += pathParts[index - 1].match(/^\d+$/)
- ? `[${part}]`
- : `.${part}`;
- }
-
- const elementId = `object_${currentPath.replace(
- /[^a-zA-Z0-9]/g,
- '_'
- )}_${index}`;
- selectors.push(`#${elementId}`);
- });
-
- return selectors;
- }
-}
-
-// Export for testing
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = APIFormatterUtils;
-}
-
-// Export for browser
-if (typeof window !== 'undefined') {
- window.APIFormatterUtils = APIFormatterUtils;
-}
diff --git a/src/utils/base64-utils.js b/src/utils/base64-utils.js
deleted file mode 100644
index 056c3cc7..00000000
--- a/src/utils/base64-utils.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Base64 utilities for testing - extracted from Base64Converter
- */
-
-class Base64Utils {
- static encodeText(text) {
- if (!text || !text.trim()) {
- throw new Error('Please enter text to encode.');
- }
-
- try {
- return btoa(unescape(encodeURIComponent(text)));
- } catch (error) {
- throw new Error('Error encoding text: ' + error.message);
- }
- }
-
- static decodeText(base64) {
- if (!base64 || !base64.trim()) {
- throw new Error('Please enter Base64 to decode.');
- }
-
- if (!this.isValidBase64(base64.trim())) {
- throw new Error('Invalid Base64 format');
- }
-
- try {
- return decodeURIComponent(escape(atob(base64.trim())));
- } catch (error) {
- throw new Error(
- 'Error decoding Base64: Invalid format or corrupted data'
- );
- }
- }
-
- static isValidBase64(str) {
- if (!str || str.trim() === '') return false;
-
- try {
- return btoa(atob(str)) === str;
- } catch (err) {
- return false;
- }
- }
-}
-
-module.exports = Base64Utils;
diff --git a/src/utils/lorem-utils.js b/src/utils/lorem-utils.js
deleted file mode 100644
index 7c3bbe23..00000000
--- a/src/utils/lorem-utils.js
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * Lorem utilities for generating lorem ipsum text
- */
-
-class LoremUtils {
- static LOREM_WORDS = [
- 'lorem',
- 'ipsum',
- 'dolor',
- 'sit',
- 'amet',
- 'consectetur',
- 'adipiscing',
- 'elit',
- 'sed',
- 'do',
- 'eiusmod',
- 'tempor',
- 'incididunt',
- 'ut',
- 'labore',
- 'et',
- 'dolore',
- 'magna',
- 'aliqua',
- 'enim',
- 'ad',
- 'minim',
- 'veniam',
- 'quis',
- 'nostrud',
- 'exercitation',
- 'ullamco',
- 'laboris',
- 'nisi',
- 'aliquip',
- 'ex',
- 'ea',
- 'commodo',
- 'consequat',
- 'duis',
- 'aute',
- 'irure',
- 'in',
- 'reprehenderit',
- 'voluptate',
- 'velit',
- 'esse',
- 'cillum',
- 'fugiat',
- 'nulla',
- 'pariatur',
- 'excepteur',
- 'sint',
- 'occaecat',
- 'cupidatat',
- 'non',
- 'proident',
- 'sunt',
- 'culpa',
- 'qui',
- 'officia',
- 'deserunt',
- 'mollit',
- 'anim',
- 'id',
- 'est',
- 'laborum',
- 'at',
- 'vero',
- 'eos',
- 'accusamus',
- 'accusantium',
- 'doloremque',
- 'laudantium',
- 'totam',
- 'rem',
- 'aperiam',
- 'eaque',
- 'ipsa',
- 'quae',
- 'ab',
- 'illo',
- 'inventore',
- 'veritatis',
- 'et',
- 'quasi',
- 'architecto',
- 'beatae',
- 'vitae',
- 'dicta',
- 'sunt',
- 'explicabo',
- 'nemo',
- 'ipsam',
- 'voluptatem',
- 'quia',
- 'voluptas',
- 'aspernatur',
- 'aut',
- 'odit',
- 'fugit',
- 'sed',
- 'quia',
- 'consequuntur',
- 'magni',
- 'dolores',
- 'ratione',
- 'sequi',
- 'nesciunt',
- 'neque',
- 'porro',
- 'quisquam',
- 'dolorem',
- 'adipisci',
- 'numquam',
- 'eius',
- 'modi',
- 'tempora',
- 'incidunt',
- 'magnam',
- 'quaerat',
- 'voluptatem',
- 'laudantium',
- 'doloremque',
- 'laudantium',
- ];
-
- static generateWords(count) {
- if (count < 1) {
- throw new Error('Word count must be at least 1');
- }
-
- const words = [];
- for (let i = 0; i < count; i++) {
- const word =
- this.LOREM_WORDS[Math.floor(Math.random() * this.LOREM_WORDS.length)];
- words.push(word);
- }
- return words.join(' ');
- }
-
- static generateSentences(count) {
- if (count < 1) {
- throw new Error('Sentence count must be at least 1');
- }
-
- const sentences = [];
- for (let i = 0; i < count; i++) {
- const wordCount = this.randomBetween(8, 20);
- const words = this.generateWords(wordCount).split(' ');
-
- words[0] = this.capitalizeFirst(words[0]);
-
- let sentence = words.join(' ');
-
- if (Math.random() < 0.1) {
- sentence += '!';
- } else if (Math.random() < 0.1) {
- sentence += '?';
- } else {
- sentence += '.';
- }
-
- sentences.push(sentence);
- }
- return sentences.join(' ');
- }
-
- static generateParagraphs(count) {
- if (count < 1) {
- throw new Error('Paragraph count must be at least 1');
- }
-
- const paragraphs = [];
- for (let i = 0; i < count; i++) {
- const sentenceCount = this.randomBetween(3, 7);
- const sentences = this.generateSentences(sentenceCount);
- paragraphs.push(sentences);
- }
- return paragraphs.join('\n\n');
- }
-
- static generateLorem(type = 'paragraphs', count = 1) {
- if (count < 1 || count > 50) {
- throw new Error('Count must be between 1 and 50');
- }
-
- switch (type) {
- case 'paragraphs':
- return this.generateParagraphs(count);
- case 'sentences':
- return this.generateSentences(count);
- case 'words':
- return this.generateWords(count);
- default:
- return this.generateParagraphs(count);
- }
- }
-
- static randomBetween(min, max) {
- return Math.floor(Math.random() * (max - min + 1)) + min;
- }
-
- static capitalizeFirst(str) {
- if (!str) return str;
- return str.charAt(0).toUpperCase() + str.slice(1);
- }
-}
-
-module.exports = LoremUtils;
diff --git a/src/utils/password-utils.js b/src/utils/password-utils.js
deleted file mode 100644
index b8a79f20..00000000
--- a/src/utils/password-utils.js
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * Password utilities for generating secure passwords and passphrases
- */
-
-class PasswordUtils {
- static LOWERCASE = 'abcdefghijklmnopqrstuvwxyz';
- static UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- static NUMBERS = '0123456789';
- static SYMBOLS = '!@#$%^&*()_+-=[]{};\':"|,.<>?';
- static AMBIGUOUS = '0OIl1';
-
- // Word list for passphrases (subset for testing)
- static WORDS = [
- 'apple',
- 'brave',
- 'chair',
- 'dream',
- 'eagle',
- 'flame',
- 'grape',
- 'house',
- 'image',
- 'judge',
- 'knife',
- 'lemon',
- 'magic',
- 'novel',
- 'ocean',
- 'piano',
- 'queen',
- 'river',
- 'stone',
- 'table',
- 'unity',
- 'value',
- 'water',
- 'youth',
- 'zebra',
- 'beach',
- 'cloud',
- 'dance',
- 'earth',
- 'field',
- 'green',
- 'happy',
- 'light',
- 'mouse',
- 'night',
- 'party',
- 'quick',
- 'smile',
- 'trust',
- 'voice',
- ];
-
- static generatePassword(options = {}) {
- const {
- length = 12,
- includeLowercase = true,
- includeUppercase = true,
- includeNumbers = true,
- includeSymbols = false,
- excludeAmbiguous = false,
- } = options;
-
- let charset = '';
-
- // Build character set based on options
- if (includeLowercase) charset += this.LOWERCASE;
- if (includeUppercase) charset += this.UPPERCASE;
- if (includeNumbers) charset += this.NUMBERS;
- if (includeSymbols) charset += this.SYMBOLS;
-
- if (!charset) {
- throw new Error('At least one character set must be selected');
- }
-
- // Remove ambiguous characters if requested
- if (excludeAmbiguous) {
- for (const char of this.AMBIGUOUS) {
- charset = charset.replace(new RegExp(char, 'g'), '');
- }
- }
-
- // Generate password
- let password = '';
- for (let i = 0; i < length; i++) {
- const randomIndex = Math.floor(Math.random() * charset.length);
- password += charset[randomIndex];
- }
-
- return password;
- }
-
- static generateMultiplePasswords(count, options = {}) {
- const passwords = [];
- for (let i = 0; i < count; i++) {
- passwords.push(this.generatePassword(options));
- }
- return passwords;
- }
-
- static calculatePasswordStrength(password) {
- if (!password) {
- return {
- score: 0,
- strength: 'Very Weak',
- feedback: ['Password is required'],
- entropy: 0,
- };
- }
-
- let score = 0;
- let feedback = [];
-
- // Length check
- if (password.length >= 12) score += 2;
- else if (password.length >= 8) score += 1;
- else feedback.push('Use at least 8 characters');
-
- // Character variety checks
- if (/[a-z]/.test(password)) score += 1;
- else feedback.push('Add lowercase letters');
-
- if (/[A-Z]/.test(password)) score += 1;
- else feedback.push('Add uppercase letters');
-
- if (/[0-9]/.test(password)) score += 1;
- else feedback.push('Add numbers');
-
- if (/[^a-zA-Z0-9]/.test(password)) score += 1;
- else feedback.push('Add symbols');
-
- // Common pattern penalties
- if (/(.)\1{2,}/.test(password)) {
- score -= 1;
- feedback.push('Avoid repeated characters');
- }
-
- if (
- /123|234|345|456|567|678|789|abc|bcd|cde|def/.test(password.toLowerCase())
- ) {
- score -= 1;
- feedback.push('Avoid sequential characters');
- }
-
- // Calculate entropy
- let charset = 0;
- if (/[a-z]/.test(password)) charset += 26;
- if (/[A-Z]/.test(password)) charset += 26;
- if (/[0-9]/.test(password)) charset += 10;
- if (/[^a-zA-Z0-9]/.test(password)) charset += 32;
-
- const entropy = Math.log2(Math.pow(charset, password.length));
-
- // Determine strength label
- let strength;
- if (score < 1) strength = 'Very Weak';
- else if (score < 2) strength = 'Weak';
- else if (score < 4) strength = 'Fair';
- else if (score < 6) strength = 'Good';
- else strength = 'Strong';
-
- return {
- score: Math.max(0, score),
- strength,
- feedback,
- entropy: Math.round(entropy),
- };
- }
-
- static generatePassphrase(options = {}) {
- const {
- wordCount = 4,
- separator = '-',
- capitalize = false,
- includeNumbers = false,
- } = options;
-
- const selectedWords = [];
-
- // Select random words
- for (let i = 0; i < wordCount; i++) {
- const randomIndex = Math.floor(Math.random() * this.WORDS.length);
- let word = this.WORDS[randomIndex];
-
- if (capitalize) {
- word = word.charAt(0).toUpperCase() + word.slice(1);
- }
-
- selectedWords.push(word);
- }
-
- let passphrase = selectedWords.join(separator);
-
- // Add numbers if requested
- if (includeNumbers) {
- const randomNum = Math.floor(Math.random() * 1000);
- passphrase += randomNum;
- }
-
- return passphrase;
- }
-}
-
-module.exports = PasswordUtils;
diff --git a/src/utils/unit-converter-utils.js b/src/utils/unit-converter-utils.js
deleted file mode 100644
index 0b3f2ca3..00000000
--- a/src/utils/unit-converter-utils.js
+++ /dev/null
@@ -1,258 +0,0 @@
-/**
- * Unit conversion utilities with comprehensive conversion support
- * Supports Length, Weight, Temperature, and Currency conversions
- */
-
-class UnitConverterUtils {
- // Length conversions (all to meters as base)
- static LENGTH_CONVERSIONS = {
- mm: 0.001,
- cm: 0.01,
- m: 1,
- km: 1000,
- in: 0.0254,
- ft: 0.3048,
- yd: 0.9144,
- mi: 1609.344,
- };
-
- // Weight conversions (all to grams as base)
- static WEIGHT_CONVERSIONS = {
- mg: 0.001,
- g: 1,
- kg: 1000,
- oz: 28.3495,
- lb: 453.592,
- st: 6350.29,
- t: 1000000,
- };
-
- // Currency rates (static rates for offline use - USD as base)
- static CURRENCY_RATES = {
- USD: 1,
- EUR: 0.85,
- GBP: 0.73,
- JPY: 110,
- CAD: 1.25,
- AUD: 1.35,
- };
-
- static UNIT_CATEGORIES = {
- length: {
- name: 'Length',
- units: {
- mm: 'Millimeters',
- cm: 'Centimeters',
- m: 'Meters',
- km: 'Kilometers',
- in: 'Inches',
- ft: 'Feet',
- yd: 'Yards',
- mi: 'Miles',
- },
- },
- weight: {
- name: 'Weight',
- units: {
- mg: 'Milligrams',
- g: 'Grams',
- kg: 'Kilograms',
- oz: 'Ounces',
- lb: 'Pounds',
- st: 'Stones',
- t: 'Metric Tons',
- },
- },
- temperature: {
- name: 'Temperature',
- units: {
- C: 'Celsius',
- F: 'Fahrenheit',
- K: 'Kelvin',
- },
- },
- currency: {
- name: 'Currency',
- units: {
- USD: 'US Dollar',
- EUR: 'Euro',
- GBP: 'British Pound',
- JPY: 'Japanese Yen',
- CAD: 'Canadian Dollar',
- AUD: 'Australian Dollar',
- },
- },
- };
-
- /**
- * Convert length units
- */
- static convertLength(value, fromUnit, toUnit) {
- if (
- !this.LENGTH_CONVERSIONS[fromUnit] ||
- !this.LENGTH_CONVERSIONS[toUnit]
- ) {
- throw new Error('Invalid length unit');
- }
-
- // Convert to base unit (meters) then to target unit
- const meters = value * this.LENGTH_CONVERSIONS[fromUnit];
- return meters / this.LENGTH_CONVERSIONS[toUnit];
- }
-
- /**
- * Convert weight units
- */
- static convertWeight(value, fromUnit, toUnit) {
- if (
- !this.WEIGHT_CONVERSIONS[fromUnit] ||
- !this.WEIGHT_CONVERSIONS[toUnit]
- ) {
- throw new Error('Invalid weight unit');
- }
-
- // Convert to base unit (grams) then to target unit
- const grams = value * this.WEIGHT_CONVERSIONS[fromUnit];
- return grams / this.WEIGHT_CONVERSIONS[toUnit];
- }
-
- /**
- * Convert temperature units
- */
- static convertTemperature(value, fromUnit, toUnit) {
- if (fromUnit === toUnit) return value;
-
- let celsius;
-
- // Convert to Celsius first
- switch (fromUnit) {
- case 'C':
- celsius = value;
- break;
- case 'F':
- celsius = ((value - 32) * 5) / 9;
- break;
- case 'K':
- if (value < 0) {
- throw new Error('Kelvin cannot be negative');
- }
- celsius = value - 273.15;
- break;
- default:
- throw new Error('Invalid temperature unit');
- }
-
- // Convert from Celsius to target unit
- switch (toUnit) {
- case 'C':
- return celsius;
- case 'F':
- return (celsius * 9) / 5 + 32;
- case 'K':
- const kelvin = celsius + 273.15;
- if (kelvin < 0) {
- throw new Error('Temperature below absolute zero');
- }
- return kelvin;
- default:
- throw new Error('Invalid temperature unit');
- }
- }
-
- /**
- * Convert currency units
- */
- static convertCurrency(value, fromUnit, toUnit) {
- if (!this.CURRENCY_RATES[fromUnit] || !this.CURRENCY_RATES[toUnit]) {
- throw new Error('Invalid currency unit');
- }
-
- // Convert to base currency (USD) then to target currency
- const usd = value / this.CURRENCY_RATES[fromUnit];
- return usd * this.CURRENCY_RATES[toUnit];
- }
-
- /**
- * Main conversion method that routes to appropriate converter
- */
- static convert(value, category, fromUnit, toUnit) {
- // Validate input
- if (value === '' || value === null || value === undefined) {
- throw new Error('Please enter a value to convert');
- }
-
- const numValue = parseFloat(value);
- if (isNaN(numValue)) {
- throw new Error('Please enter a valid number');
- }
-
- if (!isFinite(numValue)) {
- throw new Error('Number is too large');
- }
-
- // Check for negative values where inappropriate
- if (category === 'weight' && numValue < 0) {
- throw new Error('Weight cannot be negative');
- }
-
- if (category === 'length' && numValue < 0) {
- throw new Error('Length cannot be negative');
- }
-
- let result;
- switch (category) {
- case 'length':
- result = this.convertLength(numValue, fromUnit, toUnit);
- break;
- case 'weight':
- result = this.convertWeight(numValue, fromUnit, toUnit);
- break;
- case 'temperature':
- result = this.convertTemperature(numValue, fromUnit, toUnit);
- break;
- case 'currency':
- result = this.convertCurrency(numValue, fromUnit, toUnit);
- break;
- default:
- throw new Error('Invalid conversion category');
- }
-
- // Round to reasonable precision
- if (category === 'currency') {
- return Math.round(result * 100) / 100; // 2 decimal places for currency
- } else {
- return Math.round(result * 1000000) / 1000000; // 6 decimal places for others
- }
- }
-
- /**
- * Get units for a category
- */
- static getUnitsForCategory(category) {
- return this.UNIT_CATEGORIES[category]?.units || {};
- }
-
- /**
- * Get all categories
- */
- static getCategories() {
- return Object.keys(this.UNIT_CATEGORIES);
- }
-
- /**
- * Get category display name
- */
- static getCategoryName(category) {
- return this.UNIT_CATEGORIES[category]?.name || category;
- }
-}
-
-// Export for Node.js testing
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = UnitConverterUtils;
-}
-
-// Export for browser
-if (typeof window !== 'undefined') {
- window.UnitConverterUtils = UnitConverterUtils;
-}
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 00000000..5dc5008e
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1,9 @@
+///
+
+interface ImportMetaEnv {
+ readonly VITE_APP_TITLE: string;
+}
+
+interface ImportMeta {
+ readonly env: ImportMetaEnv;
+}
diff --git a/tailwind.config.ts b/tailwind.config.ts
new file mode 100644
index 00000000..baf4c920
--- /dev/null
+++ b/tailwind.config.ts
@@ -0,0 +1,87 @@
+import type { Config } from "tailwindcss";
+
+export default {
+ darkMode: ["class"],
+ content: ["./pages/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}", "./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"],
+ prefix: "",
+ theme: {
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ extend: {
+ fontFamily: {
+ sans: ['Inter', 'system-ui', 'sans-serif'],
+ mono: ['JetBrains Mono', 'monospace'],
+ },
+ colors: {
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ sidebar: {
+ DEFAULT: "hsl(var(--sidebar-background))",
+ foreground: "hsl(var(--sidebar-foreground))",
+ primary: "hsl(var(--sidebar-primary))",
+ "primary-foreground": "hsl(var(--sidebar-primary-foreground))",
+ accent: "hsl(var(--sidebar-accent))",
+ "accent-foreground": "hsl(var(--sidebar-accent-foreground))",
+ border: "hsl(var(--sidebar-border))",
+ ring: "hsl(var(--sidebar-ring))",
+ },
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: "0" },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ },
+ },
+ },
+ plugins: [require("tailwindcss-animate")],
+} satisfies Config;
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 00000000..3add82f5
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,31 @@
+{
+ "compilerOptions": {
+ "types": ["vitest/globals"],
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": false,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitAny": false,
+ "noFallthroughCasesInSwitch": false,
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["src"]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..25187730
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "files": [],
+ "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }],
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ },
+ "noImplicitAny": false,
+ "noUnusedParameters": false,
+ "skipLibCheck": true,
+ "allowJs": true,
+ "noUnusedLocals": false,
+ "strictNullChecks": false
+ }
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 00000000..3133162c
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 00000000..c6578542
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,25 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react-swc";
+import path from "path";
+
+// https://vitejs.dev/config/
+export default defineConfig(() => ({
+ server: {
+ host: "::",
+ port: 8080,
+ hmr: {
+ overlay: false,
+ },
+ },
+ plugins: [react()],
+ resolve: {
+ alias: {
+ "@": path.resolve(__dirname, "./src"),
+ },
+ },
+ base: "./",
+ build: {
+ outDir: "dist",
+ emptyOutDir: true,
+ },
+}));
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 00000000..fefe05a9
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,16 @@
+import { defineConfig } from "vitest/config";
+import react from "@vitejs/plugin-react-swc";
+import path from "path";
+
+export default defineConfig({
+ plugins: [react()],
+ test: {
+ environment: "jsdom",
+ globals: true,
+ setupFiles: ["./src/test/setup.ts"],
+ include: ["src/**/*.{test,spec}.{ts,tsx}"],
+ },
+ resolve: {
+ alias: { "@": path.resolve(__dirname, "./src") },
+ },
+});