diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49e19e04..24986d80 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,5 +24,11 @@ jobs: - name: Run Biome Check run: npx @biomejs/biome ci . + - name: Run Tests + run: npm run test + + - name: Build Package + run: npm run build:package + - name: Run Build run: npm run build diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml new file mode 100644 index 00000000..fd51d183 --- /dev/null +++ b/.github/workflows/package.yml @@ -0,0 +1,88 @@ +name: Package CI & Publish + +on: + push: + branches: + - main + - master + paths: + - "packages/rein-input/**" + - ".github/workflows/package.yml" + pull_request: + paths: + - "packages/rein-input/**" + - ".github/workflows/package.yml" + release: + types: [published] + workflow_dispatch: + inputs: + publish: + description: "Publish to npm" + required: false + type: boolean + default: false + +jobs: + test-package: + name: Test on ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + cache: "npm" + + - name: Install dependencies + run: npm install + + - name: Run Tests + run: npm run test + + - name: Build Package + run: npm run build:package + + - name: Verify Package Tarball + run: | + cd packages/rein-input + npm pack --dry-run + + publish-package: + name: Publish to npm + needs: test-package + if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.publish == true) + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + registry-url: "https://registry.npmjs.org" + + - name: Install dependencies + run: npm install + + - name: Build Package + run: npm run build:package + + - name: Publish @aossie/rein-input + run: | + cd packages/rein-input + npm publish --access public --provenance + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/README.md b/README.md index c766c47b..23a3577c 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,14 @@ Quality couch keyboards are not so accessible, STT on Linux isn’t in a good st * **Framework**: [TanStack Start](https://tanstack.com/start) * **Language**: TypeScript * **Real-time**: WebRTC -* **Input Simulation**: Koffi +* **Input Simulation**: Koffi / [@aossie/rein-input](packages/rein-input) + +## Reusable Packages + +* **[`@aossie/rein-input`](packages/rein-input)**: Standalone, cross-platform native input injection library for Node.js and Electron with sub-millisecond latency and zero C++ addon compilation. Available on npm: + ```bash + npm install @aossie/rein-input koffi + ``` ## Development Setup diff --git a/biome.json b/biome.json index 7082d621..edafa56e 100644 --- a/biome.json +++ b/biome.json @@ -9,6 +9,8 @@ "ignoreUnknown": false, "includes": [ "src/**/*", + "packages/**/*", + "!packages/**/dist/**/*", ".vscode/**/*", "index.html", "vite.config.ts", diff --git a/package-lock.json b/package-lock.json index 058ce7b3..485faea2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,11 @@ "name": "Rein", "version": "0.1.0", "hasInstallScript": true, + "workspaces": [ + "packages/*" + ], "dependencies": { + "@aossie/rein-input": "*", "@tanstack/react-router": "^1.169.2", "@tanstack/react-router-ssr-query": "^1.166.12", "@tanstack/react-start": "^1.167.61", @@ -54,7 +58,7 @@ "postcss": "^8.5.6", "tailwindcss": "^4.2.4", "tsx": "^4.19.0", - "typescript": "^5.7.2", + "typescript": "^7.0.2", "vite": "^8.0.10", "vite-tsconfig-paths": "^6.0.2", "vitest": "^3.0.5", @@ -81,6 +85,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@aossie/rein-input": { + "resolved": "packages/rein-input", + "link": true + }, "node_modules/@asamuzakjp/css-color": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", @@ -96,9 +104,9 @@ } }, "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -120,9 +128,9 @@ } }, "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -190,13 +198,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -311,12 +319,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.8" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -382,17 +390,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", + "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", + "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -400,9 +408,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -413,9 +421,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.8.tgz", - "integrity": "sha512-aeAeeJB9fSDc7Gq+2GqpQxA0qBj6gj1k2R6L1cYqGePKP/baIq1WX8y6B+D+nRsO5ViQL22K/8IwbqERW0q1nw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.1.tgz", + "integrity": "sha512-IXWLCxKmae+rI7LOHS1B3EbVisQ6GRAWbhN9msa6KjNCyFWrvKZWR4oUdinaNssrV852OrSHuSPa95h1GPJc7Q==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -429,20 +437,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.5.8", - "@biomejs/cli-darwin-x64": "2.5.8", - "@biomejs/cli-linux-arm64": "2.5.8", - "@biomejs/cli-linux-arm64-musl": "2.5.8", - "@biomejs/cli-linux-x64": "2.5.8", - "@biomejs/cli-linux-x64-musl": "2.5.8", - "@biomejs/cli-win32-arm64": "2.5.8", - "@biomejs/cli-win32-x64": "2.5.8" + "@biomejs/cli-darwin-arm64": "2.5.1", + "@biomejs/cli-darwin-x64": "2.5.1", + "@biomejs/cli-linux-arm64": "2.5.1", + "@biomejs/cli-linux-arm64-musl": "2.5.1", + "@biomejs/cli-linux-x64": "2.5.1", + "@biomejs/cli-linux-x64-musl": "2.5.1", + "@biomejs/cli-win32-arm64": "2.5.1", + "@biomejs/cli-win32-x64": "2.5.1" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.8.tgz", - "integrity": "sha512-mk1QON9PHllvvLN5gU3f4rMxeh4syK5p9OvKyWH6/W8ueh04uaC8TUXXByhGufWf/y5mQc03ZLM45zU+cmqMjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-npqDzvqv7vFaWRiNN1Te71siRgPaqS9MpqgYCdP/CrUbkJ7ApezaeaKjueKHRN/JH/6lRjJQAHi8acQDCAz22w==", "cpu": [ "arm64" ], @@ -457,9 +465,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.8.tgz", - "integrity": "sha512-bsGwFMBNyHPyiLSsQcZJxdoRrg1V4JL+d7wEsvUBczlP9U9lwM+7mzQHxI4o1mhBsTmdOBbAb6fHU3Z3snN45w==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.1.tgz", + "integrity": "sha512-RgwTqPAM8g2tn1j+b5oRjF/DbSBX8a4gwojtuG9XuhfK7GgomvZ9+T+tqjXiVbjLEeGJOoL6VEk8mvRTVeSybw==", "cpu": [ "x64" ], @@ -474,9 +482,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.8.tgz", - "integrity": "sha512-XmFiA0WPYFC+uiUDC8WRFzAIH9bo7vwQLav38Uoq4ETC+T/+uBi0TsYGJECkugY3r8USl3jc+Ae2/irAF6F2lQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.1.tgz", + "integrity": "sha512-yhV35CzZh38VyMvTEXi3JTjxZBs++oCKK9KG8vB6VI5+uvQvZNR3BFWEKKzuOmx9DJJj7sQpZ4LQJcmbGTs3+Q==", "cpu": [ "arm64" ], @@ -494,9 +502,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.8.tgz", - "integrity": "sha512-VcJNbstduTHx83NGAdhp78/JOcP45BZHXL7yNsfI1uGzdUgegAz2s+mSoT7wK6PBNzLoqG0zDOXaz/RQYVtSiw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-WMcvMLgByyTqVxGlq918NBBYliq9FRR9GAQVETHb+VjGVqXCZFfHlZHC1FX4ibuYY/Hg6TJE3rHU0xVrdJXNRw==", "cpu": [ "arm64" ], @@ -514,9 +522,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.8.tgz", - "integrity": "sha512-S5wcm9OBDvLHodD4PUaN488hCpco9QD/9ZxuYJiw4euWtr/oQvLR72z2ixItH8Wd5BCm6FZaeb+YNvOoM1xHtQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.1.tgz", + "integrity": "sha512-J/7uHSX7NfoYDI7HijAkd8lnQIOrRb2W7j3X+tw4R+N5ExvXGsyXFiGdQcfcxfOmNQmZVSQOCDk757fwpzqQcg==", "cpu": [ "x64" ], @@ -534,9 +542,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.8.tgz", - "integrity": "sha512-kKmiyokeISRGq2FLwvr+TzsgBusfxaZ0FZNLcOYOpCK/78tRrEjeEBLvq3xLZMpqbANgJdRPI7vZX8ZL37u9/w==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-ANTowtlLmPYm5yeMckWY8Xzb9Ix+JJP3tgHR/n6xRj1VWyIzzWtfRfih9hv9VmClwadpBvZduISZIbBsIlYG3A==", "cpu": [ "x64" ], @@ -554,9 +562,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.8.tgz", - "integrity": "sha512-nILH0mzm3Hi3iEdd7o7GpB8kBR/mSQwfQG/tyBqyNrY2GFtcgwfV9nV8xLmbtUpMNY/Oi0Ml1XgfR4flOdq+AA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.1.tgz", + "integrity": "sha512-zgXnKNgWPC4iPF7Y1lR3STUeCUuZRpD6IiOrC7TZTlh0Lx6FiVUT05myuMQHQ9D+1cc7uyMldi4forE6lp0ivQ==", "cpu": [ "arm64" ], @@ -571,9 +579,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.8.tgz", - "integrity": "sha512-I2czzXTY61f3nFJxXoMDq80t7MivxDEnCjE+8sDKoFfcKMaoQdkqhIFQ3KyY0XLzeSpUBYeNAXgD+iOV/BU0VA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.1.tgz", + "integrity": "sha512-6uxpR9hvaglANkZemeSiN/FhYgkGasrEGn267eXIWvjrjJ2LhDlk251IhjVJq6MXzkV2/bcXwLwSroLyPtqRZg==", "cpu": [ "x64" ], @@ -617,9 +625,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", "dev": true, "funding": [ { @@ -641,9 +649,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", - "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", + "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", "dev": true, "funding": [ { @@ -658,7 +666,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.3.0" + "@csstools/css-calc": "^3.2.1" }, "engines": { "node": ">=20.19.0" @@ -692,9 +700,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", - "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz", + "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==", "dev": true, "funding": [ { @@ -748,9 +756,9 @@ } }, "node_modules/@electron-internal/extract-zip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz", - "integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.4.tgz", + "integrity": "sha512-Zr1Vs7E9tpCNhZHDAbFVXc2gEVCG9RqPDjrno5+bdgB6LRAuvgyMHJut4NCVyYwtAieapMzc3fiQ3CSTi75ARg==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -783,9 +791,9 @@ "license": "MIT" }, "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -904,9 +912,9 @@ } }, "node_modules/@electron/get": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz", - "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", + "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", "dev": true, "license": "MIT", "dependencies": { @@ -1004,9 +1012,9 @@ } }, "node_modules/@electron/rebuild": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz", - "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.6.tgz", + "integrity": "sha512-323ygp5Lz4DP2nVu54NLCx4n0TKsQ3OMDG3PPeOFjOTMDtSxGbCi7mQfWBc5C80pp+9awEsiHx9HR9DfAM/IEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1051,9 +1059,9 @@ "license": "MIT" }, "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "license": "MIT", "dependencies": { @@ -1061,9 +1069,9 @@ } }, "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", - "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "dev": true, "license": "MIT", "dependencies": { @@ -1114,9 +1122,9 @@ } }, "node_modules/@electron/windows-sign/node_modules/fs-extra": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", - "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "dev": true, "license": "MIT", "optional": true, @@ -1130,6 +1138,37 @@ "node": ">=14.14" } }, + "node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", @@ -1765,42 +1804,25 @@ "integrity": "sha512-eFrYUPDVHeuwWHluTG1kwNQUEUcFjVKYwPkU8z9DR1JH3AW7JtJsG9cRVGmwz809kKtGfwGJj58juCZxEvnI/g==", "license": "MIT" }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@neodrag/core": { - "version": "3.0.0-next.11", - "resolved": "https://registry.npmjs.org/@neodrag/core/-/core-3.0.0-next.11.tgz", - "integrity": "sha512-3WQWxyrbxiaK9zS5JU2wJsW2gpoQlZBXVghduBh61JpqaeE0T0cte8R0qYK2RuJo3J2TYQYqxO19CpG/C1i5eg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@neodrag/solid": { - "version": "3.0.0-next.11", - "resolved": "https://registry.npmjs.org/@neodrag/solid/-/solid-3.0.0-next.11.tgz", - "integrity": "sha512-vCBIn/pimjWMQ6vhTS2/O1XNAwzVtc4eUhdbQ91WykbZWWqQ5NocDXt/1OdYrEkeRzJcpCv8wEz5PnMkgKP81Q==", - "dev": true, - "license": "MIT", + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, "peerDependencies": { - "@neodrag/core": "3.0.0-next.11", - "solid-js": "^1.0.0" + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "node_modules/@noble/curves": { @@ -1831,9 +1853,9 @@ } }, "node_modules/@noble/hashes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz", - "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", "dev": true, "license": "MIT", "engines": { @@ -1900,125 +1922,813 @@ "node": ">=20.0" } }, - "node_modules/@oxc-project/types": { - "version": "0.144.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.144.0.tgz", - "integrity": "sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==", + "node_modules/@oxc-minify/binding-android-arm-eabi": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm-eabi/-/binding-android-arm-eabi-0.110.0.tgz", + "integrity": "sha512-43fMTO8/5bMlqfOiNSZNKUzIqeLIYuB9Hr1Ohyf58B1wU11S2dPGibTXOGNaWsfgHy99eeZ1bSgeIHy/fEYqbw==", + "cpu": [ + "arm" + ], "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz", - "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", + "node_modules/@oxc-minify/binding-android-arm64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm64/-/binding-android-arm64-0.110.0.tgz", + "integrity": "sha512-5oQrnn9eK/ccOp80PTrNj0Vq893NPNNRryjGpOIVsYNgWFuoGCfpnKg68oEFcN8bArizYAqw4nvgHljEnar69w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz", - "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", + "node_modules/@oxc-minify/binding-darwin-arm64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-arm64/-/binding-darwin-arm64-0.110.0.tgz", + "integrity": "sha512-dqBDgTG9tF2z2lrZp9E8wU+Godz1i8gCGSei2eFKS2hRploBOD5dmOLp1j4IMornkPvSQmbwB3uSjPq7fjx4EA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz", - "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", + "node_modules/@oxc-minify/binding-darwin-x64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-x64/-/binding-darwin-x64-0.110.0.tgz", + "integrity": "sha512-U0AqabqaooDOpYmeeOye8wClv8PSScELXgOfYqyqgrwH9J9KrpCE1jL8Rlqgz68QbL4mPw3V6sKiiHssI4CLeQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz", - "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", + "node_modules/@oxc-minify/binding-freebsd-x64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-freebsd-x64/-/binding-freebsd-x64-0.110.0.tgz", + "integrity": "sha512-H0w8o/Wo1072WSdLfhwwrpFpwZnPpjQODlHuRYkTfsSSSJbTxQtjJd4uxk7YJsRv5RQp69y0I7zvdH6f8Xueyw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-rsa": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz", - "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", + "node_modules/@oxc-minify/binding-linux-arm-gnueabihf": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.110.0.tgz", + "integrity": "sha512-qd6sW0AvEVYZhbVVMGtmKZw3b1zDYGIW+54Uh42moWRAj6i4Jhk/LGr6r9YNZpOINeuvZfkFuEeDD/jbu7xPUA==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz", - "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", + "node_modules/@oxc-minify/binding-linux-arm-musleabihf": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.110.0.tgz", + "integrity": "sha512-7WXP0aXMrWSn0ScppUBi3jf68ebfBG0eri8kxLmBOVSBj6jw1repzkHMITJMBeLr5d0tT/51qFEptiAk2EP2iA==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pfx": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz", - "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", + "node_modules/@oxc-minify/binding-linux-arm64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.110.0.tgz", + "integrity": "sha512-LYfADrq5x1W5gs+u9OIbMbDQNYkAECTXX0ufnAuf3oGmO51rF98kGFR5qJqC/6/csokDyT3wwTpxhE0TkcF/Og==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", - "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "node_modules/@oxc-minify/binding-linux-arm64-musl": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.110.0.tgz", + "integrity": "sha512-53GjCVY8kvymk9P6qNDh6zyblcehF5QHstq9QgCjv13ONGRnSHjeds0PxIwiihD7h295bxsWs84DN39syLPH4Q==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "@peculiar/utils": "^2.0.2", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz", - "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", + "node_modules/@oxc-minify/binding-linux-ppc64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.110.0.tgz", + "integrity": "sha512-li8XcN81dxbJDMBESnTgGhoiAQ+CNIdM0QGscZ4duVPjCry1RpX+5FJySFbGqG3pk4s9ZzlL/vtQtbRzZIZOzg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/utils": "^2.0.2", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-riscv64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.110.0.tgz", + "integrity": "sha512-SweKfsnLKShu6UFV8mwuj1d1wmlNoL/FlAxPUzwjEBgwiT2HQkY24KnjBH+TIA+//1O83kzmWKvvs4OuEhdIEQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-riscv64-musl": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.110.0.tgz", + "integrity": "sha512-oH8G4aFMP8XyTsEpdANC5PQyHgSeGlopHZuW1rpyYcaErg5YaK0vXjQ4EM5HVvPm+feBV24JjxgakTnZoF3aOQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-s390x-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.110.0.tgz", + "integrity": "sha512-W9na+Vza7XVUlpf8wMt4QBfH35KeTENEmnpPUq3NSlbQHz8lSlSvhAafvo43NcKvHAXV3ckD/mUf2VkqSdbklg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-x64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.110.0.tgz", + "integrity": "sha512-XJdA4mmmXOjJxSRgNJXsDP7Xe8h3gQhmb56hUcCrvq5d+h5UcEi2pR8rxsdIrS8QmkLuBA3eHkGK8E27D7DTgQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-x64-musl": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-musl/-/binding-linux-x64-musl-0.110.0.tgz", + "integrity": "sha512-QqzvALuOTtSckI8x467R4GNArzYDb/yEh6aNzLoeaY1O7vfT7SPDwlOEcchaTznutpeS9Dy8gUS/AfqtUHaufw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-openharmony-arm64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-openharmony-arm64/-/binding-openharmony-arm64-0.110.0.tgz", + "integrity": "sha512-gAMssLs2Q3+uhLZxanh1DF+27Kaug3cf4PXb9AB7XK81DR+LVcKySXaoGYoOs20Co0fFSphd6rRzKge2qDK3dA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-wasm32-wasi": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-wasm32-wasi/-/binding-wasm32-wasi-0.110.0.tgz", + "integrity": "sha512-7Wqi5Zjl022bs2zXq+ICdalDPeDuCH/Nhbi8q2isLihAonMVIT0YH2hqqnNEylRNGYck+FJ6gRZwMpGCgrNxPg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-minify/binding-win32-arm64-msvc": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.110.0.tgz", + "integrity": "sha512-ZPx+0Tj4dqn41ecyoGotlvekQKy6JxJCixn9Rw7h/dafZ3eDuBcEVh3c2ZoldXXsyMIt5ywI8IWzFZsjNedd5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-ia32-msvc": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.110.0.tgz", + "integrity": "sha512-H0Oyd3RWBfpEyvJIrFK94RYiY7KKSQl11Ym7LMDwLEagelIAfRCkt1amHZhFa/S3ZRoaOJFXzEw4YKeSsjVFsg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-x64-msvc": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.110.0.tgz", + "integrity": "sha512-Hr3nK90+qXKJ2kepXwFIcNfQQIOBecB4FFCyaMMypthoEEhVP08heRynj4eSXZ8NL9hLjs3fQzH8PJXfpznRnQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.137.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", + "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxc-transform/binding-android-arm-eabi": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm-eabi/-/binding-android-arm-eabi-0.110.0.tgz", + "integrity": "sha512-sE9dxvqqAax1YYJ3t7j+h5ZSI9jl6dYuDfngl6ieZUrIy5P89/8JKVgAzgp8o3wQSo7ndpJvYsi1K4ZqrmbP7w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-android-arm64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.110.0.tgz", + "integrity": "sha512-nqtbP4aMCtsCZ6qpHlHaQoWVHSBtlKzwaAgwEOvR+9DWqHjk31BHvpGiDXlMeed6CVNpl3lCbWgygb3RcSjcfw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-darwin-arm64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.110.0.tgz", + "integrity": "sha512-oeSeHnL4Z4cMXtc8V0/rwoVn0dgwlS9q0j6LcHn9dIhtFEdp3W0iSBF8YmMQA+E7sILeLDjsHmHE4Kp0sOScXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-darwin-x64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.110.0.tgz", + "integrity": "sha512-nL9K5x7OuZydobAGPylsEW9d4APs2qEkIBLMgQPA+kY8dtVD3IR87QsTbs4l4DBQYyun/+ay6qVCDlxqxdX2Jg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-freebsd-x64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.110.0.tgz", + "integrity": "sha512-GS29zXXirDQhZEUq8xKJ1azAWMuUy3Ih3W5Bc5ddk12LRthO5wRLFcKIyeHpAXCoXymQ+LmxbMtbPf84GPxouw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm-gnueabihf": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.110.0.tgz", + "integrity": "sha512-glzDHak8ISyZJemCUi7RCvzNSl+MQ1ly9RceT2qRufhUsvNZ4C/2QLJ1HJwd2N6E88bO4laYn+RofdRzNnGGEA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm-musleabihf": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.110.0.tgz", + "integrity": "sha512-8JThvgJ2FRoTVfbp7e4wqeZqCZbtudM06SfZmNzND9kPNu/LVYygIR+72RWs+xm4bWkuYHg/islo/boNPtMT5Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.110.0.tgz", + "integrity": "sha512-IRh21Ub/g4bkHoErZ0AUWMlWfoZaS0A6EaOVtbcY70RSYIMlrsbjiFwJCzM+b/1DD1rXbH5tsGcH7GweTbfRqg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm64-musl": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.110.0.tgz", + "integrity": "sha512-e5JN94/oy+wevk76q+LMr+2klTTcO60uXa+Wkq558Ms7mdF2TvkKFI++d/JeiuIwJLTi/BxQ4qdT5FWcsHM/ug==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-ppc64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.110.0.tgz", + "integrity": "sha512-Y3/Tnnz1GvDpmv8FXBIKtdZPsdZklOEPdrL6NHrN5i2u54BOkybFaDSptgWF53wOrJlTrcmAVSE6fRKK9XCM2Q==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-riscv64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.110.0.tgz", + "integrity": "sha512-Y0E35iA9/v9jlkNcP6tMJ+ZFOS0rLsWDqG6rU9z+X2R3fBFJBO9UARIK6ngx8upxk81y1TFR2CmBFhupfYdH6Q==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-riscv64-musl": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.110.0.tgz", + "integrity": "sha512-JOUSYFfHjBUs7xp2FHmZHb8eTYD/oEu0NklS6JgUauqnoXZHiTLPLVW2o2uVCqldnabYHcomuwI2iqVFYJNhTw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-s390x-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.110.0.tgz", + "integrity": "sha512-7blgoXF9D3Ngzb7eun23pNrHJpoV/TtE6LObwlZ3Nmb4oZ6Z+yMvBVaoW68NarbmvNGfZ95zrOjgm6cVETLYBA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-x64-gnu": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.110.0.tgz", + "integrity": "sha512-YQ2joGWCVDZVEU2cD/r/w49hVjDm/Qu1BvC/7zs8LvprzdLS/HyMXGF2oA0puw0b+AqgYaz3bhwKB2xexHyITQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-x64-musl": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.110.0.tgz", + "integrity": "sha512-fkjr5qE632ULmNgvFXWDR/8668WxERz3tU7TQFp6JebPBneColitjSkdx6VKNVXEoMmQnOvBIGeP5tUNT384oA==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-openharmony-arm64": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-openharmony-arm64/-/binding-openharmony-arm64-0.110.0.tgz", + "integrity": "sha512-HWH9Zj+lMrdSTqFRCZsvDWMz7OnMjbdGsm3xURXWfRZpuaz0bVvyuZNDQXc4FyyhRDsemICaJbU1bgeIpUJDGw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-wasm32-wasi": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.110.0.tgz", + "integrity": "sha512-ejdxHmYfIcHDPhZUe3WklViLt9mDEJE5BzcW7+R1vc5i/5JFA8D0l7NUSsHBJ7FB8Bu9gF+5iMDm6cXGAgaghw==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-transform/binding-win32-arm64-msvc": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.110.0.tgz", + "integrity": "sha512-9VTwpXCZs7xkV+mKhQ62dVk7KLnLXtEUxNS2T4nLz3iMl1IJbA4h5oltK0JoobtiUAnbkV53QmMVGW8+Nh3bDQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-win32-ia32-msvc": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.110.0.tgz", + "integrity": "sha512-5y0fzuNON7/F2hh2P94vANFaRPJ/3DI1hVl5rseCT8VUVqOGIjWaza0YS/D1g6t1WwycW2LWDMi2raOKoWU5GQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-win32-x64-msvc": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.110.0.tgz", + "integrity": "sha512-QROrowwlrApI1fEScMknGWKM6GTM/Z2xwMnDqvSaEmzNazBsDUlE08Jasw610hFEsYAVU2K5sp/YaCa9ORdP4A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz", + "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz", + "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz", + "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz", + "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-rsa": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz", + "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz", + "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.8.0", + "@peculiar/asn1-pfx": "^2.8.0", + "@peculiar/asn1-pkcs8": "^2.8.0", + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "@peculiar/asn1-x509-attr": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz", + "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/asn1-x509": "^2.8.0", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", + "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz", + "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.8.0", + "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } @@ -2123,9 +2833,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.4.tgz", - "integrity": "sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", + "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", "cpu": [ "arm64" ], @@ -2139,9 +2849,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", + "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", "cpu": [ "arm64" ], @@ -2155,9 +2865,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.4.tgz", - "integrity": "sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", + "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", "cpu": [ "x64" ], @@ -2171,9 +2881,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.4.tgz", - "integrity": "sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", + "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", "cpu": [ "x64" ], @@ -2187,9 +2897,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.4.tgz", - "integrity": "sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", + "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", "cpu": [ "arm" ], @@ -2203,9 +2913,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.4.tgz", - "integrity": "sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", + "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", "cpu": [ "arm64" ], @@ -2222,9 +2932,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.4.tgz", - "integrity": "sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", + "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", "cpu": [ "arm64" ], @@ -2241,9 +2951,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.4.tgz", - "integrity": "sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", + "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", "cpu": [ "ppc64" ], @@ -2260,9 +2970,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.4.tgz", - "integrity": "sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", + "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", "cpu": [ "s390x" ], @@ -2279,9 +2989,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.4.tgz", - "integrity": "sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", + "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", "cpu": [ "x64" ], @@ -2298,9 +3008,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.4.tgz", - "integrity": "sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", + "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", "cpu": [ "x64" ], @@ -2317,9 +3027,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.4.tgz", - "integrity": "sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", + "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", "cpu": [ "arm64" ], @@ -2332,10 +3042,59 @@ "node": "^20.19.0 || >=22.12.0" } }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", + "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.4.tgz", - "integrity": "sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", + "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", "cpu": [ "arm64" ], @@ -2349,9 +3108,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.4.tgz", - "integrity": "sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", + "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", "cpu": [ "x64" ], @@ -2403,9 +3162,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", - "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", "cpu": [ "arm" ], @@ -2416,9 +3175,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", - "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", "cpu": [ "arm64" ], @@ -2429,9 +3188,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", - "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", "cpu": [ "arm64" ], @@ -2442,9 +3201,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", - "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", "cpu": [ "x64" ], @@ -2455,9 +3214,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", - "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", "cpu": [ "arm64" ], @@ -2468,9 +3227,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", - "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", "cpu": [ "x64" ], @@ -2481,9 +3240,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", - "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", "cpu": [ "arm" ], @@ -2497,9 +3256,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", - "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", "cpu": [ "arm" ], @@ -2513,9 +3272,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", - "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", "cpu": [ "arm64" ], @@ -2529,9 +3288,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", - "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", "cpu": [ "arm64" ], @@ -2545,9 +3304,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", - "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", "cpu": [ "loong64" ], @@ -2561,9 +3320,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", - "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", "cpu": [ "loong64" ], @@ -2577,9 +3336,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", - "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", "cpu": [ "ppc64" ], @@ -2593,9 +3352,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", - "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", "cpu": [ "ppc64" ], @@ -2609,9 +3368,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", - "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", "cpu": [ "riscv64" ], @@ -2625,9 +3384,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", - "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", "cpu": [ "riscv64" ], @@ -2641,9 +3400,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", - "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", "cpu": [ "s390x" ], @@ -2657,9 +3416,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", - "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", "cpu": [ "x64" ], @@ -2673,9 +3432,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", - "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", "cpu": [ "x64" ], @@ -2689,9 +3448,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", - "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", "cpu": [ "x64" ], @@ -2702,9 +3461,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", - "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", "cpu": [ "arm64" ], @@ -2715,9 +3474,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", - "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", "cpu": [ "arm64" ], @@ -2728,9 +3487,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", - "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", "cpu": [ "ia32" ], @@ -2741,9 +3500,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", - "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", "cpu": [ "x64" ], @@ -2754,9 +3513,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", - "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", "cpu": [ "x64" ], @@ -2808,79 +3567,79 @@ } }, "node_modules/@solid-primitives/event-listener": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@solid-primitives/event-listener/-/event-listener-2.4.6.tgz", - "integrity": "sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@solid-primitives/event-listener/-/event-listener-2.4.5.tgz", + "integrity": "sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==", "dev": true, "license": "MIT", "dependencies": { - "@solid-primitives/utils": "^6.4.1" + "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "node_modules/@solid-primitives/keyboard": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@solid-primitives/keyboard/-/keyboard-1.3.7.tgz", - "integrity": "sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@solid-primitives/keyboard/-/keyboard-1.3.5.tgz", + "integrity": "sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ==", "dev": true, "license": "MIT", "dependencies": { - "@solid-primitives/event-listener": "^2.4.6", - "@solid-primitives/rootless": "^1.5.4", - "@solid-primitives/utils": "^6.4.1" + "@solid-primitives/event-listener": "^2.4.5", + "@solid-primitives/rootless": "^1.5.3", + "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "node_modules/@solid-primitives/resize-observer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@solid-primitives/resize-observer/-/resize-observer-2.2.0.tgz", - "integrity": "sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@solid-primitives/resize-observer/-/resize-observer-2.1.5.tgz", + "integrity": "sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw==", "dev": true, "license": "MIT", "dependencies": { - "@solid-primitives/event-listener": "^2.4.6", - "@solid-primitives/rootless": "^1.5.4", - "@solid-primitives/static-store": "^0.1.4", - "@solid-primitives/utils": "^6.4.1" + "@solid-primitives/event-listener": "^2.4.5", + "@solid-primitives/rootless": "^1.5.3", + "@solid-primitives/static-store": "^0.1.3", + "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "node_modules/@solid-primitives/rootless": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@solid-primitives/rootless/-/rootless-1.5.4.tgz", - "integrity": "sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@solid-primitives/rootless/-/rootless-1.5.3.tgz", + "integrity": "sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==", "dev": true, "license": "MIT", "dependencies": { - "@solid-primitives/utils": "^6.4.1" + "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "node_modules/@solid-primitives/static-store": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@solid-primitives/static-store/-/static-store-0.1.4.tgz", - "integrity": "sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@solid-primitives/static-store/-/static-store-0.1.3.tgz", + "integrity": "sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==", "dev": true, "license": "MIT", "dependencies": { - "@solid-primitives/utils": "^6.4.1" + "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "node_modules/@solid-primitives/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.4.0.tgz", + "integrity": "sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2913,49 +3672,49 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", - "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", + "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.24.1", + "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.3" + "tailwindcss": "4.3.1" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", - "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", + "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-arm64": "4.3.3", - "@tailwindcss/oxide-darwin-x64": "4.3.3", - "@tailwindcss/oxide-freebsd-x64": "4.3.3", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", - "@tailwindcss/oxide-linux-x64-musl": "4.3.3", - "@tailwindcss/oxide-wasm32-wasi": "4.3.3", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + "@tailwindcss/oxide-android-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-x64": "4.3.1", + "@tailwindcss/oxide-freebsd-x64": "4.3.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-x64-musl": "4.3.1", + "@tailwindcss/oxide-wasm32-wasi": "4.3.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", - "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", + "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", "cpu": [ "arm64" ], @@ -2970,9 +3729,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", - "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", + "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", "cpu": [ "arm64" ], @@ -2987,9 +3746,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", - "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", + "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", "cpu": [ "x64" ], @@ -3004,9 +3763,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", - "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", + "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", "cpu": [ "x64" ], @@ -3021,9 +3780,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", - "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", + "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", "cpu": [ "arm" ], @@ -3038,9 +3797,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", - "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", + "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", "cpu": [ "arm64" ], @@ -3058,9 +3817,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", - "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", + "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", "cpu": [ "arm64" ], @@ -3078,9 +3837,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", - "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", + "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", "cpu": [ "x64" ], @@ -3098,9 +3857,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", - "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", + "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", "cpu": [ "x64" ], @@ -3118,9 +3877,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", - "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", + "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -3136,9 +3895,9 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.11.1", - "@emnapi/runtime": "^1.11.1", - "@emnapi/wasi-threads": "^1.2.2", + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" @@ -3148,9 +3907,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", - "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", + "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", "cpu": [ "arm64" ], @@ -3165,9 +3924,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", - "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", + "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", "cpu": [ "x64" ], @@ -3182,17 +3941,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", - "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.1.tgz", + "integrity": "sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.3.3", - "@tailwindcss/oxide": "4.3.3", - "postcss": "^8.5.16", - "tailwindcss": "4.3.3" + "@tailwindcss/node": "4.3.1", + "@tailwindcss/oxide": "4.3.1", + "postcss": "8.5.15", + "tailwindcss": "4.3.1" } }, "node_modules/@tailwindcss/typography": { @@ -3209,19 +3968,18 @@ } }, "node_modules/@tanstack/devtools": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@tanstack/devtools/-/devtools-0.14.0.tgz", - "integrity": "sha512-tN0SEi1BVaJYtkZbgYpvLsInjwNRAZkR3r6slSvz9Jm+bfkhcdjuOSrZp0cAwOGwdnauHZ1mYgtfe2AfC/V1NQ==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@tanstack/devtools/-/devtools-0.12.5.tgz", + "integrity": "sha512-JdxTSeVdjJheycgz4c7qbldNKDCEDWlWr1l9dZBhd9sOmRBT5Z70ka9Eb8mb+FUnalcOIB62IDSR/iSxAIUD8Q==", "dev": true, "license": "MIT", "dependencies": { - "@neodrag/solid": "3.0.0-next.11", "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/keyboard": "^1.3.3", "@solid-primitives/resize-observer": "^2.1.3", "@tanstack/devtools-client": "0.0.8", "@tanstack/devtools-event-bus": "0.4.2", - "@tanstack/devtools-ui": "0.7.0", + "@tanstack/devtools-ui": "0.6.0", "clsx": "^2.1.1", "goober": "^2.1.16", "solid-js": "^1.9.9" @@ -3292,9 +4050,9 @@ } }, "node_modules/@tanstack/devtools-ui": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/devtools-ui/-/devtools-ui-0.7.0.tgz", - "integrity": "sha512-px/a+JgRSVHDj/hID1cwfsIi+ly5l7t3Yw7fLw4G556HXCNgDri36fupt9h7oBeEKntpsx3ep/XtZn51rrCv2g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@tanstack/devtools-ui/-/devtools-ui-0.6.0.tgz", + "integrity": "sha512-CVaM6rT6Nl5ijo83vJYFa2SjofvpuOl/uOvbYGhBrRgUhhelNHhx8zZX+hnZCHmIr0/lzM65hsocnZ72592Rvg==", "dev": true, "license": "MIT", "dependencies": { @@ -3398,9 +4156,9 @@ } }, "node_modules/@tanstack/history": { - "version": "1.162.1", - "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.1.tgz", - "integrity": "sha512-DR9t6lfLVdrjgCwpglrR9DR7Ok8/HlXjcOE+goWXF3zyuLUO/ug7vMbSFxTqrQTtbRghJfyhmIZ0S6LhPIy44w==", + "version": "1.162.0", + "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.0.tgz", + "integrity": "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==", "license": "MIT", "engines": { "node": ">=20.19" @@ -3411,9 +4169,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.101.4", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.4.tgz", - "integrity": "sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.2.tgz", + "integrity": "sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==", "license": "MIT", "peer": true, "funding": { @@ -3422,13 +4180,13 @@ } }, "node_modules/@tanstack/react-devtools": { - "version": "0.10.10", - "resolved": "https://registry.npmjs.org/@tanstack/react-devtools/-/react-devtools-0.10.10.tgz", - "integrity": "sha512-hYH34MSVbajs1pUc22ftSapyKQp2gOh0w34a7ouYOdIcbXD6YPckSR2YpAWGq1rrs6N0l/rvV6LM/G1pgN5ARg==", + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-devtools/-/react-devtools-0.10.8.tgz", + "integrity": "sha512-YJV6YttQf9lhhPbPBLULgy1eScEvJUMsCS26mjg9hfBKgAJQA5sF9zvzorDzW9Ob6o/asoXikO81JnRUVuFX0Q==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/devtools": "0.14.0" + "@tanstack/devtools": "0.12.5" }, "engines": { "node": ">=18" @@ -3445,13 +4203,13 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.101.4", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.4.tgz", - "integrity": "sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.2.tgz", + "integrity": "sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==", "license": "MIT", "peer": true, "dependencies": { - "@tanstack/query-core": "5.101.4" + "@tanstack/query-core": "5.101.2" }, "funding": { "type": "github", @@ -3462,14 +4220,14 @@ } }, "node_modules/@tanstack/react-router": { - "version": "1.170.27", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.27.tgz", - "integrity": "sha512-Hxl49xzd8ffWd2ZMigqfXZmpySpixWGvjq5zfh2nK2DbzzDH6IGVh+iUuwarK9MJNcnhWPZ85tOoy6o/OmNlww==", + "version": "1.170.16", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.16.tgz", + "integrity": "sha512-w6eq1IJklujs1tESazaK/FxH0+H2l8vm/QPuu1cD3oRW/ubgKneQpd7b64ti/8gUyEimzimJQZDmJr6YHfP5+g==", "license": "MIT", "dependencies": { - "@tanstack/history": "1.162.1", + "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", - "@tanstack/router-core": "1.171.22", + "@tanstack/router-core": "1.171.13", "isbot": "^5.1.22" }, "engines": { @@ -3485,13 +4243,13 @@ } }, "node_modules/@tanstack/react-router-devtools": { - "version": "1.167.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.167.1.tgz", - "integrity": "sha512-pjfGrmjj4d7naEPM7oshqFfwBoxDPNo/UxltlHH5ePbHsJ+plBhd+JaAewm1ueYOjZ0js9hckjWWDYXpCrSfKw==", + "version": "1.167.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.167.0.tgz", + "integrity": "sha512-nGw095EG7IHx0h5NtlEmzf6vcCTaFNPWdTSuDKazajhN0ct/v/TkekJ9J6KYUCeV1a8/2ZmToc58M+0rrOyn7w==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/router-devtools-core": "1.168.1" + "@tanstack/router-devtools-core": "1.168.0" }, "engines": { "node": ">=20.19" @@ -3501,8 +4259,8 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-router": "^1.170.19", - "@tanstack/router-core": "^1.171.16", + "@tanstack/react-router": "^1.170.0", + "@tanstack/router-core": "^1.170.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, @@ -3536,19 +4294,19 @@ } }, "node_modules/@tanstack/react-start": { - "version": "1.168.44", - "resolved": "https://registry.npmjs.org/@tanstack/react-start/-/react-start-1.168.44.tgz", - "integrity": "sha512-varBaGENYuX0qdRMy8xZvr3BpHCHfkOeBaFCQkXUaOzK3NmWdpqj6CSbPq5uMCHkvFTDXNN6PZukp5zRa5Wmcg==", + "version": "1.168.26", + "resolved": "https://registry.npmjs.org/@tanstack/react-start/-/react-start-1.168.26.tgz", + "integrity": "sha512-ZzNecqKWC0p2643/kIcFUdsMrXZ8A4dXm4Yfe9zV/Y0u14MtSkh/Sk76RQYIU5S84VyDyKhHo0Ffh8HQbLdvFw==", "license": "MIT", "dependencies": { - "@tanstack/react-router": "1.170.27", - "@tanstack/react-start-client": "1.168.25", - "@tanstack/react-start-rsc": "0.1.43", - "@tanstack/react-start-server": "1.167.32", + "@tanstack/react-router": "1.170.16", + "@tanstack/react-start-client": "1.168.14", + "@tanstack/react-start-rsc": "0.1.25", + "@tanstack/react-start-server": "1.167.20", "@tanstack/router-utils": "1.162.2", - "@tanstack/start-client-core": "1.170.22", - "@tanstack/start-plugin-core": "1.171.34", - "@tanstack/start-server-core": "1.169.26", + "@tanstack/start-client-core": "1.170.12", + "@tanstack/start-plugin-core": "1.171.18", + "@tanstack/start-server-core": "1.169.15", "pathe": "^2.0.3" }, "engines": { @@ -3577,14 +4335,14 @@ } }, "node_modules/@tanstack/react-start-client": { - "version": "1.168.25", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-client/-/react-start-client-1.168.25.tgz", - "integrity": "sha512-vwjhuXUXFEAS8btmmXa24J/cP12AuAqIn/9OdZnrVufBE489IaxUEE3KuqEyUyZ+dtwPxChgVxFPHLcG9zonwA==", + "version": "1.168.14", + "resolved": "https://registry.npmjs.org/@tanstack/react-start-client/-/react-start-client-1.168.14.tgz", + "integrity": "sha512-oaz43fdOhBWfOPsdLkp3IejwYEXRyeaZ4CYexOPZx3eVXzm4LLozvNkkkBE9aje1sM5MVC2Yo6+cyv2HdVzkHQ==", "license": "MIT", "dependencies": { - "@tanstack/react-router": "1.170.27", - "@tanstack/router-core": "1.171.22", - "@tanstack/start-client-core": "1.170.22" + "@tanstack/react-router": "1.170.16", + "@tanstack/router-core": "1.171.13", + "@tanstack/start-client-core": "1.170.12" }, "engines": { "node": ">=22.12.0" @@ -3599,18 +4357,19 @@ } }, "node_modules/@tanstack/react-start-rsc": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-rsc/-/react-start-rsc-0.1.43.tgz", - "integrity": "sha512-5h5qytaTlhakTWX0oMz7pVxS/4FuCJeg5a/jKkbLsEU2hWy/R098zQG9tftkWbzPhq+B3pfrGk32ufUzsiwK5A==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@tanstack/react-start-rsc/-/react-start-rsc-0.1.25.tgz", + "integrity": "sha512-Rwm6cjcS148y2XAebr8jyrwU0SqsRSkW4/CuXesoHg+G3IOnVRHV0HOylJfnznUTVuH1nVhfQRPI5uWPJaw2TA==", "license": "MIT", "dependencies": { - "@tanstack/react-router": "1.170.27", - "@tanstack/router-core": "1.171.22", + "@tanstack/react-router": "1.170.16", + "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", - "@tanstack/start-client-core": "1.170.22", + "@tanstack/start-client-core": "1.170.12", "@tanstack/start-fn-stubs": "1.162.0", - "@tanstack/start-plugin-core": "1.171.34", - "@tanstack/start-storage-context": "1.167.24", + "@tanstack/start-plugin-core": "1.171.18", + "@tanstack/start-server-core": "1.169.15", + "@tanstack/start-storage-context": "1.167.15", "pathe": "^2.0.3" }, "engines": { @@ -3622,7 +4381,7 @@ }, "peerDependencies": { "@rspack/core": ">=2.0.0-0", - "@vitejs/plugin-rsc": ">=0.5.30", + "@vitejs/plugin-rsc": ">=0.5.20", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "react-server-dom-rspack": ">=0.0.2" @@ -3640,14 +4399,14 @@ } }, "node_modules/@tanstack/react-start-server": { - "version": "1.167.32", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-server/-/react-start-server-1.167.32.tgz", - "integrity": "sha512-HZV8EE9f2XU+KnyJcB20SCZgAm6G3uGPUwihaqgAz+MPnuJ/xG1iNy1oyQRz/SeqI3PVnPKzWK3Dkv+7xiO7cA==", + "version": "1.167.20", + "resolved": "https://registry.npmjs.org/@tanstack/react-start-server/-/react-start-server-1.167.20.tgz", + "integrity": "sha512-hg9xVI6yNDu+6NCalKz1h3Ea18HZEUu35i/ZMJz1WadwqcArLMp41nM1GNhOAtGIdpycrp9tT7ccqc9zuRMRpQ==", "license": "MIT", "dependencies": { - "@tanstack/react-router": "1.170.27", - "@tanstack/router-core": "1.171.22", - "@tanstack/start-server-core": "1.169.26" + "@tanstack/react-router": "1.170.16", + "@tanstack/router-core": "1.171.13", + "@tanstack/start-server-core": "1.169.15" }, "engines": { "node": ">=22.12.0" @@ -3680,15 +4439,15 @@ } }, "node_modules/@tanstack/router-core": { - "version": "1.171.22", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.22.tgz", - "integrity": "sha512-sitsuRkz4qpTjIAV97S5zFCoeGv0OFd6+VWg3ZcIlQbi5R4NIXfz6ogg51n5w6rvTwSODz/lKWb5dl5tvh2bQw==", + "version": "1.171.13", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.13.tgz", + "integrity": "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA==", "license": "MIT", "dependencies": { - "@tanstack/history": "1.162.1", + "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", - "seroval": "^1.6.2", - "seroval-plugins": "^1.6.2" + "seroval": "^1.5.4", + "seroval-plugins": "^1.5.4" }, "engines": { "node": ">=20.19" @@ -3699,9 +4458,9 @@ } }, "node_modules/@tanstack/router-devtools-core": { - "version": "1.168.1", - "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.168.1.tgz", - "integrity": "sha512-qr4voa4cpSMwQvS3867xkU3AB3MtJbTuovKIy+btjJ/Faju6er9w0nDylmD+005Mk/3YKw9/iueZJl2JAB7JOA==", + "version": "1.168.0", + "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.168.0.tgz", + "integrity": "sha512-wQoQhlBK7nlZgqzaqdYXKWNTpdHdsaREdaPhFZVH0/Ador+F+eM3/NF2i3f2LPeS0GgKraZUQXe1Q/1+KHyEYg==", "dev": true, "license": "MIT", "dependencies": { @@ -3716,7 +4475,7 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/router-core": "^1.171.16", + "@tanstack/router-core": "^1.170.0", "csstype": "^3.0.10" }, "peerDependenciesMeta": { @@ -3726,13 +4485,13 @@ } }, "node_modules/@tanstack/router-generator": { - "version": "1.167.28", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.167.28.tgz", - "integrity": "sha512-AxvzdqQoBxrA8hoO1fHYg4cAUVug/xLqQhsGbNG1PelU3RbYRYEtDim7+HbYQCOqJaEuvV8tCvrTPTnT69iIwg==", + "version": "1.167.17", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.167.17.tgz", + "integrity": "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.22", + "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", @@ -3749,16 +4508,16 @@ } }, "node_modules/@tanstack/router-plugin": { - "version": "1.168.30", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.168.30.tgz", - "integrity": "sha512-Z53FeZjSddyn3c+lmUGHOU3bhZPpaFabcynja8/s87CZeyMYS7oNgUMoaYZAhVLk9cAEC/z3fkqISXqktZadDA==", + "version": "1.168.18", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.168.18.tgz", + "integrity": "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg==", "license": "MIT", "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.22", - "@tanstack/router-generator": "1.167.28", + "@tanstack/router-core": "1.171.13", + "@tanstack/router-generator": "1.167.17", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", @@ -3773,7 +4532,7 @@ }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", - "@tanstack/react-router": "^1.170.26", + "@tanstack/react-router": "^1.170.15", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" @@ -3837,15 +4596,15 @@ } }, "node_modules/@tanstack/start-client-core": { - "version": "1.170.22", - "resolved": "https://registry.npmjs.org/@tanstack/start-client-core/-/start-client-core-1.170.22.tgz", - "integrity": "sha512-18gHvhrVLEmhO0qZVIJaR/y3Mb7tvC9UQnCEiooQG/aIpYg4/kqoQ06E7WUJ/0WFy4NZOkEjk8QkDQNkFED+1g==", + "version": "1.170.12", + "resolved": "https://registry.npmjs.org/@tanstack/start-client-core/-/start-client-core-1.170.12.tgz", + "integrity": "sha512-gwtZRMPUIAxmDV2AIQUhC0kSW262SV7BkHXEgy5B1woHQdrdsELuGOdJwdweLxrjyefORxk+9MYGqDY0Cxn0bw==", "license": "MIT", "dependencies": { - "@tanstack/router-core": "1.171.22", + "@tanstack/router-core": "1.171.13", "@tanstack/start-fn-stubs": "1.162.0", - "@tanstack/start-storage-context": "1.167.24", - "seroval": "^1.6.2" + "@tanstack/start-storage-context": "1.167.15", + "seroval": "^1.5.4" }, "engines": { "node": ">=22.12.0" @@ -3869,24 +4628,24 @@ } }, "node_modules/@tanstack/start-plugin-core": { - "version": "1.171.34", - "resolved": "https://registry.npmjs.org/@tanstack/start-plugin-core/-/start-plugin-core-1.171.34.tgz", - "integrity": "sha512-MMp5Mlt8HAtstkVKwHW6dY5w58CP/Vtq+DhXdH4mIPuOeEhFtl/BYErJCzpnq80QqbEpRxCfMZPf9ng2PzApaA==", + "version": "1.171.18", + "resolved": "https://registry.npmjs.org/@tanstack/start-plugin-core/-/start-plugin-core-1.171.18.tgz", + "integrity": "sha512-weuOOjRD03BiKcF9NYKL5QADEQOp3yGHb0qIsOX42ENz5XUE4in2fXcVYHjSwwpzs+XGhWIFLp5J385pOVPuZQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.22", - "@tanstack/router-generator": "1.167.28", - "@tanstack/router-plugin": "1.168.30", + "@tanstack/router-core": "1.171.13", + "@tanstack/router-generator": "1.167.17", + "@tanstack/router-plugin": "1.168.18", "@tanstack/router-utils": "1.162.2", - "@tanstack/start-server-core": "1.169.26", + "@tanstack/start-server-core": "1.169.15", "exsolve": "^1.0.7", "lightningcss": "^1.32.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "seroval": "^1.6.2", + "seroval": "^1.5.4", "source-map": "^0.7.6", "srvx": "^0.11.9", "tinyglobby": "^0.2.15", @@ -3930,18 +4689,18 @@ } }, "node_modules/@tanstack/start-server-core": { - "version": "1.169.26", - "resolved": "https://registry.npmjs.org/@tanstack/start-server-core/-/start-server-core-1.169.26.tgz", - "integrity": "sha512-57Pvc00i/Y6l8+kqlV/QElVUh5onFUPeMUBDDRNwelAA4eoOmRDmfEWfVfkJNYlcAF4kt/s0mgnD58DlCgC9JA==", + "version": "1.169.15", + "resolved": "https://registry.npmjs.org/@tanstack/start-server-core/-/start-server-core-1.169.15.tgz", + "integrity": "sha512-V8ie2G2Ecb3Nklk8/QuKzulxb+tDUqgz6rjJe8Isdp4iKVXZu/TscItkUP/4Q5Bu7W4gUy3P25O6soC1oW1SXQ==", "license": "MIT", "dependencies": { - "@tanstack/history": "1.162.1", - "@tanstack/router-core": "1.171.22", - "@tanstack/start-client-core": "1.170.22", - "@tanstack/start-storage-context": "1.167.24", + "@tanstack/history": "1.162.0", + "@tanstack/router-core": "1.171.13", + "@tanstack/start-client-core": "1.170.12", + "@tanstack/start-storage-context": "1.167.15", "fetchdts": "^0.1.6", "h3-v2": "npm:h3@2.0.1-rc.20", - "seroval": "^1.6.2" + "seroval": "^1.5.4" }, "engines": { "node": ">=22.12.0" @@ -3952,12 +4711,12 @@ } }, "node_modules/@tanstack/start-storage-context": { - "version": "1.167.24", - "resolved": "https://registry.npmjs.org/@tanstack/start-storage-context/-/start-storage-context-1.167.24.tgz", - "integrity": "sha512-HPltgydit1LmLJFX3BhMcXMxkmUgtWJopPUx6Eg0YTC4tVwFvUhSWCrfgtTIiGWcHd1Ah+fi6fK9BAe8Y5KZtw==", + "version": "1.167.15", + "resolved": "https://registry.npmjs.org/@tanstack/start-storage-context/-/start-storage-context-1.167.15.tgz", + "integrity": "sha512-Jy0q4vdG6pv76N92+X+ag3fuOV2zINQagYyMN1/es7tPI1vzpKECIU8AqHqzI6ahkwaph7XDvmfUkiLJ3i4LOA==", "license": "MIT", "dependencies": { - "@tanstack/router-core": "1.171.22" + "@tanstack/router-core": "1.171.13" }, "engines": { "node": ">=22.12.0" @@ -4038,6 +4797,16 @@ } } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -4221,105 +4990,445 @@ "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": "*" + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "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.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qrcode": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", + "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.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/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } }, - "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/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" } }, - "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/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } }, - "node_modules/@types/node": { - "version": "22.20.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/qrcode": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", - "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.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==", + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" } }, "node_modules/@vitejs/plugin-react": { @@ -4344,15 +5453,15 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz", - "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.6.tgz", + "integrity": "sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.7", - "@vitest/utils": "3.2.7", + "@vitest/spy": "3.2.6", + "@vitest/utils": "3.2.6", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -4361,9 +5470,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", - "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.6.tgz", + "integrity": "sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==", "dev": true, "license": "MIT", "dependencies": { @@ -4374,13 +5483,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz", - "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.6.tgz", + "integrity": "sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.7", + "@vitest/utils": "3.2.6", "pathe": "^2.0.3", "strip-literal": "^3.0.0" }, @@ -4389,13 +5498,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz", - "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.6.tgz", + "integrity": "sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.7", + "@vitest/pretty-format": "3.2.6", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -4404,9 +5513,9 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz", - "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.6.tgz", + "integrity": "sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==", "dev": true, "license": "MIT", "dependencies": { @@ -4417,13 +5526,13 @@ } }, "node_modules/@vitest/utils": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz", - "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.6.tgz", + "integrity": "sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.7", + "@vitest/pretty-format": "3.2.6", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, @@ -4435,7 +5544,6 @@ "version": "0.8.13", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", - "deprecated": "this version has critical issues, please update to the latest version", "dev": true, "license": "MIT", "engines": { @@ -4698,6 +5806,39 @@ "readable-stream": "^2.0.6" } }, + "node_modules/are-we-there-yet/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==", + "license": "MIT", + "optional": 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" + } + }, + "node_modules/are-we-there-yet/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==", + "license": "MIT", + "optional": true + }, + "node_modules/are-we-there-yet/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==", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4792,9 +5933,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", - "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.2.tgz", + "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", "dev": true, "funding": [ { @@ -4812,8 +5953,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.6", - "caniuse-lite": "^1.0.30001806", + "browserslist": "^4.28.4", + "caniuse-lite": "^1.0.30001799", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -4846,14 +5987,14 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", - "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.6", + "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -4938,9 +6079,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.13", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz", - "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==", + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -5003,22 +6144,22 @@ "optional": true }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", "funding": [ { "type": "opencollective", @@ -5035,11 +6176,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -5048,30 +6189,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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.2.1" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5258,9 +6375,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "funding": [ { "type": "opencollective", @@ -5400,6 +6517,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clone-response/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", + "engines": { + "node": ">=4" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -5445,9 +6572,9 @@ } }, "node_modules/color-name": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.1.tgz", - "integrity": "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -5506,15 +6633,15 @@ "license": "MIT" }, "node_modules/concurrently": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", - "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.3.tgz", + "integrity": "sha512-ihjs0E2SxvDgq/MK418hX6YycQgKhsqxpbZuZbHo0yKfqDWdymWMjWYIpCIzqDDLLKClHlXev8whW/8WXmJ0BA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", - "shell-quote": "1.9.0", + "shell-quote": "1.8.4", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" @@ -5679,9 +6806,9 @@ } }, "node_modules/crossws": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.10.tgz", - "integrity": "sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.6.tgz", + "integrity": "sha512-/Wxe9Z007EbJ496j88nToZEvyPZ8PY/wjZJ18Agh/GCA9cYHyLbxtrpdFlFzAw3TV20F0SUYGl0g6PzChbwUrg==", "license": "MIT", "peerDependencies": { "srvx": ">=0.11.5" @@ -5736,9 +6863,9 @@ } }, "node_modules/cssstyle/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -5874,9 +7001,9 @@ } }, "node_modules/daisyui": { - "version": "5.7.16", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.7.16.tgz", - "integrity": "sha512-V9CJxvrWIXTDuP/0tpijjWaKaKJNYo2IrULJfTWs3/DjW9rPqswk1n8NCLQRLrTutmlG2Ech7nkJDpCnF+6Dzw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.6.3.tgz", + "integrity": "sha512-QvdtXnQ/tD5a18Y/+NJkJ1+ggwRtMF84GHTHCCAto5SNqYwZj8SUQQviKMpe1cKR7vMo/evTBDExkYd19KloBQ==", "dev": true, "license": "MIT", "funding": { @@ -6056,19 +7183,6 @@ "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", @@ -6205,9 +7319,9 @@ "license": "MIT" }, "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -6320,6 +7434,39 @@ "readable-stream": "^2.0.2" } }, + "node_modules/duplexer2/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, + "license": "MIT", + "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" + } + }, + "node_modules/duplexer2/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" + }, + "node_modules/duplexer2/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -6348,9 +7495,9 @@ } }, "node_modules/electron": { - "version": "40.10.6", - "resolved": "https://registry.npmjs.org/electron/-/electron-40.10.6.tgz", - "integrity": "sha512-TGjlkOU9Lg6K4KjDbsErywCWCIDaNgLh0q+xj0nlpRoQhevI7VBIxBTtJI/V30lypyLAaXMpnP9O9jui1/qRFw==", + "version": "40.10.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-40.10.5.tgz", + "integrity": "sha512-VzTIvwOYXZZufT9B83GDQogR1TFqREygRYhm0LE++QhGPjvBeg+W7siOP9K5+9rHMUnRuCX4YU/0ivLekN/UZQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6556,9 +7703,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.405", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.405.tgz", - "integrity": "sha512-bNglH7lPH5l+yHOes7Zr4VqxhOy4BQ9ZBUX4VdoFgxMpzJk7W1ZoO3Vgd9Pxa9PyjQ76sfm2aKH/nzEcCNRlew==", + "version": "1.5.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.380.tgz", + "integrity": "sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==", "license": "ISC" }, "node_modules/electron-winstaller": { @@ -6622,9 +7769,9 @@ } }, "node_modules/electron/node_modules/@types/node": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", - "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", "dev": true, "license": "MIT", "dependencies": { @@ -6661,9 +7808,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", - "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6701,22 +7848,22 @@ } }, "node_modules/env-runner": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/env-runner/-/env-runner-0.1.16.tgz", - "integrity": "sha512-2LRJM4P2KLX6J83QZZrMqvgCDt/D5ea7wPcI3yYiy5cG/9rX5QwdwZFx0D7ktWnjdRyZxYjttGGorb5nFqb1CA==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/env-runner/-/env-runner-0.1.14.tgz", + "integrity": "sha512-qdk5mmgFsd+zPg3r1bkZ+IbvpfUfypyDvNhMGypSMRpz7kOa/kI6SpW8fgyukuEM4Lo24M65r+1Ne0DtT7vFBA==", "license": "MIT", "dependencies": { - "crossws": "^0.4.8", - "exsolve": "^1.1.0", - "httpxy": "^0.5.4", - "srvx": "^0.11.19" + "crossws": "^0.4.5", + "exsolve": "^1.0.8", + "httpxy": "^0.5.3", + "srvx": "^0.11.16" }, "bin": { "env-runner": "dist/cli.mjs" }, "peerDependencies": { "@netlify/runtime": "^4.1.23", - "@vercel/queue": ">=0.2.0", + "@vercel/queue": "^0.2.0", "miniflare": "^4.20260515.0", "wrangler": "^4.0.0" }, @@ -6914,9 +8061,9 @@ "license": "MIT" }, "node_modules/eventsource": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.1.tgz", - "integrity": "sha512-D6bTRWh6KahHTK/m4WnjPQyEinNPf9eFLEZSEoj7d6fTibspnAVYfzHvirL7u/aoX5d9YYfIkBVAhmigUELk9w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", + "integrity": "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -6926,9 +8073,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", - "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -6952,9 +8099,9 @@ "license": "Apache-2.0" }, "node_modules/exsolve": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", - "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", + "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", "license": "MIT" }, "node_modules/extend": { @@ -6988,9 +8135,9 @@ "optional": true }, "node_modules/fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -7058,9 +8205,9 @@ "license": "MIT" }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "license": "MIT", "dependencies": { @@ -7437,9 +8584,9 @@ "license": "MIT" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7575,13 +8722,13 @@ "license": "ISC" }, "node_modules/h3": { - "version": "2.0.1-rc.26", - "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.26.tgz", - "integrity": "sha512-GDxlvDsKxgjRvG5UBRJYyGJTMWLV30CJ4cV+e7QCTgftDHihrvio1fVPbNembhEr6J4WNm8IWy3fookgyTweLw==", + "version": "2.0.1-rc.22", + "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.22.tgz", + "integrity": "sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==", "license": "MIT", "dependencies": { - "rou3": "^0.9.1", - "srvx": "^0.12.4" + "rou3": "^0.8.1", + "srvx": "^0.11.15" }, "bin": { "h3": "bin/h3.mjs" @@ -7590,7 +8737,7 @@ "node": ">=20.11.1" }, "peerDependencies": { - "crossws": "^0.4.9" + "crossws": "^0.4.1" }, "peerDependenciesMeta": { "crossws": { @@ -7623,24 +8770,6 @@ } } }, - "node_modules/h3/node_modules/rou3": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.9.2.tgz", - "integrity": "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==", - "license": "MIT" - }, - "node_modules/h3/node_modules/srvx": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.12.5.tgz", - "integrity": "sha512-IuvtDNQg5EIwv3c6dleyau7u8hCyGQ7D6+V/QM799Aud07z0wCUcurKLTRfyG33C8oUY+UWcVBFkfHMcbtmRLA==", - "license": "MIT", - "bin": { - "srvx": "bin/srvx.mjs" - }, - "engines": { - "node": ">=20.16.0" - } - }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -7890,9 +9019,9 @@ } }, "node_modules/httpxy": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.5.tgz", - "integrity": "sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.3.tgz", + "integrity": "sha512-SMS9V6Sn7VWaS11lYhoAr0ceoaiolTWf4jYdJn0NJhCdKMu9R2H9Fh0LBDWBHQF6HRLI1PmaePYsjanSpE5PEw==", "license": "MIT" }, "node_modules/ieee754": { @@ -8038,9 +9167,9 @@ } }, "node_modules/isbot": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.2.1.tgz", - "integrity": "sha512-dJ+LpKyClQZ7NG+j3OensC/mAZkGpukE9YUrgPYvAZj2doVL0edfDgywTUh5CXa0o+nW9a1V9e5+CJTX8+SxRw==", + "version": "5.1.44", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.44.tgz", + "integrity": "sha512-PGEHtwMnKbZpeSEXW2Utx+/JWed7dp6DiH0WWg33vGSDA7RUvpUeJSVlLrVkQ1RCpvDOUc/eH9ql7VsdbBZ8pA==", "license": "Unlicense", "engines": { "node": ">=18" @@ -8125,9 +9254,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "funding": [ { "type": "github", @@ -8290,9 +9419,9 @@ } }, "node_modules/koffi": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.16.3.tgz", - "integrity": "sha512-E9y1AsgYGlaxMhcZzHr8y96QF2U5XzA12GGVAfbWqIubTwPNMXQarfBzePNXHe0xtIEtNd6ifAv3GAKYGUeBAQ==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.16.2.tgz", + "integrity": "sha512-owU0MRwv6xkrVqCd+33uw6BaYppkTRXbO/rVdJNI2dvZG0gzyRhYwW25eWtc5pauwK8TGh3AbkFONSezdykfSA==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8717,9 +9846,9 @@ "license": "CC0-1.0" }, "node_modules/mediabunny": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.53.0.tgz", - "integrity": "sha512-RjWe9yJr9MPvb6kX4gSu54fZD2w1yf6RyCS0Jmgaml+fFSqEr7+XuASXoRxSqJxgc+wIe+7TujXWcyj3evJ3Bg==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.53.1.tgz", + "integrity": "sha512-w25gA6mQuHSLzdpWswqwndbKtHFcJ0IRowJaIHgY7rlJaVTHhomfx5mLq4IHqonrsGCGDE/LIrtXz8mxiDzavA==", "license": "MPL-2.0", "workspaces": [ ".", @@ -8771,23 +9900,26 @@ } }, "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==", + "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": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.8" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -8876,9 +10008,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", "devOptional": true, "funding": [ { @@ -8895,9 +10027,9 @@ } }, "node_modules/nf3": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/nf3/-/nf3-0.3.23.tgz", - "integrity": "sha512-RWVLAWozmVD3AaDmaU3qMGB3v+yNlH5d9qqStI4e/WLlNQVnJ4YErGDbYCIrGFyrHdbF6I6Baf0Ae6c7tFYmSg==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/nf3/-/nf3-0.3.17.tgz", + "integrity": "sha512-N9zEWySuJFw+gR0lhS5863YsvNeudOdqRyFvNb+jMXbeTJOdrjDqkCpDginIZfUm0LzT1t1nCRiDeqQm/8kirQ==", "license": "MIT" }, "node_modules/nitro": { @@ -8965,27 +10097,25 @@ } }, "node_modules/nitro-nightly": { - "version": "3.0.1-20260810-113911-16ff2809", - "resolved": "https://registry.npmjs.org/nitro-nightly/-/nitro-nightly-3.0.1-20260810-113911-16ff2809.tgz", - "integrity": "sha512-CD/oRD6udCLWDMOHRRulls448wD1bUzQ6GYfzlUKXTSERDGML9orZhp0dfXTDMZ0A4EtUkRogFH/vHAj9P42ow==", + "version": "3.0.1-alpha.2", + "resolved": "https://registry.npmjs.org/nitro-nightly/-/nitro-nightly-3.0.1-alpha.2.tgz", + "integrity": "sha512-/Ows8m2X4N+zNNwnG/Vq5sQfSfsjHvppelnrq0jCs0YN73Zakg14jVmH1oKDuEwfnmm57oDPxNMn8BIGgUOT4A==", "license": "MIT", "dependencies": { "consola": "^3.4.2", - "crossws": "^0.4.10", + "crossws": "^0.4.3", "db0": "^0.3.4", - "env-runner": "^0.1.16", - "h3": "^2.0.1-rc.25", - "h3-rules": "^0.1.0", - "hookable": "^6.1.1", - "nf3": "^0.3.22", - "ocache": "^0.2.0", + "h3": "^2.0.1-rc.11", + "jiti": "^2.6.1", + "nf3": "^0.3.5", "ofetch": "^2.0.0-alpha.3", "ohash": "^2.0.11", - "rolldown": "^1.2.0", - "rou3": "^0.9.1", - "srvx": "^0.11.22", + "oxc-minify": "^0.110.0", + "oxc-transform": "^0.110.0", + "srvx": "^0.10.1", + "undici": "^7.18.2", "unenv": "^2.0.0-rc.24", - "unstorage": "^2.0.0-alpha.7" + "unstorage": "^2.0.0-alpha.5" }, "bin": { "nitro": "dist/cli/index.mjs" @@ -8994,26 +10124,13 @@ "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "@vercel/queue": "^0.4.0", - "dotenv": "*", - "giget": "*", - "jiti": "^2.7.0", - "rollup": "^4.62.2", - "vite": "^7 || ^8", - "xml2js": "^0.6.2", - "zephyr-agent": "^1.1.2" + "rolldown": ">=1.0.0-beta.0", + "rollup": "^4", + "vite": "^7 || ^8 || >=8.0.0-0", + "xml2js": "^0.6.2" }, "peerDependenciesMeta": { - "@vercel/queue": { - "optional": true - }, - "dotenv": { - "optional": true - }, - "giget": { - "optional": true - }, - "jiti": { + "rolldown": { "optional": true }, "rollup": { @@ -9024,56 +10141,21 @@ }, "xml2js": { "optional": true - }, - "zephyr-agent": { - "optional": true } } }, - "node_modules/nitro-nightly/node_modules/h3-rules": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/h3-rules/-/h3-rules-0.1.0.tgz", - "integrity": "sha512-MrUUH1E/yoM7hvpKVbLs/CFeindwiTn7Fcfo+zXDpfuRYbcpJDPkYGGttCSiHNJmjUQNYQ5yn9veUIqFonYXuw==", + "node_modules/nitro-nightly/node_modules/srvx": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.10.1.tgz", + "integrity": "sha512-A//xtfak4eESMWWydSRFUVvCTQbSwivnGCEf8YGPe2eHU0+Z6znfUTCPF0a7oV3sObSOcrXHlL6Bs9vVctfXdg==", "license": "MIT", - "dependencies": { - "rou3": "^0.9.1", - "ufo": "^1.6.4" - }, - "peerDependencies": { - "h3": "^2.0.1-rc.25", - "ocache": ">=0.2.0" + "bin": { + "srvx": "bin/srvx.mjs" }, - "peerDependenciesMeta": { - "ocache": { - "optional": true - } - } - }, - "node_modules/nitro-nightly/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "extraneous": true, - "license": "BlueOak-1.0.0", "engines": { - "node": "20 || >=22" - } - }, - "node_modules/nitro-nightly/node_modules/ocache": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ocache/-/ocache-0.2.0.tgz", - "integrity": "sha512-QE+SxXf/A8yR01rEOg2X5KwUe+mARHo1xQXl+iwLMzLIH06S5lBOZhhHQWp7T5etfFa8nOnRhvjGuo9YBCWwig==", - "license": "MIT", - "dependencies": { - "ohash": "^2.0.11" + "node": ">=20.16.0" } }, - "node_modules/nitro-nightly/node_modules/rou3": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.9.2.tgz", - "integrity": "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==", - "license": "MIT" - }, "node_modules/nitro-nightly/node_modules/unstorage": { "version": "2.0.0-alpha.7", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-2.0.0-alpha.7.tgz", @@ -9176,16 +10258,6 @@ } } }, - "node_modules/nitro/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "extraneous": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/nitro/node_modules/unstorage": { "version": "2.0.0-alpha.7", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-2.0.0-alpha.7.tgz", @@ -9289,9 +10361,9 @@ } }, "node_modules/node-abi": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.33.0.tgz", - "integrity": "sha512-vLBWCKb+7LWsX+TbfzWOkw0W81m377tyx3hOweBTjO43CXZnRGS1/JPWs20fr0PgZyDXk6ROYrylsEycK8raDA==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", "dev": true, "license": "MIT", "dependencies": { @@ -9396,9 +10468,9 @@ } }, "node_modules/node-gyp/node_modules/undici": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", - "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", + "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", "dev": true, "license": "MIT", "engines": { @@ -9429,9 +10501,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", "license": "MIT", "engines": { "node": ">=18" @@ -9561,6 +10633,74 @@ "fn.name": "1.x.x" } }, + "node_modules/oxc-minify": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/oxc-minify/-/oxc-minify-0.110.0.tgz", + "integrity": "sha512-KWGTzPo83QmGrXC4ml83PM9HDwUPtZFfasiclUvTV4i3/0j7xRRqINVkrL77CbQnoWura3CMxkRofjQKVDuhBw==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-minify/binding-android-arm-eabi": "0.110.0", + "@oxc-minify/binding-android-arm64": "0.110.0", + "@oxc-minify/binding-darwin-arm64": "0.110.0", + "@oxc-minify/binding-darwin-x64": "0.110.0", + "@oxc-minify/binding-freebsd-x64": "0.110.0", + "@oxc-minify/binding-linux-arm-gnueabihf": "0.110.0", + "@oxc-minify/binding-linux-arm-musleabihf": "0.110.0", + "@oxc-minify/binding-linux-arm64-gnu": "0.110.0", + "@oxc-minify/binding-linux-arm64-musl": "0.110.0", + "@oxc-minify/binding-linux-ppc64-gnu": "0.110.0", + "@oxc-minify/binding-linux-riscv64-gnu": "0.110.0", + "@oxc-minify/binding-linux-riscv64-musl": "0.110.0", + "@oxc-minify/binding-linux-s390x-gnu": "0.110.0", + "@oxc-minify/binding-linux-x64-gnu": "0.110.0", + "@oxc-minify/binding-linux-x64-musl": "0.110.0", + "@oxc-minify/binding-openharmony-arm64": "0.110.0", + "@oxc-minify/binding-wasm32-wasi": "0.110.0", + "@oxc-minify/binding-win32-arm64-msvc": "0.110.0", + "@oxc-minify/binding-win32-ia32-msvc": "0.110.0", + "@oxc-minify/binding-win32-x64-msvc": "0.110.0" + } + }, + "node_modules/oxc-transform": { + "version": "0.110.0", + "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.110.0.tgz", + "integrity": "sha512-/fymQNzzUoKZweH0nC5yvbI2eR0yWYusT9TEKDYVgOgYrf9Qmdez9lUFyvxKR9ycx+PTHi/reIOzqf3wkShQsw==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-transform/binding-android-arm-eabi": "0.110.0", + "@oxc-transform/binding-android-arm64": "0.110.0", + "@oxc-transform/binding-darwin-arm64": "0.110.0", + "@oxc-transform/binding-darwin-x64": "0.110.0", + "@oxc-transform/binding-freebsd-x64": "0.110.0", + "@oxc-transform/binding-linux-arm-gnueabihf": "0.110.0", + "@oxc-transform/binding-linux-arm-musleabihf": "0.110.0", + "@oxc-transform/binding-linux-arm64-gnu": "0.110.0", + "@oxc-transform/binding-linux-arm64-musl": "0.110.0", + "@oxc-transform/binding-linux-ppc64-gnu": "0.110.0", + "@oxc-transform/binding-linux-riscv64-gnu": "0.110.0", + "@oxc-transform/binding-linux-riscv64-musl": "0.110.0", + "@oxc-transform/binding-linux-s390x-gnu": "0.110.0", + "@oxc-transform/binding-linux-x64-gnu": "0.110.0", + "@oxc-transform/binding-linux-x64-musl": "0.110.0", + "@oxc-transform/binding-openharmony-arm64": "0.110.0", + "@oxc-transform/binding-wasm32-wasi": "0.110.0", + "@oxc-transform/binding-win32-arm64-msvc": "0.110.0", + "@oxc-transform/binding-win32-ia32-msvc": "0.110.0", + "@oxc-transform/binding-win32-x64-msvc": "0.110.0" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -9722,9 +10862,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -9789,9 +10929,9 @@ } }, "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "devOptional": true, "funding": [ { @@ -9809,7 +10949,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.17", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -9869,9 +11009,9 @@ } }, "node_modules/prettier": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", - "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.1.tgz", + "integrity": "sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -9898,13 +11038,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/pretty-format/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" - }, "node_modules/proc-log": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", @@ -10012,9 +11145,9 @@ } }, "node_modules/pvutils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", - "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -10160,41 +11293,40 @@ } }, "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.8" + "react": "^19.2.7" } }, "node_modules/react-icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", - "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz", + "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==", "license": "MIT", "peerDependencies": { "react": "*" } }, "node_modules/react-is": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", - "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", - "license": "MIT", - "peer": true + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, "node_modules/react-redux": { "version": "9.3.0", @@ -10243,32 +11375,23 @@ } }, "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==", - "devOptional": true, + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/readable-stream/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==", - "devOptional": true, - "license": "MIT" - }, "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -10505,12 +11628,12 @@ } }, "node_modules/rolldown": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.4.tgz", - "integrity": "sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", + "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.144.0", + "@oxc-project/types": "=0.137.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -10520,20 +11643,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.4", - "@rolldown/binding-darwin-arm64": "1.2.4", - "@rolldown/binding-darwin-x64": "1.2.4", - "@rolldown/binding-freebsd-x64": "1.2.4", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.4", - "@rolldown/binding-linux-arm64-gnu": "1.2.4", - "@rolldown/binding-linux-arm64-musl": "1.2.4", - "@rolldown/binding-linux-ppc64-gnu": "1.2.4", - "@rolldown/binding-linux-s390x-gnu": "1.2.4", - "@rolldown/binding-linux-x64-gnu": "1.2.4", - "@rolldown/binding-linux-x64-musl": "1.2.4", - "@rolldown/binding-openharmony-arm64": "1.2.4", - "@rolldown/binding-win32-arm64-msvc": "1.2.4", - "@rolldown/binding-win32-x64-msvc": "1.2.4" + "@rolldown/binding-android-arm64": "1.1.3", + "@rolldown/binding-darwin-arm64": "1.1.3", + "@rolldown/binding-darwin-x64": "1.1.3", + "@rolldown/binding-freebsd-x64": "1.1.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", + "@rolldown/binding-linux-arm64-gnu": "1.1.3", + "@rolldown/binding-linux-arm64-musl": "1.1.3", + "@rolldown/binding-linux-ppc64-gnu": "1.1.3", + "@rolldown/binding-linux-s390x-gnu": "1.1.3", + "@rolldown/binding-linux-x64-gnu": "1.1.3", + "@rolldown/binding-linux-x64-musl": "1.1.3", + "@rolldown/binding-openharmony-arm64": "1.1.3", + "@rolldown/binding-wasm32-wasi": "1.1.3", + "@rolldown/binding-win32-arm64-msvc": "1.1.3", + "@rolldown/binding-win32-x64-msvc": "1.1.3" } }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { @@ -10543,9 +11667,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.62.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", - "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -10559,32 +11683,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.62.4", - "@rollup/rollup-android-arm64": "4.62.4", - "@rollup/rollup-darwin-arm64": "4.62.4", - "@rollup/rollup-darwin-x64": "4.62.4", - "@rollup/rollup-freebsd-arm64": "4.62.4", - "@rollup/rollup-freebsd-x64": "4.62.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", - "@rollup/rollup-linux-arm-musleabihf": "4.62.4", - "@rollup/rollup-linux-arm64-gnu": "4.62.4", - "@rollup/rollup-linux-arm64-musl": "4.62.4", - "@rollup/rollup-linux-loong64-gnu": "4.62.4", - "@rollup/rollup-linux-loong64-musl": "4.62.4", - "@rollup/rollup-linux-ppc64-gnu": "4.62.4", - "@rollup/rollup-linux-ppc64-musl": "4.62.4", - "@rollup/rollup-linux-riscv64-gnu": "4.62.4", - "@rollup/rollup-linux-riscv64-musl": "4.62.4", - "@rollup/rollup-linux-s390x-gnu": "4.62.4", - "@rollup/rollup-linux-x64-gnu": "4.62.4", - "@rollup/rollup-linux-x64-musl": "4.62.4", - "@rollup/rollup-openbsd-x64": "4.62.4", - "@rollup/rollup-openharmony-arm64": "4.62.4", - "@rollup/rollup-win32-arm64-msvc": "4.62.4", - "@rollup/rollup-win32-ia32-msvc": "4.62.4", - "@rollup/rollup-win32-x64-gnu": "4.62.4", - "@rollup/rollup-win32-x64-msvc": "4.62.4", + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" } }, @@ -10651,9 +11774,9 @@ } }, "node_modules/sax": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", - "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -10713,18 +11836,18 @@ } }, "node_modules/seroval": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.2.tgz", - "integrity": "sha512-mPT+SD2TrlB6wvte1KkYOYUkubaTbd6pZ/6Kk3C9nxzrHmCZyhxOO7XGAeL7f+yLKZglzGtM9odUVvg/EhO+vQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.4.tgz", + "integrity": "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==", "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.6.2.tgz", - "integrity": "sha512-TfxuUjlbBESzUOWdTkTKqvSmav0ABym+itetDXLK6mDz8SmrpdI30aF8RTXE8Bvq+tH/1yIDkvy3W0lfQb1ipQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.4.tgz", + "integrity": "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==", "license": "MIT", "engines": { "node": ">=10" @@ -10763,9 +11886,9 @@ } }, "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true, "license": "MIT", "engines": { @@ -10816,38 +11939,15 @@ } }, "node_modules/solid-js": { - "version": "1.9.14", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.14.tgz", - "integrity": "sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==", + "version": "1.9.13", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.13.tgz", + "integrity": "sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ==", "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.1.0", - "seroval": "~1.5.4", - "seroval-plugins": "~1.5.4" - } - }, - "node_modules/solid-js/node_modules/seroval": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.6.tgz", - "integrity": "sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/solid-js/node_modules/seroval-plugins": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.6.tgz", - "integrity": "sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" + "seroval": "~1.5.0", + "seroval-plugins": "~1.5.0" } }, "node_modules/source-map": { @@ -10911,9 +12011,9 @@ "optional": true }, "node_modules/srvx": { - "version": "0.11.22", - "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.22.tgz", - "integrity": "sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==", + "version": "0.11.17", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.17.tgz", + "integrity": "sha512-43yM4luKfCJamyCMhrUeHUPOrf8TdZe7kN8s5zayZCH5OeprYqi49Aso5ZvHXR4aB+DHaRNO/diNFgZSMNG8Xw==", "license": "MIT", "bin": { "srvx": "bin/srvx.mjs" @@ -10998,20 +12098,14 @@ } }, "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==", + "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==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/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==", - "license": "MIT" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -11095,9 +12189,9 @@ "license": "MIT" }, "node_modules/tailwindcss": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", - "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", + "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", "dev": true, "license": "MIT" }, @@ -11116,9 +12210,9 @@ } }, "node_modules/tar": { - "version": "7.5.22", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", - "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "version": "7.5.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", + "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -11273,22 +12367,22 @@ } }, "node_modules/tldts": { - "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", - "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.5.tgz", + "integrity": "sha512-RfEzKWcq5fHUOFq7J3rl3Oz6ylKGtcHqUznzj4EcXsxLSIjJcvpbXAQtWGeJQ0xKnimR5e0Cn+cn9TssfMzm+g==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.10" + "tldts-core": "^7.4.5" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", - "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.5.tgz", + "integrity": "sha512-pGrwzZDvPwKe+7NNUqAunb6rqTfynr0VOUhCMdqbu5xlvNiszsAJygRzwvpVycdzejlbpY+SWJOn+s75Og7FEA==", "dev": true, "license": "MIT" }, @@ -11313,9 +12407,9 @@ } }, "node_modules/tough-cookie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", - "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11367,28 +12461,6 @@ "utf8-byte-length": "^1.0.1" } }, - "node_modules/tsconfck": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", - "deprecated": "unmaintained", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -11396,9 +12468,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.12", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz", - "integrity": "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11466,17 +12538,38 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", "dev": true, "license": "Apache-2.0", "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "tsc": "bin/tsc" }, "engines": { - "node": ">=14.17" + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" } }, "node_modules/ufo": { @@ -11486,12 +12579,10 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", - "dev": true, + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "license": "MIT", - "optional": true, "engines": { "node": ">=20.18.1" } @@ -11523,9 +12614,9 @@ } }, "node_modules/unplugin": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", - "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.2.0.tgz", + "integrity": "sha512-6nGlT7EHsS+tTcTdAkYFqXIUwDrMJyJvHFNYGSr4x2/2ySIcV4f5e1RAJUeDyfOJPR8TF0auE8l+82PLhKjqsA==", "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", @@ -11606,9 +12697,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "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==", "funding": [ { "type": "opencollective", @@ -11933,16 +13024,16 @@ } }, "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", + "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", "devOptional": true, "license": "MIT", "dependencies": { - "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "~1.1.2", "tinyglobby": "^0.2.17" }, "bin": { @@ -11959,7 +13050,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -12019,370 +13110,130 @@ "dependencies": { "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": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/vite": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", - "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz", - "integrity": "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/vite/node_modules/lightningcss": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", - "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", - "devOptional": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.33.0", - "lightningcss-darwin-arm64": "1.33.0", - "lightningcss-darwin-x64": "1.33.0", - "lightningcss-freebsd-x64": "1.33.0", - "lightningcss-linux-arm-gnueabihf": "1.33.0", - "lightningcss-linux-arm64-gnu": "1.33.0", - "lightningcss-linux-arm64-musl": "1.33.0", - "lightningcss-linux-x64-gnu": "1.33.0", - "lightningcss-linux-x64-musl": "1.33.0", - "lightningcss-win32-arm64-msvc": "1.33.0", - "lightningcss-win32-x64-msvc": "1.33.0" - } - }, - "node_modules/vite/node_modules/lightningcss-android-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", - "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-darwin-arm64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", - "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-darwin-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-freebsd-x64": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", - "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", - "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", - "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", - "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", - "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "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": ">= 12.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/vite-node/node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">= 12.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", - "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" + "node_modules/vite-tsconfig-paths": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz", + "integrity": "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "vite": "*" } }, - "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", - "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], + "node_modules/vite-tsconfig-paths/node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "deprecated": "unmaintained", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, "engines": { - "node": ">= 12.0.0" + "node": "^18 || >=20" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/vitefu": { @@ -12405,20 +13256,20 @@ } }, "node_modules/vitest": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", - "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.6.tgz", + "integrity": "sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.7", - "@vitest/mocker": "3.2.7", - "@vitest/pretty-format": "^3.2.7", - "@vitest/runner": "3.2.7", - "@vitest/snapshot": "3.2.7", - "@vitest/spy": "3.2.7", - "@vitest/utils": "3.2.7", + "@vitest/expect": "3.2.6", + "@vitest/mocker": "3.2.6", + "@vitest/pretty-format": "^3.2.6", + "@vitest/runner": "3.2.6", + "@vitest/snapshot": "3.2.6", + "@vitest/spy": "3.2.6", + "@vitest/utils": "3.2.6", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", @@ -12448,8 +13299,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.7", - "@vitest/ui": "3.2.7", + "@vitest/browser": "3.2.6", + "@vitest/ui": "3.2.6", "happy-dom": "*", "jsdom": "*" }, @@ -12478,13 +13329,13 @@ } }, "node_modules/vitest/node_modules/@vitest/mocker": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", - "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.6.tgz", + "integrity": "sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.7", + "@vitest/spy": "3.2.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -12593,14 +13444,14 @@ } }, "node_modules/wait-on": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.1.0.tgz", - "integrity": "sha512-PymrLXHLBM1Ju/Xspb2ADUhbPSMvbnuNvy/mN2hWtpbJ3da0h3Ky1LqwKPG5QSVR57liyO0iUpfipYl/s5qNvA==", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.10.tgz", + "integrity": "sha512-rCoJEhvMr0X6alHmwc9abbrA5ZrLZFKpFQVKPNFwl2h7DapXOGdmimIHDtLOWhT4PjhZhxFEtZoQgEXbkDWdZw==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.18.1", - "joi": "^18.2.3", + "axios": "^1.16.0", + "joi": "^18.2.1", "lodash": "^4.18.1", "minimist": "^1.2.8", "rxjs": "^7.8.2" @@ -12761,6 +13612,30 @@ "node": ">=10" } }, + "node_modules/werift-rtp/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, "node_modules/werift-rtp/node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -12790,6 +13665,30 @@ "node": ">=10" } }, + "node_modules/werift/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, "node_modules/werift/node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -12916,34 +13815,6 @@ "node": ">= 12.0.0" } }, - "node_modules/winston-transport/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==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/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==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -13006,9 +13877,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", - "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -13036,30 +13907,6 @@ "node": ">=18" } }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", @@ -13158,6 +14005,27 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "packages/rein-input": { + "name": "@aossie/rein-input", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "koffi": "^2.16.2" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "esbuild": "^0.28.2", + "typescript": "^7.0.2" + }, + "peerDependencies": { + "koffi": "^2.16.2" + }, + "peerDependenciesMeta": { + "koffi": { + "optional": false + } + } } } } diff --git a/package.json b/package.json index 60e65324..615023e0 100644 --- a/package.json +++ b/package.json @@ -6,21 +6,27 @@ "author": "AOSSIE", "private": true, "type": "module", + "workspaces": [ + "packages/*" + ], "scripts": { "predev": "biome check . --write", "dev": "vite dev --host", "start": "vite preview --host --open", "build": "vite build", + "build:package": "npm --workspace @aossie/rein-input run build", "electron": "npx electron .", "electron-dev": "concurrently \"vite\" \"wait-on http://localhost:3000 && VITE_DEV_SERVER_URL=http://localhost:3000 electron .\"", "dist": "electron-builder", "preview": "vite preview", "test": "vitest run", + "typecheck": "tsc --noEmit", "check": "biome check .", "check:fix": "biome check . --write", "postinstall": "node scripts/install-gstreamer.js" }, "dependencies": { + "@aossie/rein-input": "*", "@tanstack/react-router": "^1.169.2", "@tanstack/react-router-ssr-query": "^1.166.12", "@tanstack/react-start": "^1.167.61", @@ -66,7 +72,7 @@ "postcss": "^8.5.6", "tailwindcss": "^4.2.4", "tsx": "^4.19.0", - "typescript": "^5.7.2", + "typescript": "^7.0.2", "vite": "^8.0.10", "vite-tsconfig-paths": "^6.0.2", "vitest": "^3.0.5", diff --git a/packages/rein-input/LICENSE b/packages/rein-input/LICENSE new file mode 100644 index 00000000..3b9e3c31 --- /dev/null +++ b/packages/rein-input/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative + Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 AOSSIE + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/rein-input/README.md b/packages/rein-input/README.md new file mode 100644 index 00000000..6c1ab365 --- /dev/null +++ b/packages/rein-input/README.md @@ -0,0 +1,209 @@ +# @aossie/rein-input + +[![npm version](https://img.shields.io/npm/v/@aossie/rein-input.svg)](https://www.npmjs.com/package/@aossie/rein-input) +[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) +[![Node Version](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org) + +Cross-platform native input injection library for Node.js and Electron using [Koffi](https://koffi.dev/) FFI. + +Part of the [Rein](https://github.com/AOSSIE-Org/Rein) remote input and screen mirror ecosystem under [AOSSIE](https://aossie.org). + +--- + +## ✨ Features + +- ⚡ **Zero-addon Compilation**: Uses Koffi FFI to bind directly to native OS C APIs without requiring `node-gyp` or native C++ compilation toolchains. +- 🚀 **High Performance & Low Latency**: Sub-millisecond event dispatch suitable for real-time remote control, WebRTC streaming, trackpad emulation, and cloud gaming interfaces. +- 🖥️ **True Cross-Platform Support**: + - **Linux**: Virtual mouse, keyboard, and multitouch devices via the kernel **uinput** subsystem (MT slot protocol B). + - **macOS**: Native mouse, scrolling, keyboard, and gesture simulation via **CoreGraphics** APIs with Unicode character fallback. + - **Windows**: High-precision mouse and keyboard injection via Win32 **SendInput** and multitouch via the **Synthetic Pointer API**. +- 🖱️ **Full Input Capabilities**: + - Mouse movement (relative delta, absolute tracking, acceleration curves, sensitivity tuning). + - Mouse buttons (left, right, middle, drag & hold states). + - High-resolution vertical and horizontal mouse wheel scrolling with inversion support. + - Key presses, releases, and key combinations (`Ctrl+C`, `Cmd+V`, `Alt+Tab`, etc.). + - Full Unicode text injection for arbitrary character sets and emoji. + - Multitouch contacts tracking, pinch-to-zoom, and multi-finger pan gestures. +- 📦 **Dual Module Distribution**: First-class support for both ECMAScript Modules (ESM) and CommonJS (CJS) with bundled TypeScript declarations (`.d.ts`). + +--- + +## 📦 Installation + +Install `@aossie/rein-input` along with its peer dependency `koffi`: + +```bash +npm install @aossie/rein-input koffi +``` + +or with yarn / pnpm: + +```bash +yarn add @aossie/rein-input koffi +# or +pnpm add @aossie/rein-input koffi +``` + +--- + +## 🚀 Quick Start + +### Universal Factory (`createInputInjector`) + +The `createInputInjector` function automatically detects the host operating system (`win32`, `linux`, `darwin`) and instantiates the appropriate native driver: + +```typescript +import { createInputInjector } from "@aossie/rein-input" + +// Initialize with custom screen dimensions and sensitivity +const injector = createInputInjector({ + sensitivity: 1.2, + acceleration: true, + invertScroll: false, + screenWidth: 1920, + screenHeight: 1080, +}) + +// 1. Mouse movement (relative coordinates) +injector.injectMouseMove(25, -10) + +// 2. Mouse click +injector.injectMouseButton("left", true) // Press down +injector.injectMouseButton("left", false) // Release + +// 3. Mouse wheel scroll (horizontal dx, vertical dy) +injector.injectMouseWheel(0, 5) + +// 4. Keyboard key press +injector.injectKey("enter") + +// 5. Key combinations +injector.injectCombo(["control", "c"]) // or ["meta", "c"] on macOS + +// 6. Direct text injection +injector.injectText("Hello from Rein!") + +// 7. Cleanup on exit +injector.destroy() +``` + +--- + +## 📱 Multitouch & Gestures + +Inject multi-contact touch events for trackpads and touchscreen devices: + +```typescript +import { createInputInjector } from "@aossie/rein-input" + +const injector = createInputInjector() + +// Multi-finger touch contact frame +injector.injectTouch([ + { id: 0, x: 500, y: 400, state: "down" }, + { id: 1, x: 550, y: 400, state: "down" }, +]) + +// Move contacts (pan / scroll / pinch) +injector.injectTouch([ + { id: 0, x: 510, y: 410, state: "move" }, + { id: 1, x: 570, y: 420, state: "move" }, +]) + +// Lift contacts +injector.injectTouch([ + { id: 0, x: 510, y: 410, state: "up" }, + { id: 1, x: 570, y: 420, state: "up" }, +]) +``` + +--- + +## 🛠️ Direct Platform Classes + +You can also directly instantiate platform-specific injector classes if required: + +```typescript +import { + WindowsInputInjector, + LinuxInputInjector, + MacInputInjector, +} from "@aossie/rein-input" + +// On Windows: +const winInjector = new WindowsInputInjector({ sensitivity: 1.0 }) + +// On Linux: +const linuxInjector = new LinuxInputInjector({ screenWidth: 1920, screenHeight: 1080 }) + +// On macOS: +const macInjector = new MacInputInjector() +``` + +--- + +## 🎛️ API Reference + +### `createInputInjector(options?)` + +Creates and initializes a cross-platform input injector. + +#### Options (`CreateInjectorOptions` or `Partial`): +- `sensitivity` (`number`): Cursor speed multiplier (default: `1.0`). +- `invertScroll` (`boolean`): Inverts vertical and horizontal scroll directions (default: `false`). +- `acceleration` (`boolean`): Enables non-linear motion acceleration curve (default: `true`). +- `screenWidth` (`number`): Target desktop display width in pixels (default: `1920`). +- `screenHeight` (`number`): Target desktop display height in pixels (default: `1080`). +- `platform` (`NodeJS.Platform`): Optional override for OS detection (`"win32" | "linux" | "darwin"`). +- `onError` (`(type: string, msg: string) => void`): Callback invoked on initialization or runtime errors. + +### `PlatformInjector` Interface + +| Method | Description | +|---|---| +| `injectMouseMove(dx: number, dy: number)` | Injects relative cursor movement | +| `injectMouseButton(button: "left" \| "right" \| "middle", isDown: boolean)` | Injects mouse button press or release | +| `injectMouseWheel(dx: number, dy: number)` | Injects horizontal (`dx`) and vertical (`dy`) wheel scroll | +| `injectKey(key: string, pos?: string)` | Injects single key event (`"HOLD"`, `"RELEASE"`, or press+release) | +| `injectCombo(keys: string[])` | Injects atomic key combination (`["control", "alt", "delete"]`) | +| `injectText(text: string)` | Injects string of characters (Unicode supported) | +| `injectTouch(contacts: TouchContact[])` | Injects multi-touch contacts frame | +| `updateConfig(config: Partial)` | Updates runtime sensitivity, scroll inversion, and screen bounds | +| `destroy()` | Releases held buttons, touches, and native driver handles | + +### Utilities & Keymaps + +- `applyMotion(dx, dy, config)`: Computes accelerated coordinate deltas based on velocity threshold and non-linear power curve. +- `resolveChar(ch, keyMap)`: Translates a character into its platform virtual key code and shift state. +- `VK_MAP`: Virtual key codes for Windows SendInput. +- `LINUX_KEY_MAP`: Linux input event codes (`linux/input-event-codes.h`). +- `MAC_KEY_MAP`: macOS virtual key codes (`HIToolbox/Events.h`). +- `SHIFTED_CHARS`: Mapping of US keyboard shifted symbols (`!` -> `1`, `@` -> `2`, etc.). + +--- + +## 🔒 Platform Permissions & Setup + +### 🐧 Linux +Linux requires access to the `/dev/uinput` kernel device. Create a udev rule to allow non-root access: + +```bash +echo 'KERNEL=="uinput", GROUP="input", MODE="0660"' | sudo tee /etc/udev/rules.d/99-rein.rules +sudo usermod -a -G input $USER +# Log out and log back in for group changes to take effect +``` + +### 🍎 macOS +macOS requires **Accessibility** permissions to inject system-wide input events via CoreGraphics: +1. Open **System Settings** > **Privacy & Security** > **Accessibility**. +2. Enable your terminal or application (e.g. `Terminal`, `iTerm2`, `Electron`, or `Node`). + +### 🪟 Windows +Windows requires no special kernel drivers. Multitouch features use the Windows Synthetic Pointer API available in Windows 8 and later. + +--- + +## 📄 License + +Apache-2.0 © [AOSSIE](https://aossie.org) diff --git a/packages/rein-input/build.js b/packages/rein-input/build.js new file mode 100644 index 00000000..d8c30197 --- /dev/null +++ b/packages/rein-input/build.js @@ -0,0 +1,44 @@ +import fs from "node:fs" +import path from "node:path" +import { fileURLToPath } from "node:url" +import { execSync } from "node:child_process" +import * as esbuild from "esbuild" + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const distDir = path.resolve(__dirname, "dist") + +if (fs.existsSync(distDir)) { + fs.rmSync(distDir, { recursive: true, force: true }) +} +fs.mkdirSync(distDir, { recursive: true }) + +const commonOptions = { + entryPoints: [path.resolve(__dirname, "src/index.ts")], + bundle: true, + platform: "node", + target: "node18", + external: ["koffi"], + sourcemap: true, +} + +console.log("[@aossie/rein-input] Building ESM bundle...") +await esbuild.build({ + ...commonOptions, + format: "esm", + outfile: path.resolve(distDir, "index.js"), +}) + +console.log("[@aossie/rein-input] Building CJS bundle...") +await esbuild.build({ + ...commonOptions, + format: "cjs", + outfile: path.resolve(distDir, "index.cjs"), +}) + +console.log("[@aossie/rein-input] Generating TypeScript declaration files...") +execSync("npx tsc -p tsconfig.json", { + cwd: __dirname, + stdio: "inherit", +}) + +console.log("[@aossie/rein-input] Build completed successfully!") diff --git a/packages/rein-input/package.json b/packages/rein-input/package.json new file mode 100644 index 00000000..d3803f86 --- /dev/null +++ b/packages/rein-input/package.json @@ -0,0 +1,71 @@ +{ + "name": "@aossie/rein-input", + "version": "0.1.0", + "description": "Cross-platform native input injection library using Koffi FFI for Node.js and Electron", + "author": "AOSSIE", + "license": "Apache-2.0", + "type": "module", + "keywords": [ + "input", + "mouse", + "keyboard", + "touch", + "multitouch", + "gesture", + "injection", + "cross-platform", + "koffi", + "ffi", + "uinput", + "coregraphics", + "sendinput", + "webrtc", + "remote-desktop" + ], + "homepage": "https://github.com/AOSSIE-Org/Rein#readme", + "bugs": { + "url": "https://github.com/AOSSIE-Org/Rein/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/AOSSIE-Org/Rein.git", + "directory": "packages/rein-input" + }, + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "node build.js", + "typecheck": "tsc --noEmit", + "test": "vitest run" + }, + "peerDependencies": { + "koffi": "^2.16.2" + }, + "peerDependenciesMeta": { + "koffi": { + "optional": false + } + }, + "devDependencies": { + "@types/node": "^22.10.2", + "esbuild": "^0.28.2", + "koffi": "^2.16.2", + "typescript": "^7.0.2" + } +} diff --git a/packages/rein-input/src/constants.ts b/packages/rein-input/src/constants.ts new file mode 100644 index 00000000..7ac0f9ba --- /dev/null +++ b/packages/rein-input/src/constants.ts @@ -0,0 +1,28 @@ +import type { InputConfig } from "./types" + +export const INPUT_MOUSE = 0 +export const INPUT_KEYBOARD = 1 + +export const DEFAULT_SCREEN_WIDTH = 1920 +export const DEFAULT_SCREEN_HEIGHT = 1080 + +export const WHEEL_SCALE = 3 +export const PINCH_PAN_THRESHOLD = 2 + +export const DEFAULT_CONFIG: InputConfig = { + sensitivity: 1.0, + invertScroll: false, + acceleration: true, + screenWidth: DEFAULT_SCREEN_WIDTH, + screenHeight: DEFAULT_SCREEN_HEIGHT, +} + +export const MAX_TEXT_LENGTH = 10000 +export const MAX_COORD = 2000 +export const MAX_COMBO_KEYS = 10 +export const MAX_KEY_LENGTH = 50 + +// Motion acceleration tuning parameters +export const ACCEL_THRESHOLD = 1 +export const ACCEL_FACTOR = 0.8 +export const ACCEL_EXPONENT = 1.2 diff --git a/packages/rein-input/src/factory.ts b/packages/rein-input/src/factory.ts new file mode 100644 index 00000000..596ed190 --- /dev/null +++ b/packages/rein-input/src/factory.ts @@ -0,0 +1,115 @@ +import os from "node:os" +import type { + InputConfig, + PlatformInjector, + TouchContact, + MouseButton, +} from "./types" +import { DEFAULT_CONFIG } from "./constants" +import { WindowsInputInjector } from "./windows" +import { LinuxInputInjector } from "./linux" +import { MacInputInjector } from "./mac" + +/** + * Safe fallback injector for unsupported platforms or headless testing environments. + */ +export class StubInputInjector implements PlatformInjector { + private config: InputConfig + private onWarn?: (method: string) => void + + constructor( + config: Partial = {}, + onWarn?: (method: string) => void, + ) { + this.config = { ...DEFAULT_CONFIG, ...config } + this.onWarn = onWarn + } + + updateConfig(config: Partial): void { + this.config = { ...this.config, ...config } + } + + injectMouseMove(_dx: number, _dy: number): void { + this.warn("injectMouseMove") + } + + injectMouseButton(_button: MouseButton, _isDown: boolean): void { + this.warn("injectMouseButton") + } + + injectMouseWheel(_dx: number, _dy: number): void { + this.warn("injectMouseWheel") + } + + injectKey(_key: string, _pos?: string): void { + this.warn("injectKey") + } + + injectCombo(_keys: string[]): void { + this.warn("injectCombo") + } + + injectText(_text: string): void { + this.warn("injectText") + } + + injectTouch(_contacts: TouchContact[]): void { + this.warn("injectTouch") + } + + destroy(): void {} + + private warn(method: string): void { + if (this.onWarn) { + this.onWarn(method) + } + } +} + +export interface CreateInjectorOptions { + config?: Partial + platform?: NodeJS.Platform | string + onError?: (errorType: string, message: string) => void +} + +/** + * Universal factory to create the appropriate PlatformInjector for the current OS. + * + * @param options Configuration options, custom platform override, and error callback. + * @returns An initialized PlatformInjector or StubInputInjector. + */ +export function createInputInjector( + options: Partial | CreateInjectorOptions = {}, +): PlatformInjector { + const opts: CreateInjectorOptions = + "sensitivity" in options || + "screenWidth" in options || + "invertScroll" in options + ? { config: options as Partial } + : (options as CreateInjectorOptions) + + const platform = opts.platform ?? os.platform() + const config = opts.config ?? {} + + try { + if (platform === "win32") { + return new WindowsInputInjector(config) + } + if (platform === "linux") { + return new LinuxInputInjector(config) + } + if (platform === "darwin") { + return new MacInputInjector(config) + } + + const msg = `Unsupported platform: ${platform}` + console.warn(`[createInputInjector] ${msg}`) + opts.onError?.("unsupported-platform", msg) + return new StubInputInjector(config) + } catch (err) { + const errMsg = `Input injector initialization failed: ${err instanceof Error ? err.message : String(err)}` + console.warn(`[createInputInjector] ${errMsg}`) + opts.onError?.("input-injector-init-failed", errMsg) + return new StubInputInjector(config) + } +} diff --git a/packages/rein-input/src/index.ts b/packages/rein-input/src/index.ts new file mode 100644 index 00000000..e33d0b1e --- /dev/null +++ b/packages/rein-input/src/index.ts @@ -0,0 +1,15 @@ +/** + * @aossie/rein-input + * Cross-platform native input injection library using Koffi FFI. + */ + +export * from "./types" +export * from "./constants" +export * from "./keyMap" +export * from "./utils" +export * from "./factory" + +// Platform-specific injectors & components +export { WindowsInputInjector, WindowsKeyboard, WindowsTouch } from "./windows" +export { LinuxInputInjector, LinuxKeyboard, LinuxTouch } from "./linux" +export { MacInputInjector, MacKeyboard, MacTouch } from "./mac" diff --git a/packages/rein-input/src/keyMap.ts b/packages/rein-input/src/keyMap.ts new file mode 100644 index 00000000..e468fd57 --- /dev/null +++ b/packages/rein-input/src/keyMap.ts @@ -0,0 +1,377 @@ +export const VK_MAP: Record = { + backspace: 0x08, + tab: 0x09, + enter: 0x0d, + shift: 0x10, + control: 0x11, + ctrl: 0x11, + alt: 0x12, + pause: 0x13, + capslock: 0x14, + escape: 0x1b, + esc: 0x1b, + space: 0x20, + pageup: 0x21, + pagedown: 0x22, + end: 0x23, + home: 0x24, + arrowleft: 0x25, + arrowup: 0x26, + arrowright: 0x27, + arrowdown: 0x28, + printscreen: 0x2c, + insert: 0x2d, + delete: 0x2e, + del: 0x2e, + "0": 0x30, + "1": 0x31, + "2": 0x32, + "3": 0x33, + "4": 0x34, + "5": 0x35, + "6": 0x36, + "7": 0x37, + "8": 0x38, + "9": 0x39, + a: 0x41, + b: 0x42, + c: 0x43, + d: 0x44, + e: 0x45, + f: 0x46, + g: 0x47, + h: 0x48, + i: 0x49, + j: 0x4a, + k: 0x4b, + l: 0x4c, + m: 0x4d, + n: 0x4e, + o: 0x4f, + p: 0x50, + q: 0x51, + r: 0x52, + s: 0x53, + t: 0x54, + u: 0x55, + v: 0x56, + w: 0x57, + x: 0x58, + y: 0x59, + z: 0x5a, + meta: 0x5b, + win: 0x5b, + f1: 0x70, + f2: 0x71, + f3: 0x72, + f4: 0x73, + f5: 0x74, + f6: 0x75, + f7: 0x76, + f8: 0x77, + f9: 0x78, + f10: 0x79, + f11: 0x7a, + f12: 0x7b, + numlock: 0x90, + scrolllock: 0x91, + audiomute: 0xad, + volumemute: 0xad, + audiovoldown: 0xae, + volumedown: 0xae, + audiovolup: 0xaf, + volumeup: 0xaf, + audionext: 0xb0, + audioprev: 0xb1, + audiostop: 0xb2, + audioplay: 0xb3, + audiopause: 0xb3, +} + +export const LINUX_KEY_MAP: Record = { + shift: 0x2a, // KEY_LEFTSHIFT + leftshift: 0x2a, + rightshift: 0x36, // KEY_RIGHTSHIFT + control: 0x1d, // KEY_LEFTCTRL + ctrl: 0x1d, + leftcontrol: 0x1d, + rightcontrol: 0x61, // KEY_RIGHTCTRL + alt: 0x38, // KEY_LEFTALT + leftalt: 0x38, + rightalt: 0x64, // KEY_RIGHTALT (AltGr) + meta: 0x7d, // KEY_LEFTMETA + win: 0x7d, + leftmeta: 0x7d, + rightmeta: 0x7e, // KEY_RIGHTMETA + + // ---- Function keys ---- + f1: 0x3b, + f2: 0x3c, + f3: 0x3d, + f4: 0x3e, + f5: 0x3f, + f6: 0x40, + f7: 0x41, + f8: 0x42, + f9: 0x43, + f10: 0x44, + f11: 0x57, + f12: 0x58, + + // ---- Navigation ---- + arrowup: 0x67, + arrowdown: 0x6c, + arrowleft: 0x69, + arrowright: 0x6a, + home: 0x66, + end: 0x6b, + pageup: 0x68, + pagedown: 0x6d, + insert: 0x6e, + delete: 0x6f, + del: 0x6f, + + // ---- Common keys ---- + backspace: 0x0e, + tab: 0x0f, + enter: 0x1c, + escape: 0x01, + esc: 0x01, + space: 0x39, + " ": 0x39, + capslock: 0x3a, + printscreen: 0x63, + scrolllock: 0x46, + pause: 0x77, + numlock: 0x45, + + // ---- Digits ---- + "0": 0x0b, + "1": 0x02, + "2": 0x03, + "3": 0x04, + "4": 0x05, + "5": 0x06, + "6": 0x07, + "7": 0x08, + "8": 0x09, + "9": 0x0a, + + // ---- Letters ---- + a: 0x1e, + b: 0x30, + c: 0x2e, + d: 0x20, + e: 0x12, + f: 0x21, + g: 0x22, + h: 0x23, + i: 0x17, + j: 0x24, + k: 0x25, + l: 0x26, + m: 0x32, + n: 0x31, + o: 0x18, + p: 0x19, + q: 0x10, + r: 0x13, + s: 0x1f, + t: 0x14, + u: 0x16, + v: 0x2f, + w: 0x11, + x: 0x2d, + y: 0x15, + z: 0x2c, + + // ---- Symbols---- + "-": 0x0c, + "=": 0x0d, + "[": 0x1a, + "]": 0x1b, + "\\": 0x2b, + ";": 0x27, + "'": 0x28, + "`": 0x29, + ",": 0x33, + ".": 0x34, + "/": 0x35, + + // ---- Media keys (linux/input-event-codes.h) ---- + audiomute: 0x71, // KEY_MUTE + volumemute: 0x71, + audiovoldown: 0x72, // KEY_VOLUMEDOWN + volumedown: 0x72, + audiovolup: 0x73, // KEY_VOLUMEUP + volumeup: 0x73, + audionext: 0xa3, // KEY_NEXTSONG + audioprev: 0xa5, // KEY_PREVIOUSSONG + audiostop: 0xa6, // KEY_STOPCD + audioplay: 0xa4, // KEY_PLAYPAUSE + audiopause: 0xa4, // KEY_PLAYPAUSE +} + +export const MAC_KEY_MAP: Record = { + // ── Modifiers ────────────────────────────────────────────────────────── + shift: 0x38, + leftshift: 0x38, + rightshift: 0x3c, + control: 0x3b, + ctrl: 0x3b, + leftcontrol: 0x3b, + rightcontrol: 0x3e, + alt: 0x3a, // Option + option: 0x3a, + leftalt: 0x3a, + rightalt: 0x3d, + meta: 0x37, // Command (mirrors Linux "meta"/"win") + win: 0x37, + command: 0x37, + cmd: 0x37, + leftmeta: 0x37, + rightmeta: 0x36, + leftcommand: 0x37, + rightcommand: 0x36, + fn: 0x3f, + capslock: 0x39, + + f1: 0x7a, + f2: 0x78, + f3: 0x63, + f4: 0x76, + f5: 0x60, + f6: 0x61, + f7: 0x62, + f8: 0x64, + f9: 0x65, + f10: 0x6d, + f11: 0x67, + f12: 0x6f, + f13: 0x69, + f14: 0x6b, + f15: 0x71, + f16: 0x6a, + f17: 0x40, + f18: 0x4f, + f19: 0x50, + f20: 0x5a, + + arrowup: 0x7e, + arrowdown: 0x7d, + arrowleft: 0x7b, + arrowright: 0x7c, + home: 0x73, + end: 0x77, + pageup: 0x74, + pagedown: 0x79, + insert: 0x72, + delete: 0x75, + forwarddelete: 0x75, + + backspace: 0x33, + tab: 0x30, + enter: 0x24, + return: 0x24, + escape: 0x35, + esc: 0x35, + space: 0x31, + " ": 0x31, + + "1": 0x12, + "2": 0x13, + "3": 0x14, + "4": 0x15, + "5": 0x17, + "6": 0x16, + "7": 0x1a, + "8": 0x1c, + "9": 0x19, + + a: 0x00, + b: 0x0b, + c: 0x08, + d: 0x02, + e: 0x0e, + f: 0x03, + g: 0x05, + h: 0x04, + i: 0x22, + j: 0x26, + k: 0x28, + l: 0x25, + m: 0x2e, + n: 0x2d, + o: 0x1f, + p: 0x23, + q: 0x0c, + r: 0x0f, + s: 0x01, + t: 0x11, + u: 0x20, + v: 0x09, + w: 0x0d, + x: 0x07, + y: 0x10, + z: 0x06, + "-": 0x1b, + "=": 0x18, + "[": 0x21, + "]": 0x1e, + "\\": 0x2a, + ";": 0x29, + "'": 0x27, + "`": 0x32, + ",": 0x2b, + ".": 0x2f, + "/": 0x2c, + volumeup: 0x48, + volumedown: 0x49, + mute: 0x4a, + audiomute: 0x4a, + volumemute: 0x4a, + audiovoldown: 0x49, + audiovolup: 0x48, + numpad0: 0x52, + numpad1: 0x53, + numpad2: 0x54, + numpad3: 0x55, + numpad4: 0x56, + numpad5: 0x57, + numpad6: 0x58, + numpad7: 0x59, + numpad8: 0x5b, + numpad9: 0x5c, + numpaddecimal: 0x41, + numpadmultiply: 0x43, + numpadadd: 0x45, + numpadclear: 0x47, + numpaddivide: 0x4b, + numpadenter: 0x4c, + numpadsubtract: 0x4e, + numpadequals: 0x51, +} + +export const SHIFTED_CHARS: Record = { + "!": "1", + "@": "2", + "#": "3", + $: "4", + "%": "5", + "^": "6", + "&": "7", + "*": "8", + "(": "9", + ")": "0", + _: "-", + "+": "=", + "{": "[", + "}": "]", + "|": "\\", + ":": ";", + '"': "'", + "<": ",", + ">": ".", + "?": "/", + "~": "`", +} diff --git a/packages/rein-input/src/linux/constants.ts b/packages/rein-input/src/linux/constants.ts new file mode 100644 index 00000000..3d3d7ffd --- /dev/null +++ b/packages/rein-input/src/linux/constants.ts @@ -0,0 +1,62 @@ +// ---- Event types ---- +export const EV_SYN = 0x00 +export const EV_KEY = 0x01 +export const EV_REL = 0x02 +export const EV_ABS = 0x03 + +// ---- Sync events ---- +export const SYN_REPORT = 0x00 +export const SYN_MT_REPORT = 0x02 + +// ---- Relative axes (mouse movement / scroll) ---- +export const REL_X = 0x00 +export const REL_Y = 0x01 +export const REL_WHEEL = 0x08 +export const REL_HWHEEL = 0x06 + +// ---- Absolute axes (multitouch) ---- +export const ABS_X = 0x00 +export const ABS_Y = 0x01 +export const ABS_MT_SLOT = 0x2f +export const ABS_MT_TRACKING_ID = 0x39 +export const ABS_MT_POSITION_X = 0x35 +export const ABS_MT_POSITION_Y = 0x36 +export const ABS_MT_TOUCH_MAJOR = 0x30 +export const ABS_MT_PRESSURE = 0x3a + +// ---- Mouse buttons ---- +export const BTN_LEFT = 0x110 +export const BTN_RIGHT = 0x111 +export const BTN_MIDDLE = 0x112 + +// ---- Touchpad / touch tool buttons ---- +export const BTN_TOUCH = 0x14a +export const BTN_TOOL_FINGER = 0x145 +export const BTN_TOOL_DOUBLETAP = 0x14d +export const BTN_TOOL_TRIPLETAP = 0x14e +export const BTN_TOOL_QUADTAP = 0x14f + +// ---- Key press states ---- +export const KEY_PRESS = 1 +export const KEY_RELEASE = 0 +export const KEY_REPEAT = 2 + +// ---- uinput ioctl codes (from linux/uinput.h) ---- +// Computed as: _IOW('U', n, int) = 0x40045500 | n (sizeof int = 4) +export const UI_SET_EVBIT = 0x40045564 // _IOW('U', 100, int) +export const UI_SET_KEYBIT = 0x40045565 // _IOW('U', 101, int) +export const UI_SET_RELBIT = 0x40045566 // _IOW('U', 102, int) +export const UI_SET_ABSBIT = 0x40045567 // _IOW('U', 103, int) +// _IOW('U', 3, uinput_setup) — sizeof(uinput_setup) = 92 (0x5c) +export const UI_DEV_SETUP = 0x405c5503 +// _IOW('U', 4, uinput_abs_setup) — sizeof(uinput_abs_setup) = 24 (0x18) +export const UI_ABS_SETUP = 0x40186504 +// _IO('U', 1) / _IO('U', 2) +export const UI_DEV_CREATE = 0x5501 +export const UI_DEV_DESTROY = 0x5502 + +// ---- Misc ---- +export const MAX_CONTACTS = 10 +export const MT_TRACKING_ID_RELEASED = -1 +export const UINPUT_PATH = "/dev/uinput" +export const UINPUT_MAX_NAME_SIZE = 80 diff --git a/packages/rein-input/src/linux/index.ts b/packages/rein-input/src/linux/index.ts new file mode 100644 index 00000000..9eb0f2d5 --- /dev/null +++ b/packages/rein-input/src/linux/index.ts @@ -0,0 +1,329 @@ +import { + openUinput, + closeUinput, + writeEvent, + ioctlInt, + ioctlStruct, + ioctlNull, +} from "./structs" +import { + EV_SYN, + EV_KEY, + EV_REL, + EV_ABS, + SYN_REPORT, + REL_X, + REL_Y, + REL_WHEEL, + REL_HWHEEL, + BTN_LEFT, + BTN_RIGHT, + BTN_MIDDLE, + BTN_TOUCH, + BTN_TOOL_FINGER, + BTN_TOOL_DOUBLETAP, + BTN_TOOL_TRIPLETAP, + BTN_TOOL_QUADTAP, + ABS_MT_SLOT, + ABS_MT_TRACKING_ID, + ABS_MT_POSITION_X, + ABS_MT_POSITION_Y, + ABS_MT_TOUCH_MAJOR, + ABS_MT_PRESSURE, + ABS_X, + ABS_Y, + UI_SET_EVBIT, + UI_SET_KEYBIT, + UI_SET_RELBIT, + UI_SET_ABSBIT, + UI_DEV_SETUP, + UI_ABS_SETUP, + UI_DEV_CREATE, + UI_DEV_DESTROY, + UINPUT_PATH, + MAX_CONTACTS, + KEY_PRESS, + KEY_RELEASE, +} from "./constants" +import { WHEEL_SCALE, DEFAULT_CONFIG } from "../constants" +import { LinuxKeyboard } from "./keyboard" +import { LinuxTouch } from "./touch" +import { LINUX_KEY_MAP } from "../keyMap" +import type { + InputConfig, + PlatformInjector, + TouchContact, + MouseButton, +} from "../types" + +const BUS_USB = 0x03 + +class UinputDevice { + fd = -1 + private name: string + + constructor(name: string) { + this.name = name + } + + open(): boolean { + try { + const fd = openUinput(UINPUT_PATH) + this.fd = fd + return true + } catch (err) { + console.error(`[${this.name}] Failed to open ${UINPUT_PATH}:`, err) + console.error( + `[${this.name}] Ensure /dev/uinput exists and the process has write permission.`, + ) + return false + } + } + + create(deviceName: string): boolean { + const nameBuf = new Array(80).fill(0) + for (let i = 0; i < Math.min(deviceName.length, 79); i++) { + nameBuf[i] = deviceName.charCodeAt(i) + } + + const setup = { + bustype: BUS_USB, + vendor: 0x1234, + product: 0x5678, + version: 1, + name: nameBuf, + ff_effects_max: 0, + } + + const ret = ioctlStruct(this.fd, UI_DEV_SETUP, "uinput_setup *", setup) + if (ret < 0) { + console.error(`[${this.name}] UI_DEV_SETUP failed (ret=${ret})`) + return false + } + + const createRet = ioctlNull(this.fd, UI_DEV_CREATE) + if (createRet < 0) { + console.error(`[${this.name}] UI_DEV_CREATE failed (ret=${createRet})`) + return false + } + return true + } + + setEvbit(bit: number): void { + ioctlInt(this.fd, UI_SET_EVBIT, bit) + } + setKeybit(bit: number): void { + ioctlInt(this.fd, UI_SET_KEYBIT, bit) + } + setRelbit(bit: number): void { + ioctlInt(this.fd, UI_SET_RELBIT, bit) + } + setAbsbit(bit: number): void { + ioctlInt(this.fd, UI_SET_ABSBIT, bit) + } + + setupAbs(code: number, min: number, max: number, fuzz = 0, flat = 0): void { + const setup = { + code, + __pad: 0, + __pad2: 0, + absinfo: { + value: 0, + minimum: min, + maximum: max, + fuzz, + flat, + resolution: 0, + }, + } + ioctlStruct(this.fd, UI_ABS_SETUP, "uinput_abs_setup *", setup) + } + + destroy(): void { + if (this.fd >= 0) { + ioctlNull(this.fd, UI_DEV_DESTROY) + closeUinput(this.fd) + this.fd = -1 + } + } +} + +export class LinuxInputInjector implements PlatformInjector { + private config: InputConfig + private mouseDev = new UinputDevice("Mouse") + private kbDev = new UinputDevice("Keyboard") + private touchDev = new UinputDevice("Touch") + private keyboard: LinuxKeyboard | null = null + private touch: LinuxTouch | null = null + private initialized = false + + constructor(config: Partial = {}) { + if (process.platform !== "linux") { + throw new Error("LinuxInputInjector can only be used on Linux") + } + this.config = { ...DEFAULT_CONFIG, ...config } + this.initialize() + if (!this.initialized) { + throw new Error( + "Linux virtual input devices failed to initialize (check /dev/uinput permissions)", + ) + } + } + + updateConfig(config: Partial): void { + this.config = { ...this.config, ...config } + } + + injectMouseMove(dx: number, dy: number): void { + if (!this.initialized || (dx === 0 && dy === 0)) return + const fd = this.mouseDev.fd + + writeEvent(fd, EV_REL, REL_X, Math.round(dx)) + writeEvent(fd, EV_REL, REL_Y, Math.round(dy)) + writeEvent(fd, EV_SYN, SYN_REPORT, 0) + } + + injectMouseButton(button: MouseButton, isDown: boolean): void { + if (!this.initialized) return + + const codeMap: Record = { + left: BTN_LEFT, + right: BTN_RIGHT, + middle: BTN_MIDDLE, + } + const code = codeMap[button] + const fd = this.mouseDev.fd + + writeEvent(fd, EV_KEY, code, isDown ? KEY_PRESS : KEY_RELEASE) + writeEvent(fd, EV_SYN, SYN_REPORT, 0) + } + + injectMouseWheel(dx: number, dy: number): void { + if (!this.initialized) return + + const fd = this.mouseDev.fd + const invert = this.config.invertScroll ? -1 : 1 + + if (dy !== 0) { + const amount = Math.round(dy * invert * WHEEL_SCALE) + writeEvent(fd, EV_REL, REL_WHEEL, amount) + } + if (dx !== 0) { + const amount = Math.round(dx * invert * WHEEL_SCALE) + writeEvent(fd, EV_REL, REL_HWHEEL, amount) + } + writeEvent(fd, EV_SYN, SYN_REPORT, 0) + } + + injectKey(key: string, pos?: string): void { + this.keyboard?.injectKey(key, pos ?? "") + } + + injectCombo(keys: string[]): void { + this.keyboard?.injectCombo(keys) + } + + injectText(text: string): void { + this.keyboard?.injectText(text) + } + + injectTouch(contacts: TouchContact[]): void { + this.touch?.injectTouch(contacts) + } + + destroy(): void { + this.touch?.releaseAll() + this.mouseDev.destroy() + this.kbDev.destroy() + this.touchDev.destroy() + this.initialized = false + } + + private initialize(): void { + const mouseOk = this.setupMouseDevice() + const kbOk = this.setupKeyboardDevice() + const touchOk = this.setupTouchDevice() + + if (!mouseOk || !kbOk || !touchOk) { + const msg = + "One or more virtual uinput devices failed to initialize (check /dev/uinput permissions)" + console.error(`[LinuxInputInjector] ${msg}`) + this.destroy() + this.initialized = false + throw new Error(msg) + } + + this.keyboard = new LinuxKeyboard(this.kbDev.fd) + this.touch = new LinuxTouch(this.touchDev.fd) + this.initialized = true + console.log("[LinuxInputInjector] All virtual devices initialized") + } + + private setupMouseDevice(): boolean { + if (!this.mouseDev.open()) return false + this.mouseDev.setEvbit(EV_KEY) + this.mouseDev.setEvbit(EV_REL) + this.mouseDev.setEvbit(EV_SYN) + + this.mouseDev.setKeybit(BTN_LEFT) + this.mouseDev.setKeybit(BTN_RIGHT) + this.mouseDev.setKeybit(BTN_MIDDLE) + + this.mouseDev.setRelbit(REL_X) + this.mouseDev.setRelbit(REL_Y) + this.mouseDev.setRelbit(REL_WHEEL) + this.mouseDev.setRelbit(REL_HWHEEL) + + return this.mouseDev.create("Virtual Mouse") + } + + private setupKeyboardDevice(): boolean { + if (!this.kbDev.open()) return false + + this.kbDev.setEvbit(EV_KEY) + this.kbDev.setEvbit(EV_SYN) + + for (const code of Object.values(LINUX_KEY_MAP)) { + this.kbDev.setKeybit(code) + } + + return this.kbDev.create("Virtual Keyboard") + } + + private setupTouchDevice(): boolean { + if (!this.touchDev.open()) return false + + this.touchDev.setEvbit(EV_ABS) + this.touchDev.setEvbit(EV_KEY) + this.touchDev.setEvbit(EV_SYN) + + this.touchDev.setKeybit(BTN_TOUCH) + this.touchDev.setKeybit(BTN_TOOL_FINGER) + this.touchDev.setKeybit(BTN_TOOL_DOUBLETAP) + this.touchDev.setKeybit(BTN_TOOL_TRIPLETAP) + this.touchDev.setKeybit(BTN_TOOL_QUADTAP) + + this.touchDev.setAbsbit(ABS_MT_SLOT) + this.touchDev.setAbsbit(ABS_MT_TRACKING_ID) + this.touchDev.setAbsbit(ABS_MT_POSITION_X) + this.touchDev.setAbsbit(ABS_MT_POSITION_Y) + this.touchDev.setAbsbit(ABS_MT_TOUCH_MAJOR) + this.touchDev.setAbsbit(ABS_MT_PRESSURE) + this.touchDev.setAbsbit(ABS_X) + this.touchDev.setAbsbit(ABS_Y) + + this.touchDev.setupAbs(ABS_MT_SLOT, 0, MAX_CONTACTS - 1) + this.touchDev.setupAbs(ABS_MT_TRACKING_ID, -1, 0x7fffffff) + this.touchDev.setupAbs(ABS_MT_POSITION_X, 0, this.config.screenWidth) + this.touchDev.setupAbs(ABS_MT_POSITION_Y, 0, this.config.screenHeight) + this.touchDev.setupAbs(ABS_MT_TOUCH_MAJOR, 0, 255) + this.touchDev.setupAbs(ABS_MT_PRESSURE, 0, 255) + this.touchDev.setupAbs(ABS_X, 0, this.config.screenWidth) + this.touchDev.setupAbs(ABS_Y, 0, this.config.screenHeight) + + return this.touchDev.create("Virtual Touchpad") + } +} + +export { LinuxKeyboard } from "./keyboard" +export { LinuxTouch } from "./touch" diff --git a/packages/rein-input/src/linux/keyboard.ts b/packages/rein-input/src/linux/keyboard.ts new file mode 100644 index 00000000..b038957d --- /dev/null +++ b/packages/rein-input/src/linux/keyboard.ts @@ -0,0 +1,89 @@ +import { writeEvent } from "./structs" +import { EV_SYN, EV_KEY, SYN_REPORT, KEY_PRESS, KEY_RELEASE } from "./constants" +import { LINUX_KEY_MAP } from "../keyMap" +import { resolveChar } from "../utils" + +export class LinuxKeyboard { + private fd: number + + constructor(fd: number) { + this.fd = fd + } + + injectKey(key: string, pos: string): void { + const code = LINUX_KEY_MAP[key.toLowerCase()] + + if (code !== undefined) { + if (pos !== "RELEASE") { + this.sendKeyEvent(code, KEY_PRESS) + } + if (pos !== "HOLD") { + this.sendKeyEvent(code, KEY_RELEASE) + } + this.sync() + } else if (key.length === 1) { + this.injectText(key) + } else { + console.warn("[LinuxKeyboard] Unknown key:", key) + } + } + + injectCombo(keys: string[]): void { + const codes: number[] = [] + for (const k of keys) { + const code = LINUX_KEY_MAP[k.toLowerCase()] + if (code !== undefined) { + codes.push(code) + } else { + console.warn("[LinuxKeyboard] Unknown combo key:", k) + } + } + if (codes.length === 0) return + + // Press all + for (const code of codes) { + this.sendKeyEvent(code, KEY_PRESS) + } + this.sync() + + // Release in reverse + for (let i = codes.length - 1; i >= 0; i--) { + this.sendKeyEvent(codes[i], KEY_RELEASE) + } + this.sync() + } + + injectText(text: string): void { + if (!text) return + + for (const ch of text) { + const { code, shifted } = resolveChar(ch, LINUX_KEY_MAP) + if (code === undefined) { + console.warn("[LinuxKeyboard] No key mapping for char:", ch) + continue + } + if (shifted) { + const shiftCode = LINUX_KEY_MAP.shift + if (shiftCode === undefined) { + console.warn("[LinuxKeyboard] Shift key code not defined in key map") + continue + } + this.sendKeyEvent(shiftCode, KEY_PRESS) + } + this.sendKeyEvent(code, KEY_PRESS) + this.sendKeyEvent(code, KEY_RELEASE) + if (shifted) { + this.sendKeyEvent(LINUX_KEY_MAP.shift, KEY_RELEASE) + } + this.sync() + } + } + + private sendKeyEvent(code: number, value: number): void { + writeEvent(this.fd, EV_KEY, code, value) + } + + private sync(): void { + writeEvent(this.fd, EV_SYN, SYN_REPORT, 0) + } +} diff --git a/packages/rein-input/src/linux/structs.ts b/packages/rein-input/src/linux/structs.ts new file mode 100644 index 00000000..df1e48aa --- /dev/null +++ b/packages/rein-input/src/linux/structs.ts @@ -0,0 +1,130 @@ +import koffi from "koffi" + +export const InputEvent = koffi.struct("input_event", { + tv_sec: "int64", + tv_usec: "int64", + type: "uint16", + code: "uint16", + value: "int32", +}) + +export const UinputSetup = koffi.struct("uinput_setup", { + bustype: "uint16", + vendor: "uint16", + product: "uint16", + version: "uint16", + name: koffi.array("char", 80), + ff_effects_max: "uint32", +}) + +export const InputAbsinfo = koffi.struct("input_absinfo", { + value: "int32", + minimum: "int32", + maximum: "int32", + fuzz: "int32", + flat: "int32", + resolution: "int32", +}) + +export const UinputAbsSetup = koffi.struct("uinput_abs_setup", { + code: "uint16", + __pad: "uint16", + __pad2: "uint32", + absinfo: InputAbsinfo, +}) + +type KoffiLib = ReturnType +type KoffiFunc = ReturnType + +let _libc: KoffiLib | null = null +let _open: KoffiFunc | null = null +let _close: KoffiFunc | null = null +let _write: KoffiFunc | null = null +let _ioctl: KoffiFunc | null = null + +function ensureLibc() { + if (!_libc) { + _libc = koffi.load("libc.so.6") + + _open = _libc.func("int open(const char *pathname, int flags, ...)") + _close = _libc.func("int close(int fd)") + _write = _libc.func( + "int64 write(int fd, const input_event *buf, size_t count)", + ) + _ioctl = _libc.func("int ioctl(int fd, unsigned long request, ...)") + } +} + +const O_WRONLY = 0x1 +const O_NONBLOCK = 0x800 +export const INPUT_EVENT_SIZE = koffi.sizeof(InputEvent) + +export function openUinput(path: string): number { + ensureLibc() + if (!_open) { + throw new Error("libc not initialized") + } + const fd = _open(path, O_WRONLY | O_NONBLOCK) as number + if (fd < 0) { + throw new Error( + `Failed to open ${path}, got fd ${fd} (check permissions and /dev/uinput availability)`, + ) + } + return fd +} + +export function closeUinput(fd: number): void { + ensureLibc() + if (!_close) { + throw new Error("libc not initialized") + } + _close(fd) +} + +export function writeEvent( + fd: number, + type: number, + code: number, + value: number, +): boolean { + ensureLibc() + const ev = { tv_sec: 0n, tv_usec: 0n, type, code, value } + if (!_write) { + throw new Error("libc not initialized") + } + const written = _write(fd, ev, INPUT_EVENT_SIZE) as number + return written === INPUT_EVENT_SIZE +} + +/** + * Perform an ioctl call with an integer argument. + * @returns 0 on success, -1 on error + */ +export function ioctlInt(fd: number, request: number, value: number): number { + ensureLibc() + if (!_ioctl) { + throw new Error("libc not initialized") + } + return _ioctl(fd, request, "int", value) as number +} + +export function ioctlStruct( + fd: number, + request: number, + typeName: string, + data: unknown, +): number { + ensureLibc() + if (!_ioctl) { + throw new Error("libc not initialized") + } + return _ioctl(fd, request, typeName, data) as number +} + +export function ioctlNull(fd: number, request: number): number { + ensureLibc() + if (!_ioctl) { + throw new Error("libc not initialized") + } + return _ioctl(fd, request, "void *", 0) as number +} diff --git a/packages/rein-input/src/linux/touch.ts b/packages/rein-input/src/linux/touch.ts new file mode 100644 index 00000000..8f44d0d9 --- /dev/null +++ b/packages/rein-input/src/linux/touch.ts @@ -0,0 +1,165 @@ +import { writeEvent } from "./structs" +import { + EV_SYN, + EV_ABS, + EV_KEY, + SYN_REPORT, + ABS_MT_SLOT, + ABS_MT_TRACKING_ID, + ABS_MT_POSITION_X, + ABS_MT_POSITION_Y, + ABS_MT_PRESSURE, + ABS_MT_TOUCH_MAJOR, + BTN_TOUCH, + BTN_TOOL_FINGER, + BTN_TOOL_DOUBLETAP, + BTN_TOOL_TRIPLETAP, + BTN_TOOL_QUADTAP, + KEY_PRESS, + KEY_RELEASE, + MAX_CONTACTS, + MT_TRACKING_ID_RELEASED, +} from "./constants" +import type { TouchContact } from "../types" + +export class LinuxTouch { + private fd: number + private slotTrackingIds: Int32Array + private contactSlotMap = new Map() + private freeSlots: number[] = [] + private nextTrackingId = 1 + private activeContactCount = 0 + + constructor(fd: number) { + this.fd = fd + this.slotTrackingIds = new Int32Array(MAX_CONTACTS).fill( + MT_TRACKING_ID_RELEASED, + ) + for (let i = MAX_CONTACTS - 1; i >= 0; i--) { + this.freeSlots.push(i) + } + } + + injectTouch(contacts: TouchContact[]): void { + if (contacts.length === 0) return + + const releasedSourceIds: number[] = [] + let slotChanged = -1 + + for (const contact of contacts) { + if (contact.state === "up") { + this.liftContact(contact.id) + releasedSourceIds.push(contact.id) + continue + } + + let slot = this.contactSlotMap.get(contact.id) + + if (slot === undefined) { + const free = this.freeSlots.pop() + if (free === undefined) { + console.warn("[LinuxTouch] Max contacts reached") + continue + } + slot = free + this.contactSlotMap.set(contact.id, slot) + this.nextTrackingId = (this.nextTrackingId % 0x7fffffff) + 1 + this.slotTrackingIds[slot] = this.nextTrackingId + this.activeContactCount++ + + this.selectSlot(slot, slotChanged) + slotChanged = slot + writeEvent(this.fd, EV_ABS, ABS_MT_TRACKING_ID, this.nextTrackingId) + } else if (slot !== slotChanged) { + this.selectSlot(slot, slotChanged) + slotChanged = slot + } + + writeEvent(this.fd, EV_ABS, ABS_MT_POSITION_X, Math.round(contact.x)) + writeEvent(this.fd, EV_ABS, ABS_MT_POSITION_Y, Math.round(contact.y)) + writeEvent(this.fd, EV_ABS, ABS_MT_PRESSURE, 128) + writeEvent(this.fd, EV_ABS, ABS_MT_TOUCH_MAJOR, 4) + } + + this.emitToolButtons() + this.sync() + + for (const id of releasedSourceIds) { + const slot = this.contactSlotMap.get(id) + if (slot !== undefined) { + this.contactSlotMap.delete(id) + this.freeSlots.push(slot) + } + } + } + + releaseAll(): void { + if (this.contactSlotMap.size === 0) return + + for (const [, slot] of this.contactSlotMap) { + writeEvent(this.fd, EV_ABS, ABS_MT_SLOT, slot) + writeEvent(this.fd, EV_ABS, ABS_MT_TRACKING_ID, MT_TRACKING_ID_RELEASED) + } + + writeEvent(this.fd, EV_KEY, BTN_TOUCH, KEY_RELEASE) + writeEvent(this.fd, EV_KEY, BTN_TOOL_FINGER, KEY_RELEASE) + this.sync() + + this.contactSlotMap.clear() + this.slotTrackingIds.fill(MT_TRACKING_ID_RELEASED) + this.freeSlots = Array.from( + { length: MAX_CONTACTS }, + (_, i) => MAX_CONTACTS - 1 - i, + ) + this.activeContactCount = 0 + } + + private liftContact(sourceId: number): void { + const slot = this.contactSlotMap.get(sourceId) + if (slot === undefined) return + + writeEvent(this.fd, EV_ABS, ABS_MT_SLOT, slot) + writeEvent(this.fd, EV_ABS, ABS_MT_TRACKING_ID, MT_TRACKING_ID_RELEASED) + this.slotTrackingIds[slot] = MT_TRACKING_ID_RELEASED + this.activeContactCount = Math.max(0, this.activeContactCount - 1) + } + + private selectSlot(slot: number, currentSlot: number): void { + if (slot !== currentSlot) { + writeEvent(this.fd, EV_ABS, ABS_MT_SLOT, slot) + } + } + + private emitToolButtons(): void { + const n = this.activeContactCount + writeEvent(this.fd, EV_KEY, BTN_TOUCH, n > 0 ? KEY_PRESS : KEY_RELEASE) + writeEvent( + this.fd, + EV_KEY, + BTN_TOOL_FINGER, + n === 1 ? KEY_PRESS : KEY_RELEASE, + ) + writeEvent( + this.fd, + EV_KEY, + BTN_TOOL_DOUBLETAP, + n === 2 ? KEY_PRESS : KEY_RELEASE, + ) + writeEvent( + this.fd, + EV_KEY, + BTN_TOOL_TRIPLETAP, + n === 3 ? KEY_PRESS : KEY_RELEASE, + ) + writeEvent( + this.fd, + EV_KEY, + BTN_TOOL_QUADTAP, + n >= 4 ? KEY_PRESS : KEY_RELEASE, + ) + } + + private sync(): void { + writeEvent(this.fd, EV_SYN, SYN_REPORT, 0) + } +} diff --git a/packages/rein-input/src/mac/constants.ts b/packages/rein-input/src/mac/constants.ts new file mode 100644 index 00000000..e5169367 --- /dev/null +++ b/packages/rein-input/src/mac/constants.ts @@ -0,0 +1,154 @@ +// ── CGEventType ──────────────────────────────────────────────────────────── +export const kCGEventNull = 0 +export const kCGEventLeftMouseDown = 1 +export const kCGEventLeftMouseUp = 2 +export const kCGEventRightMouseDown = 3 +export const kCGEventRightMouseUp = 4 +export const kCGEventMouseMoved = 5 +export const kCGEventLeftMouseDragged = 6 +export const kCGEventRightMouseDragged = 7 +export const kCGEventKeyDown = 10 +export const kCGEventKeyUp = 11 +export const kCGEventFlagsChanged = 12 +export const kCGEventScrollWheel = 22 +export const kCGEventOtherMouseDown = 25 +export const kCGEventOtherMouseUp = 26 +export const kCGEventOtherMouseDragged = 27 + +// ── CGMouseButton ────────────────────────────────────────────────────────── +export const kCGMouseButtonLeft = 0 +export const kCGMouseButtonRight = 1 +export const kCGMouseButtonCenter = 2 + +// ── CGEventTapLocation ───────────────────────────────────────────────────── +export const kCGHIDEventTap = 0 // injected before window server +export const kCGSessionEventTap = 1 // session level +export const kCGAnnotatedSessionEventTap = 2 // post-window-server + +// ── CGScrollEventUnit ────────────────────────────────────────────────────── +export const kCGScrollEventUnitPixel = 0 +export const kCGScrollEventUnitLine = 1 + +// ── CGEventField (used with CGEventSetIntegerValueField) ─────────────────── +export const kCGKeyboardEventKeycode = 9 +export const kCGMouseEventClickState = 1 // click count +export const kCGScrollWheelEventDeltaAxis1 = 11 // vertical +export const kCGScrollWheelEventDeltaAxis2 = 12 // horizontal + +// ── macOS Virtual Key Codes (from HIToolbox/Events.h) ───────────────────── +// Letters +export const kVK_ANSI_A = 0x00 +export const kVK_ANSI_S = 0x01 +export const kVK_ANSI_D = 0x02 +export const kVK_ANSI_F = 0x03 +export const kVK_ANSI_H = 0x04 +export const kVK_ANSI_G = 0x05 +export const kVK_ANSI_Z = 0x06 +export const kVK_ANSI_X = 0x07 +export const kVK_ANSI_C = 0x08 +export const kVK_ANSI_V = 0x09 +export const kVK_ANSI_B = 0x0b +export const kVK_ANSI_Q = 0x0c +export const kVK_ANSI_W = 0x0d +export const kVK_ANSI_E = 0x0e +export const kVK_ANSI_R = 0x0f +export const kVK_ANSI_Y = 0x10 +export const kVK_ANSI_T = 0x11 +export const kVK_ANSI_1 = 0x12 +export const kVK_ANSI_2 = 0x13 +export const kVK_ANSI_3 = 0x14 +export const kVK_ANSI_4 = 0x15 +export const kVK_ANSI_6 = 0x16 +export const kVK_ANSI_5 = 0x17 +export const kVK_ANSI_Equal = 0x18 +export const kVK_ANSI_9 = 0x19 +export const kVK_ANSI_7 = 0x1a +export const kVK_ANSI_Minus = 0x1b +export const kVK_ANSI_8 = 0x1c +export const kVK_ANSI_0 = 0x1d +export const kVK_ANSI_RightBracket = 0x1e +export const kVK_ANSI_O = 0x1f +export const kVK_ANSI_U = 0x20 +export const kVK_ANSI_LeftBracket = 0x21 +export const kVK_ANSI_I = 0x22 +export const kVK_ANSI_P = 0x23 +export const kVK_ANSI_L = 0x25 +export const kVK_ANSI_J = 0x26 +export const kVK_ANSI_Quote = 0x27 +export const kVK_ANSI_K = 0x28 +export const kVK_ANSI_Semicolon = 0x29 +export const kVK_ANSI_Backslash = 0x2a +export const kVK_ANSI_Comma = 0x2b +export const kVK_ANSI_Slash = 0x2c +export const kVK_ANSI_N = 0x2d +export const kVK_ANSI_M = 0x2e +export const kVK_ANSI_Period = 0x2f +export const kVK_ANSI_Grave = 0x32 +export const kVK_ANSI_KeypadDecimal = 0x41 +export const kVK_ANSI_KeypadMultiply = 0x43 +export const kVK_ANSI_KeypadPlus = 0x45 +export const kVK_ANSI_KeypadClear = 0x47 +export const kVK_ANSI_KeypadDivide = 0x4b +export const kVK_ANSI_KeypadEnter = 0x4c +export const kVK_ANSI_KeypadMinus = 0x4e +export const kVK_ANSI_KeypadEquals = 0x51 +export const kVK_ANSI_Keypad0 = 0x52 +export const kVK_ANSI_Keypad1 = 0x53 +export const kVK_ANSI_Keypad2 = 0x54 +export const kVK_ANSI_Keypad3 = 0x55 +export const kVK_ANSI_Keypad4 = 0x56 +export const kVK_ANSI_Keypad5 = 0x57 +export const kVK_ANSI_Keypad6 = 0x58 +export const kVK_ANSI_Keypad7 = 0x59 +export const kVK_ANSI_Keypad8 = 0x5b +export const kVK_ANSI_Keypad9 = 0x5c + +// Special / modifier keys +export const kVK_Return = 0x24 +export const kVK_Tab = 0x30 +export const kVK_Space = 0x31 +export const kVK_Delete = 0x33 // Backspace on Apple keyboards +export const kVK_Escape = 0x35 +export const kVK_Command = 0x37 // Left Command +export const kVK_Shift = 0x38 // Left Shift +export const kVK_CapsLock = 0x39 +export const kVK_Option = 0x3a // Left Option/Alt +export const kVK_Control = 0x3b // Left Control +export const kVK_RightCommand = 0x36 +export const kVK_RightShift = 0x3c +export const kVK_RightOption = 0x3d +export const kVK_RightControl = 0x3e +export const kVK_Function = 0x3f +export const kVK_F17 = 0x40 +export const kVK_VolumeUp = 0x48 +export const kVK_VolumeDown = 0x49 +export const kVK_Mute = 0x4a +export const kVK_F18 = 0x4f +export const kVK_F19 = 0x50 +export const kVK_F20 = 0x5a +export const kVK_F5 = 0x60 +export const kVK_F6 = 0x61 +export const kVK_F7 = 0x62 +export const kVK_F3 = 0x63 +export const kVK_F8 = 0x64 +export const kVK_F9 = 0x65 +export const kVK_F11 = 0x67 +export const kVK_F13 = 0x69 +export const kVK_F16 = 0x6a +export const kVK_F14 = 0x6b +export const kVK_F10 = 0x6d +export const kVK_F12 = 0x6f +export const kVK_F15 = 0x71 +export const kVK_Help = 0x72 +export const kVK_Home = 0x73 +export const kVK_PageUp = 0x74 +export const kVK_ForwardDelete = 0x75 +export const kVK_F4 = 0x76 +export const kVK_End = 0x77 +export const kVK_F2 = 0x78 +export const kVK_PageDown = 0x79 +export const kVK_F1 = 0x7a +export const kVK_LeftArrow = 0x7b +export const kVK_RightArrow = 0x7c +export const kVK_DownArrow = 0x7d +export const kVK_UpArrow = 0x7e diff --git a/packages/rein-input/src/mac/index.ts b/packages/rein-input/src/mac/index.ts new file mode 100644 index 00000000..8dacc44c --- /dev/null +++ b/packages/rein-input/src/mac/index.ts @@ -0,0 +1,148 @@ +import { postMouseEvent, postScrollEvent } from "./structs" +import { + kCGEventMouseMoved, + kCGEventLeftMouseDown, + kCGEventLeftMouseUp, + kCGEventRightMouseDown, + kCGEventRightMouseUp, + kCGEventOtherMouseDown, + kCGEventOtherMouseUp, + kCGEventOtherMouseDragged, + kCGEventLeftMouseDragged, + kCGEventRightMouseDragged, + kCGMouseButtonLeft, + kCGMouseButtonRight, + kCGMouseButtonCenter, +} from "./constants" +import { WHEEL_SCALE, DEFAULT_CONFIG } from "../constants" +import { MacKeyboard } from "./keyboard" +import { MacTouch } from "./touch" +import type { + InputConfig, + PlatformInjector, + TouchContact, + MouseButton, +} from "../types" + +const BUTTON_MAP = { + left: { + down: kCGEventLeftMouseDown, + up: kCGEventLeftMouseUp, + drag: kCGEventLeftMouseDragged, + btn: kCGMouseButtonLeft, + }, + right: { + down: kCGEventRightMouseDown, + up: kCGEventRightMouseUp, + drag: kCGEventRightMouseDragged, + btn: kCGMouseButtonRight, + }, + middle: { + down: kCGEventOtherMouseDown, + up: kCGEventOtherMouseUp, + drag: kCGEventOtherMouseDragged, + btn: kCGMouseButtonCenter, + }, +} as const + +export class MacInputInjector implements PlatformInjector { + private config: InputConfig + private keyboard: MacKeyboard + private touch: MacTouch + private cursorX = 0 + private cursorY = 0 + private buttonsHeld = new Set() + + constructor(config: Partial = {}) { + if (process.platform !== "darwin") { + throw new Error("MacInputInjector can only be used on macOS") + } + this.config = { ...DEFAULT_CONFIG, ...config } + this.keyboard = new MacKeyboard() + this.touch = new MacTouch() + this.cursorX = this.config.screenWidth / 2 + this.cursorY = this.config.screenHeight / 2 + } + + updateConfig(config: Partial): void { + this.config = { ...this.config, ...config } + } + + injectMouseMove(dx: number, dy: number): void { + if (dx === 0 && dy === 0) return + this.cursorX = Math.max( + 0, + Math.min(this.config.screenWidth, this.cursorX + dx), + ) + this.cursorY = Math.max( + 0, + Math.min(this.config.screenHeight, this.cursorY + dy), + ) + + let eventType = kCGEventMouseMoved + let button = kCGMouseButtonLeft + if (this.buttonsHeld.has("left")) { + eventType = kCGEventLeftMouseDragged + button = kCGMouseButtonLeft + } + if (this.buttonsHeld.has("right")) { + eventType = kCGEventRightMouseDragged + button = kCGMouseButtonRight + } + if (this.buttonsHeld.has("middle")) { + eventType = kCGEventOtherMouseDragged + button = kCGMouseButtonCenter + } + + postMouseEvent(eventType, this.cursorX, this.cursorY, button) + } + + injectMouseButton(button: MouseButton, isDown: boolean): void { + const map = BUTTON_MAP[button] + const eventType = isDown ? map.down : map.up + + if (isDown) { + this.buttonsHeld.add(button) + } else { + this.buttonsHeld.delete(button) + } + + postMouseEvent(eventType, this.cursorX, this.cursorY, map.btn) + } + + injectMouseWheel(dx: number, dy: number): void { + const invert = this.config.invertScroll ? -1 : 1 + + const cgDy = dy !== 0 ? Math.round(dy * invert * WHEEL_SCALE) : 0 + const cgDx = dx !== 0 ? Math.round(dx * invert * WHEEL_SCALE) : 0 + + postScrollEvent(cgDx, cgDy) + } + + injectKey(key: string, pos?: string): void { + this.keyboard.injectKey(key, pos ?? "") + } + + injectCombo(keys: string[]): void { + this.keyboard.injectCombo(keys) + } + + injectText(text: string): void { + this.keyboard.injectText(text) + } + + injectTouch(contacts: TouchContact[]): void { + this.touch.injectTouch(contacts) + } + + destroy(): void { + this.touch.releaseAll() + for (const btn of this.buttonsHeld) { + this.injectMouseButton(btn, false) + } + this.buttonsHeld.clear() + } +} + +export { MacKeyboard } from "./keyboard" +export { MacTouch } from "./touch" diff --git a/packages/rein-input/src/mac/keyboard.ts b/packages/rein-input/src/mac/keyboard.ts new file mode 100644 index 00000000..2256b92f --- /dev/null +++ b/packages/rein-input/src/mac/keyboard.ts @@ -0,0 +1,144 @@ +import { + postKeyEvent, + postMediaKeyEvent, + NX_KEYTYPE_PLAY, + NX_KEYTYPE_NEXT, + NX_KEYTYPE_PREVIOUS, +} from "./structs" +import { MAC_KEY_MAP } from "../keyMap" +import { resolveChar } from "../utils" + +// Media transport keys that require NX_SYSDEFINED events +const MEDIA_KEY_MAP: Record = { + audioplay: NX_KEYTYPE_PLAY, + audiopause: NX_KEYTYPE_PLAY, + audionext: NX_KEYTYPE_NEXT, + audioprev: NX_KEYTYPE_PREVIOUS, + audiostop: NX_KEYTYPE_PLAY, +} + +export class MacKeyboard { + injectKey(key: string, pos: string = ""): void { + const lowerKey = key.toLowerCase() + + const mediaType = MEDIA_KEY_MAP[lowerKey] + if (mediaType !== undefined) { + postMediaKeyEvent(mediaType) + return + } + + const code = MAC_KEY_MAP[lowerKey] + if (code !== undefined) { + if (pos !== "RELEASE") postKeyEvent(code, true) + if (pos !== "HOLD") postKeyEvent(code, false) + } else if (key.length === 1) { + this.injectText(key) + } else { + console.warn("[MacKeyboard] Unknown key:", key) + } + } + + injectCombo(keys: string[]): void { + const codes: number[] = [] + for (const k of keys) { + const code = MAC_KEY_MAP[k.toLowerCase()] + if (code !== undefined) { + codes.push(code) + } else { + console.warn("[MacKeyboard] Unknown combo key:", k) + } + } + if (codes.length === 0) return + + for (const code of codes) { + postKeyEvent(code, true) + } + for (let i = codes.length - 1; i >= 0; i--) { + postKeyEvent(codes[i], false) + } + } + + injectText(text: string): void { + if (!text) return + for (const ch of text) { + const { code, shifted } = resolveChar(ch, MAC_KEY_MAP) + const shiftCode = MAC_KEY_MAP.shift + if (code === undefined) { + this.injectUnicodeChar(ch) + continue + } + if (shiftCode === undefined) { + console.warn("[MacKeyboard] Shift key code not defined in key map") + continue + } + if (shifted) postKeyEvent(shiftCode, true) + postKeyEvent(code, true) + postKeyEvent(code, false) + if (shifted) postKeyEvent(shiftCode, false) + } + } + + private injectUnicodeChar(ch: string): void { + injectUnicode(ch) + } +} + +// Unicode injection fallback via CoreGraphics +let _unicodeInjectorLoaded = false +let _CGEventCreateKeyboardEvent: + | ((s: null, k: number, d: number) => unknown) + | null = null +let _CGEventKeyboardSetUnicodeString: + | ((e: unknown, l: number, s: Buffer) => void) + | null = null +let _CGEventPost: ((tap: number, e: unknown) => void) | null = null +let _CFRelease: ((r: unknown) => void) | null = null + +function ensureUnicode() { + if (_unicodeInjectorLoaded) return + _unicodeInjectorLoaded = true + try { + const koffi = require("koffi") + const lib = koffi.load( + "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics", + ) + _CGEventCreateKeyboardEvent = lib.func( + "void * CGEventCreateKeyboardEvent(void *, uint16, uint8)", + ) + _CGEventKeyboardSetUnicodeString = lib.func( + "void CGEventKeyboardSetUnicodeString(void *, size_t, void *)", + ) + _CGEventPost = lib.func("void CGEventPost(uint32, void *)") + _CFRelease = lib.func("void CFRelease(void *)") + } catch (e) { + console.warn( + "[MacKeyboard] Failed to load CoreGraphics for Unicode injection:", + e, + ) + } +} + +function injectUnicode(ch: string): void { + ensureUnicode() + if ( + !_CGEventCreateKeyboardEvent || + !_CGEventKeyboardSetUnicodeString || + !_CGEventPost || + !_CFRelease + ) + return + const buf = Buffer.from(ch, "utf16le") + const charCount = buf.length / 2 + + const downRef = _CGEventCreateKeyboardEvent(null, 0, 1) + if (!downRef) return + _CGEventKeyboardSetUnicodeString(downRef, charCount, buf) + _CGEventPost(0, downRef) + _CFRelease(downRef) + + const upRef = _CGEventCreateKeyboardEvent(null, 0, 0) + if (!upRef) return + _CGEventKeyboardSetUnicodeString(upRef, charCount, buf) + _CGEventPost(0, upRef) + _CFRelease(upRef) +} diff --git a/packages/rein-input/src/mac/structs.ts b/packages/rein-input/src/mac/structs.ts new file mode 100644 index 00000000..921df519 --- /dev/null +++ b/packages/rein-input/src/mac/structs.ts @@ -0,0 +1,145 @@ +import koffi from "koffi" + +// ── Load CoreGraphics ────────────────────────────────────────────────────── +const CG_PATH = "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics" + +let _cg: ReturnType | null = null + +function cg() { + if (!_cg) { + _cg = koffi.load(CG_PATH) + } + return _cg +} + +// ── CGPoint ──────────────────────────────────────────────────────────────── +export const CGPoint = koffi.struct("CGPoint", { + x: "double", + y: "double", +}) + +let _CGEventCreateMouseEvent: koffi.KoffiFunction | null = null +let _CGEventCreateKeyboardEvent: koffi.KoffiFunction | null = null +let _CGEventCreateScrollWheelEvent: koffi.KoffiFunction | null = null +let _CGEventPost: koffi.KoffiFunction | null = null +let _CFRelease: koffi.KoffiFunction | null = null +let _CGEventSetIntegerValueField: koffi.KoffiFunction | null = null + +function ensureFunctions() { + const lib = cg() + if (!_CGEventCreateMouseEvent) { + _CGEventCreateMouseEvent = lib.func( + "void * CGEventCreateMouseEvent(void *, uint32, CGPoint, uint32)", + ) + _CGEventCreateKeyboardEvent = lib.func( + "void * CGEventCreateKeyboardEvent(void *, uint16, uint8)", + ) + _CGEventCreateScrollWheelEvent = lib.func( + "void * CGEventCreateScrollWheelEvent(void *, uint32, uint32, int32, int32)", + ) + _CGEventPost = lib.func("void CGEventPost(uint32, void *)") + _CFRelease = lib.func("void CFRelease(void *)") + } +} + +export function postMouseEvent( + mouseType: number, + x: number, + y: number, + button: number, +): void { + ensureFunctions() + const pt = { x, y } + const ref = _CGEventCreateMouseEvent?.(null, mouseType, pt, button) as + | bigint + | number + | null + if (!ref) return + _CGEventPost?.(0, ref) // 0 = kCGHIDEventTap + _CFRelease?.(ref) +} + +export function postKeyEvent(keyCode: number, keyDown: boolean): void { + ensureFunctions() + const ref = _CGEventCreateKeyboardEvent?.(null, keyCode, keyDown ? 1 : 0) as + | bigint + | number + | null + if (!ref) return + _CGEventPost?.(0, ref) + _CFRelease?.(ref) +} + +export function postScrollEvent(deltaX: number, deltaY: number): void { + ensureFunctions() + const ref = _CGEventCreateScrollWheelEvent?.( + null, + 1, + 2, + Math.round(deltaY), + Math.round(deltaX), + ) as bigint | number | null + if (!ref) return + _CGEventPost?.(0, ref) + _CFRelease?.(ref) +} + +export const NX_KEYTYPE_PLAY = 16 +export const NX_KEYTYPE_NEXT = 17 +export const NX_KEYTYPE_PREVIOUS = 18 +export const NX_KEYTYPE_FAST = 19 +export const NX_KEYTYPE_REWIND = 20 + +const NX_SYSDEFINED = 14 // NSEventTypeSystemDefined +const NX_SUBTYPE_AUX = 8 // NX_SUBTYPE_AUX_CONTROL_BUTTONS + +let _CGEventCreate: koffi.KoffiFunction | null = null +let _CGEventSetType: koffi.KoffiFunction | null = null + +function ensureMediaFunctions() { + ensureFunctions() + if (!_CGEventCreate) { + const lib = cg() + _CGEventCreate = lib.func("void * CGEventCreate(void *)") + _CGEventSetType = lib.func("void CGEventSetType(void *, uint32)") + _CGEventSetIntegerValueField = lib.func( + "void CGEventSetIntegerValueField(void *, uint32, int64)", + ) + } +} + +/** + * Post a macOS media key event (play, next, prev, etc.). + * `keyType` is one of the NX_KEYTYPE_* constants above. + */ +export function postMediaKeyEvent(keyType: number): void { + ensureMediaFunctions() + if ( + !_CGEventCreate || + !_CGEventSetType || + !_CGEventSetIntegerValueField || + !_CGEventPost || + !_CFRelease + ) + return + + // Key-down: data = (keyType << 16) | (0xa << 8) [flags=0xa = key-down] + const downData = (keyType << 16) | (0x0a << 8) + const downRef = _CGEventCreate(null) as bigint | number | null + if (!downRef) return + _CGEventSetType(downRef, NX_SYSDEFINED) + _CGEventSetIntegerValueField(downRef, 131, NX_SUBTYPE_AUX) // field 131 = eventSubtype + _CGEventSetIntegerValueField(downRef, 132, downData) // field 132 = eventData1 + _CGEventPost(0, downRef) + _CFRelease(downRef) + + // Key-up: data = (keyType << 16) | (0xb << 8) [flags=0xb = key-up] + const upData = (keyType << 16) | (0x0b << 8) + const upRef = _CGEventCreate(null) as bigint | number | null + if (!upRef) return + _CGEventSetType(upRef, NX_SYSDEFINED) + _CGEventSetIntegerValueField(upRef, 131, NX_SUBTYPE_AUX) + _CGEventSetIntegerValueField(upRef, 132, upData) + _CGEventPost(0, upRef) + _CFRelease(upRef) +} diff --git a/packages/rein-input/src/mac/touch.ts b/packages/rein-input/src/mac/touch.ts new file mode 100644 index 00000000..daf1d672 --- /dev/null +++ b/packages/rein-input/src/mac/touch.ts @@ -0,0 +1,186 @@ +import { postMouseEvent, postScrollEvent, postKeyEvent } from "./structs" +import { + kCGEventLeftMouseDown, + kCGEventLeftMouseUp, + kCGEventLeftMouseDragged, + kCGMouseButtonLeft, +} from "./constants" +import { MAC_KEY_MAP } from "../keyMap" +import type { TouchContact } from "../types" +import { PINCH_PAN_THRESHOLD } from "../constants" + +interface TrackedContact { + id: number + x: number + y: number + state: "down" | "move" | "up" +} + +interface PinchState { + contactIds: [number, number] + lastSpread: number +} + +const PINCH_SCROLL_SCALE = 0.05 + +export class MacTouch { + private activeContacts = new Map() + private pinch: PinchState | null = null + + injectTouch(contacts: TouchContact[]): void { + if (contacts.length === 0) return + + const downs: TouchContact[] = [] + const moves: TouchContact[] = [] + const ups: TouchContact[] = [] + + for (const c of contacts) { + if (c.state === "down") downs.push(c) + else if (c.state === "move") moves.push(c) + else ups.push(c) + } + + this.processDowns(downs) + this.processMoves(moves) + this.processUps(ups) + } + + releaseAll(): void { + if (this.activeContacts.size === 0) return + + const first = [...this.activeContacts.values()][0] + postMouseEvent(kCGEventLeftMouseUp, first.x, first.y, kCGMouseButtonLeft) + this.activeContacts.clear() + this.pinch = null + } + + private processDowns(downs: TouchContact[]): void { + for (const c of downs) { + this.activeContacts.set(c.id, { ...c }) + } + + const active = this.activeContacts.size + + if (active === 1 && downs.length > 0) { + const c = downs[0] + postMouseEvent(kCGEventLeftMouseDown, c.x, c.y, kCGMouseButtonLeft) + this.pinch = null + } else if (active === 2) { + const first = [...this.activeContacts.values()][0] + postMouseEvent(kCGEventLeftMouseUp, first.x, first.y, kCGMouseButtonLeft) + this.pinch = this.buildPinchState() + } else if (active > 2) { + console.warn( + `[MacTouch] ${active}-finger touches are not supported on macOS — ignoring`, + ) + } + } + + private processMoves(moves: TouchContact[]): void { + for (const c of moves) { + const prev = this.activeContacts.get(c.id) + const active = this.activeContacts.size + + if (active === 1 && prev) { + postMouseEvent(kCGEventLeftMouseDragged, c.x, c.y, kCGMouseButtonLeft) + } else if (active === 2) { + this.handleTwoFingerMove(c, prev) + } + + this.activeContacts.set(c.id, { ...c }) + } + } + + private processUps(ups: TouchContact[]): void { + for (const c of ups) { + const prev = this.activeContacts.get(c.id) + this.activeContacts.delete(c.id) + + if (this.activeContacts.size === 0 && prev) { + postMouseEvent(kCGEventLeftMouseUp, c.x, c.y, kCGMouseButtonLeft) + this.pinch = null + } else if (this.activeContacts.size === 1 && this.pinch) { + this.pinch = null + const remaining = [...this.activeContacts.values()][0] + postMouseEvent( + kCGEventLeftMouseDown, + remaining.x, + remaining.y, + kCGMouseButtonLeft, + ) + } + } + } + + private handleTwoFingerMove( + c: TouchContact, + prev: TrackedContact | undefined, + ): void { + if (!this.pinch) { + this.pinch = this.buildPinchState() + return + } + + if (c.id !== this.pinch.contactIds[0]) return + + const contacts = [...this.activeContacts.values()] + if (contacts.length < 2) return + + const [a, b] = contacts + const newSpread = spread(a, b) + const delta = newSpread - this.pinch.lastSpread + + const isPinch = Math.abs(delta) > PINCH_PAN_THRESHOLD + const isPan = !isPinch + + if (isPinch) { + this.emitPinchZoom(delta) + this.pinch.lastSpread = newSpread + } else if (isPan) { + const otherPrev = this.activeContacts.get( + c.id === this.pinch.contactIds[0] + ? this.pinch.contactIds[1] + : this.pinch.contactIds[0], + ) + if (prev && otherPrev) { + const dx = c.x - (prev?.x ?? c.x) + const dy = c.y - (prev?.y ?? c.y) + postScrollEvent(dx, -dy) + } + } + } + + private emitPinchZoom(spreadDelta: number): void { + const lines = Math.round(spreadDelta * PINCH_SCROLL_SCALE) + if (lines === 0) return + + const ctrlCode = MAC_KEY_MAP.control + if (ctrlCode === undefined) { + console.warn( + "[MacTouch] Control key code not defined in key map — cannot emit pinch zoom", + ) + return + } + postKeyEvent(ctrlCode, true) + postScrollEvent(0, lines) + postKeyEvent(ctrlCode, false) + } + + private buildPinchState(): PinchState | null { + const contacts = [...this.activeContacts.values()] + if (contacts.length < 2) return null + return { + contactIds: [contacts[0].id, contacts[1].id], + lastSpread: spread(contacts[0], contacts[1]), + } + } +} + +function spread( + a: { x: number; y: number }, + b: { x: number; y: number }, +): number { + const dx = a.x - b.x + const dy = a.y - b.y + return Math.sqrt(dx * dx + dy * dy) +} diff --git a/packages/rein-input/src/types.ts b/packages/rein-input/src/types.ts new file mode 100644 index 00000000..43ab14fa --- /dev/null +++ b/packages/rein-input/src/types.ts @@ -0,0 +1,58 @@ +/** + * Type definitions for @aossie/rein-input + */ + +export interface TouchContact { + id: number + x: number + y: number + state: "down" | "move" | "up" +} + +export interface InputConfig { + sensitivity: number + invertScroll: boolean + acceleration: boolean + screenWidth: number + screenHeight: number +} + +export interface InputMessage { + type: + | "move" + | "paste" + | "copy" + | "click" + | "scroll" + | "key" + | "text" + | "zoom" + | "combo" + | "touch" + dx?: number + dy?: number + config?: Partial + button?: "left" | "right" | "middle" + press?: boolean + key?: string + keys?: string[] + text?: string + delta?: number + contacts?: TouchContact[] +} + +export type MouseButton = "left" | "right" | "middle" + +export interface PlatformInjector { + updateConfig(config: Partial): void + injectMouseMove(dx: number, dy: number): void + injectMouseButton(button: MouseButton, isDown: boolean): void + injectMouseWheel(dx: number, dy: number): void + injectKey(key: string, pos?: string): void + injectCombo(keys: string[]): void + injectText(text: string): void + injectTouch(contacts: TouchContact[]): void + destroy(): void +} + +export type InputInjector = PlatformInjector diff --git a/packages/rein-input/src/utils.ts b/packages/rein-input/src/utils.ts new file mode 100644 index 00000000..f2bd32d3 --- /dev/null +++ b/packages/rein-input/src/utils.ts @@ -0,0 +1,43 @@ +import { SHIFTED_CHARS } from "./keyMap" +import type { InputConfig } from "./types" +import { ACCEL_THRESHOLD, ACCEL_FACTOR, ACCEL_EXPONENT } from "./constants" + +/** + * Calculates accelerated and scaled delta coordinates based on input configuration. + */ +export function applyMotion( + dx: number, + dy: number, + config: InputConfig, +): { ax: number; ay: number } { + const sdx = dx * config.sensitivity + const sdy = dy * config.sensitivity + + if (!config.acceleration) return { ax: sdx, ay: sdy } + + const mag = Math.sqrt(sdx * sdx + sdy * sdy) + if (mag < ACCEL_THRESHOLD) return { ax: sdx, ay: sdy } + + const acc = mag ** ACCEL_EXPONENT * ACCEL_FACTOR + const ratio = acc / mag + return { ax: sdx * ratio, ay: sdy * ratio } +} + +/** + * Resolves a character into its platform-specific keycode and whether shift is required. + */ +export function resolveChar( + ch: string, + map: Record, +): { code?: number; shifted: boolean } { + if (ch >= "A" && ch <= "Z") { + return { code: map[ch.toLowerCase()], shifted: true } + } + const direct = map[ch] + if (direct !== undefined) return { code: direct, shifted: false } + const base = SHIFTED_CHARS[ch] + if (base !== undefined) { + return { code: map[base], shifted: true } + } + return { code: undefined, shifted: false } +} diff --git a/packages/rein-input/src/windows/constants.ts b/packages/rein-input/src/windows/constants.ts new file mode 100644 index 00000000..5a973da4 --- /dev/null +++ b/packages/rein-input/src/windows/constants.ts @@ -0,0 +1,30 @@ +// Mouse flags +export const MOUSEEVENTF_MOVE = 0x0001 +export const MOUSEEVENTF_LEFTDOWN = 0x0002 +export const MOUSEEVENTF_LEFTUP = 0x0004 +export const MOUSEEVENTF_RIGHTDOWN = 0x0008 +export const MOUSEEVENTF_RIGHTUP = 0x0010 +export const MOUSEEVENTF_MIDDLEDOWN = 0x0020 +export const MOUSEEVENTF_MIDDLEUP = 0x0040 +export const MOUSEEVENTF_WHEEL = 0x0800 +export const MOUSEEVENTF_HWHEEL = 0x1000 + +// Keyboard flags +export const KEYEVENTF_KEYUP = 0x0002 +export const KEYEVENTF_UNICODE = 0x0004 + +// Touch constants +export const PT_TOUCHPAD = 5 +export const POINTER_FLAG_NONE = 0 +export const POINTER_FLAG_NEW = 0x00000001 +export const POINTER_FLAG_INRANGE = 0x00000002 +export const POINTER_FLAG_INCONTACT = 0x00000004 +export const POINTER_FLAG_PRIMARY = 0x00002000 +export const POINTER_FLAG_DOWN = 0x00010000 +export const POINTER_FLAG_UPDATE = 0x00020000 +export const POINTER_FLAG_UP = 0x00040000 +export const TOUCH_MASK_CONTACTAREA = 0x00000001 +export const POINTER_FEEDBACK_DEFAULT = 3 + +export const WHEEL_DELTA = 120 +export const MAX_CONTACTS = 10 diff --git a/packages/rein-input/src/windows/index.ts b/packages/rein-input/src/windows/index.ts new file mode 100644 index 00000000..3da4d0a1 --- /dev/null +++ b/packages/rein-input/src/windows/index.ts @@ -0,0 +1,162 @@ +import { SendInput, INPUT_STRUCT_SIZE } from "./structs" +import { + MOUSEEVENTF_MOVE, + MOUSEEVENTF_LEFTDOWN, + MOUSEEVENTF_LEFTUP, + MOUSEEVENTF_RIGHTDOWN, + MOUSEEVENTF_RIGHTUP, + MOUSEEVENTF_MIDDLEDOWN, + MOUSEEVENTF_MIDDLEUP, + MOUSEEVENTF_WHEEL, + MOUSEEVENTF_HWHEEL, + WHEEL_DELTA, +} from "./constants" +import { INPUT_MOUSE, DEFAULT_CONFIG } from "../constants" +import type { + InputConfig, + PlatformInjector, + TouchContact, + MouseButton, +} from "../types" +import { WindowsKeyboard } from "./keyboard" +import { WindowsTouch } from "./touch" + +export class WindowsInputInjector implements PlatformInjector { + private keyboard: WindowsKeyboard + private touch: WindowsTouch + private config: InputConfig + + constructor(config: Partial = {}) { + if (process.platform !== "win32") { + throw new Error("WindowsInputInjector can only be used on Windows") + } + this.config = { ...DEFAULT_CONFIG, ...config } + this.keyboard = new WindowsKeyboard() + this.touch = new WindowsTouch() + } + + updateConfig(config: Partial): void { + this.config = { ...this.config, ...config } + } + + injectMouseMove(dx: number, dy: number): void { + if (dx === 0 && dy === 0) return + SendInput( + 1, + [ + { + type: INPUT_MOUSE, + __pad: 0, + u: { + mi: { + dx: Math.round(dx), + dy: Math.round(dy), + mouseData: 0, + dwFlags: MOUSEEVENTF_MOVE, + time: 0, + dwExtraInfo: 0, + }, + }, + }, + ], + INPUT_STRUCT_SIZE, + ) + } + + injectMouseButton(button: MouseButton, isDown: boolean): void { + const flagMap: Record = { + left: [MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP], + right: [MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_RIGHTUP], + middle: [MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_MIDDLEUP], + } + + SendInput( + 1, + [ + { + type: INPUT_MOUSE, + __pad: 0, + u: { + mi: { + dx: 0, + dy: 0, + mouseData: 0, + dwFlags: flagMap[button][isDown ? 0 : 1], + time: 0, + dwExtraInfo: 0, + }, + }, + }, + ], + INPUT_STRUCT_SIZE, + ) + } + + injectMouseWheel(dx: number, dy: number): void { + const inputs: Array> = [] + + if (dy !== 0) { + const scrollAmount = this.config.invertScroll ? -dy : dy + inputs.push({ + type: INPUT_MOUSE, + __pad: 0, + u: { + mi: { + dx: 0, + dy: 0, + mouseData: Math.round(scrollAmount * WHEEL_DELTA), + dwFlags: MOUSEEVENTF_WHEEL, + time: 0, + dwExtraInfo: 0, + }, + }, + }) + } + + if (dx !== 0) { + inputs.push({ + type: INPUT_MOUSE, + __pad: 0, + u: { + mi: { + dx: 0, + dy: 0, + mouseData: Math.round( + (this.config.invertScroll ? dx : -dx) * WHEEL_DELTA, + ), + dwFlags: MOUSEEVENTF_HWHEEL, + time: 0, + dwExtraInfo: 0, + }, + }, + }) + } + + if (inputs.length > 0) { + SendInput(inputs.length, inputs, INPUT_STRUCT_SIZE) + } + } + + injectKey(key: string, pos?: string): void { + this.keyboard.injectKey(key, pos ?? "") + } + + injectCombo(keys: string[]): void { + this.keyboard.injectCombo(keys) + } + + injectText(text: string): void { + this.keyboard.injectText(text) + } + + injectTouch(contacts: TouchContact[]): void { + this.touch.injectTouch(contacts) + } + + destroy(): void { + this.touch.destroy() + } +} + +export { WindowsKeyboard } from "./keyboard" +export { WindowsTouch } from "./touch" diff --git a/packages/rein-input/src/windows/keyboard.ts b/packages/rein-input/src/windows/keyboard.ts new file mode 100644 index 00000000..c1f11049 --- /dev/null +++ b/packages/rein-input/src/windows/keyboard.ts @@ -0,0 +1,144 @@ +import { SendInput, INPUT_STRUCT_SIZE } from "./structs" +import { KEYEVENTF_KEYUP, KEYEVENTF_UNICODE } from "./constants" +import { INPUT_KEYBOARD } from "../constants" +import { VK_MAP } from "../keyMap" + +export class WindowsKeyboard { + injectKey(key: string, pos: string = ""): void { + const lowerKey = key.toLowerCase() + const vk = VK_MAP[lowerKey] + + if (vk !== undefined) { + const events: Array> = [] + if (pos !== "RELEASE") { + events.push({ + type: INPUT_KEYBOARD, + __pad: 0, + u: { ki: { wVk: vk, wScan: 0, dwFlags: 0, time: 0, dwExtraInfo: 0 } }, + }) + } + if (pos !== "HOLD") { + events.push({ + type: INPUT_KEYBOARD, + __pad: 0, + u: { + ki: { + wVk: vk, + wScan: 0, + dwFlags: KEYEVENTF_KEYUP, + time: 0, + dwExtraInfo: 0, + }, + }, + }) + } + this.sendInput(events.length, events) + } else if (key.length === 1) { + this.injectText(key) + } else { + console.warn( + "[WindowsKeyboard] Unknown key and not a single character:", + key, + ) + } + } + + injectCombo(keys: string[]): void { + const vks = keys + .map((k) => VK_MAP[k.toLowerCase()]) + .filter((vk): vk is number => vk !== undefined) + + if (vks.length === 0) { + console.warn("[WindowsKeyboard] No valid VK codes found, aborting") + return + } + + const events: Array> = [] + + for (const vk of vks) { + events.push({ + type: INPUT_KEYBOARD, + __pad: 0, + u: { ki: { wVk: vk, wScan: 0, dwFlags: 0, time: 0, dwExtraInfo: 0 } }, + }) + } + + for (let i = vks.length - 1; i >= 0; i--) { + events.push({ + type: INPUT_KEYBOARD, + __pad: 0, + u: { + ki: { + wVk: vks[i], + wScan: 0, + dwFlags: KEYEVENTF_KEYUP, + time: 0, + dwExtraInfo: 0, + }, + }, + }) + } + + this.sendInput(events.length, events) + } + + injectText(text: string): void { + if (!text) { + console.warn("[WindowsKeyboard] Empty text, returning") + return + } + for (const ch of text) { + const c = ch.charCodeAt(0) + + this.sendInput(2, [ + { + type: INPUT_KEYBOARD, + __pad: 0, + u: { + ki: { + wVk: 0, + wScan: c, + dwFlags: KEYEVENTF_UNICODE, + time: 0, + dwExtraInfo: 0, + }, + }, + }, + { + type: INPUT_KEYBOARD, + __pad: 0, + u: { + ki: { + wVk: 0, + wScan: c, + dwFlags: KEYEVENTF_UNICODE | KEYEVENTF_KEYUP, + time: 0, + dwExtraInfo: 0, + }, + }, + }, + ]) + } + } + + private sendInput( + count: number, + events: Array>, + ): void { + if (events.length === 0) { + console.warn("[WindowsKeyboard] No events to send") + return + } + + const result = SendInput(count, events, INPUT_STRUCT_SIZE) + + if (result !== count) { + console.error( + "[WindowsKeyboard] SendInput failed! Sent:", + result, + "of", + count, + ) + } + } +} diff --git a/packages/rein-input/src/windows/structs.ts b/packages/rein-input/src/windows/structs.ts new file mode 100644 index 00000000..10fa38f1 --- /dev/null +++ b/packages/rein-input/src/windows/structs.ts @@ -0,0 +1,154 @@ +import koffi from "koffi" + +// ---- Struct Definitions (safe to define at module level) ---- +const POINT = koffi.struct("POINT", { + x: "long", + y: "long", +}) + +const RECT = koffi.struct("RECT", { + left: "long", + top: "long", + right: "long", + bottom: "long", +}) + +const POINTER_INFO = koffi.struct("POINTER_INFO", { + pointerType: "uint32", + pointerId: "uint32", + frameId: "uint32", + pointerFlags: "uint32", + sourceDevice: "void *", + hwndTarget: "void *", + ptPixelLocation: POINT, + ptHimetricLocation: POINT, + ptPixelLocationRaw: POINT, + ptHimetricLocationRaw: POINT, + dwTime: "uint32", + historyCount: "uint32", + InputData: "int32", + dwKeyStates: "uint32", + PerformanceCount: "uint64", + ButtonChangeType: "int32", +}) + +const POINTER_TOUCH_INFO = koffi.struct("POINTER_TOUCH_INFO", { + pointerInfo: POINTER_INFO, + touchFlags: "uint32", + touchMask: "uint32", + rcContact: RECT, + rcContactRaw: RECT, + orientation: "uint32", + pressure: "uint32", +}) + +export const POINTER_TYPE_INFO = koffi.struct("POINTER_TYPE_INFO", { + type: "uint32", + touchInfo: POINTER_TOUCH_INFO, +}) + +const MOUSEINPUT = koffi.struct("MOUSEINPUT", { + dx: "long", + dy: "long", + mouseData: "uint32", + dwFlags: "uint32", + time: "uint32", + dwExtraInfo: "uintptr", +}) + +const KEYBDINPUT = koffi.struct("KEYBDINPUT", { + wVk: "uint16", + wScan: "uint16", + dwFlags: "uint32", + time: "uint32", + dwExtraInfo: "uintptr", +}) + +const INPUT_UNION = koffi.union("INPUT_UNION", { + mi: MOUSEINPUT, + ki: KEYBDINPUT, +}) + +const INPUT = koffi.struct("INPUT", { + type: "uint32", + __pad: "uint32", + u: INPUT_UNION, +}) + +type KoffiLib = ReturnType +type KoffiFunc = ReturnType +let _lib: KoffiLib | null = null +let _CreateSyntheticPointerDevice: KoffiFunc | null = null +let _InjectPointerInput: KoffiFunc | null = null +let _SendInput: KoffiFunc | null = null + +function ensureLib() { + if (!_lib) { + _lib = koffi.load("user32.dll") + + _CreateSyntheticPointerDevice = _lib.func( + "void * CreateSyntheticPointerDevice(uint32 pointerType, uint32 maxCount, uint32 mode)", + ) + + _InjectPointerInput = _lib.func( + "int InjectPointerInput(void * device, const POINTER_TYPE_INFO * pointerInfo, uint32 count)", + ) + + _SendInput = _lib.func( + "uint32 SendInput(uint32 nInputs, const INPUT * pInputs, int cbSize)", + ) + } +} + +// ---- Exports ---- +export const INPUT_STRUCT_SIZE = koffi.sizeof(INPUT) + +export function SendInput( + count: number, + events: unknown, + size: number, +): number { + if (count < 0 || count > 1000) { + throw new Error(`Invalid event count: ${count}`) + } + if (size !== INPUT_STRUCT_SIZE) { + throw new Error(`Size mismatch: expected ${INPUT_STRUCT_SIZE}, got ${size}`) + } + ensureLib() + if (!_SendInput) { + throw new Error("Failed to load SendInput from user32.dll") + } + return _SendInput(count, events, size) as number +} + +export function CreateSyntheticPointerDevice( + pointerType: number, + maxCount: number, + mode: number, +): unknown { + ensureLib() + if (!_CreateSyntheticPointerDevice) { + throw new Error( + "Failed to load CreateSyntheticPointerDevice from user32.dll", + ) + } + return _CreateSyntheticPointerDevice(pointerType, maxCount, mode) +} + +export function InjectPointerInput( + device: unknown, + pointerInfo: unknown, + count: number, +): number { + if (!device) { + throw new Error("Invalid device handle") + } + if (count < 0 || count > 100) { + throw new Error(`Invalid pointer count: ${count}`) + } + ensureLib() + if (!_InjectPointerInput) { + throw new Error("Failed to load InjectPointerInput from user32.dll") + } + return _InjectPointerInput(device, pointerInfo, count) as number +} diff --git a/packages/rein-input/src/windows/touch.ts b/packages/rein-input/src/windows/touch.ts new file mode 100644 index 00000000..dc130b0d --- /dev/null +++ b/packages/rein-input/src/windows/touch.ts @@ -0,0 +1,195 @@ +import koffi from "koffi" +import { CreateSyntheticPointerDevice, InjectPointerInput } from "./structs" +import { + PT_TOUCHPAD, + POINTER_FEEDBACK_DEFAULT, + POINTER_FLAG_NEW, + POINTER_FLAG_INRANGE, + POINTER_FLAG_INCONTACT, + POINTER_FLAG_PRIMARY, + POINTER_FLAG_DOWN, + POINTER_FLAG_UPDATE, + POINTER_FLAG_UP, + TOUCH_MASK_CONTACTAREA, + MAX_CONTACTS, +} from "./constants" +import type { TouchContact } from "../types" + +export class WindowsTouch { + private hDevice: bigint | null = null + private contactIdMap = new Map() + private freePointerIds: number[] = [] + private primarySourceId: number | null = null + private currentFrameId = 1 + + constructor() { + for (let i = MAX_CONTACTS - 1; i >= 0; i--) { + this.freePointerIds.push(i) + } + this.initialize() + } + + private initialize(): void { + if (this.hDevice) return + + const handle = CreateSyntheticPointerDevice( + PT_TOUCHPAD, + MAX_CONTACTS, + POINTER_FEEDBACK_DEFAULT, + ) + + if (handle) { + try { + this.hDevice = koffi.address(handle) + console.log("[WindowsTouch] Touch device initialized") + } catch (e) { + console.error("[WindowsTouch] Failed to initialize touch device:", e) + return + } + } else { + console.error("[WindowsTouch] Failed to create touch device") + } + } + + private getOrAllocPointerId(sourceId: number): number { + const existing = this.contactIdMap.get(sourceId) + if (existing !== undefined) return existing + + const id = this.freePointerIds.pop() + if (id === undefined) { + console.warn("[WindowsTouch] Max contacts reached") + throw new Error("Cannot allocate pointer ID: max contacts reached") + } + this.contactIdMap.set(sourceId, id) + return id + } + + injectTouch(contacts: TouchContact[]): void { + if (!this.hDevice || contacts.length === 0) return + + if (this.primarySourceId === null) { + const firstDown = contacts.find((c) => c.state === "down") + this.primarySourceId = firstDown ? firstDown.id : contacts[0].id + } + + const releasedIds: number[] = [] + const frame: Array<{ type: number; touchInfo: Record }> = + [] + + for (const contact of contacts) { + const winId = this.getOrAllocPointerId(contact.id) + let flags = POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT + + switch (contact.state) { + case "down": + flags |= POINTER_FLAG_DOWN | POINTER_FLAG_NEW + break + case "move": + flags |= POINTER_FLAG_UPDATE + break + case "up": + flags = (flags | POINTER_FLAG_UP) & ~POINTER_FLAG_INCONTACT + releasedIds.push(contact.id) + break + } + + if (contact.id === this.primarySourceId) { + flags |= POINTER_FLAG_PRIMARY + } + + const x = Math.round(contact.x) + const y = Math.round(contact.y) + const contactSize = 2 + + frame.push({ + type: PT_TOUCHPAD, + touchInfo: { + pointerInfo: { + pointerType: PT_TOUCHPAD, + pointerId: winId, + frameId: this.currentFrameId, + pointerFlags: flags, + sourceDevice: null, + hwndTarget: null, + ptPixelLocation: { x, y }, + ptHimetricLocation: { x: 0, y: 0 }, + ptPixelLocationRaw: { x: 0, y: 0 }, + ptHimetricLocationRaw: { x: 0, y: 0 }, + dwTime: 0, + historyCount: 0, + InputData: 0, + dwKeyStates: 0, + PerformanceCount: 0, + ButtonChangeType: 0, + }, + touchFlags: 0, + touchMask: TOUCH_MASK_CONTACTAREA, + rcContact: { + left: x - contactSize, + top: y - contactSize, + right: x + contactSize, + bottom: y + contactSize, + }, + rcContactRaw: { + left: x - contactSize, + top: y - contactSize, + right: x + contactSize, + bottom: y + contactSize, + }, + orientation: 0, + pressure: 512, + }, + }) + } + + frame.sort( + (a, b) => + (a.touchInfo as { pointerInfo: { pointerId: number } }).pointerInfo + .pointerId - + (b.touchInfo as { pointerInfo: { pointerId: number } }).pointerInfo + .pointerId, + ) + + try { + if (InjectPointerInput(this.hDevice, frame, frame.length)) { + this.currentFrameId = (this.currentFrameId % 0xffffffff) + 1 + } + } catch (e) { + console.error("[WindowsTouch] Error injecting pointer input:", e) + } + + for (const id of releasedIds) { + const winId = this.contactIdMap.get(id) + if (winId !== undefined) { + this.contactIdMap.delete(id) + if (!this.freePointerIds.includes(winId)) { + this.freePointerIds.push(winId) + } + } + } + + if (this.contactIdMap.size === 0) { + this.primarySourceId = null + } + } + + destroy(): void { + if (this.hDevice) { + const releases: TouchContact[] = [] + for (const sourceId of this.contactIdMap.keys()) { + releases.push({ id: sourceId, x: 0, y: 0, state: "up" }) + } + if (releases.length > 0) { + this.injectTouch(releases) + } + + this.hDevice = null + this.contactIdMap.clear() + this.freePointerIds = [] + for (let i = MAX_CONTACTS - 1; i >= 0; i--) { + this.freePointerIds.push(i) + } + this.primarySourceId = null + } + } +} diff --git a/packages/rein-input/test/factory.test.ts b/packages/rein-input/test/factory.test.ts new file mode 100644 index 00000000..54dfa0a3 --- /dev/null +++ b/packages/rein-input/test/factory.test.ts @@ -0,0 +1,66 @@ +import { describe, it, expect, vi } from "vitest" +import { createInputInjector, StubInputInjector } from "../src/factory" +import { DEFAULT_CONFIG } from "../src/constants" + +describe("createInputInjector & StubInputInjector", () => { + describe("StubInputInjector", () => { + it("safely handles all injector methods without throwing", () => { + const warnings: string[] = [] + const stub = new StubInputInjector(DEFAULT_CONFIG, (method) => { + warnings.push(method) + }) + + expect(() => stub.injectMouseMove(10, 10)).not.toThrow() + expect(() => stub.injectMouseButton("left", true)).not.toThrow() + expect(() => stub.injectMouseButton("left", false)).not.toThrow() + expect(() => stub.injectMouseWheel(0, 5)).not.toThrow() + expect(() => stub.injectKey("enter")).not.toThrow() + expect(() => stub.injectCombo(["control", "c"])).not.toThrow() + expect(() => stub.injectText("hello")).not.toThrow() + expect(() => + stub.injectTouch([{ id: 1, x: 100, y: 100, state: "down" }]), + ).not.toThrow() + expect(() => stub.updateConfig({ sensitivity: 2.0 })).not.toThrow() + expect(() => stub.destroy()).not.toThrow() + + expect(warnings).toContain("injectMouseMove") + expect(warnings).toContain("injectMouseButton") + expect(warnings).toContain("injectMouseWheel") + expect(warnings).toContain("injectKey") + expect(warnings).toContain("injectCombo") + expect(warnings).toContain("injectText") + expect(warnings).toContain("injectTouch") + }) + }) + + describe("createInputInjector factory", () => { + it("returns a StubInputInjector for unsupported platforms without throwing", () => { + const onError = vi.fn() + const injector = createInputInjector({ + platform: "aix" as NodeJS.Platform, + onError, + }) + + expect(injector).toBeInstanceOf(StubInputInjector) + expect(onError).toHaveBeenCalledWith( + "unsupported-platform", + expect.stringContaining("Unsupported platform: aix"), + ) + }) + + it("instantiates StubInputInjector when unknown platform string is provided", () => { + const injector = createInputInjector({ + platform: "freebsd" as NodeJS.Platform, + }) + expect(injector).toBeInstanceOf(StubInputInjector) + }) + + it("handles direct Partial argument gracefully", () => { + const injector = createInputInjector({ + sensitivity: 1.5, + screenWidth: 2560, + }) + expect(injector).toBeDefined() + }) + }) +}) diff --git a/packages/rein-input/test/keyMap.test.ts b/packages/rein-input/test/keyMap.test.ts new file mode 100644 index 00000000..4ae288bc --- /dev/null +++ b/packages/rein-input/test/keyMap.test.ts @@ -0,0 +1,99 @@ +import { describe, it, expect } from "vitest" +import { resolveChar } from "../src/utils" +import { + VK_MAP, + LINUX_KEY_MAP, + MAC_KEY_MAP, + SHIFTED_CHARS, +} from "../src/keyMap" + +describe("keyMap & resolveChar utilities", () => { + describe("resolveChar", () => { + it("resolves lowercase letters directly without shift", () => { + const res = resolveChar("a", LINUX_KEY_MAP) + expect(res).toEqual({ code: LINUX_KEY_MAP.a, shifted: false }) + }) + + it("resolves uppercase letters with shifted: true", () => { + const res = resolveChar("A", LINUX_KEY_MAP) + expect(res).toEqual({ code: LINUX_KEY_MAP.a, shifted: true }) + }) + + it("resolves special shifted characters like '!' to base character code with shift", () => { + const res = resolveChar("!", LINUX_KEY_MAP) + expect(res).toEqual({ code: LINUX_KEY_MAP["1"], shifted: true }) + }) + + it("resolves shifted symbol '$' to '4' code with shift", () => { + const res = resolveChar("$", MAC_KEY_MAP) + expect(res).toEqual({ code: MAC_KEY_MAP["4"], shifted: true }) + }) + + it("resolves direct punctuation without shift", () => { + const res = resolveChar("-", LINUX_KEY_MAP) + expect(res).toEqual({ code: LINUX_KEY_MAP["-"], shifted: false }) + }) + + it("returns undefined code and shifted false for unknown characters", () => { + const res = resolveChar("🚀", LINUX_KEY_MAP) + expect(res).toEqual({ code: undefined, shifted: false }) + }) + }) + + describe("Keymap Integrity", () => { + it("VK_MAP contains essential modifier and function keys", () => { + expect(VK_MAP.shift).toBe(0x10) + expect(VK_MAP.control).toBe(0x11) + expect(VK_MAP.alt).toBe(0x12) + expect(VK_MAP.space).toBe(0x20) + expect(VK_MAP.enter).toBe(0x0d) + expect(VK_MAP.escape).toBe(0x1b) + expect(VK_MAP.f1).toBe(0x70) + expect(VK_MAP.audioplay).toBe(0xb3) + }) + + it("LINUX_KEY_MAP contains essential uinput key codes", () => { + expect(LINUX_KEY_MAP.shift).toBe(0x2a) + expect(LINUX_KEY_MAP.control).toBe(0x1d) + expect(LINUX_KEY_MAP.alt).toBe(0x38) + expect(LINUX_KEY_MAP.meta).toBe(0x7d) + expect(LINUX_KEY_MAP.space).toBe(0x39) + expect(LINUX_KEY_MAP.enter).toBe(0x1c) + expect(LINUX_KEY_MAP.audiomute).toBe(0x71) + }) + + it("MAC_KEY_MAP contains essential virtual key codes", () => { + expect(MAC_KEY_MAP.shift).toBe(0x38) + expect(MAC_KEY_MAP.control).toBe(0x3b) + expect(MAC_KEY_MAP.command).toBe(0x37) + expect(MAC_KEY_MAP.option).toBe(0x3a) + expect(MAC_KEY_MAP.space).toBe(0x31) + expect(MAC_KEY_MAP.return).toBe(0x24) + expect(MAC_KEY_MAP.audiomute).toBe(0x4a) + }) + + it("SHIFTED_CHARS covers common US keyboard shifted symbols", () => { + expect(SHIFTED_CHARS["!"]).toBe("1") + expect(SHIFTED_CHARS["@"]).toBe("2") + expect(SHIFTED_CHARS["#"]).toBe("3") + expect(SHIFTED_CHARS.$).toBe("4") + expect(SHIFTED_CHARS["%"]).toBe("5") + expect(SHIFTED_CHARS["^"]).toBe("6") + expect(SHIFTED_CHARS["&"]).toBe("7") + expect(SHIFTED_CHARS["*"]).toBe("8") + expect(SHIFTED_CHARS["("]).toBe("9") + expect(SHIFTED_CHARS[")"]).toBe("0") + expect(SHIFTED_CHARS._).toBe("-") + expect(SHIFTED_CHARS["+"]).toBe("=") + expect(SHIFTED_CHARS["{"]).toBe("[") + expect(SHIFTED_CHARS["}"]).toBe("]") + expect(SHIFTED_CHARS["|"]).toBe("\\") + expect(SHIFTED_CHARS[":"]).toBe(";") + expect(SHIFTED_CHARS['"']).toBe("'") + expect(SHIFTED_CHARS["<"]).toBe(",") + expect(SHIFTED_CHARS[">"]).toBe(".") + expect(SHIFTED_CHARS["?"]).toBe("/") + expect(SHIFTED_CHARS["~"]).toBe("`") + }) + }) +}) diff --git a/packages/rein-input/test/motion.test.ts b/packages/rein-input/test/motion.test.ts new file mode 100644 index 00000000..9aa6aaca --- /dev/null +++ b/packages/rein-input/test/motion.test.ts @@ -0,0 +1,62 @@ +import { describe, it, expect } from "vitest" +import { applyMotion } from "../src/utils" +import { DEFAULT_CONFIG, ACCEL_FACTOR, ACCEL_EXPONENT } from "../src/constants" +import type { InputConfig } from "../src/types" + +describe("applyMotion utility", () => { + it("returns (0, 0) when dx and dy are 0", () => { + const result = applyMotion(0, 0, DEFAULT_CONFIG) + expect(result).toEqual({ ax: 0, ay: 0 }) + }) + + it("applies sensitivity scaling linearly without acceleration", () => { + const config: InputConfig = { + ...DEFAULT_CONFIG, + sensitivity: 2.0, + acceleration: false, + } + const result = applyMotion(5, -10, config) + expect(result.ax).toBe(10) + expect(result.ay).toBe(-20) + }) + + it("returns linear motion when magnitude is below ACCEL_THRESHOLD even with acceleration enabled", () => { + const config: InputConfig = { + ...DEFAULT_CONFIG, + sensitivity: 0.5, + acceleration: true, + } + // dx=1, dy=0 => mag = 0.5 < ACCEL_THRESHOLD (1) + const result = applyMotion(1, 0, config) + expect(result.ax).toBe(0.5) + expect(result.ay).toBe(0) + }) + + it("applies non-linear exponential curve when magnitude exceeds ACCEL_THRESHOLD", () => { + const config: InputConfig = { + ...DEFAULT_CONFIG, + sensitivity: 1.0, + acceleration: true, + } + const dx = 10 + const dy = 0 + const mag = 10 + const expectedAcc = mag ** ACCEL_EXPONENT * ACCEL_FACTOR + const expectedAx = mag * (expectedAcc / mag) + + const result = applyMotion(dx, dy, config) + expect(result.ax).toBeCloseTo(expectedAx, 5) + expect(result.ay).toBe(0) + }) + + it("preserves directional ratio on diagonal motion", () => { + const config: InputConfig = { + ...DEFAULT_CONFIG, + sensitivity: 1.5, + acceleration: true, + } + const result = applyMotion(10, 10, config) + expect(result.ax).toBe(result.ay) + expect(result.ax).toBeGreaterThan(15) // Accelerated beyond linear (10 * 1.5) + }) +}) diff --git a/packages/rein-input/test/platform-injectors.test.ts b/packages/rein-input/test/platform-injectors.test.ts new file mode 100644 index 00000000..a80c435b --- /dev/null +++ b/packages/rein-input/test/platform-injectors.test.ts @@ -0,0 +1,30 @@ +import { describe, it, expect } from "vitest" +import { LinuxInputInjector } from "../src/linux" +import { MacInputInjector } from "../src/mac" +import { WindowsInputInjector } from "../src/windows" + +describe("Platform Injectors Platform Guard", () => { + it("LinuxInputInjector throws on non-linux systems", () => { + if (process.platform !== "linux") { + expect(() => new LinuxInputInjector()).toThrow( + "LinuxInputInjector can only be used on Linux", + ) + } + }) + + it("MacInputInjector throws on non-darwin systems", () => { + if (process.platform !== "darwin") { + expect(() => new MacInputInjector()).toThrow( + "MacInputInjector can only be used on macOS", + ) + } + }) + + it("WindowsInputInjector throws on non-win32 systems", () => { + if (process.platform !== "win32") { + expect(() => new WindowsInputInjector()).toThrow( + "WindowsInputInjector can only be used on Windows", + ) + } + }) +}) diff --git a/packages/rein-input/tsconfig.json b/packages/rein-input/tsconfig.json new file mode 100644 index 00000000..7dd25ef5 --- /dev/null +++ b/packages/rein-input/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022"], + "types": ["node"], + "rootDir": "./src", + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "./dist", + "strict": true, + "skipLibCheck": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*"] +} diff --git a/src/components/Trackpad/ScreenShareConsent.tsx b/src/components/Trackpad/ScreenShareConsent.tsx new file mode 100644 index 00000000..d1af8bbf --- /dev/null +++ b/src/components/Trackpad/ScreenShareConsent.tsx @@ -0,0 +1,62 @@ +"use client" + +import { useState } from "react" +import { ScreenShare, ShieldAlert } from "lucide-react" +import { t } from "../../utils/i18n" + +interface ScreenShareConsentProps { + onAllow: () => void +} + +export const ScreenShareConsent = ({ onAllow }: ScreenShareConsentProps) => { + const [denied, setDenied] = useState(false) + + return ( +
+
+
+ {denied ? ( + + ) : ( + + )} +
+ +
+

+ {denied + ? t("screenShareConsent", "deniedTitle") + : t("screenShareConsent", "title")} +

+

+ {denied + ? t("screenShareConsent", "deniedDescription") + : t("screenShareConsent", "description")} +

+
+
+
+ + {!denied && ( + + )} +
+
+
+ ) +} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 2463a92e..cac4c23a 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -9,19 +9,14 @@ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. import { Route as rootRouteImport } from './routes/__root' -import { Route as IndexRouteImport } from './routes/index' -import { Route as DebugRouteImport } from './routes/debug' -import { Route as SettingsRouteImport } from './routes/settings' import { Route as TrackpadRouteImport } from './routes/trackpad' +import { Route as SettingsRouteImport } from './routes/settings' +import { Route as DebugRouteImport } from './routes/debug' +import { Route as IndexRouteImport } from './routes/index' -const IndexRoute = IndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => rootRouteImport, -} as any) -const DebugRoute = DebugRouteImport.update({ - id: '/debug', - path: '/debug', +const TrackpadRoute = TrackpadRouteImport.update({ + id: '/trackpad', + path: '/trackpad', getParentRoute: () => rootRouteImport, } as any) const SettingsRoute = SettingsRouteImport.update({ @@ -29,9 +24,14 @@ const SettingsRoute = SettingsRouteImport.update({ path: '/settings', getParentRoute: () => rootRouteImport, } as any) -const TrackpadRoute = TrackpadRouteImport.update({ - id: '/trackpad', - path: '/trackpad', +const DebugRoute = DebugRouteImport.update({ + id: '/debug', + path: '/debug', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', getParentRoute: () => rootRouteImport, } as any) @@ -71,18 +71,11 @@ export interface RootRouteChildren { declare module '@tanstack/react-router' { interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexRouteImport - parentRoute: typeof rootRouteImport - } - '/debug': { - id: '/debug' - path: '/debug' - fullPath: '/debug' - preLoaderRoute: typeof DebugRouteImport + '/trackpad': { + id: '/trackpad' + path: '/trackpad' + fullPath: '/trackpad' + preLoaderRoute: typeof TrackpadRouteImport parentRoute: typeof rootRouteImport } '/settings': { @@ -92,11 +85,18 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof SettingsRouteImport parentRoute: typeof rootRouteImport } - '/trackpad': { - id: '/trackpad' - path: '/trackpad' - fullPath: '/trackpad' - preLoaderRoute: typeof TrackpadRouteImport + '/debug': { + id: '/debug' + path: '/debug' + fullPath: '/debug' + preLoaderRoute: typeof DebugRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport parentRoute: typeof rootRouteImport } } diff --git a/src/routes/trackpad.tsx b/src/routes/trackpad.tsx index 86665ce6..85086457 100644 --- a/src/routes/trackpad.tsx +++ b/src/routes/trackpad.tsx @@ -9,6 +9,7 @@ import { useRemoteConnection } from "../hooks/useRemoteConnection" import { useTrackpadGesture } from "../hooks/useTrackpadGesture" import { ScreenMirror } from "../components/Trackpad/ScreenMirror" import { ErrorComponent } from "../components/Trackpad/ErrorComponent" +import { ScreenShareConsent } from "../components/Trackpad/ScreenShareConsent" import { useWebRtcStream } from "../hooks/useWebRtcStream" export const Route = createFileRoute("/trackpad")({ @@ -42,6 +43,7 @@ function TrackpadPage() { const isComposingRef = useRef(false) const [keyboardOpen, setKeyboardOpen] = useState(false) const [extraKeysVisible, setExtraKeysVisible] = useState(true) + const [screenShareConsented, setScreenShareConsented] = useState(false) const { status, send, sendCombo } = useRemoteConnection() const { trackActive, @@ -51,7 +53,7 @@ function TrackpadPage() { connecting, reconnect, } = useWebRtcStream({ - token, + token: screenShareConsented ? token : null, }) // Send input actions safely over WebRTC DataChannels @@ -217,7 +219,9 @@ function TrackpadPage() { scrollMode={scrollMode} handlers={handlers} /> - {error && errorHandle ? ( + {!screenShareConsented ? ( + setScreenShareConsented(true)} /> + ) : error && errorHandle ? ( ): void { @@ -298,19 +272,3 @@ function isValidButton(button: unknown): button is MouseButton { (VALID_BUTTONS as readonly string[]).includes(button) ) } - -function createStubInjector(): PlatformInjector { - const warn = (method: string) => - console.warn(`[InputHandler] ${method} called on unsupported platform`) - return { - updateConfig: () => {}, - injectMouseMove: () => warn("injectMouseMove"), - injectMouseButton: () => warn("injectMouseButton"), - injectMouseWheel: () => warn("injectMouseWheel"), - injectKey: () => warn("injectKey"), - injectCombo: () => warn("injectCombo"), - injectText: () => warn("injectText"), - injectTouch: () => warn("injectTouch"), - destroy: () => {}, - } -} diff --git a/src/server/drivers/index.ts b/src/server/drivers/index.ts new file mode 100644 index 00000000..372eb382 --- /dev/null +++ b/src/server/drivers/index.ts @@ -0,0 +1,6 @@ +/** + * Cross-platform native input injection layer. + * Re-exports the standalone @aossie/rein-input library for backward compatibility. + */ + +export * from "@aossie/rein-input" diff --git a/src/server/drivers/linux/structs.ts b/src/server/drivers/linux/structs.ts index fc9e1c0c..f10a2794 100644 --- a/src/server/drivers/linux/structs.ts +++ b/src/server/drivers/linux/structs.ts @@ -41,7 +41,6 @@ let _open: KoffiFunc | null = null let _close: KoffiFunc | null = null let _write: KoffiFunc | null = null let _ioctl: KoffiFunc | null = null -export let _dummyBuffer: Buffer | null = null function ensureLibc() { if (!_libc) { @@ -53,7 +52,6 @@ function ensureLibc() { "int64 write(int fd, const input_event *buf, size_t count)", ) _ioctl = _libc.func("int ioctl(int fd, unsigned long request, ...)") - _dummyBuffer = Buffer.alloc(1) } } diff --git a/src/server/drivers/mac/structs.ts b/src/server/drivers/mac/structs.ts index 39ef6527..900c34f8 100644 --- a/src/server/drivers/mac/structs.ts +++ b/src/server/drivers/mac/structs.ts @@ -23,9 +23,7 @@ let _CGEventCreateKeyboardEvent: koffi.KoffiFunction | null = null let _CGEventCreateScrollWheelEvent: koffi.KoffiFunction | null = null let _CGEventPost: koffi.KoffiFunction | null = null let _CFRelease: koffi.KoffiFunction | null = null -let _CGEventSetIntegerValueField: koffi.KoffiFunction | null = null -export let _CGEventSetDoubleValueField: koffi.KoffiFunction | null = null -export let _CGEventGetLocation: koffi.KoffiFunction | null = null +const _CGEventSetIntegerValueField: koffi.KoffiFunction | null = null function ensureFunctions() { const lib = cg() @@ -47,19 +45,6 @@ function ensureFunctions() { // void CFRelease(CFTypeRef cf) _CFRelease = lib.func("void CFRelease(void *)") - - // void CGEventSetIntegerValueField(CGEventRef, CGEventField, int64) - _CGEventSetIntegerValueField = lib.func( - "void CGEventSetIntegerValueField(void *, uint32, int64)", - ) - - // void CGEventSetDoubleValueField(CGEventRef, CGEventField, double) - _CGEventSetDoubleValueField = lib.func( - "void CGEventSetDoubleValueField(void *, uint32, double)", - ) - - // CGPoint CGEventGetLocation(CGEventRef) - _CGEventGetLocation = lib.func("CGPoint CGEventGetLocation(void *)") } } diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts index 48cef3e3..6527139b 100644 --- a/src/utils/i18n.ts +++ b/src/utils/i18n.ts @@ -82,6 +82,17 @@ export const i18n = { minutesAgo: "{m}m ago", hoursAgo: "{h}h ago", }, + screenShareConsent: { + title: "Allow Screen Sharing?", + description: + "This device wants to view and control the host's screen. Only allow this if you trust the source.", + allow: "Allow", + deny: "Deny", + deniedTitle: "Screen Sharing Denied", + deniedDescription: + "You denied the screen sharing request. You can allow it below to continue.", + tryAgain: "Try Again", + }, }, } as const diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 8b53f8b4..f8dbcf84 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -58,16 +58,8 @@ if (verboseLogs) { } // Optional: Intercept standard console.log and redirect to winston - -const serialize = (a: unknown): string => { - if (typeof a === "string") return a - if (a instanceof Error) return a.stack || a.message - try { - return JSON.stringify(a) - } catch { - return String(a) - } -} +const serialize = (a: unknown): string => + typeof a === "string" ? a : JSON.stringify(a) console.log = (...args: unknown[]) => { logger.info(args.map(serialize).join(" ")) diff --git a/tsconfig.json b/tsconfig.json index 1addc4c0..3f53c925 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,9 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true, "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@aossie/rein-input": ["./packages/rein-input/src/index.ts"], + "@aossie/rein-input/*": ["./packages/rein-input/src/*"] } } } diff --git a/vitest.config.ts b/vitest.config.ts index 217f7ddf..ef596377 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,10 +5,11 @@ export default defineConfig({ resolve: { alias: { "@": path.resolve(__dirname, "./src"), + "@aossie/rein-input": path.resolve(__dirname, "./packages/rein-input/src"), }, }, test: { environment: "node", - include: ["src/**/*.test.ts"], + include: ["src/**/*.test.ts", "packages/**/*.test.ts"], }, })