diff --git a/.github/renovate.json b/.github/renovate.json index 5c47c052..2a125ab7 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -11,25 +11,33 @@ "schedule:weekly" ], "dependencyDashboard": false, + "ignorePaths": [ + "**/packages/light-adjustment-gpu/model/**" + ], "packageRules": [ { - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "platformAutomerge": true, - "automerge": true - }, - { - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "matchPackagePatterns": ["eslint"], - "groupName": "eslint", + "matchUpdateTypes": [ + "minor", + "patch", + "pin", + "digest" + ], "platformAutomerge": true, "automerge": true }, { - "matchUpdateTypes": ["minor", "patch", "pin", "digest"], - "matchPackagePatterns": ["rollup"], + "matchUpdateTypes": [ + "minor", + "patch", + "pin", + "digest" + ], + "matchPackagePatterns": [ + "rollup" + ], "groupName": "rollup", "platformAutomerge": true, "automerge": true } ] -} +} \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e5a1612e..4c346ebb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: goto-bus-stop/setup-zig@v2 - run: zig version - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - uses: pnpm/action-setup@v2 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ae8a75fa..05093c20 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -42,7 +42,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -53,7 +53,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -67,4 +67,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cbdba615..ecf2f1ed 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v4 - uses: goto-bus-stop/setup-zig@v2 - run: zig version - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: "18" - uses: pnpm/action-setup@v2 @@ -60,4 +60,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v3 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..699ed733 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["biomejs.biome"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..6ce2adb8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,20 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "editor.codeActionsOnSave": { + "quickfix.biome": "explicit", + "source.organizeImports.biome": "explicit" + } +} diff --git a/CHANGES.md b/CHANGES.md index 79556129..42fe189b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,11 +11,24 @@ ## develop -- [FIX] Zig の組み込みのキャスト関数xToYがyFromXにリネームされたので対応 +- [FIX] Zig の WebAssembly ビルドで addSharedLibrary から addBinary を使うよう変更になったので対応 + - https://ziglang.org/documentation/master/#Freestanding + - https://github.com/ziglang/zig/pull/17815 +- [FIX] zig で std.mem.copy ではなく @memcpy を使うようにする + - https://github.com/ziglang/zig/pull/18143 + - @voluntas +- [FIX] Zig の組み込みのキャスト関数 xToY が yFromX にリネームされたので対応 - @kounoike - [FIX] Zig の `@truncate` やキャスト関連に破壊的変更があったため対応 - @kounoike +## light-adjustment-gpu-2023.1.1 + +- [FIX] ライト調整 GPU 版の semantic_guided_llie_324x240 のパラメータが間違っていたのを修正 + - @kounoike +- [FIX] image-to-image-video-processor だけ TypeScript 5.2.2 に固定する + - @voluntas + ## light-adjustment-gpu-2023.1.0 **初リリース** @@ -23,12 +36,12 @@ - [ADD] 推論ベースの Low-Light-Image-Enhancement を行う @shiguredo/light-adjustment-gpu パッケージを追加 - 暗い画像に対してコントラストを改善したり、逆光で暗くなっている人物を明るくすることができる - 内部的には @shiguredo/image-to-image-video-processor を利用する - - https://github.com/PINTO0309/PINTO_model_zoo/tree/main/370_Semantic-Guided-Low-Light-Image-Enhancement のモデルをtfjsに変換して使用する + - https://github.com/PINTO0309/PINTO_model_zoo/tree/main/370_Semantic-Guided-Low-Light-Image-Enhancement のモデルを tfjs に変換して使用する - @kounoike -- [ADD] 画像→画像の推論を行う際に使える @shiguredo/image-to-image-video-processor パッケージを追加する - - Tensorflow.jsを使い、画像→画像の何らかの推論を行う +- [ADD] 画像 → 画像の推論を行う際に使える @shiguredo/image-to-image-video-processor パッケージを追加する + - Tensorflow.js を使い、画像 → 画像の何らかの推論を行う - 推論前後のリサイズ処理を入力解像度に合わせて自動的に行う - - Low Light Image Enhancementのような明るさ補正、超解像、ノイズ除去などの推論で使われることを想定している + - Low Light Image Enhancement のような明るさ補正、超解像、ノイズ除去などの推論で使われることを想定している - @kounoike - [CHANGE] tsconfig.json の compilerOptions の lib を es2015 から es2020 に変更する - @voluntas @@ -42,7 +55,7 @@ ## virtual-background-2023.2.0 -- [UPDATE] CPU-GPUの転送を減らして背景ぼかし処理を高速化 +- [UPDATE] CPU-GPU の転送を減らして背景ぼかし処理を高速化 - @kounoike - [UPDATE] GitHub Actions に Node 20 を追加 - @voluntas @@ -118,30 +131,30 @@ ## noise-suppression-2022.4.1 -- [FIX] 公開APIに含まれる型を定義しているパッケージをdependenciesに追加 +- [FIX] 公開 API に含まれる型を定義しているパッケージを dependencies に追加 - https://github.com/shiguredo/media-processors/pull/26 - @sile ## virtual-background-2022.4.1 -- [FIX] 公開APIに含まれる型を定義しているパッケージをdependenciesに追加 +- [FIX] 公開 API に含まれる型を定義しているパッケージを dependencies に追加 - https://github.com/shiguredo/media-processors/pull/26 - @sile ## noise-suppression-2022.4.0 -- [ADD] RNNoiseモデルの差し替えに対応 +- [ADD] RNNoise モデルの差し替えに対応 - https://github.com/shiguredo/media-processors/pull/15 - @sile -- [ADD] 処理適用前後のメディアトラックを取得するためのAPIを追加 +- [ADD] 処理適用前後のメディアトラックを取得するための API を追加 - https://github.com/shiguredo/media-processors/pull/25 - @sile ## virtual-background-2022.4.0 -- [ADD] 処理適用前後のメディアトラックを取得するためのAPIを追加 +- [ADD] 処理適用前後のメディアトラックを取得するための API を追加 - https://github.com/shiguredo/media-processors/pull/25 - @sile diff --git a/README.md b/README.md index aae40d43..ba98e3f9 100644 --- a/README.md +++ b/README.md @@ -16,20 +16,27 @@ Please read https://github.com/shiguredo/oss/blob/master/README.en.md before use ## 方針 -- 動作するブラウザは最新の Chrome または Edge のみです。それ以外のブラウザでは動作しません - - iOS の Chrome や Edge では動作しません +対応ブラウザは最新の Chrome または Edge です。それ以外のブラウザでは動作しません。 + +ただし、以下の機能は Safari でも動作します。 + +- 仮想背景 / 背景ぼかし +- ライト調整 +- ライト調整(GPU版) ## 機能 - [仮想背景 / 背景ぼかし](https://github.com/shiguredo/media-processors/tree/develop/packages/virtual-background) - [ノイズ抑制](https://github.com/shiguredo/media-processors/tree/develop/packages/noise-suppression) - [ライト調整](https://github.com/shiguredo/media-processors/tree/develop/packages/light-adjustment) +- [ライト調整(GPU版)](https://github.com/shiguredo/media-processors/tree/develop/packages/light-adjustment-gpu) ## npm - [@shiguredo/virtual\-background \- npm](https://www.npmjs.com/package/@shiguredo/virtual-background) - [@shiguredo/noise\-suppression \- npm](https://www.npmjs.com/package/@shiguredo/noise-suppression) - [@shiguredo/light\-adjustment \- npm](https://www.npmjs.com/package/@shiguredo/light-adjustment) +- [@shiguredo/light\-adjustment\-gpu \- npm](https://www.npmjs.com/package/@shiguredo/light-adjustment-gpu) ## サンプル @@ -38,6 +45,7 @@ GitHub Pages にサンプルを用意しています。完全にクライアン - [仮想背景 / 背景ぼかし](https://shiguredo.github.io/media-processors/examples/virtual-background.html) - [ノイズ抑制](https://shiguredo.github.io/media-processors/examples/noise-suppression.html) - [ライト調整](https://shiguredo.github.io/media-processors/examples/light-adjustment) +- [ライト調整(GPU版)](https://shiguredo.github.io/media-processors/examples/light-adjustment-gpu) ## 優先実装 diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..d882ece5 --- /dev/null +++ b/biome.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.4.0/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "ignore": [], + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100 + }, + "json": { + "parser": { + "allowComments": true + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100 + } + }, + "javascript": { + "formatter": { + "enabled": true, + "quoteStyle": "single", + "jsxQuoteStyle": "double", + "trailingComma": "all", + "semicolons": "asNeeded", + "arrowParentheses": "always", + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100, + "quoteProperties": "asNeeded" + } + } +} \ No newline at end of file diff --git a/examples/video-multi-processors-gpu.html b/examples/video-multi-processors-gpu.html new file mode 100644 index 00000000..8cc78eaa --- /dev/null +++ b/examples/video-multi-processors-gpu.html @@ -0,0 +1,55 @@ + + + + Media Processors: ライト調整(GPU) + 仮想背景 + +

Media Processors: ライト調整(GPU) + 仮想背景

+ +

左: 処理後の映像、右: オリジナル映像

+ ライト調整: フレーム処理時間: 0.0 秒 フレームレート: 0.0FPS
+ 仮想背景: フレーム処理時間: 0.0 秒 フレームレート: 0.0FPS
+ + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..ed2d257a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2285 @@ +{ + "name": "media-processors", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "license": "Apache-2.0", + "dependencies": { + "@types/dom-mediacapture-transform": "0.1.9" + }, + "devDependencies": { + "@biomejs/biome": "1.5.2", + "@rollup/plugin-commonjs": "25.0.7", + "@rollup/plugin-node-resolve": "15.2.3", + "@rollup/plugin-typescript": "11.1.6", + "rollup": "4.9.5", + "rollup-plugin-copy": "3.5.0", + "serve": "14.2.1", + "tslib": "2.6.2", + "typedoc": "0.25.7", + "typescript": "5.3.3" + }, + "engines": { + "node": ">=18.17" + } + }, + "node_modules/@biomejs/biome": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.5.2.tgz", + "integrity": "sha512-LhycxGQBQLmfv6M3e4tMfn/XKcUWyduDYOlCEBrHXJ2mMth2qzYt1JWypkWp+XmU/7Hl2dKvrP4mZ5W44+nWZw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.5.2", + "@biomejs/cli-darwin-x64": "1.5.2", + "@biomejs/cli-linux-arm64": "1.5.2", + "@biomejs/cli-linux-arm64-musl": "1.5.2", + "@biomejs/cli-linux-x64": "1.5.2", + "@biomejs/cli-linux-x64-musl": "1.5.2", + "@biomejs/cli-win32-arm64": "1.5.2", + "@biomejs/cli-win32-x64": "1.5.2" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.5.2.tgz", + "integrity": "sha512-3JVl08aHKsPyf0XL9SEj1lssIMmzOMAn2t1zwZKBiy/mcZdb0vuyMSTM5haMQ/90wEmrkYN7zux777PHEGrGiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.5.2.tgz", + "integrity": "sha512-QAPW9rZb/AgucUx+ogMg+9eJNipQDqvabktC5Tx4Aqb/mFzS6eDqNP7O0SbGz3DtC5Y2LATEj6o6zKIQ4ZT+3w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.5.2.tgz", + "integrity": "sha512-fVLrUgIlo05rO4cNu+Py5EwwmXnXhWH+8KrNlWkr2weMYjq85SihUsuWWKpmqU+bUVR+m5gwfcIXZVWYVCJMHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.2.tgz", + "integrity": "sha512-Z29SjaOyO4QfajplNXSjLx17S79oPN42D094zjE24z7C7p3NxvLhKLygtSP9emgaXkcoESe2chOzF4IrGy/rlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.5.2.tgz", + "integrity": "sha512-ixqJtUHtF0ho1+1DTZQLAEwHGSqvmvHhAAFXZQoaSdABn+IcITYExlFVA3bGvASy/xtPjRhTx42hVwPtLwMHwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.2.tgz", + "integrity": "sha512-ZolquPEjWYUmGeERS8svHOOT7OXEeoriPnV8qptgWJmYF9EO9HUGRn1UtCvdVziDYK+u1A7PxjOdkY1B00ty5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.5.2.tgz", + "integrity": "sha512-DN4cXSAoFTdjOoh7f+JITj1uQgQSXt+1pVea9bFrpbgip+ZwkONqQq+jUcmFMMehbp9LuiVtNXFz/ReHn6FY7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.5.2.tgz", + "integrity": "sha512-YvWWXZmk936FdrXqc2jcP6rfsXsNBIs9MKBQQoVXIihwNNRiAaBD9Iwa/ouU1b7Zxq2zETgeuRewVJickFuVOw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.*" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", + "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", + "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", + "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", + "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", + "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", + "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", + "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", + "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", + "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", + "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", + "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", + "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", + "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", + "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/dom-mediacapture-transform": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.9.tgz", + "integrity": "sha512-/K96dASG23bqF+VAftybbI5SUj9qSsdsSKZglm7Bq/sIaEve5z8I+GdClARcSQMAAVkH7bc83UI1jiH/qc5LMw==", + "dependencies": { + "@types/dom-webcodecs": "*" + } + }, + "node_modules/@types/dom-webcodecs": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.11.tgz", + "integrity": "sha512-yPEZ3z7EohrmOxbk/QTAa0yonMFkNkjnVXqbGb7D4rMr+F1dGQ8ZUFxXkyLLJuiICPejZ0AZE9Rrk9wUCczx4A==" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", + "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@zeit/schemas": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", + "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dev": true, + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dev": true, + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", + "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.5", + "@rollup/rollup-android-arm64": "4.9.5", + "@rollup/rollup-darwin-arm64": "4.9.5", + "@rollup/rollup-darwin-x64": "4.9.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", + "@rollup/rollup-linux-arm64-gnu": "4.9.5", + "@rollup/rollup-linux-arm64-musl": "4.9.5", + "@rollup/rollup-linux-riscv64-gnu": "4.9.5", + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@rollup/rollup-linux-x64-musl": "4.9.5", + "@rollup/rollup-win32-arm64-msvc": "4.9.5", + "@rollup/rollup-win32-ia32-msvc": "4.9.5", + "@rollup/rollup-win32-x64-msvc": "4.9.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-copy": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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 + }, + "node_modules/serve": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz", + "integrity": "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==", + "dev": true, + "dependencies": { + "@zeit/schemas": "2.29.0", + "ajv": "8.11.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.5", + "update-check": "1.5.4" + }, + "bin": { + "serve": "build/main.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", + "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedoc": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.7.tgz", + "integrity": "sha512-m6A6JjQRg39p2ZVRIN3NKXgrN8vzlHhOS+r9ymUYtcUP/TIQPvWSq7YgE5ZjASfv5Vd5BW5xrir6Gm2XNNcOow==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.3", + "shiki": "^0.14.7" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "dev": true, + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 8cbb287a..ce13da0c 100644 --- a/package.json +++ b/package.json @@ -9,26 +9,22 @@ "start": "serve -S -l 8080 ." }, "dependencies": { - "@types/dom-mediacapture-transform": "0.1.7" + "@types/dom-mediacapture-transform": "0.1.9" }, "devDependencies": { + "@biomejs/biome": "1.5.2", "@rollup/plugin-commonjs": "25.0.7", "@rollup/plugin-node-resolve": "15.2.3", - "@rollup/plugin-typescript": "11.1.5", - "@typescript-eslint/eslint-plugin": "6.7.5", - "@typescript-eslint/parser": "6.7.5", - "eslint": "8.51.0", - "eslint-config-prettier": "9.0.0", - "eslint-plugin-prettier": "5.0.1", - "rollup": "4.1.4", + "@rollup/plugin-typescript": "11.1.6", + "rollup": "4.9.5", "rollup-plugin-copy": "3.5.0", "serve": "14.2.1", "tslib": "2.6.2", - "typedoc": "0.25.2", - "typescript": "5.2.2" + "typedoc": "0.25.7", + "typescript": "5.3.3" }, - "packageManager": "pnpm@8.9.2", + "packageManager": "pnpm@8.14.1", "engines": { "node": ">=18.17" } -} +} \ No newline at end of file diff --git a/packages/image-to-image-video-processor/.editorconfig b/packages/image-to-image-video-processor/.editorconfig deleted file mode 100644 index c6c8b362..00000000 --- a/packages/image-to-image-video-processor/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/image-to-image-video-processor/.eslintignore b/packages/image-to-image-video-processor/.eslintignore deleted file mode 100644 index df9377dd..00000000 --- a/packages/image-to-image-video-processor/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -examples diff --git a/packages/image-to-image-video-processor/.eslintrc.json b/packages/image-to-image-video-processor/.eslintrc.json deleted file mode 100644 index 08915040..00000000 --- a/packages/image-to-image-video-processor/.eslintrc.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/eslintrc.json", - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.json"] - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": ["error", { - "vars": "all", - "args": "all", - "argsIgnorePattern": "^_" - }], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"] - }, - { - "selector": "class", - "format": ["PascalCase"] - }, - { - "selector": "interface", - "format": ["PascalCase"] - }, - { - "selector": "typeAlias", - "format": ["PascalCase"] - }, - { - "selector": "objectLiteralProperty", - "format": ["camelCase", "snake_case"] - }, - { - "selector": "typeProperty", - "format": null - }, - { - "selector": "parameter", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "typeParameter", - "format": ["PascalCase"] - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"] - } - ], - "curly": "error" - } -} diff --git a/packages/image-to-image-video-processor/.prettierrc.json b/packages/image-to-image-video-processor/.prettierrc.json deleted file mode 100644 index 3a891926..00000000 --- a/packages/image-to-image-video-processor/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 120, - "semi": true, - "trailingComma": "es5" -} diff --git a/packages/image-to-image-video-processor/package.json b/packages/image-to-image-video-processor/package.json index 70961844..3f871446 100644 --- a/packages/image-to-image-video-processor/package.json +++ b/packages/image-to-image-video-processor/package.json @@ -8,8 +8,8 @@ "types": "dist/image_to_image_video_processor.d.ts", "scripts": { "build": "rollup -c ./rollup.config.mjs --bundleConfigAsCjs && tsc --emitDeclarationOnly", - "lint": "eslint --ext .ts ./src", - "fmt": "prettier --write src", + "lint": "biome lint ./src", + "fmt": "biome format --write src", "doc": "typedoc" }, "repository": { @@ -26,10 +26,9 @@ ], "devDependencies": { "@shiguredo/video-track-processor": "workspace:*", - "@tensorflow/tfjs": "^4.8.0", - "@tensorflow/tfjs-backend-webgl": "^4.8.0", - "@tensorflow/tfjs-backend-webgpu": "^4.8.0", - "@typescript-eslint/eslint-plugin": "5.60.0", - "@typescript-eslint/parser": "5.60.0" + "@tensorflow/tfjs": "4.16.0", + "@tensorflow/tfjs-backend-webgl": "4.16.0", + "@tensorflow/tfjs-backend-webgpu": "4.16.0", + "typescript": "5.3.3" } -} +} \ No newline at end of file diff --git a/packages/image-to-image-video-processor/src/image_to_image_video_processor.ts b/packages/image-to-image-video-processor/src/image_to_image_video_processor.ts index cc271ab6..980d5100 100644 --- a/packages/image-to-image-video-processor/src/image_to_image_video_processor.ts +++ b/packages/image-to-image-video-processor/src/image_to_image_video_processor.ts @@ -1,25 +1,27 @@ -import { VideoTrackProcessor } from "@shiguredo/video-track-processor"; -import "@tensorflow/tfjs-backend-webgl"; -import * as tf from "@tensorflow/tfjs"; +import { VideoTrackProcessor } from '@shiguredo/video-track-processor' +import * as tf from '@tensorflow/tfjs' +import '@tensorflow/tfjs-backend-webgl' /** * ImageToImageVideoProcessor で使うモデルのオプション */ export interface ImageToImageModelOptions { - modelPath: string; - inputWidth: number; - inputHeight: number; + modelPath: string + inputWidth: number + inputHeight: number // LLIEではinputWidth/Height = outputWidth/Heightだが、超解像を使う場合には必要なので作っておく - outputWidth: number; - outputHeight: number; + outputWidth: number + outputHeight: number // Semantic Guided Low-light Image Enhancementでは必要ないが、他のモデルを使う場合には必要なので作っておく - inputConverter?: (tensor: tf.Tensor3D) => tf.Tensor | tf.NamedTensorMap | tf.Tensor[]; - outputConverter?: (tensor: tf.Tensor | tf.Tensor[] | tf.NamedTensorMap) => tf.Tensor3D; + inputConverter?: ( + tensor: tf.Tensor3D, + ) => tf.Tensor | tf.NamedTensorMap | tf.Tensor[] + outputConverter?: (tensor: tf.Tensor | tf.Tensor[] | tf.NamedTensorMap) => tf.Tensor3D // 超解像用 - outputSizeIsModelOutputSize?: boolean; + outputSizeIsModelOutputSize?: boolean } -const customBackendName = "shiguredo-custom-webgl"; +const customBackendName = 'shiguredo-custom-webgl' /** * 動画ストリームに対して、画像から画像への変換を行う推論処理をtfjsで行う際の処理を共通化したユーティリティクラス @@ -30,56 +32,56 @@ export abstract class ImageToImageVideoProcessor { /** * 内部で使用するVideoTrackProcessorのインスタンスです */ - private trackProcessor: VideoTrackProcessor; + private trackProcessor: VideoTrackProcessor /** * 使用するモデルのオプションです */ - private modelOptions: ImageToImageModelOptions; + private modelOptions: ImageToImageModelOptions /* * 補正の強さ。元画像と補正画像をブレンディングする際の比率を0.0 から 1.0 の範囲で指定します */ - private strength: number; + private strength: number constructor(model: ImageToImageModelOptions, strength: number) { - this.trackProcessor = new VideoTrackProcessor(); - this.modelOptions = model; - this.strength = strength; + this.trackProcessor = new VideoTrackProcessor() + this.modelOptions = model + this.strength = strength } setStrength(strength: number): void { - this.strength = strength; + this.strength = strength } static isSupported(): boolean { - return VideoTrackProcessor.isSupported(); + return VideoTrackProcessor.isSupported() } async startProcessing(track: MediaStreamVideoTrack): Promise { - const inputResizeCanvas = document.createElement("canvas"); - inputResizeCanvas.width = this.modelOptions.inputWidth; - inputResizeCanvas.height = this.modelOptions.inputHeight; - const inputResizeCanvasCtx = inputResizeCanvas.getContext("2d", { willReadFrequently: true }); + const inputResizeCanvas = document.createElement('canvas') + inputResizeCanvas.width = this.modelOptions.inputWidth + inputResizeCanvas.height = this.modelOptions.inputHeight + const inputResizeCanvasCtx = inputResizeCanvas.getContext('2d', { willReadFrequently: true }) if (inputResizeCanvasCtx === null) { - throw new Error("Failed to get canvas context"); + throw new Error('Failed to get canvas context') } - const outputResizeCanvas = document.createElement("canvas"); + const outputResizeCanvas = document.createElement('canvas') if (this.modelOptions.outputSizeIsModelOutputSize) { - outputResizeCanvas.width = this.modelOptions.outputWidth; - outputResizeCanvas.height = this.modelOptions.outputHeight; + outputResizeCanvas.width = this.modelOptions.outputWidth + outputResizeCanvas.height = this.modelOptions.outputHeight } else { - outputResizeCanvas.width = track.getSettings().width ?? 0; - outputResizeCanvas.height = track.getSettings().height ?? 0; + outputResizeCanvas.width = track.getSettings().width ?? 0 + outputResizeCanvas.height = track.getSettings().height ?? 0 } - const outputResizeCanvasCtx = outputResizeCanvas.getContext("2d"); + const outputResizeCanvasCtx = outputResizeCanvas.getContext('2d') if (outputResizeCanvasCtx === null) { - throw new Error("Failed to get canvas context"); + throw new Error('Failed to get canvas context') } - const glCanvas = document.createElement("canvas"); - glCanvas.width = this.modelOptions.outputWidth; - glCanvas.height = this.modelOptions.outputHeight; + const glCanvas = document.createElement('canvas') + glCanvas.width = this.modelOptions.outputWidth + glCanvas.height = this.modelOptions.outputHeight - const gl = glCanvas.getContext("webgl2", { + const gl = glCanvas.getContext('webgl2', { alpha: true, antialias: false, premultipliedAlpha: false, @@ -87,118 +89,131 @@ export abstract class ImageToImageVideoProcessor { depth: false, stencil: false, failIfMajorPerformanceCaveat: true, - powerPreference: "low-power", - }); + powerPreference: 'low-power', + }) if (gl === null) { - throw new Error("Failed to get canvas/gl context"); + throw new Error('Failed to get canvas/gl context') } if (tf.getKernelsForBackend(customBackendName).length === 0) { - const kernels = tf.getKernelsForBackend("webgl"); - kernels.forEach((kernelConfig) => { - const newKernelConfig = { ...kernelConfig, backendName: customBackendName }; - tf.registerKernel(newKernelConfig); - }); + const kernels = tf.getKernelsForBackend('webgl') + kernels.filter((kernelConfig) => { + const newKernelConfig = { ...kernelConfig, backendName: customBackendName } + tf.registerKernel(newKernelConfig) + }) } tf.registerBackend(customBackendName, () => { - return new tf.MathBackendWebGL(new tf.GPGPUContext(gl)); - }); - - await tf.setBackend(customBackendName); - - const modelUrl = this.modelOptions.modelPath + "/model.json"; - const model = await tf.loadGraphModel(modelUrl); - - const frameBuffer = gl.createFramebuffer(); - - // eslint-disable-next-line @typescript-eslint/require-await - return this.trackProcessor.startProcessing(track, async (image: ImageBitmap | HTMLVideoElement) => { - inputResizeCanvasCtx.drawImage( - image, - 0, - 0, - image.width, - image.height, - 0, - 0, - this.modelOptions.inputWidth, - this.modelOptions.inputHeight - ); - if ( - !this.modelOptions.outputSizeIsModelOutputSize && - (outputResizeCanvas.width !== image.width || outputResizeCanvas.height !== image.height) - ) { - outputResizeCanvas.width = image.width; - outputResizeCanvas.height = image.height; - } - const inputConverter = this.modelOptions.inputConverter ?? ((img) => tf.div(tf.expandDims(img), 255.0)); - const output = tf.tidy(() => { - const img = tf.browser.fromPixels(inputResizeCanvas); - const inputTensor = inputConverter(img); - const outputTensor = model.predict(inputTensor); - if (this.modelOptions.outputConverter !== undefined) { - return this.modelOptions.outputConverter(outputTensor); - } else { - const outputRgb = (outputTensor as tf.Tensor4D).squeeze(); + return new tf.MathBackendWebGL(new tf.GPGPUContext(gl)) + }) + + await tf.setBackend(customBackendName) + + const modelUrl = `${this.modelOptions.modelPath}/model.json` + const model = await tf.loadGraphModel(modelUrl) + + const frameBuffer = gl.createFramebuffer() + + return this.trackProcessor.startProcessing( + track, + async (image: ImageBitmap | HTMLVideoElement) => { + inputResizeCanvasCtx.drawImage( + image, + 0, + 0, + image.width, + image.height, + 0, + 0, + this.modelOptions.inputWidth, + this.modelOptions.inputHeight, + ) + if ( + !this.modelOptions.outputSizeIsModelOutputSize && + (outputResizeCanvas.width !== image.width || outputResizeCanvas.height !== image.height) + ) { + outputResizeCanvas.width = image.width + outputResizeCanvas.height = image.height + } + const inputConverter = + this.modelOptions.inputConverter ?? ((img) => tf.div(tf.expandDims(img), 255.0)) + const output = tf.tidy(() => { + const img = tf.browser.fromPixels(inputResizeCanvas) + const inputTensor = inputConverter(img) + const outputTensor = model.predict(inputTensor) + if (this.modelOptions.outputConverter !== undefined) { + return this.modelOptions.outputConverter(outputTensor) + } + const outputRgb = (outputTensor as tf.Tensor4D).squeeze() const outputA = tf.fill( [this.modelOptions.outputHeight, this.modelOptions.outputWidth, 1], this.strength, - "float32" - ) as tf.Tensor3D; - return tf.concat3d([outputRgb as tf.Tensor3D, outputA], 2); + 'float32', + ) as tf.Tensor3D + return tf.concat3d([outputRgb as tf.Tensor3D, outputA], 2) + }) + const data = output.dataToGPU({ + customTexShape: [this.modelOptions.outputHeight, this.modelOptions.outputWidth], + }) + if (data.texture !== undefined) { + gl.bindTexture(gl.TEXTURE_2D, data.texture) + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true) + gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer) + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + data.texture, + 0, + ) + gl.bindTexture(gl.TEXTURE_2D, null) + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, frameBuffer) + gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null) + gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]) + gl.blitFramebuffer( + 0, + 0, + this.modelOptions.outputWidth, + this.modelOptions.outputHeight, + 0, + 0, + this.modelOptions.outputWidth, + this.modelOptions.outputHeight, + gl.COLOR_BUFFER_BIT, + gl.NEAREST, + ) + gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null) } - }); - const data = output.dataToGPU({ - customTexShape: [this.modelOptions.outputHeight, this.modelOptions.outputWidth], - }); - if (data.texture !== undefined) { - gl.bindTexture(gl.TEXTURE_2D, data.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, data.texture, 0); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.bindFramebuffer(gl.READ_FRAMEBUFFER, frameBuffer); - gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); - gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]); - gl.blitFramebuffer( - 0, - 0, - this.modelOptions.outputWidth, - this.modelOptions.outputHeight, + data.tensorRef.dispose() + output.dispose() + + if (this.modelOptions.outputSizeIsModelOutputSize) { + return glCanvas + } + outputResizeCanvasCtx.drawImage(image, 0, 0) + outputResizeCanvasCtx.drawImage( + glCanvas, 0, 0, - this.modelOptions.outputWidth, - this.modelOptions.outputHeight, - gl.COLOR_BUFFER_BIT, - gl.NEAREST - ); - gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null); - } - data.tensorRef.dispose(); - output.dispose(); - - if (this.modelOptions.outputSizeIsModelOutputSize) { - return glCanvas; - } else { - outputResizeCanvasCtx.drawImage(image, 0, 0); - outputResizeCanvasCtx.drawImage(glCanvas, 0, 0, outputResizeCanvas.width, outputResizeCanvas.height); - return outputResizeCanvas; - } - }); + outputResizeCanvas.width, + outputResizeCanvas.height, + ) + return outputResizeCanvas + }, + ) } stopProcessing() { - this.trackProcessor.stopProcessing(); + this.trackProcessor.stopProcessing() if (tf.getBackend() === customBackendName) { - tf.removeBackend(customBackendName); + tf.removeBackend(customBackendName) } } getFps() { - return this.trackProcessor.getFps(); + return this.trackProcessor.getFps() } getAverageProcessedTimeMs() { - return this.trackProcessor.getAverageProcessedTimeMs(); + return this.trackProcessor.getAverageProcessedTimeMs() } } diff --git a/packages/light-adjustment-gpu/.editorconfig b/packages/light-adjustment-gpu/.editorconfig deleted file mode 100644 index c6c8b362..00000000 --- a/packages/light-adjustment-gpu/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/light-adjustment-gpu/.eslintignore b/packages/light-adjustment-gpu/.eslintignore deleted file mode 100644 index df9377dd..00000000 --- a/packages/light-adjustment-gpu/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -examples diff --git a/packages/light-adjustment-gpu/.eslintrc.json b/packages/light-adjustment-gpu/.eslintrc.json deleted file mode 100644 index 08915040..00000000 --- a/packages/light-adjustment-gpu/.eslintrc.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/eslintrc.json", - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.json"] - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": ["error", { - "vars": "all", - "args": "all", - "argsIgnorePattern": "^_" - }], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"] - }, - { - "selector": "class", - "format": ["PascalCase"] - }, - { - "selector": "interface", - "format": ["PascalCase"] - }, - { - "selector": "typeAlias", - "format": ["PascalCase"] - }, - { - "selector": "objectLiteralProperty", - "format": ["camelCase", "snake_case"] - }, - { - "selector": "typeProperty", - "format": null - }, - { - "selector": "parameter", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "typeParameter", - "format": ["PascalCase"] - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"] - } - ], - "curly": "error" - } -} diff --git a/packages/light-adjustment-gpu/.prettierrc.json b/packages/light-adjustment-gpu/.prettierrc.json deleted file mode 100644 index 3a891926..00000000 --- a/packages/light-adjustment-gpu/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 120, - "semi": true, - "trailingComma": "es5" -} diff --git a/packages/light-adjustment-gpu/model/requirements.txt b/packages/light-adjustment-gpu/model/requirements.txt index 7352a63f..b08fc30a 100644 --- a/packages/light-adjustment-gpu/model/requirements.txt +++ b/packages/light-adjustment-gpu/model/requirements.txt @@ -1,72 +1,72 @@ absl-py==1.4.0 astunparse==1.6.3 -cachetools==5.3.1 -certifi==2023.5.7 -charset-normalizer==3.1.0 -chex==0.1.7 -contourpy==1.1.0 -cycler==0.11.0 +cachetools==5.3.2 +certifi==2023.11.17 +charset-normalizer==3.3.2 +chex==0.1.85 +contourpy==1.2.0 +cycler==0.12.1 dm-tree==0.1.8 flatbuffers==23.5.26 -flax==0.6.2 -fonttools==4.40.0 -gast==0.4.0 -google-auth==2.21.0 -google-auth-oauthlib==1.0.0 +flax==0.7.5 +fonttools==4.45.1 +gast==0.5.4 +google-auth==2.23.4 +google-auth-oauthlib==1.1.0 google-pasta==0.2.0 -grpcio==1.56.0 -h5py==3.9.0 -idna==3.4 -importlib-metadata==6.7.0 -importlib-resources==5.12.0 -jax==0.4.13 -jaxlib==0.4.13 -keras==2.12.0 -kiwisolver==1.4.4 -libclang==16.0.0 -Markdown==3.4.3 +grpcio==1.59.3 +h5py==3.10.0 +idna==3.6 +importlib-metadata==6.8.0 +importlib-resources==5.13.0 +jax==0.4.20 +jaxlib==0.4.20 +keras==2.15.0 +kiwisolver==1.4.5 +libclang==16.0.6 +Markdown==3.5.1 markdown-it-py==3.0.0 MarkupSafe==2.1.3 -matplotlib==3.7.2 +matplotlib==3.8.2 mdurl==0.1.2 -ml-dtypes==0.2.0 -msgpack==1.0.5 -numpy==1.24.3 +ml-dtypes==0.3.1 +msgpack==1.0.7 +numpy==1.26.2 oauthlib==3.2.2 opt-einsum==3.3.0 -optax==0.1.5 +optax==0.1.7 packaging==20.9 -pandas==2.0.3 -Pillow==10.0.0 -protobuf==4.23.3 -pyasn1==0.5.0 +pandas==2.1.3 +Pillow==10.1.0 +protobuf==4.25.1 +pyasn1==0.5.1 pyasn1-modules==0.3.0 -Pygments==2.15.1 -pyparsing==3.0.9 +Pygments==2.17.2 +pyparsing==3.1.1 python-dateutil==2.8.2 -pytz==2023.3 -PyYAML==6.0 +pytz==2023.3.post1 +PyYAML==6.0.1 requests==2.31.0 requests-oauthlib==1.3.1 -rich==13.4.2 +rich==13.7.0 rsa==4.9 -scipy==1.10.1 +scipy==1.11.4 six==1.16.0 -tensorboard==2.12.3 -tensorboard-data-server==0.7.1 -tensorflow==2.12.1 -tensorflow-decision-forests==1.4.0 -tensorflow-estimator==2.12.0 -tensorflow-hub==0.13.0 -tensorflow-io-gcs-filesystem==0.32.0 -tensorflowjs==4.8.0 -tensorstore==0.1.40 +tensorboard==2.15.1 +tensorboard-data-server==0.7.2 +tensorflow==2.15.0 +tensorflow-decision-forests==1.8.1 +tensorflow-estimator==2.15.0 +tensorflow-hub==0.15.0 +tensorflow-io-gcs-filesystem==0.34.0 +tensorflowjs==4.13.0 +tensorstore==0.1.50 termcolor==2.3.0 toolz==0.12.0 -typing-extensions==4.5.0 +typing-extensions==4.8.0 tzdata==2023.3 -urllib3==1.26.16 -Werkzeug==2.3.6 -wrapt==1.14.1 +urllib3==1.26.18 +Werkzeug==2.3.8 +wrapt==1.16.0 wurlitzer==3.0.3 -zipp==3.15.0 +zipp==3.17.0 diff --git a/packages/light-adjustment-gpu/package.json b/packages/light-adjustment-gpu/package.json index 26685342..80a9e69a 100644 --- a/packages/light-adjustment-gpu/package.json +++ b/packages/light-adjustment-gpu/package.json @@ -1,6 +1,6 @@ { "name": "@shiguredo/light-adjustment-gpu", - "version": "2023.1.0", + "version": "2023.1.1", "description": "Low Light Image Enhancement(GPU) Library", "author": "Shiguredo Inc.", "license": "Apache-2.0", @@ -9,8 +9,8 @@ "types": "dist/low_light_image_enhance.d.ts", "scripts": { "build": "rollup -c ./rollup.config.mjs --bundleConfigAsCjs && tsc --emitDeclarationOnly", - "lint": "eslint --ext .ts ./src", - "fmt": "prettier --write src", + "lint": "biome lint ./src", + "fmt": "biome format --write src", "doc": "typedoc" }, "repository": { diff --git a/packages/light-adjustment-gpu/src/light_adjustment_gpu.ts b/packages/light-adjustment-gpu/src/light_adjustment_gpu.ts index 310cdc1a..9515a64c 100644 --- a/packages/light-adjustment-gpu/src/light_adjustment_gpu.ts +++ b/packages/light-adjustment-gpu/src/light_adjustment_gpu.ts @@ -1,46 +1,49 @@ -import { ImageToImageVideoProcessor, ImageToImageModelOptions } from "@shiguredo/image-to-image-video-processor"; +import { + ImageToImageVideoProcessor, + ImageToImageModelOptions, +} from '@shiguredo/image-to-image-video-processor' /** * 使用するLow Light Image Enhancementのモデル名 * 現時点ではすべて SemanticGuidedLLIE なので、処理解像度のみの違い */ export enum llieModelNames { - semanticGuidedLlie1284x720 = "semantic_guided_llie_1284x720", - semanticGuidedLlie648x480 = "semantic_guided_llie_648x480", - semanticGuidedLlie648x360 = "semantic_guided_llie_648x360", - semanticGuidedLlie324x240 = "semantic_guided_llie_324x240", + semanticGuidedLlie1284x720 = 'semantic_guided_llie_1284x720', + semanticGuidedLlie648x480 = 'semantic_guided_llie_648x480', + semanticGuidedLlie648x360 = 'semantic_guided_llie_648x360', + semanticGuidedLlie324x240 = 'semantic_guided_llie_324x240', } const llieModels: { [key: string]: ImageToImageModelOptions } = { semantic_guided_llie_1284x720: { - modelPath: "tfjs_model_semantic_guided_llie_720x1284", + modelPath: 'tfjs_model_semantic_guided_llie_720x1284', inputWidth: 1284, inputHeight: 720, outputWidth: 1284, outputHeight: 720, }, semantic_guided_llie_648x480: { - modelPath: "tfjs_model_semantic_guided_llie_480x648", + modelPath: 'tfjs_model_semantic_guided_llie_480x648', inputWidth: 648, inputHeight: 480, outputWidth: 648, outputHeight: 480, }, semantic_guided_llie_648x360: { - modelPath: "tfjs_model_semantic_guided_llie_360x648", + modelPath: 'tfjs_model_semantic_guided_llie_360x648', inputWidth: 648, inputHeight: 360, outputWidth: 648, outputHeight: 360, }, semantic_guided_llie_324x240: { - modelPath: "tfjs_model_semantic_guided_llie_240x324", - inputWidth: 648, - inputHeight: 360, - outputWidth: 648, - outputHeight: 360, + modelPath: 'tfjs_model_semantic_guided_llie_240x324', + inputWidth: 324, + inputHeight: 240, + outputWidth: 324, + outputHeight: 240, }, -}; +} /** * GPU 推論を使って画像の明るさ補正を行うプロセッサークラス @@ -54,7 +57,7 @@ export class LightAdjustmentGpuProcessor extends ImageToImageVideoProcessor { * @param strength 補正の強さ。0.0 から 1.0 の範囲で指定します */ constructor(assetPath: string, modelName: llieModelNames, strength: number) { - const model = llieModels[modelName]; - super(Object.assign({}, model, { modelPath: assetPath + model.modelPath }), strength); + const model = llieModels[modelName] + super(Object.assign({}, model, { modelPath: assetPath + model.modelPath }), strength) } } diff --git a/packages/light-adjustment/.editorconfig b/packages/light-adjustment/.editorconfig deleted file mode 100644 index c6c8b362..00000000 --- a/packages/light-adjustment/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/light-adjustment/.eslintignore b/packages/light-adjustment/.eslintignore deleted file mode 100644 index df9377dd..00000000 --- a/packages/light-adjustment/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -examples diff --git a/packages/light-adjustment/.eslintrc.json b/packages/light-adjustment/.eslintrc.json deleted file mode 100644 index 08915040..00000000 --- a/packages/light-adjustment/.eslintrc.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/eslintrc.json", - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.json"] - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": ["error", { - "vars": "all", - "args": "all", - "argsIgnorePattern": "^_" - }], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"] - }, - { - "selector": "class", - "format": ["PascalCase"] - }, - { - "selector": "interface", - "format": ["PascalCase"] - }, - { - "selector": "typeAlias", - "format": ["PascalCase"] - }, - { - "selector": "objectLiteralProperty", - "format": ["camelCase", "snake_case"] - }, - { - "selector": "typeProperty", - "format": null - }, - { - "selector": "parameter", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "typeParameter", - "format": ["PascalCase"] - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"] - } - ], - "curly": "error" - } -} diff --git a/packages/light-adjustment/.prettierrc.json b/packages/light-adjustment/.prettierrc.json deleted file mode 100644 index 3a891926..00000000 --- a/packages/light-adjustment/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 120, - "semi": true, - "trailingComma": "es5" -} diff --git a/packages/light-adjustment/build-wasm.sh b/packages/light-adjustment/build-wasm.sh index 74801599..0c40df25 100755 --- a/packages/light-adjustment/build-wasm.sh +++ b/packages/light-adjustment/build-wasm.sh @@ -7,4 +7,4 @@ zig build -Doptimize=ReleaseFast -Dtarget=wasm32-freestanding cd .. mkdir -p dist/ -cp zig/zig-out/lib/light_adjustment.wasm dist/ +cp zig/zig-out/bin/light_adjustment.wasm dist/ diff --git a/packages/light-adjustment/package.json b/packages/light-adjustment/package.json index 0c08c5b3..cee046b6 100644 --- a/packages/light-adjustment/package.json +++ b/packages/light-adjustment/package.json @@ -9,8 +9,8 @@ "types": "dist/light_adjustment.d.ts", "scripts": { "build": "./build-wasm.sh && rollup -c ./rollup.config.mjs --bundleConfigAsCjs && tsc --emitDeclarationOnly", - "lint": "eslint --ext .ts ./src", - "fmt": "prettier --write src", + "lint": "biome lint ./src", + "fmt": "biome format --write src", "doc": "typedoc" }, "repository": { @@ -27,9 +27,9 @@ ], "devDependencies": { "@mediapipe/selfie_segmentation": "0.1.1675465747", - "@rollup/plugin-replace": "5.0.4", + "@rollup/plugin-replace": "5.0.5", "@shiguredo/video-track-processor": "workspace:*", - "@types/offscreencanvas": "2019.7.1", + "@types/offscreencanvas": "2019.7.3", "stackblur-canvas": "2.6.0" } } \ No newline at end of file diff --git a/packages/light-adjustment/src/light_adjustment.ts b/packages/light-adjustment/src/light_adjustment.ts index c12dcc6f..2b96104a 100644 --- a/packages/light-adjustment/src/light_adjustment.ts +++ b/packages/light-adjustment/src/light_adjustment.ts @@ -1,11 +1,11 @@ -import { VideoTrackProcessor } from "@shiguredo/video-track-processor"; import { + Results as SelfieSegmentationResults, SelfieSegmentation, SelfieSegmentationConfig, - Results as SelfieSegmentationResults, -} from "@mediapipe/selfie_segmentation"; +} from '@mediapipe/selfie_segmentation' +import { VideoTrackProcessor } from '@shiguredo/video-track-processor' -const LIGHT_ADJUSTMENT_WASM = "__LIGHT_ADJUSTMENT_WASM__"; +const LIGHT_ADJUSTMENT_WASM = '__LIGHT_ADJUSTMENT_WASM__' /** * {@link LightAdjustmentProcessor} に指定可能なオプション @@ -18,7 +18,7 @@ interface LightAdjustmentProcessorOptions { * * デフォルト値は 0.5 */ - alpha?: number; + alpha?: number /** * ライト調整処理の度合い。 @@ -28,7 +28,7 @@ interface LightAdjustmentProcessorOptions { * * デフォルト値は 50 */ - adjustmentLevel?: number; + adjustmentLevel?: number /** * AGCWD によるライト調整後に画像に適用するシャープネス処理の度合い。 @@ -40,21 +40,21 @@ interface LightAdjustmentProcessorOptions { * * デフォルト値は 20 */ - sharpnessLevel?: number; + sharpnessLevel?: number /** * 処理後の画像の最低の明るさ (HSV の V の値、 0 ~ 255 の整数)。 * * デフォルト値は 0 */ - minIntensity?: number; + minIntensity?: number /** * 処理後の画像の最大の明るさ (HSV の V の値、 0 ~ 255 の整数)。 * * デフォルト値は 255 */ - maxIntensity?: number; + maxIntensity?: number /** * AGCWD の論文に登場する、映像のフレーム間の差異を検知する際の閾値(0.0 ~ 1.0 の数値) @@ -69,7 +69,7 @@ interface LightAdjustmentProcessorOptions { * * デフォルト値は 0.05 */ - entropyThreshold?: number; + entropyThreshold?: number /** * ライト調整の際に基準とする画像領域を指定するマスクの取得方法。 @@ -87,7 +87,7 @@ interface LightAdjustmentProcessorOptions { * マスク取得は毎フレームではなく、最後にマスクを取得したフレームに対して、 * {@link LightAdjustmentProcessorOptions.entropyThreshold} の閾値を超える変化が検知された時にのみ行われる。 */ - focusMask?: FocusMask; + focusMask?: FocusMask } /** @@ -97,19 +97,19 @@ interface LightAdjustmentProcessorOptions { * アルゴリズムをベースにしています */ class LightAdjustmentProcessor { - private trackProcessor: VideoTrackProcessor; - private stats: LightAdjustmentProcessorStats; - private wasm?: WasmLightAdjustment; - private focusMask: FocusMask; - private isOptionsUpdated = false; + private trackProcessor: VideoTrackProcessor + private stats: LightAdjustmentProcessorStats + private wasm?: WasmLightAdjustment + private focusMask: FocusMask + private isOptionsUpdated = false /** * {@link LightAdjustmentProcessor} インスタンスを生成します */ constructor() { - this.trackProcessor = new VideoTrackProcessor(); - this.stats = new LightAdjustmentProcessorStats(); - this.focusMask = new UniformFocusMask(); + this.trackProcessor = new VideoTrackProcessor() + this.stats = new LightAdjustmentProcessorStats() + this.focusMask = new UniformFocusMask() } /** @@ -122,7 +122,7 @@ class LightAdjustmentProcessor { * @returns サポートされているかどうか */ static isSupported(): boolean { - return VideoTrackProcessor.isSupported(); + return VideoTrackProcessor.isSupported() } /** @@ -140,65 +140,68 @@ class LightAdjustmentProcessor { */ async startProcessing( track: MediaStreamVideoTrack, - options: LightAdjustmentProcessorOptions = {} + options: LightAdjustmentProcessorOptions = {}, ): Promise { - const initialWidth = track.getSettings().width || 0; - const initialHeight = track.getSettings().height || 0; + const initialWidth = track.getSettings().width || 0 + const initialHeight = track.getSettings().height || 0 - const canvas = createOffscreenCanvas(initialWidth, initialHeight); - const canvasCtx = canvas.getContext("2d", { + const canvas = createOffscreenCanvas(initialWidth, initialHeight) + const canvasCtx = canvas.getContext('2d', { desynchronized: true, willReadFrequently: false, // ここをtrueにするとCPU-GPUメモリ転送が発生して遅くなる - }) as OffscreenCanvasRenderingContext2D | null; + }) as OffscreenCanvasRenderingContext2D | null if (canvasCtx === null) { - throw Error("Failed to create 2D canvas context"); + throw Error('Failed to create 2D canvas context') } const wasmResults = await WebAssembly.instantiateStreaming( - fetch("data:application/wasm;base64," + LIGHT_ADJUSTMENT_WASM), - {} - ); - this.wasm = new WasmLightAdjustment(wasmResults.instance, track); - this.focusMask = new UniformFocusMask(); - this.updateOptions(options); - - this.resetStats(); - return this.trackProcessor.startProcessing(track, async (image: ImageBitmap | HTMLVideoElement) => { - const { width, height } = image; - resizeCanvasIfNeed(width, height, canvas); - canvasCtx.drawImage(image, 0, 0); - const imageData = canvasCtx.getImageData(0, 0, width, height); - await this.processImage(imageData); - canvasCtx.putImageData(imageData, 0, 0); - return canvas; - }); + fetch(`data:application/wasm;base64,${LIGHT_ADJUSTMENT_WASM}`), + {}, + ) + this.wasm = new WasmLightAdjustment(wasmResults.instance, track) + this.focusMask = new UniformFocusMask() + this.updateOptions(options) + + this.resetStats() + return this.trackProcessor.startProcessing( + track, + async (image: ImageBitmap | HTMLVideoElement) => { + const { width, height } = image + resizeCanvasIfNeed(width, height, canvas) + canvasCtx.drawImage(image, 0, 0) + const imageData = canvasCtx.getImageData(0, 0, width, height) + await this.processImage(imageData) + canvasCtx.putImageData(imageData, 0, 0) + return canvas + }, + ) } private async processImage(image: ImageData): Promise { if (this.wasm === undefined) { - return; + return } - const start = performance.now(); + const start = performance.now() - this.wasm.setImageData(image); + this.wasm.setImageData(image) if (this.isOptionsUpdated || this.wasm.isStateObsolete()) { // TODO(sile): SelfieSegmentationFocusMask の場合には、一番最初にファイルのダウンロードや初期化処理が入るので、 // ここに await を入れると少し映像が止まることがある。 // マスク更新は必須の処理という訳ではないので `await` ではなく `.then()` で繋いだ方が // ユーザの体験としては良くなるかもしれない。 - const mask = await this.focusMask.getFocusMask(image); - this.wasm.setFocusMaskData(mask); - this.wasm.updateState(); - this.stats.totalUpdateStateCount += 1; - this.isOptionsUpdated = false; + const mask = await this.focusMask.getFocusMask(image) + this.wasm.setFocusMaskData(mask) + this.wasm.updateState() + this.stats.totalUpdateStateCount += 1 + this.isOptionsUpdated = false } - this.wasm.processImage(); - this.wasm.copyProcessedImageData(image); + this.wasm.processImage() + this.wasm.copyProcessedImageData(image) - const elapsed = performance.now() - start; - this.stats.totalProcessedTimeMs += elapsed; - this.stats.totalProcessedFrames += 1; + const elapsed = performance.now() - start + this.stats.totalProcessedTimeMs += elapsed + this.stats.totalProcessedFrames += 1 } /** @@ -208,10 +211,10 @@ class LightAdjustmentProcessor { * 必要であれば、別途呼び出し側で対処する必要があります */ stopProcessing() { - this.trackProcessor.stopProcessing(); + this.trackProcessor.stopProcessing() if (this.wasm !== undefined) { - this.wasm.destroy(); - this.wasm = undefined; + this.wasm.destroy() + this.wasm = undefined } } @@ -221,7 +224,7 @@ class LightAdjustmentProcessor { * @returns 実行中であれば `true` 、そうでなければ `false` */ isProcessing(): boolean { - return this.trackProcessor.isProcessing(); + return this.trackProcessor.isProcessing() } /** @@ -235,7 +238,7 @@ class LightAdjustmentProcessor { * @returns 処理適用中の場合は映像トラック、それ以外なら `undefined` */ getOriginalTrack(): MediaStreamVideoTrack | undefined { - return this.trackProcessor.getOriginalTrack(); + return this.trackProcessor.getOriginalTrack() } /** @@ -249,7 +252,7 @@ class LightAdjustmentProcessor { * @returns 処理適用中の場合は映像トラック、それ以外なら `undefined` */ getProcessedTrack(): MediaStreamVideoTrack | undefined { - return this.trackProcessor.getProcessedTrack(); + return this.trackProcessor.getProcessedTrack() } /** @@ -261,11 +264,11 @@ class LightAdjustmentProcessor { */ updateOptions(options: LightAdjustmentProcessorOptions): void { if (this.wasm !== undefined) { - this.wasm.updateOptions(options); + this.wasm.updateOptions(options) if (options.focusMask !== undefined) { - this.focusMask = options.focusMask; + this.focusMask = options.focusMask } - this.isOptionsUpdated = true; + this.isOptionsUpdated = true } } @@ -275,28 +278,28 @@ class LightAdjustmentProcessor { * @returns 統計値オブジェクト */ getStats(): LightAdjustmentProcessorStats { - return this.stats; + return this.stats } /** * 統計値を初期化します */ resetStats(): void { - this.stats.reset(); + this.stats.reset() } /** * VideoTrackProcessorで計算したFPSを取得します */ getFps(): number { - return this.trackProcessor.getFps(); + return this.trackProcessor.getFps() } /** * VideoTrackProcessorで計算した平均処理時間を取得します */ getAverageProcessedTimeMs(): number { - return this.trackProcessor.getAverageProcessedTimeMs(); + return this.trackProcessor.getAverageProcessedTimeMs() } } @@ -307,17 +310,17 @@ class LightAdjustmentProcessorStats { /** * 処理した映像フレームの合計数 */ - totalProcessedFrames = 0; + totalProcessedFrames = 0 /** * 映像フレームの処理に要した合計時間(ミリ秒単位) */ - totalProcessedTimeMs = 0; + totalProcessedTimeMs = 0 /** * ライト調整用の変換テーブルを更新した数 */ - totalUpdateStateCount = 0; + totalUpdateStateCount = 0 /** * 映像フレームの処理に要した時間の平均値を取得します @@ -326,144 +329,182 @@ class LightAdjustmentProcessorStats { */ getAverageProcessedTimeMs(): number { if (this.totalProcessedFrames === 0) { - return 0; - } else { - return this.totalProcessedTimeMs / this.totalProcessedFrames; + return 0 } + return this.totalProcessedTimeMs / this.totalProcessedFrames } /** * 統計値を初期化します */ reset(): void { - this.totalProcessedFrames = 0; - this.totalProcessedTimeMs = 0; - this.totalUpdateStateCount = 0; + this.totalProcessedFrames = 0 + this.totalProcessedTimeMs = 0 + this.totalUpdateStateCount = 0 } } class WasmLightAdjustment { - private wasm: WebAssembly.Instance; - private memory: WebAssembly.Memory; - private lightAdjustmentPtr: number; - private imageDataPtr: number; - private maskDataPtr: number; - private imageWidth: number; - private imageHeight: number; + private wasm: WebAssembly.Instance + private memory: WebAssembly.Memory + private lightAdjustmentPtr: number + private imageDataPtr: number + private maskDataPtr: number + private imageWidth: number + private imageHeight: number constructor(wasm: WebAssembly.Instance, track: MediaStreamVideoTrack) { - this.wasm = wasm; - this.memory = wasm.exports.memory as WebAssembly.Memory; + this.wasm = wasm + this.memory = wasm.exports.memory as WebAssembly.Memory - const width = track.getSettings().width || 0; - const height = track.getSettings().height || 0; - this.imageWidth = width; - this.imageHeight = height; + const width = track.getSettings().width || 0 + const height = track.getSettings().height || 0 + this.imageWidth = width + this.imageHeight = height - const lightAdjustmentPtr = (wasm.exports.new as CallableFunction)(width, height) as number; + const lightAdjustmentPtr = (wasm.exports.new as CallableFunction)(width, height) as number if (lightAdjustmentPtr === 0) { - throw new Error("Failed to create WebAssembly LightAdjustment instance."); + throw new Error('Failed to create WebAssembly LightAdjustment instance.') } - this.lightAdjustmentPtr = lightAdjustmentPtr; - this.imageDataPtr = (wasm.exports.getImageData as CallableFunction)(lightAdjustmentPtr) as number; - this.maskDataPtr = (wasm.exports.getFocusMaskData as CallableFunction)(lightAdjustmentPtr) as number; + this.lightAdjustmentPtr = lightAdjustmentPtr + this.imageDataPtr = (wasm.exports.getImageData as CallableFunction)( + lightAdjustmentPtr, + ) as number + this.maskDataPtr = (wasm.exports.getFocusMaskData as CallableFunction)( + lightAdjustmentPtr, + ) as number } destroy(): void { - (this.wasm.exports.free as CallableFunction)(this.lightAdjustmentPtr); + ;(this.wasm.exports.free as CallableFunction)(this.lightAdjustmentPtr) } setImageData(image: ImageData): void { - this.resizeIfNeed(image); - new Uint8Array(this.memory.buffer, this.imageDataPtr, this.imageWidth * this.imageHeight * 4).set(image.data); + this.resizeIfNeed(image) + new Uint8Array( + this.memory.buffer, + this.imageDataPtr, + this.imageWidth * this.imageHeight * 4, + ).set(image.data) } copyProcessedImageData(image: ImageData): void { - image.data.set(new Uint8Array(this.memory.buffer, this.imageDataPtr, this.imageWidth * this.imageHeight * 4)); + image.data.set( + new Uint8Array(this.memory.buffer, this.imageDataPtr, this.imageWidth * this.imageHeight * 4), + ) } setFocusMaskData(data: Uint8Array): void { - new Uint8Array(this.memory.buffer, this.maskDataPtr, this.imageWidth * this.imageHeight).set(data); + new Uint8Array(this.memory.buffer, this.maskDataPtr, this.imageWidth * this.imageHeight).set( + data, + ) } isStateObsolete(): boolean { - return (this.wasm.exports.isStateObsolete as CallableFunction)(this.lightAdjustmentPtr) as boolean; + return (this.wasm.exports.isStateObsolete as CallableFunction)( + this.lightAdjustmentPtr, + ) as boolean } updateState(): boolean { - return (this.wasm.exports.updateState as CallableFunction)(this.lightAdjustmentPtr) as boolean; + return (this.wasm.exports.updateState as CallableFunction)(this.lightAdjustmentPtr) as boolean } processImage(): boolean { - return (this.wasm.exports.processImage as CallableFunction)(this.lightAdjustmentPtr) as boolean; + return (this.wasm.exports.processImage as CallableFunction)(this.lightAdjustmentPtr) as boolean } updateOptions(options: LightAdjustmentProcessorOptions): void { if (options.alpha !== undefined) { - if (options.alpha < 0 || !isFinite(options.alpha)) { - throw new Error(`Invaild alpha value: ${options.alpha} (must be a non-negative number)`); + if (options.alpha < 0 || !Number.isFinite(options.alpha)) { + throw new Error(`Invalid alpha value: ${options.alpha} (must be a non-negative number)`) } - (this.wasm.exports.setAlpha as CallableFunction)(this.lightAdjustmentPtr, options.alpha); + ;(this.wasm.exports.setAlpha as CallableFunction)(this.lightAdjustmentPtr, options.alpha) } if (options.adjustmentLevel !== undefined) { if (!(0 <= options.adjustmentLevel && options.adjustmentLevel <= 100)) { - throw new Error(`Invaild fusion value: ${options.adjustmentLevel} (must be an integer between 0 and 100)`); + throw new Error( + `Invalid fusion value: ${options.adjustmentLevel} (must be an integer between 0 and 100)`, + ) } - (this.wasm.exports.setAdjustmentLevel as CallableFunction)(this.lightAdjustmentPtr, options.adjustmentLevel); + ;(this.wasm.exports.setAdjustmentLevel as CallableFunction)( + this.lightAdjustmentPtr, + options.adjustmentLevel, + ) } if (options.sharpnessLevel !== undefined) { if (!(0 <= options.sharpnessLevel && options.sharpnessLevel <= 100)) { throw new Error( - `Invaild sharpen level value: ${options.sharpnessLevel} (must be an integer between 0 and 100)` - ); + `Invaild sharpen level value: ${options.sharpnessLevel} (must be an integer between 0 and 100)`, + ) } - (this.wasm.exports.setSharpnessLevel as CallableFunction)(this.lightAdjustmentPtr, options.sharpnessLevel); + ;(this.wasm.exports.setSharpnessLevel as CallableFunction)( + this.lightAdjustmentPtr, + options.sharpnessLevel, + ) } if (options.entropyThreshold !== undefined) { if (!(0.0 <= options.entropyThreshold && options.entropyThreshold <= 1.0)) { throw new Error( - `Invaild entropyThreshold value: ${options.entropyThreshold} (must be a number between 0.0 and 1.0)` - ); + `Invaild entropyThreshold value: ${options.entropyThreshold} (must be a number between 0.0 and 1.0)`, + ) } - (this.wasm.exports.setEntropyThreshold as CallableFunction)(this.lightAdjustmentPtr, options.entropyThreshold); + ;(this.wasm.exports.setEntropyThreshold as CallableFunction)( + this.lightAdjustmentPtr, + options.entropyThreshold, + ) } if (options.minIntensity !== undefined) { if (!(0 <= options.minIntensity && options.minIntensity <= 255)) { - throw new Error(`Invaild minIntensity value: ${options.minIntensity} (must be an integer between 0 and 255)`); + throw new Error( + `Invaild minIntensity value: ${options.minIntensity} (must be an integer between 0 and 255)`, + ) } - (this.wasm.exports.setMinIntensity as CallableFunction)(this.lightAdjustmentPtr, options.minIntensity); + ;(this.wasm.exports.setMinIntensity as CallableFunction)( + this.lightAdjustmentPtr, + options.minIntensity, + ) } if (options.maxIntensity !== undefined) { if (!(0 <= options.maxIntensity && options.maxIntensity <= 255)) { - throw new Error(`Invaild maxIntensity value: ${options.maxIntensity} (must be an integer between 0 and 255)`); + throw new Error( + `Invaild maxIntensity value: ${options.maxIntensity} (must be an integer between 0 and 255)`, + ) } - (this.wasm.exports.setMaxIntensity as CallableFunction)(this.lightAdjustmentPtr, options.maxIntensity); + ;(this.wasm.exports.setMaxIntensity as CallableFunction)( + this.lightAdjustmentPtr, + options.maxIntensity, + ) } } private resizeIfNeed(image: ImageData): void { if (image.width === this.imageWidth && image.height === this.imageHeight) { - return; + return } const succeeded = (this.wasm.exports.resize as CallableFunction)( this.lightAdjustmentPtr, image.width, - image.height - ) as boolean; + image.height, + ) as boolean if (!succeeded) { - throw new Error("Failed to resize WebAssembly image data."); + throw new Error('Failed to resize WebAssembly image data.') } - this.imageDataPtr = (this.wasm.exports.getImageData as CallableFunction)(this.lightAdjustmentPtr) as number; - this.maskDataPtr = (this.wasm.exports.getFocusMaskData as CallableFunction)(this.lightAdjustmentPtr) as number; - this.imageWidth = image.width; - this.imageHeight = image.height; + this.imageDataPtr = (this.wasm.exports.getImageData as CallableFunction)( + this.lightAdjustmentPtr, + ) as number + this.maskDataPtr = (this.wasm.exports.getFocusMaskData as CallableFunction)( + this.lightAdjustmentPtr, + ) as number + this.imageWidth = image.width + this.imageHeight = image.height } } @@ -483,22 +524,22 @@ interface FocusMask { * @param options 処理対象となる入力画像 * @returns フォーカス領域を示すバイト列 */ - getFocusMask(image: ImageData): Promise; + getFocusMask(image: ImageData): Promise } /** * 画像全体を均等に扱うフォーカスマスク。 */ class UniformFocusMask implements FocusMask { - private mask: Uint8Array = new Uint8Array(); + private mask: Uint8Array = new Uint8Array() getFocusMask(image: ImageData): Promise { - const { width, height } = image; + const { width, height } = image if (this.mask.byteLength !== width * height) { - this.mask = new Uint8Array(width * height); - this.mask.fill(255); + this.mask = new Uint8Array(width * height) + this.mask.fill(255) } - return Promise.resolve(this.mask); + return Promise.resolve(this.mask) } } @@ -506,23 +547,23 @@ class UniformFocusMask implements FocusMask { * 画像全体を九分割して、その中央部分にフォーカスするマスク。 */ class CenterFocusMask implements FocusMask { - private mask: Uint8Array = new Uint8Array(); + private mask: Uint8Array = new Uint8Array() getFocusMask(image: ImageData): Promise { - const { width, height } = image; + const { width, height } = image if (this.mask.byteLength !== width * height) { - this.mask = new Uint8Array(width * height); - this.mask.fill(0); + this.mask = new Uint8Array(width * height) + this.mask.fill(0) - const yStart = Math.floor(height / 3); - const yEnd = yStart * 2; - let xStart = yStart * width + Math.floor(width / 3); - let xEnd = yStart * width + Math.floor(width / 3) * 2; + const yStart = Math.floor(height / 3) + const yEnd = yStart * 2 + let xStart = yStart * width + Math.floor(width / 3) + let xEnd = yStart * width + Math.floor(width / 3) * 2 for (let y = yStart; y < yEnd; y++, xStart += width, xEnd += width) { - this.mask.fill(255, xStart, xEnd); + this.mask.fill(255, xStart, xEnd) } } - return Promise.resolve(this.mask); + return Promise.resolve(this.mask) } } @@ -533,10 +574,10 @@ class CenterFocusMask implements FocusMask { * @mediapipe/selfie-segmentation パッケージを使用している。 */ class SelfieSegmentationFocusMask implements FocusMask { - private segmentation: SelfieSegmentation; - private mask: Uint8Array; - private canvas: OffscreenCanvas; - private canvasCtx: OffscreenCanvasRenderingContext2D; + private segmentation: SelfieSegmentation + private mask: Uint8Array + private canvas: OffscreenCanvas + private canvasCtx: OffscreenCanvasRenderingContext2D /** * {@link SelfieSegmentationFocusMask} インスタンスを生成する。 @@ -544,79 +585,82 @@ class SelfieSegmentationFocusMask implements FocusMask { * @param assetsPath @mediapipe/selfie-segmentation のアセットファイル(.wasm や .tflite)が配置されているパス */ constructor(assetsPath: string) { - this.mask = new Uint8Array(); - this.canvas = createOffscreenCanvas(0, 0) as OffscreenCanvas; - const canvasCtx = this.canvas.getContext("2d", { + this.mask = new Uint8Array() + this.canvas = createOffscreenCanvas(0, 0) as OffscreenCanvas + const canvasCtx = this.canvas.getContext('2d', { desynchronized: true, willReadFrequently: true, - }); + }) if (canvasCtx === null) { - throw Error("Failed to create 2D canvas context"); + throw Error('Failed to create 2D canvas context') } - this.canvasCtx = canvasCtx; + this.canvasCtx = canvasCtx - const config: SelfieSegmentationConfig = {}; - assetsPath = trimLastSlash(assetsPath); + const config: SelfieSegmentationConfig = {} + const trimmedAssetsPath = trimLastSlash(assetsPath) config.locateFile = (file: string) => { - return `${assetsPath}/${file}`; - }; - this.segmentation = new SelfieSegmentation(config); + return `${trimmedAssetsPath}/${file}` + } + this.segmentation = new SelfieSegmentation(config) - const modelSelection = 1; // `1` means "landscape" mode. - this.segmentation.setOptions({ modelSelection }); + const modelSelection = 1 // `1` means "landscape" mode. + this.segmentation.setOptions({ modelSelection }) this.segmentation.onResults((results: SelfieSegmentationResults) => { - this.processSegmentationResults(results); - }); + this.processSegmentationResults(results) + }) } async getFocusMask(image: ImageData): Promise { // @ts-ignore TS2322: 「`image`の型が合っていない」と怒られるけれど、動作はするので一旦無視 - await this.segmentation.send({ image }); - return this.mask; + await this.segmentation.send({ image }) + return this.mask } private processSegmentationResults(results: SelfieSegmentationResults): void { - const { width, height } = results.segmentationMask; + const { width, height } = results.segmentationMask if (this.canvas.width !== width || this.canvas.height !== height) { - this.canvas.width = width; - this.canvas.height = height; - this.mask = new Uint8Array(width * height); + this.canvas.width = width + this.canvas.height = height + this.mask = new Uint8Array(width * height) } - this.canvasCtx.drawImage(results.segmentationMask, 0, 0); - const image = this.canvasCtx.getImageData(0, 0, width, height); + this.canvasCtx.drawImage(results.segmentationMask, 0, 0) + const image = this.canvasCtx.getImageData(0, 0, width, height) for (let i = 0; i < image.data.byteLength; i += 4) { - this.mask[i / 4] = image.data[i]; + this.mask[i / 4] = image.data[i] } } } function createOffscreenCanvas(width: number, height: number): OffscreenCanvas | HTMLCanvasElement { - if (typeof OffscreenCanvas === "undefined") { + if (typeof OffscreenCanvas === 'undefined') { // OffscreenCanvas が使えない場合には通常の canvas で代替する - const canvas = document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - return canvas; - } else { - return new OffscreenCanvas(width, height); + const canvas = document.createElement('canvas') + canvas.width = width + canvas.height = height + return canvas } + return new OffscreenCanvas(width, height) } -function resizeCanvasIfNeed(width: number, height: number, canvas: OffscreenCanvas | HTMLCanvasElement) { +function resizeCanvasIfNeed( + width: number, + height: number, + canvas: OffscreenCanvas | HTMLCanvasElement, +) { if (canvas.width !== width || canvas.height !== height) { - canvas.width = width; - canvas.height = height; + canvas.width = width + canvas.height = height } } function trimLastSlash(s: string): string { - if (s.slice(-1) === "/") { - return s.slice(0, -1); + if (s.slice(-1) === '/') { + return s.slice(0, -1) } - return s; + return s } export { @@ -627,4 +671,4 @@ export { UniformFocusMask, CenterFocusMask, SelfieSegmentationFocusMask, -}; +} diff --git a/packages/light-adjustment/zig/build.zig b/packages/light-adjustment/zig/build.zig index d1637f88..251a404e 100644 --- a/packages/light-adjustment/zig/build.zig +++ b/packages/light-adjustment/zig/build.zig @@ -19,8 +19,10 @@ pub fn build(b: *std.Build) void { // set a preferred release mode, allowing the user to decide how to optimize. const optimize = b.standardOptimizeOption(.{}); - // wasm をビルドするためには addStaticLibrary() ではなく addSharedLibrary() を使う必要がある - var lib = b.addSharedLibrary(.{ + // wasm をビルドするためには addExecutable() を使う必要がある + // 以前は addSharedLibrary() だったが2024/01/04現在の master では変更されている + // https://ziglang.org/documentation/master/#Freestanding + var wasm = b.addExecutable(.{ .name = "light_adjustment", // In this case the main source file is merely a path, however, in more // complicated build scripts, this could be a generated file. @@ -28,12 +30,13 @@ pub fn build(b: *std.Build) void { .target = target, .optimize = optimize, }); - lib.rdynamic = true; + wasm.rdynamic = true; + wasm.entry = .disabled; // This declares intent for the library to be installed into the standard // location when the user invokes the "install" step (the default step when // running `zig build`). - b.installArtifact(lib); + b.installArtifact(wasm); // Creates a step for unit testing. const main_tests = b.addTest(.{ diff --git a/packages/light-adjustment/zig/src/main.zig b/packages/light-adjustment/zig/src/main.zig index 62e369f4..799c4161 100644 --- a/packages/light-adjustment/zig/src/main.zig +++ b/packages/light-adjustment/zig/src/main.zig @@ -392,7 +392,7 @@ const Sharpener = struct { } const filter = [_]i8{ 0, -1, 0, -1, 5, -1, 0, -1, 0 }; - std.mem.copy(u8, self.temp_image.data, image.data); + @memcpy(self.temp_image.data, image.data); for (0..image.height) |y| { for (0..image.width) |x| { @@ -428,8 +428,8 @@ test "Process image" { var la = try LightAdjustment.init(test_allocator, 2, 2); defer la.deinit(); - std.mem.copy(u8, la.image.data, &[_]u8{ 1, 2, 3, 255, 4, 5, 6, 255, 7, 8, 9, 255, 10, 11, 12, 255 }); - std.mem.copy(u8, la.mask.data, &[_]u8{ 0, 255, 10, 200 }); + @memcpy(la.image.data, &[_]u8{ 1, 2, 3, 255, 4, 5, 6, 255, 7, 8, 9, 255, 10, 11, 12, 255 }); + @memcpy(la.mask.data, &[_]u8{ 0, 255, 10, 200 }); // 最初は常に状態の更新が必要 try expect(la.isStateObsolete()); diff --git a/packages/noise-suppression/.editorconfig b/packages/noise-suppression/.editorconfig deleted file mode 100644 index c6c8b362..00000000 --- a/packages/noise-suppression/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/noise-suppression/.eslintignore b/packages/noise-suppression/.eslintignore deleted file mode 100644 index df9377dd..00000000 --- a/packages/noise-suppression/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -examples diff --git a/packages/noise-suppression/.eslintrc.json b/packages/noise-suppression/.eslintrc.json deleted file mode 100644 index 08915040..00000000 --- a/packages/noise-suppression/.eslintrc.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/eslintrc.json", - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.json"] - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": ["error", { - "vars": "all", - "args": "all", - "argsIgnorePattern": "^_" - }], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"] - }, - { - "selector": "class", - "format": ["PascalCase"] - }, - { - "selector": "interface", - "format": ["PascalCase"] - }, - { - "selector": "typeAlias", - "format": ["PascalCase"] - }, - { - "selector": "objectLiteralProperty", - "format": ["camelCase", "snake_case"] - }, - { - "selector": "typeProperty", - "format": null - }, - { - "selector": "parameter", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "typeParameter", - "format": ["PascalCase"] - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"] - } - ], - "curly": "error" - } -} diff --git a/packages/noise-suppression/.prettierrc.json b/packages/noise-suppression/.prettierrc.json deleted file mode 100644 index 3a891926..00000000 --- a/packages/noise-suppression/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 120, - "semi": true, - "trailingComma": "es5" -} diff --git a/packages/noise-suppression/package.json b/packages/noise-suppression/package.json index e6245527..5d78eeb5 100644 --- a/packages/noise-suppression/package.json +++ b/packages/noise-suppression/package.json @@ -9,8 +9,8 @@ "types": "dist/noise_suppression.d.ts", "scripts": { "build": "rollup -c ./rollup.config.mjs --bundleConfigAsCjs && tsc --emitDeclarationOnly", - "lint": "eslint --ext .ts ./src", - "fmt": "prettier --write src", + "lint": "biome lint ./src", + "fmt": "biome format --write src", "doc": "typedoc" }, "repository": { diff --git a/packages/noise-suppression/src/noise_suppression.ts b/packages/noise-suppression/src/noise_suppression.ts index 1bea11e4..86859afa 100644 --- a/packages/noise-suppression/src/noise_suppression.ts +++ b/packages/noise-suppression/src/noise_suppression.ts @@ -1,4 +1,4 @@ -import { DenoiseState, Rnnoise } from "@shiguredo/rnnoise-wasm"; +import { DenoiseState, Rnnoise } from '@shiguredo/rnnoise-wasm' /** * {@link NoiseSuppressionProcessor.startProcessing} メソッドに指定可能なオプション @@ -9,18 +9,18 @@ interface NoiseSuppressionProcessorOptions { * * 省略された場合は、デフォルトモデルが使用されます */ - modelPath?: string; + modelPath?: string } /** * 音声トラックにノイズ抑制処理を適用するためのプロセッサ */ class NoiseSuppressionProcessor { - private assetsPath: string; - private rnnoise?: Rnnoise; - private trackProcessor?: TrackProcessor; - private processedTrack?: MediaStreamAudioTrack; - private originalTrack?: MediaStreamAudioTrack; + private assetsPath: string + private rnnoise?: Rnnoise + private trackProcessor?: TrackProcessor + private processedTrack?: MediaStreamAudioTrack + private originalTrack?: MediaStreamAudioTrack /** * {@link NoiseSuppressionProcessor}インスタンスを生成します @@ -28,7 +28,7 @@ class NoiseSuppressionProcessor { * @param assetsPath wasm ファイルの配置先ディレクトリパスないしURL */ constructor(assetsPath: string) { - this.assetsPath = trimLastSlash(assetsPath); + this.assetsPath = trimLastSlash(assetsPath) } /** @@ -39,7 +39,10 @@ class NoiseSuppressionProcessor { * @returns サポートされているかどうか */ static isSupported(): boolean { - return !(typeof MediaStreamTrackProcessor === "undefined" || typeof MediaStreamTrackGenerator === "undefined"); + return !( + typeof MediaStreamTrackProcessor === 'undefined' || + typeof MediaStreamTrackGenerator === 'undefined' + ) } /** @@ -60,30 +63,30 @@ class NoiseSuppressionProcessor { */ async startProcessing( track: MediaStreamAudioTrack, - options: NoiseSuppressionProcessorOptions = {} + options: NoiseSuppressionProcessorOptions = {}, ): Promise { if (this.isProcessing()) { - throw Error("Noise suppression processing has already started."); + throw Error('Noise suppression processing has already started.') } if (this.rnnoise === undefined) { // 最初の `startProcessing` 呼び出し時に RNNoise をロードする - this.rnnoise = await Rnnoise.load({ assetsPath: this.assetsPath }); + this.rnnoise = await Rnnoise.load({ assetsPath: this.assetsPath }) } - let denoiseState; + let denoiseState: DenoiseState; if (options.modelPath === undefined) { - denoiseState = this.rnnoise.createDenoiseState(); + denoiseState = this.rnnoise.createDenoiseState() } else { - const modelString = await fetch(options.modelPath).then((res) => res.text()); - const model = this.rnnoise.createModel(modelString); - denoiseState = this.rnnoise.createDenoiseState(model); + const modelString = await fetch(options.modelPath).then((res) => res.text()) + const model = this.rnnoise.createModel(modelString) + denoiseState = this.rnnoise.createDenoiseState(model) } - this.trackProcessor = new TrackProcessor(track, this.rnnoise, denoiseState); - this.originalTrack = track; - this.processedTrack = this.trackProcessor.startProcessing(); - return this.processedTrack; + this.trackProcessor = new TrackProcessor(track, this.rnnoise, denoiseState) + this.originalTrack = track + this.processedTrack = this.trackProcessor.startProcessing() + return this.processedTrack } /** @@ -95,10 +98,10 @@ class NoiseSuppressionProcessor { stopProcessing() { // NOTE: コンパイラの警告を防ぐために isProcessing は使わずに判定している if (this.trackProcessor !== undefined) { - this.trackProcessor.stopProcessing(); - this.trackProcessor = undefined; - this.originalTrack = undefined; - this.processedTrack = undefined; + this.trackProcessor.stopProcessing() + this.trackProcessor = undefined + this.originalTrack = undefined + this.processedTrack = undefined } } @@ -108,7 +111,7 @@ class NoiseSuppressionProcessor { * @returns 実行中であれば `true` 、そうでなければ `false` */ isProcessing(): boolean { - return this.trackProcessor !== undefined; + return this.trackProcessor !== undefined } /** @@ -122,7 +125,7 @@ class NoiseSuppressionProcessor { * @returns 処理適用中の場合は音声トラック、それ以外なら `undefined` */ getOriginalTrack(): MediaStreamAudioTrack | undefined { - return this.originalTrack; + return this.originalTrack } /** @@ -136,120 +139,129 @@ class NoiseSuppressionProcessor { * @returns 処理適用中の場合は音声トラック、それ以外なら `undefined` */ getProcessedTrack(): MediaStreamAudioTrack | undefined { - return this.processedTrack; + return this.processedTrack } } class TrackProcessor { - private track: MediaStreamAudioTrack; - private abortController: AbortController; - private denoiseState: DenoiseState; - private buffer: Float32Array; - private frameSize: number; - private bufferFrameCount: number; - private nextTimestamp: number; - private generator: MediaStreamAudioTrackGenerator; - private processor: MediaStreamTrackProcessor; + private track: MediaStreamAudioTrack + private abortController: AbortController + private denoiseState: DenoiseState + private buffer: Float32Array + private frameSize: number + private bufferFrameCount: number + private nextTimestamp: number + private generator: MediaStreamAudioTrackGenerator + private processor: MediaStreamTrackProcessor constructor(track: MediaStreamAudioTrack, rnnoise: Rnnoise, denoiseState: DenoiseState) { - this.track = track; - this.buffer = new Float32Array(rnnoise.frameSize); - this.frameSize = rnnoise.frameSize; - this.bufferFrameCount = 0; - this.nextTimestamp = 0; - this.abortController = new AbortController(); - this.denoiseState = denoiseState; + this.track = track + this.buffer = new Float32Array(rnnoise.frameSize) + this.frameSize = rnnoise.frameSize + this.bufferFrameCount = 0 + this.nextTimestamp = 0 + this.abortController = new AbortController() + this.denoiseState = denoiseState // generator / processor インスタンスを生成(まだ処理は開始しない) - this.generator = new MediaStreamTrackGenerator({ kind: "audio" }); - this.processor = new MediaStreamTrackProcessor({ track: this.track }); + this.generator = new MediaStreamTrackGenerator({ kind: 'audio' }) + this.processor = new MediaStreamTrackProcessor({ track: this.track }) } startProcessing(): MediaStreamAudioTrack { - const signal = this.abortController.signal; + const signal = this.abortController.signal this.processor.readable .pipeThrough( new TransformStream({ transform: (frame, controller) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - this.transform(frame, controller); + this.transform(frame, controller) }, }), - { signal } + { signal }, ) .pipeTo(this.generator.writable) .catch((e) => { if (signal.aborted) { - console.debug("Shutting down streams after abort."); + console.debug('Shutting down streams after abort.') } else { - console.warn("Error from stream transform:", e); + console.warn('Error from stream transform:', e) } this.processor.readable.cancel(e).catch((e) => { - console.warn("Failed to cancel `MediaStreamTrackProcessor`:", e); - }); + console.warn('Failed to cancel `MediaStreamTrackProcessor`:', e) + }) this.generator.writable.abort(e).catch((e) => { - console.warn("Failed to abort `MediaStreamTrackGenerator`:", e); - }); - }); - return this.generator; + console.warn('Failed to abort `MediaStreamTrackGenerator`:', e) + }) + }) + return this.generator } stopProcessing() { - this.abortController.abort(); - this.denoiseState.destroy(); + this.abortController.abort() + this.denoiseState.destroy() if (this.denoiseState.model !== undefined) { - this.denoiseState.model.free(); + this.denoiseState.model.free() } } - private transform(data: AudioData, controller: TransformStreamDefaultController): void { + private transform( + data: AudioData, + controller: TransformStreamDefaultController, + ): void { if (data.numberOfChannels !== 1) { - throw Error("Noise suppression for stereo channel has not been supported yet."); + throw Error('Noise suppression for stereo channel has not been supported yet.') } - if (data.format !== "f32-planar") { + if (data.format !== 'f32-planar') { // https://www.w3.org/TR/webcodecs/#audio-buffer-arrangement を見ると、 // "The Web Audio API currently uses f32-planar exclusively"と書いてあるので、 // いったんは"f32-planar"のみに対応(必要に応じて実装を追加していく)。 // // MEMO: `AutoData.copyTo`で`format`が指定できるので、もしかしたら // そのオプションで"f32-planar"を指定しておけば、後続の処理は共通化できるかもしれない。 - throw Error(`Unsupported audio data format ${data.format}."`); + throw Error(`Unsupported audio data format ${data.format}."`) } - if (this.bufferFrameCount == 0) { - this.nextTimestamp = data.timestamp; + if (this.bufferFrameCount === 0) { + this.nextTimestamp = data.timestamp } - let frameOffset = 0; + let frameOffset = 0 while (frameOffset < data.numberOfFrames) { - const frameCount = Math.min(this.frameSize - this.bufferFrameCount, data.numberOfFrames - frameOffset); - data.copyTo(this.buffer.subarray(this.bufferFrameCount), { planeIndex: 0, frameOffset, frameCount }); - this.bufferFrameCount += frameCount; - frameOffset += frameCount; + const frameCount = Math.min( + this.frameSize - this.bufferFrameCount, + data.numberOfFrames - frameOffset, + ) + data.copyTo(this.buffer.subarray(this.bufferFrameCount), { + planeIndex: 0, + frameOffset, + frameCount, + }) + this.bufferFrameCount += frameCount + frameOffset += frameCount - if (this.bufferFrameCount == this.frameSize) { + if (this.bufferFrameCount === this.frameSize) { // RNNoiseが16-bit PCMを仮定しているので変換 for (const [i, value] of this.buffer.entries()) { - this.buffer[i] = value * 0x7fff; + this.buffer[i] = value * 0x7fff } // ノイズ低減処理 - this.denoiseState.processFrame(this.buffer); + this.denoiseState.processFrame(this.buffer) // f32-planarに戻す for (const [i, value] of this.buffer.entries()) { - this.buffer[i] = value / 0x7fff; + this.buffer[i] = value / 0x7fff } - if (this.generator.readyState === "ended") { + if (this.generator.readyState === 'ended') { // ジェネレータ(ユーザに渡している処理結果トラック)がクローズ済み。 // この状態で `controller.enqueue()` を呼び出すとエラーが発生するのでスキップする。 // また `stopProcessing()` を呼び出して変換処理を停止し、以後は `transform()` 自体が呼ばれないようにする。 // // なお、上の条件判定と下のエンキューの間でジェネレータの状態が変わり、エラーが発生する可能性もないとは // 言い切れないが、かなりレアケースだと想定され、そこまでケアするのはコスパが悪いので諦めることとする。 - this.stopProcessing(); - break; + this.stopProcessing() + break } controller.enqueue( @@ -260,23 +272,23 @@ class TrackProcessor { numberOfChannels: data.numberOfChannels, timestamp: this.nextTimestamp, data: this.buffer, - }) - ); - this.buffer = new Float32Array(this.frameSize); - this.bufferFrameCount = 0; - this.nextTimestamp = data.timestamp + (data.duration * frameOffset) / data.numberOfFrames; + }), + ) + this.buffer = new Float32Array(this.frameSize) + this.bufferFrameCount = 0 + this.nextTimestamp = data.timestamp + (data.duration * frameOffset) / data.numberOfFrames } } - data.close(); + data.close() } } function trimLastSlash(s: string): string { - if (s.slice(-1) === "/") { - return s.slice(0, -1); + if (s.slice(-1) === '/') { + return s.slice(0, -1) } - return s; + return s } -export { NoiseSuppressionProcessor, NoiseSuppressionProcessorOptions }; +export { NoiseSuppressionProcessor, NoiseSuppressionProcessorOptions } diff --git a/packages/video-track-processor/.editorconfig b/packages/video-track-processor/.editorconfig deleted file mode 100644 index c6c8b362..00000000 --- a/packages/video-track-processor/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/video-track-processor/.eslintignore b/packages/video-track-processor/.eslintignore deleted file mode 100644 index df9377dd..00000000 --- a/packages/video-track-processor/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -examples diff --git a/packages/video-track-processor/.eslintrc.json b/packages/video-track-processor/.eslintrc.json deleted file mode 100644 index 08915040..00000000 --- a/packages/video-track-processor/.eslintrc.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/eslintrc.json", - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.json"] - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": ["error", { - "vars": "all", - "args": "all", - "argsIgnorePattern": "^_" - }], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"] - }, - { - "selector": "class", - "format": ["PascalCase"] - }, - { - "selector": "interface", - "format": ["PascalCase"] - }, - { - "selector": "typeAlias", - "format": ["PascalCase"] - }, - { - "selector": "objectLiteralProperty", - "format": ["camelCase", "snake_case"] - }, - { - "selector": "typeProperty", - "format": null - }, - { - "selector": "parameter", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "typeParameter", - "format": ["PascalCase"] - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"] - } - ], - "curly": "error" - } -} diff --git a/packages/video-track-processor/.prettierrc.json b/packages/video-track-processor/.prettierrc.json deleted file mode 100644 index 3a891926..00000000 --- a/packages/video-track-processor/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 120, - "semi": true, - "trailingComma": "es5" -} diff --git a/packages/video-track-processor/package.json b/packages/video-track-processor/package.json index 99e3b938..784ff7b0 100644 --- a/packages/video-track-processor/package.json +++ b/packages/video-track-processor/package.json @@ -8,8 +8,8 @@ "types": "dist/video_track_processor.d.ts", "scripts": { "build": "rollup -c ./rollup.config.mjs --bundleConfigAsCjs && tsc --emitDeclarationOnly", - "lint": "eslint --ext .ts ./src", - "fmt": "prettier --write src", + "lint": "biome lint ./src", + "fmt": "biome format --write src", "doc": "typedoc" }, "repository": { @@ -25,6 +25,6 @@ "dist" ], "devDependencies": { - "@types/offscreencanvas": "2019.7.1" + "@types/offscreencanvas": "2019.7.3" } } \ No newline at end of file diff --git a/packages/video-track-processor/src/video_track_processor.ts b/packages/video-track-processor/src/video_track_processor.ts index a41dbc1f..db6eab60 100644 --- a/packages/video-track-processor/src/video_track_processor.ts +++ b/packages/video-track-processor/src/video_track_processor.ts @@ -1,4 +1,6 @@ -type ProcessImageCallback = (image: ImageBitmap | HTMLVideoElement) => Promise; +type ProcessImageCallback = ( + image: ImageBitmap | HTMLVideoElement, +) => Promise /** * 映像トラックの各フレームの変換処理を行いやすくするためのユーティリティクラス @@ -10,255 +12,266 @@ type ProcessImageCallback = (image: ImageBitmap | HTMLVideoElement) => Promise { + async startProcessing( + track: MediaStreamVideoTrack, + callback: ProcessImageCallback, + ): Promise { if (this.isProcessing()) { - throw Error("Video track processing has already started."); + throw Error('Video track processing has already started.') } if (BreakoutBoxProcessor.isSupported()) { - this.trackProcessor = new BreakoutBoxProcessor(track, callback); + this.trackProcessor = new BreakoutBoxProcessor(track, callback) } else if (RequestVideoFrameCallbackProcessor.isSupported()) { - this.trackProcessor = new RequestVideoFrameCallbackProcessor(track, callback); + this.trackProcessor = new RequestVideoFrameCallbackProcessor(track, callback) } else { - throw Error("Unsupported browser"); + throw Error('Unsupported browser') } - this.originalTrack = track; - this.processedTrack = await this.trackProcessor.startProcessing(); - return this.processedTrack; + this.originalTrack = track + this.processedTrack = await this.trackProcessor.startProcessing() + return this.processedTrack } stopProcessing() { // NOTE: コンパイラの警告を防ぐために isProcessing は使わずに判定している if (this.trackProcessor !== undefined) { - this.trackProcessor.stopProcessing(); - this.trackProcessor = undefined; - this.originalTrack = undefined; - this.processedTrack = undefined; + this.trackProcessor.stopProcessing() + this.trackProcessor = undefined + this.originalTrack = undefined + this.processedTrack = undefined } } isProcessing(): boolean { - return this.trackProcessor !== undefined; + return this.trackProcessor !== undefined } getOriginalTrack(): MediaStreamVideoTrack | undefined { - return this.originalTrack; + return this.originalTrack } getProcessedTrack(): MediaStreamVideoTrack | undefined { - return this.processedTrack; + return this.processedTrack } getFps(): number { - return this.trackProcessor?.getFps() ?? 0; + return this.trackProcessor?.getFps() ?? 0 } getAverageProcessedTimeMs(): number { - return this.trackProcessor?.getAverageProcessedTimeMs() ?? 0; + return this.trackProcessor?.getAverageProcessedTimeMs() ?? 0 } } abstract class Processor { - protected track: MediaStreamVideoTrack; - protected callback: ProcessImageCallback; + protected track: MediaStreamVideoTrack + protected callback: ProcessImageCallback constructor(track: MediaStreamVideoTrack, callback: ProcessImageCallback) { - this.track = track; - this.callback = callback; + this.track = track + this.callback = callback } - abstract startProcessing(): Promise; + abstract startProcessing(): Promise - abstract stopProcessing(): void; + abstract stopProcessing(): void // 統計機能 - private numFramesToRecord = 100; - private startTimes: number[] = new Array(this.numFramesToRecord).fill(0) as number[]; - private processTimes: number[] = new Array(this.numFramesToRecord).fill(0) as number[]; - private count = 0; - private currentFps = 0; - private currentSumProcessedTimeMs = 0; + private numFramesToRecord = 100 + private startTimes: number[] = new Array(this.numFramesToRecord).fill(0) as number[] + private processTimes: number[] = new Array(this.numFramesToRecord).fill(0) as number[] + private count = 0 + private currentFps = 0 + private currentSumProcessedTimeMs = 0 getFps(): number { - return this.currentFps; + return this.currentFps } getAverageProcessedTimeMs(): number { - return this.currentSumProcessedTimeMs / this.numFramesToRecord; + return this.currentSumProcessedTimeMs / this.numFramesToRecord } recordStartFrame() { - const now = performance.now(); - const idx = this.count % this.numFramesToRecord; - this.currentFps = this.numFramesToRecord / ((now - this.startTimes[idx]) / 1000); - this.startTimes[idx] = now; + const now = performance.now() + const idx = this.count % this.numFramesToRecord + this.currentFps = this.numFramesToRecord / ((now - this.startTimes[idx]) / 1000) + this.startTimes[idx] = now } recordStopFrame() { - const now = performance.now(); - const idx = this.count % this.numFramesToRecord; - const prevTime = this.processTimes[idx]; - const startTime = this.startTimes[idx]; - const processTime = now - startTime; - this.currentSumProcessedTimeMs = this.currentSumProcessedTimeMs - prevTime + processTime; - this.processTimes[this.count % this.numFramesToRecord] = processTime; - this.count++; + const now = performance.now() + const idx = this.count % this.numFramesToRecord + const prevTime = this.processTimes[idx] + const startTime = this.startTimes[idx] + const processTime = now - startTime + this.currentSumProcessedTimeMs = this.currentSumProcessedTimeMs - prevTime + processTime + this.processTimes[this.count % this.numFramesToRecord] = processTime + this.count++ } } class BreakoutBoxProcessor extends Processor { - private abortController: AbortController; - private generator: MediaStreamVideoTrackGenerator; - private processor: MediaStreamTrackProcessor; + private abortController: AbortController + private generator: MediaStreamVideoTrackGenerator + private processor: MediaStreamTrackProcessor constructor(track: MediaStreamVideoTrack, callback: ProcessImageCallback) { - super(track, callback); + super(track, callback) // 処理を停止するための AbortController を初期化 - this.abortController = new AbortController(); + this.abortController = new AbortController() // generator / processor インスタンスを生成(まだ処理は開始しない) - this.generator = new MediaStreamTrackGenerator({ kind: "video" }); - this.processor = new MediaStreamTrackProcessor({ track: this.track }); + this.generator = new MediaStreamTrackGenerator({ kind: 'video' }) + this.processor = new MediaStreamTrackProcessor({ track: this.track }) } static isSupported(): boolean { - return !(typeof MediaStreamTrackProcessor === "undefined" || typeof MediaStreamTrackGenerator === "undefined"); + return !( + typeof MediaStreamTrackProcessor === 'undefined' || + typeof MediaStreamTrackGenerator === 'undefined' + ) } startProcessing(): Promise { - const signal = this.abortController.signal; + const signal = this.abortController.signal this.processor.readable .pipeThrough( new TransformStream({ transform: async (frame, controller) => { - this.recordStartFrame(); - if (this.generator.readyState === "ended") { + this.recordStartFrame() + if (this.generator.readyState === 'ended') { // ジェネレータ(ユーザに渡している処理結果トラック)がクローズ済み。 // この状態で `controller.enqueue()` を呼び出すとエラーが発生するのでスキップする。 // また `stopProcessing()` を呼び出して変換処理を停止し、以後は `transform()` 自体が呼ばれないようにする。 // // なお、上の条件判定と下のエンキューの間でジェネレータの状態が変わり、エラーが発生する可能性もないとは // 言い切れないが、かなりレアケースだと想定され、そこまでケアするのはコスパが悪いので諦めることとする。 - this.stopProcessing(); - return; + this.stopProcessing() + return } - const { timestamp, duration } = frame; + const { timestamp, duration } = frame // HTMLVideoElementと等価に扱いつつ、mediapipeに渡す際のパフォーマンスが良いのでImageBitmapを使う。 - const image = await createImageBitmap(frame); - frame.close(); - const processedImageCanvas = await this.callback(image); - image.close(); - controller.enqueue(new VideoFrame(processedImageCanvas, { timestamp, duration } as VideoFrameInit)); - this.recordStopFrame(); + const image = await createImageBitmap(frame) + frame.close() + const processedImageCanvas = await this.callback(image) + image.close() + controller.enqueue( + new VideoFrame(processedImageCanvas, { timestamp, duration } as VideoFrameInit), + ) + this.recordStopFrame() }, }), - { signal } + { signal }, ) .pipeTo(this.generator.writable) .catch((e) => { if (signal.aborted) { - console.debug("Shutting down streams after abort."); + console.debug('Shutting down streams after abort.') } else { - console.warn("Error from stream transform:", e); + console.warn('Error from stream transform:', e) } this.processor.readable.cancel(e).catch((e) => { - console.warn("Failed to cancel `MediaStreamTrackProcessor`:", e); - }); + console.warn('Failed to cancel `MediaStreamTrackProcessor`:', e) + }) this.generator.writable.abort(e).catch((e) => { - console.warn("Failed to abort `MediaStreamTrackGenerator`:", e); - }); - }); - return Promise.resolve(this.generator); + console.warn('Failed to abort `MediaStreamTrackGenerator`:', e) + }) + }) + return Promise.resolve(this.generator) } stopProcessing() { - this.abortController.abort(); + this.abortController.abort() } } class RequestVideoFrameCallbackProcessor extends Processor { - private video: HTMLVideoElement; - private requestVideoFrameCallbackHandle?: number; + private video: HTMLVideoElement + private requestVideoFrameCallbackHandle?: number // 処理結果画像を書き込むキャンバス - private canvas: HTMLCanvasElement; - private canvasCtx: CanvasRenderingContext2D; + private canvas: HTMLCanvasElement + private canvasCtx: CanvasRenderingContext2D constructor(track: MediaStreamVideoTrack, callback: ProcessImageCallback) { - super(track, callback); + super(track, callback) // requestVideoFrameCallbackHandle()` はトラックではなくビデオ単位のメソッドなので // 内部的に HTMLVideoElement を生成する - this.video = document.createElement("video"); - this.video.muted = true; - this.video.playsInline = true; - this.video.srcObject = new MediaStream([track]); + this.video = document.createElement('video') + this.video.muted = true + this.video.playsInline = true + this.video.srcObject = new MediaStream([track]) // 処理後の映像フレームを書き込むための canvas を生成する // captureStream() を使いたいので OffscreenCanvas にはできない - const width = track.getSettings().width || 0; - const height = track.getSettings().height || 0; - this.canvas = document.createElement("canvas"); - this.canvas.width = width; - this.canvas.height = height; - const canvasCtx = this.canvas.getContext("2d"); + const width = track.getSettings().width || 0 + const height = track.getSettings().height || 0 + this.canvas = document.createElement('canvas') + this.canvas.width = width + this.canvas.height = height + const canvasCtx = this.canvas.getContext('2d') if (canvasCtx === null) { - throw Error("Failed to create 2D canvas context"); + throw Error('Failed to create 2D canvas context') } - this.canvasCtx = canvasCtx; + this.canvasCtx = canvasCtx } static isSupported(): boolean { - return "requestVideoFrameCallback" in HTMLVideoElement.prototype; + return 'requestVideoFrameCallback' in HTMLVideoElement.prototype } async startProcessing(): Promise { this.requestVideoFrameCallbackHandle = this.video.requestVideoFrameCallback(() => { - this.recordStartFrame(); - this.onFrame().catch((e) => console.warn("Error: ", e)); - this.recordStopFrame(); - }); - await this.video.play(); - - const stream = this.canvas.captureStream(); - return Promise.resolve(stream.getVideoTracks()[0]); + this.recordStartFrame() + this.onFrame().catch((e) => console.warn('Error: ', e)) + this.recordStopFrame() + }) + await this.video.play() + + const stream = this.canvas.captureStream() + return Promise.resolve(stream.getVideoTracks()[0]) } stopProcessing() { if (this.requestVideoFrameCallbackHandle !== undefined) { - this.video.pause(); - this.video.cancelVideoFrameCallback(this.requestVideoFrameCallbackHandle); - this.requestVideoFrameCallbackHandle = undefined; + this.video.pause() + this.video.cancelVideoFrameCallback(this.requestVideoFrameCallbackHandle) + this.requestVideoFrameCallbackHandle = undefined } } private async onFrame() { - const { videoWidth: width, videoHeight: height } = this.video; - resizeCanvasIfNeed(width, height, this.canvas); + const { videoWidth: width, videoHeight: height } = this.video + resizeCanvasIfNeed(width, height, this.canvas) - const processedImageCanvas = await this.callback(this.video); - this.canvasCtx.drawImage(processedImageCanvas, 0, 0); + const processedImageCanvas = await this.callback(this.video) + this.canvasCtx.drawImage(processedImageCanvas, 0, 0) // @ts-ignore - // eslint-disable-next-line this.requestVideoFrameCallbackHandle = this.video.requestVideoFrameCallback(() => { - this.onFrame().catch((e) => console.warn("Error: ", e)); - }); + this.onFrame().catch((e) => console.warn('Error: ', e)) + }) } } -function resizeCanvasIfNeed(width: number, height: number, canvas: OffscreenCanvas | HTMLCanvasElement) { +function resizeCanvasIfNeed( + width: number, + height: number, + canvas: OffscreenCanvas | HTMLCanvasElement, +) { if (canvas.width !== width || canvas.height !== height) { - canvas.width = width; - canvas.height = height; + canvas.width = width + canvas.height = height } } -export { VideoTrackProcessor, ProcessImageCallback }; +export { VideoTrackProcessor, ProcessImageCallback } diff --git a/packages/virtual-background/.editorconfig b/packages/virtual-background/.editorconfig deleted file mode 100644 index c6c8b362..00000000 --- a/packages/virtual-background/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/virtual-background/.eslintignore b/packages/virtual-background/.eslintignore deleted file mode 100644 index df9377dd..00000000 --- a/packages/virtual-background/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -examples diff --git a/packages/virtual-background/.eslintrc.json b/packages/virtual-background/.eslintrc.json deleted file mode 100644 index 08915040..00000000 --- a/packages/virtual-background/.eslintrc.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/eslintrc.json", - "env": { - "browser": true, - "commonjs": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "sourceType": "module", - "project": ["./tsconfig.json"] - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": ["error", { - "vars": "all", - "args": "all", - "argsIgnorePattern": "^_" - }], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"] - }, - { - "selector": "class", - "format": ["PascalCase"] - }, - { - "selector": "interface", - "format": ["PascalCase"] - }, - { - "selector": "typeAlias", - "format": ["PascalCase"] - }, - { - "selector": "objectLiteralProperty", - "format": ["camelCase", "snake_case"] - }, - { - "selector": "typeProperty", - "format": null - }, - { - "selector": "parameter", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "typeParameter", - "format": ["PascalCase"] - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"] - } - ], - "curly": "error" - } -} diff --git a/packages/virtual-background/.prettierrc.json b/packages/virtual-background/.prettierrc.json deleted file mode 100644 index 3a891926..00000000 --- a/packages/virtual-background/.prettierrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "printWidth": 120, - "semi": true, - "trailingComma": "es5" -} diff --git a/packages/virtual-background/package.json b/packages/virtual-background/package.json index 6ade330e..186d910b 100644 --- a/packages/virtual-background/package.json +++ b/packages/virtual-background/package.json @@ -9,8 +9,8 @@ "types": "dist/virtual_background.d.ts", "scripts": { "build": "rollup -c ./rollup.config.mjs --bundleConfigAsCjs && tsc --emitDeclarationOnly", - "lint": "eslint --ext .ts ./src", - "fmt": "prettier --write src", + "lint": "biome lint ./src", + "fmt": "biome format --write src", "doc": "typedoc" }, "repository": { @@ -30,7 +30,7 @@ "devDependencies": { "@mediapipe/selfie_segmentation": "0.1.1675465747", "@shiguredo/video-track-processor": "workspace:*", - "@types/offscreencanvas": "2019.7.1", + "@types/offscreencanvas": "2019.7.3", "stackblur-canvas": "2.6.0" } } \ No newline at end of file diff --git a/packages/virtual-background/src/virtual_background.ts b/packages/virtual-background/src/virtual_background.ts index 19bc8605..aa7c1221 100644 --- a/packages/virtual-background/src/virtual_background.ts +++ b/packages/virtual-background/src/virtual_background.ts @@ -1,10 +1,10 @@ -import { VideoTrackProcessor } from "@shiguredo/video-track-processor"; import { + Results as SelfieSegmentationResults, SelfieSegmentation, SelfieSegmentationConfig, - Results as SelfieSegmentationResults, -} from "@mediapipe/selfie_segmentation"; -import * as StackBlur from "stackblur-canvas"; +} from '@mediapipe/selfie_segmentation' +import { VideoTrackProcessor } from '@shiguredo/video-track-processor' +import * as StackBlur from 'stackblur-canvas' /** * {@link VirtualBackgroundProcessor.startProcessing} メソッドに指定可能なオプション @@ -15,7 +15,12 @@ interface VirtualBackgroundProcessorOptions { * * 省略された場合には、元々の背景が使用されます */ - backgroundImage?: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas; + backgroundImage?: + | HTMLImageElement + | HTMLVideoElement + | HTMLCanvasElement + | ImageBitmap + | OffscreenCanvas /** * 背景ぼかし効果の半径(pixel) @@ -23,7 +28,7 @@ interface VirtualBackgroundProcessorOptions { * 値が大きいほど、ぼかしが強くなります。 * デフォルトではぼかしは無効で、これは値として0を指定した場合の挙動と等しいです。 */ - blurRadius?: number; + blurRadius?: number /** * セグメンテーションに使用するモデル @@ -33,7 +38,7 @@ interface VirtualBackgroundProcessorOptions { * [MediaPipe Selfie Segmentation](https://google.github.io/mediapipe/solutions/selfie_segmentation.html) * を参照してください。 */ - segmentationModel?: "selfie-landscape" | "selfie-general"; + segmentationModel?: 'selfie-landscape' | 'selfie-general' /** * 背景画像のどの領域を使用するかを決定する関数 @@ -42,25 +47,25 @@ interface VirtualBackgroundProcessorOptions { * * デフォルトでは、背景画像のアスペクト比を維持したまま中央部分を切り抜く {@link cropBackgroundImageCenter} が使われます */ - backgroundImageRegion?: (videoFrame: ImageSize, backgroundImage: ImageSize) => ImageRegion; + backgroundImageRegion?: (videoFrame: ImageSize, backgroundImage: ImageSize) => ImageRegion } /** * 画像の幅と高さ */ interface ImageSize { - width: number; - height: number; + width: number + height: number } /** * 画像の領域(始点とサイズ) */ interface ImageRegion { - x: number; - y: number; - width: number; - height: number; + x: number + y: number + width: number + height: number } /** @@ -69,24 +74,24 @@ interface ImageRegion { * これは {@link VirtualBackgroundProcessorOptions.backgroundImageRegion} オプションのデフォルトの挙動です */ function cropBackgroundImageCenter(videoFrame: ImageSize, backgroundImage: ImageSize): ImageRegion { - let x = 0; - let y = 0; - let width = backgroundImage.width; - let height = backgroundImage.height; + let x = 0 + let y = 0 + let width = backgroundImage.width + let height = backgroundImage.height - const videoFrameRatio = videoFrame.width / videoFrame.height; - const backgroundImageRatio = backgroundImage.width / backgroundImage.height; + const videoFrameRatio = videoFrame.width / videoFrame.height + const backgroundImageRatio = backgroundImage.width / backgroundImage.height if (backgroundImageRatio < videoFrameRatio) { - const newHeight = videoFrame.height * (backgroundImage.width / videoFrame.width); - y = Math.round((height - newHeight) / 2); - height = Math.round(newHeight); + const newHeight = videoFrame.height * (backgroundImage.width / videoFrame.width) + y = Math.round((height - newHeight) / 2) + height = Math.round(newHeight) } else if (backgroundImageRatio > videoFrameRatio) { - const newWidth = videoFrame.width * (backgroundImage.height / videoFrame.height); - x = Math.round((width - newWidth) / 2); - width = Math.round(newWidth); + const newWidth = videoFrame.width * (backgroundImage.height / videoFrame.height) + x = Math.round((width - newWidth) / 2) + width = Math.round(newWidth) } - return { x, y, width, height }; + return { x, y, width, height } } /** @@ -96,15 +101,15 @@ function cropBackgroundImageCenter(videoFrame: ImageSize, backgroundImage: Image * 背景画像と処理対象映像のアスペクト比が異なる場合には、背景画像が映像に合わせて引き伸ばされます */ function fillBackgroundImage(_videoFrame: ImageSize, backgroundImage: ImageSize): ImageRegion { - return { x: 0, y: 0, width: backgroundImage.width, height: backgroundImage.height }; + return { x: 0, y: 0, width: backgroundImage.width, height: backgroundImage.height } } /** * 映像トラックに仮想背景処理を適用するためのプロセッサ */ class VirtualBackgroundProcessor { - private trackProcessor: VideoTrackProcessor; - private segmentation: SelfieSegmentation; + private trackProcessor: VideoTrackProcessor + private segmentation: SelfieSegmentation /** * {@link VirtualBackgroundProcessor} インスタンスを生成します @@ -112,15 +117,15 @@ class VirtualBackgroundProcessor { * @param assetsPath wasm 等のファイルの配置先ディレクトリパスないしURL */ constructor(assetsPath: string) { - this.trackProcessor = new VideoTrackProcessor(); + this.trackProcessor = new VideoTrackProcessor() // セグメンテーションモデルのロード準備 - const config: SelfieSegmentationConfig = {}; - assetsPath = trimLastSlash(assetsPath); + const config: SelfieSegmentationConfig = {} + const trimmedAssetsPath = trimLastSlash(assetsPath) config.locateFile = (file: string) => { - return `${assetsPath}/${file}`; - }; - this.segmentation = new SelfieSegmentation(config); + return `${trimmedAssetsPath}/${file}` + } + this.segmentation = new SelfieSegmentation(config) } /** @@ -133,7 +138,7 @@ class VirtualBackgroundProcessor { * @returns サポートされているかどうか */ static isSupported(): boolean { - return VideoTrackProcessor.isSupported(); + return VideoTrackProcessor.isSupported() } /** @@ -151,57 +156,60 @@ class VirtualBackgroundProcessor { */ async startProcessing( track: MediaStreamVideoTrack, - options: VirtualBackgroundProcessorOptions = {} + options: VirtualBackgroundProcessorOptions = {}, ): Promise { - const initialWidth = track.getSettings().width || 0; - const initialHeight = track.getSettings().height || 0; - const canvas = createOffscreenCanvas(initialWidth, initialHeight); - const canvasCtx = canvas.getContext("2d", { + const initialWidth = track.getSettings().width || 0 + const initialHeight = track.getSettings().height || 0 + const canvas = createOffscreenCanvas(initialWidth, initialHeight) + const canvasCtx = canvas.getContext('2d', { desynchronized: true, willReadFrequently: false, // ここをtrueにするとCPU-GPUメモリ転送が発生して遅くなる - }) as OffscreenCanvasRenderingContext2D | null; + }) as OffscreenCanvasRenderingContext2D | null if (canvasCtx === null) { - throw Error("Failed to create 2D canvas context"); + throw Error('Failed to create 2D canvas context') } // Safari での背景ぼかし用に一時作業用の canvas を作っておく // // TODO(sile): Safari が filter に対応したらこの分岐は削除する - let blurCanvasCtx: OffscreenCanvasRenderingContext2D | undefined; - if (options.blurRadius !== undefined && browser() === "safari") { - const ctx = createOffscreenCanvas(initialWidth, initialHeight).getContext("2d", { + let blurCanvasCtx: OffscreenCanvasRenderingContext2D | undefined + if (options.blurRadius !== undefined && browser() === 'safari') { + const ctx = createOffscreenCanvas(initialWidth, initialHeight).getContext('2d', { desynchronized: true, willReadFrequently: true, - }); + }) if (ctx === null) { - throw Error("Failed to create 2D canvas context"); + throw Error('Failed to create 2D canvas context') } - blurCanvasCtx = ctx as OffscreenCanvasRenderingContext2D; + blurCanvasCtx = ctx as OffscreenCanvasRenderingContext2D } // セグメンテーションモデルを準備 - await this.segmentation.initialize(); - let modelSelection = 1; // `1` means "selfie-landscape". - if (options.segmentationModel && options.segmentationModel === "selfie-general") { - modelSelection = 0; + await this.segmentation.initialize() + let modelSelection = 1 // `1` means "selfie-landscape". + if (options.segmentationModel && options.segmentationModel === 'selfie-general') { + modelSelection = 0 } - this.segmentation.setOptions({ modelSelection }); + this.segmentation.setOptions({ modelSelection }) this.segmentation.onResults((results) => { - const { width, height } = results.segmentationMask; - resizeCanvasIfNeed(width, height, canvas); + const { width, height } = results.segmentationMask + resizeCanvasIfNeed(width, height, canvas) if (blurCanvasCtx !== undefined) { - resizeCanvasIfNeed(width, height, blurCanvasCtx.canvas); + resizeCanvasIfNeed(width, height, blurCanvasCtx.canvas) } - this.updateOffscreenCanvas(results, canvasCtx, blurCanvasCtx, options); - }); + this.updateOffscreenCanvas(results, canvasCtx, blurCanvasCtx, options) + }) // 仮想背景処理を開始 - return this.trackProcessor.startProcessing(track, async (image: ImageBitmap | HTMLVideoElement) => { - // @ts-ignore TS2322: 「`image`の型が合っていない」と怒られるけれど、動作はするので一旦無視 - await this.segmentation.send({ image }); - - return canvas; - }); + return this.trackProcessor.startProcessing( + track, + async (image: ImageBitmap | HTMLVideoElement) => { + // @ts-ignore TS2322: 「`image`の型が合っていない」と怒られるけれど、動作はするので一旦無視 + await this.segmentation.send({ image }) + + return canvas + }, + ) } /** @@ -211,8 +219,8 @@ class VirtualBackgroundProcessor { * 必要であれば、別途呼び出し側で対処する必要があります */ stopProcessing() { - this.trackProcessor.stopProcessing(); - this.segmentation.onResults(() => {}); + this.trackProcessor.stopProcessing() + this.segmentation.onResults(() => {}) } /** @@ -221,7 +229,7 @@ class VirtualBackgroundProcessor { * @returns 実行中であれば `true` 、そうでなければ `false` */ isProcessing(): boolean { - return this.trackProcessor.isProcessing(); + return this.trackProcessor.isProcessing() } /** @@ -235,7 +243,7 @@ class VirtualBackgroundProcessor { * @returns 処理適用中の場合は映像トラック、それ以外なら `undefined` */ getOriginalTrack(): MediaStreamVideoTrack | undefined { - return this.trackProcessor.getOriginalTrack(); + return this.trackProcessor.getOriginalTrack() } /** @@ -249,7 +257,7 @@ class VirtualBackgroundProcessor { * @returns 処理適用中の場合は映像トラック、それ以外なら `undefined` */ getProcessedTrack(): MediaStreamVideoTrack | undefined { - return this.trackProcessor.getProcessedTrack(); + return this.trackProcessor.getProcessedTrack() } /** @@ -260,7 +268,7 @@ class VirtualBackgroundProcessor { * @returns 平均フレームレート */ getFps(): number { - return this.trackProcessor.getFps(); + return this.trackProcessor.getFps() } /** @@ -271,42 +279,42 @@ class VirtualBackgroundProcessor { * @returns 平均処理時間 (ミリ秒) */ getAverageProcessedTimeMs(): number { - return this.trackProcessor.getAverageProcessedTimeMs(); + return this.trackProcessor.getAverageProcessedTimeMs() } private updateOffscreenCanvas( segmentationResults: SelfieSegmentationResults, canvasCtx: OffscreenCanvasRenderingContext2D, blurCanvasCtx: OffscreenCanvasRenderingContext2D | undefined, - options: VirtualBackgroundProcessorOptions + options: VirtualBackgroundProcessorOptions, ) { - const { width, height } = segmentationResults.image; + const { width, height } = segmentationResults.image - canvasCtx.save(); - canvasCtx.clearRect(0, 0, width, height); - canvasCtx.drawImage(segmentationResults.segmentationMask, 0, 0, width, height); + canvasCtx.save() + canvasCtx.clearRect(0, 0, width, height) + canvasCtx.drawImage(segmentationResults.segmentationMask, 0, 0, width, height) - canvasCtx.globalCompositeOperation = "source-in"; - canvasCtx.drawImage(segmentationResults.image, 0, 0, width, height); + canvasCtx.globalCompositeOperation = 'source-in' + canvasCtx.drawImage(segmentationResults.image, 0, 0, width, height) // NOTE: mediapipeの例 (https://google.github.io/mediapipe/solutions/selfie_segmentation.html) では、 // "destination-atop"が使われているけれど、背景画像にアルファチャンネルが含まれている場合には、 // "destination-atop"だと透過部分と人物が重なる領域が除去されてしまうので、 // "destination-over"にしている。 - canvasCtx.globalCompositeOperation = "destination-over"; + canvasCtx.globalCompositeOperation = 'destination-over' - let tmpCanvasCtx = canvasCtx; + let tmpCanvasCtx = canvasCtx if (options.blurRadius !== undefined) { if (blurCanvasCtx !== undefined) { - tmpCanvasCtx = blurCanvasCtx; + tmpCanvasCtx = blurCanvasCtx } else { - tmpCanvasCtx.filter = `blur(${options.blurRadius}px)`; + tmpCanvasCtx.filter = `blur(${options.blurRadius}px)` } } if (options.backgroundImage !== undefined) { - const decideRegion = options.backgroundImageRegion || cropBackgroundImageCenter; - const region = decideRegion({ width, height }, options.backgroundImage); + const decideRegion = options.backgroundImageRegion || cropBackgroundImageCenter + const region = decideRegion({ width, height }, options.backgroundImage) tmpCanvasCtx.drawImage( options.backgroundImage, region.x, @@ -316,63 +324,70 @@ class VirtualBackgroundProcessor { 0, 0, width, - height - ); + height, + ) } else { - tmpCanvasCtx.drawImage(segmentationResults.image, 0, 0); + tmpCanvasCtx.drawImage(segmentationResults.image, 0, 0) } if (blurCanvasCtx !== undefined) { // @ts-ignore - StackBlur.canvasRGB(tmpCanvasCtx.canvas, 0, 0, width, height, options.blurRadius); - canvasCtx.drawImage(tmpCanvasCtx.canvas, 0, 0, width, height); + StackBlur.canvasRGB(tmpCanvasCtx.canvas, 0, 0, width, height, options.blurRadius) + canvasCtx.drawImage(tmpCanvasCtx.canvas, 0, 0, width, height) } - canvasCtx.restore(); + canvasCtx.restore() } } -function resizeCanvasIfNeed(width: number, height: number, canvas: OffscreenCanvas | HTMLCanvasElement) { +function resizeCanvasIfNeed( + width: number, + height: number, + canvas: OffscreenCanvas | HTMLCanvasElement, +) { if (canvas.width !== width || canvas.height !== height) { - canvas.width = width; - canvas.height = height; + canvas.width = width + canvas.height = height } } function trimLastSlash(s: string): string { - if (s.slice(-1) === "/") { - return s.slice(0, -1); + if (s.slice(-1) === '/') { + return s.slice(0, -1) } - return s; + return s } // TODO(sile): Safari 16.4 から OffscreenCanvas に対応したので、そのうちにこの関数は削除する function createOffscreenCanvas(width: number, height: number): OffscreenCanvas | HTMLCanvasElement { - if (typeof OffscreenCanvas === "undefined") { + if (typeof OffscreenCanvas === 'undefined') { // OffscreenCanvas が使えない場合には通常の canvas で代替する - const canvas = document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - return canvas; - } else { - return new OffscreenCanvas(width, height); + const canvas = document.createElement('canvas') + canvas.width = width + canvas.height = height + return canvas } + return new OffscreenCanvas(width, height) } function browser(): string { - const ua = window.navigator.userAgent.toLocaleLowerCase(); - if (ua.indexOf("edge") !== -1) { - return "edge"; - } else if (ua.indexOf("chrome") !== -1 && ua.indexOf("edge") === -1) { - return "chrome"; - } else if (ua.indexOf("safari") !== -1 && ua.indexOf("chrome") === -1) { - return "safari"; - } else if (ua.indexOf("opera") !== -1) { - return "opera"; - } else if (ua.indexOf("firefox") !== -1) { - return "firefox"; + const ua = window.navigator.userAgent.toLocaleLowerCase() + if (ua.indexOf('edge') !== -1) { + return 'edge' + } + if (ua.indexOf('chrome') !== -1 && ua.indexOf('edge') === -1) { + return 'chrome' } - return "unknown"; + if (ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1) { + return 'safari' + } + if (ua.indexOf('opera') !== -1) { + return 'opera' + } + if (ua.indexOf('firefox') !== -1) { + return 'firefox' + } + return 'unknown' } export { @@ -382,4 +397,4 @@ export { ImageSize, cropBackgroundImageCenter, fillBackgroundImage, -}; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1af7e47..f1e86d25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,36 +9,24 @@ importers: .: dependencies: '@types/dom-mediacapture-transform': - specifier: 0.1.7 - version: 0.1.7 + specifier: 0.1.9 + version: 0.1.9 devDependencies: + '@biomejs/biome': + specifier: 1.5.2 + version: 1.5.2 '@rollup/plugin-commonjs': specifier: 25.0.7 - version: 25.0.7(rollup@4.1.4) + version: 25.0.7(rollup@4.9.5) '@rollup/plugin-node-resolve': specifier: 15.2.3 - version: 15.2.3(rollup@4.1.4) + version: 15.2.3(rollup@4.9.5) '@rollup/plugin-typescript': - specifier: 11.1.5 - version: 11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.2.2) - '@typescript-eslint/eslint-plugin': - specifier: 6.7.5 - version: 6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/parser': - specifier: 6.7.5 - version: 6.7.5(eslint@8.51.0)(typescript@5.2.2) - eslint: - specifier: 8.51.0 - version: 8.51.0 - eslint-config-prettier: - specifier: 9.0.0 - version: 9.0.0(eslint@8.51.0) - eslint-plugin-prettier: - specifier: 5.0.1 - version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.51.0)(prettier@3.0.3) + specifier: 11.1.6 + version: 11.1.6(rollup@4.9.5)(tslib@2.6.2)(typescript@5.3.3) rollup: - specifier: 4.1.4 - version: 4.1.4 + specifier: 4.9.5 + version: 4.9.5 rollup-plugin-copy: specifier: 3.5.0 version: 3.5.0 @@ -49,11 +37,11 @@ importers: specifier: 2.6.2 version: 2.6.2 typedoc: - specifier: 0.25.2 - version: 0.25.2(typescript@5.2.2) + specifier: 0.25.7 + version: 0.25.7(typescript@5.3.3) typescript: - specifier: 5.2.2 - version: 5.2.2 + specifier: 5.3.3 + version: 5.3.3 packages/image-to-image-video-processor: devDependencies: @@ -61,20 +49,17 @@ importers: specifier: workspace:* version: link:../video-track-processor '@tensorflow/tfjs': - specifier: ^4.8.0 - version: 4.8.0(seedrandom@3.0.5) + specifier: 4.16.0 + version: 4.16.0(seedrandom@3.0.5) '@tensorflow/tfjs-backend-webgl': - specifier: ^4.8.0 - version: 4.8.0(@tensorflow/tfjs-core@4.8.0) + specifier: 4.16.0 + version: 4.16.0(@tensorflow/tfjs-core@4.16.0) '@tensorflow/tfjs-backend-webgpu': - specifier: ^4.8.0 - version: 4.8.0(@tensorflow/tfjs-core@4.8.0) - '@typescript-eslint/eslint-plugin': - specifier: 5.60.0 - version: 5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/parser': - specifier: 5.60.0 - version: 5.60.0(eslint@8.51.0)(typescript@5.2.2) + specifier: 4.16.0 + version: 4.16.0(@tensorflow/tfjs-core@4.16.0) + typescript: + specifier: 5.3.3 + version: 5.3.3 packages/light-adjustment: devDependencies: @@ -82,14 +67,14 @@ importers: specifier: 0.1.1675465747 version: 0.1.1675465747 '@rollup/plugin-replace': - specifier: 5.0.4 - version: 5.0.4(rollup@4.1.4) + specifier: 5.0.5 + version: 5.0.5(rollup@4.9.5) '@shiguredo/video-track-processor': specifier: workspace:* version: link:../video-track-processor '@types/offscreencanvas': - specifier: 2019.7.1 - version: 2019.7.1 + specifier: 2019.7.3 + version: 2019.7.3 stackblur-canvas: specifier: 2.6.0 version: 2.6.0 @@ -109,8 +94,8 @@ importers: packages/video-track-processor: devDependencies: '@types/offscreencanvas': - specifier: 2019.7.1 - version: 2019.7.1 + specifier: 2019.7.3 + version: 2019.7.3 packages/virtual-background: devDependencies: @@ -121,80 +106,101 @@ importers: specifier: workspace:* version: link:../video-track-processor '@types/offscreencanvas': - specifier: 2019.7.1 - version: 2019.7.1 + specifier: 2019.7.3 + version: 2019.7.3 stackblur-canvas: specifier: 2.6.0 version: 2.6.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.51.0 - eslint-visitor-keys: 3.4.3 + /@biomejs/biome@1.5.2: + resolution: {integrity: sha512-LhycxGQBQLmfv6M3e4tMfn/XKcUWyduDYOlCEBrHXJ2mMth2qzYt1JWypkWp+XmU/7Hl2dKvrP4mZ5W44+nWZw==} + engines: {node: '>=14.*'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.5.2 + '@biomejs/cli-darwin-x64': 1.5.2 + '@biomejs/cli-linux-arm64': 1.5.2 + '@biomejs/cli-linux-arm64-musl': 1.5.2 + '@biomejs/cli-linux-x64': 1.5.2 + '@biomejs/cli-linux-x64-musl': 1.5.2 + '@biomejs/cli-win32-arm64': 1.5.2 + '@biomejs/cli-win32-x64': 1.5.2 + dev: true + + /@biomejs/cli-darwin-arm64@1.5.2: + resolution: {integrity: sha512-3JVl08aHKsPyf0XL9SEj1lssIMmzOMAn2t1zwZKBiy/mcZdb0vuyMSTM5haMQ/90wEmrkYN7zux777PHEGrGiw==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@biomejs/cli-darwin-x64@1.5.2: + resolution: {integrity: sha512-QAPW9rZb/AgucUx+ogMg+9eJNipQDqvabktC5Tx4Aqb/mFzS6eDqNP7O0SbGz3DtC5Y2LATEj6o6zKIQ4ZT+3w==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@eslint-community/regexpp@4.9.0: - resolution: {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@biomejs/cli-linux-arm64-musl@1.5.2: + resolution: {integrity: sha512-Z29SjaOyO4QfajplNXSjLx17S79oPN42D094zjE24z7C7p3NxvLhKLygtSP9emgaXkcoESe2chOzF4IrGy/rlg==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.22.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + /@biomejs/cli-linux-arm64@1.5.2: + resolution: {integrity: sha512-fVLrUgIlo05rO4cNu+Py5EwwmXnXhWH+8KrNlWkr2weMYjq85SihUsuWWKpmqU+bUVR+m5gwfcIXZVWYVCJMHw==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint/js@8.51.0: - resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@biomejs/cli-linux-x64-musl@1.5.2: + resolution: {integrity: sha512-ZolquPEjWYUmGeERS8svHOOT7OXEeoriPnV8qptgWJmYF9EO9HUGRn1UtCvdVziDYK+u1A7PxjOdkY1B00ty5A==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + /@biomejs/cli-linux-x64@1.5.2: + resolution: {integrity: sha512-ixqJtUHtF0ho1+1DTZQLAEwHGSqvmvHhAAFXZQoaSdABn+IcITYExlFVA3bGvASy/xtPjRhTx42hVwPtLwMHwg==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + /@biomejs/cli-win32-arm64@1.5.2: + resolution: {integrity: sha512-DN4cXSAoFTdjOoh7f+JITj1uQgQSXt+1pVea9bFrpbgip+ZwkONqQq+jUcmFMMehbp9LuiVtNXFz/ReHn6FY7A==} + engines: {node: '>=14.*'} + cpu: [arm64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@biomejs/cli-win32-x64@1.5.2: + resolution: {integrity: sha512-YvWWXZmk936FdrXqc2jcP6rfsXsNBIs9MKBQQoVXIihwNNRiAaBD9Iwa/ouU1b7Zxq2zETgeuRewVJickFuVOw==} + engines: {node: '>=14.*'} + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -222,22 +228,10 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.3.1 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.6.2 + fastq: 1.16.0 dev: true - /@rollup/plugin-commonjs@25.0.7(rollup@4.1.4): + /@rollup/plugin-commonjs@25.0.7(rollup@4.9.5): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -246,16 +240,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.4(rollup@4.1.4) + '@rollup/pluginutils': 5.1.0(rollup@4.9.5) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.5 - rollup: 4.1.4 + rollup: 4.9.5 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.1.4): + /@rollup/plugin-node-resolve@15.2.3(rollup@4.9.5): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -264,17 +258,17 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.4(rollup@4.1.4) + '@rollup/pluginutils': 5.1.0(rollup@4.9.5) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.6 - rollup: 4.1.4 + resolve: 1.22.8 + rollup: 4.9.5 dev: true - /@rollup/plugin-replace@5.0.4(rollup@4.1.4): - resolution: {integrity: sha512-E2hmRnlh09K8HGT0rOnnri9OTh+BILGr7NVJGB30S4E3cLRn3J0xjdiyOZ74adPs4NiAMgrjUMGAZNJDBgsdmQ==} + /@rollup/plugin-replace@5.0.5(rollup@4.9.5): + resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -282,13 +276,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.4(rollup@4.1.4) + '@rollup/pluginutils': 5.1.0(rollup@4.9.5) magic-string: 0.30.5 - rollup: 4.1.4 + rollup: 4.9.5 dev: true - /@rollup/plugin-typescript@11.1.5(rollup@4.1.4)(tslib@2.6.2)(typescript@5.2.2): - resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} + /@rollup/plugin-typescript@11.1.6(rollup@4.9.5)(tslib@2.6.2)(typescript@5.3.3): + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.14.0||^3.0.0||^4.0.0 @@ -300,118 +294,126 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.0.4(rollup@4.1.4) - resolve: 1.22.6 - rollup: 4.1.4 + '@rollup/pluginutils': 5.1.0(rollup@4.9.5) + resolve: 1.22.8 + rollup: 4.9.5 tslib: 2.6.2 - typescript: 5.2.2 + typescript: 5.3.3 dev: true - /@rollup/pluginutils@5.0.4(rollup@4.1.4): - resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} + /@rollup/pluginutils@5.1.0(rollup@4.9.5): + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.1.4 + rollup: 4.9.5 dev: true - /@rollup/rollup-android-arm-eabi@4.1.4: - resolution: {integrity: sha512-WlzkuFvpKl6CLFdc3V6ESPt7gq5Vrimd2Yv9IzKXdOpgbH4cdDSS1JLiACX8toygihtH5OlxyQzhXOph7Ovlpw==} + /@rollup/rollup-android-arm-eabi@4.9.5: + resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.1.4: - resolution: {integrity: sha512-D1e+ABe56T9Pq2fD+R3ybe1ylCDzu3tY4Qm2Mj24R9wXNCq35+JbFbOpc2yrroO2/tGhTobmEl2Bm5xfE/n8RA==} + /@rollup/rollup-android-arm64@4.9.5: + resolution: {integrity: sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.1.4: - resolution: {integrity: sha512-7vTYrgEiOrjxnjsgdPB+4i7EMxbVp7XXtS+50GJYj695xYTTEMn3HZVEvgtwjOUkAP/Q4HDejm4fIAjLeAfhtg==} + /@rollup/rollup-darwin-arm64@4.9.5: + resolution: {integrity: sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.1.4: - resolution: {integrity: sha512-eGJVZScKSLZkYjhTAESCtbyTBq9SXeW9+TX36ki5gVhDqJtnQ5k0f9F44jNK5RhAMgIj0Ht9+n6HAgH0gUUyWQ==} + /@rollup/rollup-darwin-x64@4.9.5: + resolution: {integrity: sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.1.4: - resolution: {integrity: sha512-HnigYSEg2hOdX1meROecbk++z1nVJDpEofw9V2oWKqOWzTJlJf1UXVbDE6Hg30CapJxZu5ga4fdAQc/gODDkKg==} + /@rollup/rollup-linux-arm-gnueabihf@4.9.5: + resolution: {integrity: sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.1.4: - resolution: {integrity: sha512-TzJ+N2EoTLWkaClV2CUhBlj6ljXofaYzF/R9HXqQ3JCMnCHQZmQnbnZllw7yTDp0OG5whP4gIPozR4QiX+00MQ==} + /@rollup/rollup-linux-arm64-gnu@4.9.5: + resolution: {integrity: sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.1.4: - resolution: {integrity: sha512-aVPmNMdp6Dlo2tWkAduAD/5TL/NT5uor290YvjvFvCv0Q3L7tVdlD8MOGDL+oRSw5XKXKAsDzHhUOPUNPRHVTQ==} + /@rollup/rollup-linux-arm64-musl@4.9.5: + resolution: {integrity: sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.1.4: - resolution: {integrity: sha512-77Fb79ayiDad0grvVsz4/OB55wJRyw9Ao+GdOBA9XywtHpuq5iRbVyHToGxWquYWlEf6WHFQQnFEttsAzboyKg==} + /@rollup/rollup-linux-riscv64-gnu@4.9.5: + resolution: {integrity: sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.5: + resolution: {integrity: sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.1.4: - resolution: {integrity: sha512-/t6C6niEQTqmQTVTD9TDwUzxG91Mlk69/v0qodIPUnjjB3wR4UA3klg+orR2SU3Ux2Cgf2pWPL9utK80/1ek8g==} + /@rollup/rollup-linux-x64-musl@4.9.5: + resolution: {integrity: sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.1.4: - resolution: {integrity: sha512-ZY5BHHrOPkMbCuGWFNpJH0t18D2LU6GMYKGaqaWTQ3CQOL57Fem4zE941/Ek5pIsVt70HyDXssVEFQXlITI5Gg==} + /@rollup/rollup-win32-arm64-msvc@4.9.5: + resolution: {integrity: sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.1.4: - resolution: {integrity: sha512-XG2mcRfFrJvYyYaQmvCIvgfkaGinfXrpkBuIbJrTl9SaIQ8HumheWTIwkNz2mktCKwZfXHQNpO7RgXLIGQ7HXA==} + /@rollup/rollup-win32-ia32-msvc@4.9.5: + resolution: {integrity: sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.1.4: - resolution: {integrity: sha512-ANFqWYPwkhIqPmXw8vm0GpBEHiPpqcm99jiiAp71DbCSqLDhrtr019C5vhD0Bw4My+LmMvciZq6IsWHqQpl2ZQ==} + /@rollup/rollup-win32-x64-msvc@4.9.5: + resolution: {integrity: sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==} cpu: [x64] os: [win32] requiresBuild: true @@ -422,57 +424,55 @@ packages: resolution: {integrity: sha512-WqkBxuqc0WhG1eQW+tKw9asclkysEb9hrbyUieBNiYQnNM9EzNXbNN5o++SwKWou/rsH4LW6LZMe+TpQQtDntg==} dev: true - /@tensorflow/tfjs-backend-cpu@4.8.0(@tensorflow/tfjs-core@4.8.0): - resolution: {integrity: sha512-kT4WZeM4cuuZ+dSCMatrC9YiqV4dxpFzjxKOKwdS41gdg5QKQGW7caScCe55thO/Xpp7VOJXncDYeaMH7GcxCA==} + /@tensorflow/tfjs-backend-cpu@4.16.0(@tensorflow/tfjs-core@4.16.0): + resolution: {integrity: sha512-bQFu7FTUgqgss1AwnqSwQ1f02IPrfLLc2lLn5pyyVrS6Ex7zA6Y4YkfktqoJSRE6LlRZv3vxSriUGE1avRe4qQ==} engines: {yarn: '>= 1.3.2'} peerDependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 dependencies: - '@tensorflow/tfjs-core': 4.8.0 - '@types/seedrandom': 2.4.30 + '@tensorflow/tfjs-core': 4.16.0 + '@types/seedrandom': 2.4.34 seedrandom: 3.0.5 dev: true - /@tensorflow/tfjs-backend-webgl@4.8.0(@tensorflow/tfjs-core@4.8.0): - resolution: {integrity: sha512-iAJzQbndBtarV+OWk9Ukur5U0Xk/4t7j7O5WhPQO/q9yuRyWjAT6MPaCEW/+Ew4XC8yJGuvlfL0Oqi1X0drvfA==} + /@tensorflow/tfjs-backend-webgl@4.16.0(@tensorflow/tfjs-core@4.16.0): + resolution: {integrity: sha512-cIGZWuY892iwTRokbDj3qsLi0AlpQn+U7rzB1mddhHrWr9kBXrrnAvIq0h2aiFzRFNePWUcsbgK+HmYG32kosg==} engines: {yarn: '>= 1.3.2'} peerDependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 dependencies: - '@tensorflow/tfjs-backend-cpu': 4.8.0(@tensorflow/tfjs-core@4.8.0) - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-backend-cpu': 4.16.0(@tensorflow/tfjs-core@4.16.0) + '@tensorflow/tfjs-core': 4.16.0 '@types/offscreencanvas': 2019.3.0 - '@types/seedrandom': 2.4.30 - '@types/webgl-ext': 0.0.30 + '@types/seedrandom': 2.4.34 seedrandom: 3.0.5 dev: true - /@tensorflow/tfjs-backend-webgpu@4.8.0(@tensorflow/tfjs-core@4.8.0): - resolution: {integrity: sha512-got/K0XpCOy1yNYQzpI+cuP7q2MHL7n+W62bfI/guTQb20IFBCQ1/jCE0NmBCp8mdsdAm9d5PmUFV1A7B9s7pA==} + /@tensorflow/tfjs-backend-webgpu@4.16.0(@tensorflow/tfjs-core@4.16.0): + resolution: {integrity: sha512-zAYIz/HU4LrEpo2/3TPxHzmWYGeJfE1MZNj5Vas8JhyPr3J34ijjliKyT0nqYUWVxfybAGMUZhYQ+8jHURJV1Q==} peerDependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 dependencies: - '@tensorflow/tfjs-backend-cpu': 4.8.0(@tensorflow/tfjs-core@4.8.0) - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-backend-cpu': 4.16.0(@tensorflow/tfjs-core@4.16.0) + '@tensorflow/tfjs-core': 4.16.0 dev: true - /@tensorflow/tfjs-converter@4.8.0(@tensorflow/tfjs-core@4.8.0): - resolution: {integrity: sha512-tBYsCdhdFNlFFn4FO49gr1yLX4h8xDxpoFI70lFECxDu9UfwaHNVuBLcocMx4XIFqQx12h6/Y3pD93HFvoum3A==} + /@tensorflow/tfjs-converter@4.16.0(@tensorflow/tfjs-core@4.16.0): + resolution: {integrity: sha512-gd8dHl9tqEPQOHZLAUza713nKr42rpvUXrtm7yUhk10THvJT6TXe9Q2AJKmni8J3vfR+ghsCh77F8D4RbShx1Q==} peerDependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 dependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 dev: true - /@tensorflow/tfjs-core@4.8.0: - resolution: {integrity: sha512-EkgGOAsPQSlpEdiG938c92pdC5i8GHeBVk6xO1AKKX8NiMSIruKtKqIQvX2aOkarwHy/5nhrJebAAvIL4dJlbw==} + /@tensorflow/tfjs-core@4.16.0: + resolution: {integrity: sha512-MarAtO+Up6wA8pI9QDpQOwwJgb/imYMN++tsoaalyOEE9+B5HS4lQldxDJKXO8Frf4DyXf4FItJktEXaiPfRHw==} engines: {yarn: '>= 1.3.2'} dependencies: '@types/long': 4.0.2 - '@types/offscreencanvas': 2019.7.1 - '@types/seedrandom': 2.4.30 - '@types/webgl-ext': 0.0.30 - '@webgpu/types': 0.1.30 + '@types/offscreencanvas': 2019.7.3 + '@types/seedrandom': 2.4.34 + '@webgpu/types': 0.1.38 long: 4.0.0 node-fetch: 2.6.13 seedrandom: 3.0.5 @@ -480,14 +480,14 @@ packages: - encoding dev: true - /@tensorflow/tfjs-data@4.8.0(@tensorflow/tfjs-core@4.8.0)(seedrandom@3.0.5): - resolution: {integrity: sha512-eISTI7Rs51nR9EjyMq/E+mk9JpOIvBqfxT52IEJr2DxqY7TUZ0PlN77Ng/huEL+5I9M+GoVTXe+GFHCmq/5VhQ==} + /@tensorflow/tfjs-data@4.16.0(@tensorflow/tfjs-core@4.16.0)(seedrandom@3.0.5): + resolution: {integrity: sha512-HAmB4/3mvR1t/fuxu4Vx7hEGb4w8EcJoPNlzRHLr0+cYOApii6HQ/OksCcp7Ll8JoCb/SruVR3En3WSjSUu8YQ==} peerDependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 seedrandom: ^3.0.5 dependencies: - '@tensorflow/tfjs-core': 4.8.0 - '@types/node-fetch': 2.6.5 + '@tensorflow/tfjs-core': 4.16.0 + '@types/node-fetch': 2.6.10 node-fetch: 2.6.13 seedrandom: 3.0.5 string_decoder: 1.3.0 @@ -495,24 +495,24 @@ packages: - encoding dev: true - /@tensorflow/tfjs-layers@4.8.0(@tensorflow/tfjs-core@4.8.0): - resolution: {integrity: sha512-jJJvyPxwztP4QMyjUXjyrV6ErWmw4zjub4QidijD8SpY6aVE31xVYqBzIqATa4LjF1ozYwqQoSEvKh4BVFexnA==} + /@tensorflow/tfjs-layers@4.16.0(@tensorflow/tfjs-core@4.16.0): + resolution: {integrity: sha512-LNsbIF3SX45gG2FGo/34IPU+ObRCY5Z2znnp8cSqNZ96v52Q3nZ8GbyjYU9xDHv7eREKTSC2Aga2eGZ9Hfsl/g==} peerDependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 dependencies: - '@tensorflow/tfjs-core': 4.8.0 + '@tensorflow/tfjs-core': 4.16.0 dev: true - /@tensorflow/tfjs@4.8.0(seedrandom@3.0.5): - resolution: {integrity: sha512-aKyYPFk5/aABtz+ETzvow8QBQxq0QgBCf3yQ7I33JkNbrIjlmEJmcfwbbbpLs5bg0BiOcNn2gYGbZHZ4AZuMQQ==} + /@tensorflow/tfjs@4.16.0(seedrandom@3.0.5): + resolution: {integrity: sha512-wBs29w1rsE6XpKdwJ7vrxGJ+nbyU7+51Pgj1ZhLFdv5ZXwF5irHbNX1DegSd/8VbHPEY6mQSPvEuSe1mIhMw5Q==} hasBin: true dependencies: - '@tensorflow/tfjs-backend-cpu': 4.8.0(@tensorflow/tfjs-core@4.8.0) - '@tensorflow/tfjs-backend-webgl': 4.8.0(@tensorflow/tfjs-core@4.8.0) - '@tensorflow/tfjs-converter': 4.8.0(@tensorflow/tfjs-core@4.8.0) - '@tensorflow/tfjs-core': 4.8.0 - '@tensorflow/tfjs-data': 4.8.0(@tensorflow/tfjs-core@4.8.0)(seedrandom@3.0.5) - '@tensorflow/tfjs-layers': 4.8.0(@tensorflow/tfjs-core@4.8.0) + '@tensorflow/tfjs-backend-cpu': 4.16.0(@tensorflow/tfjs-core@4.16.0) + '@tensorflow/tfjs-backend-webgl': 4.16.0(@tensorflow/tfjs-core@4.16.0) + '@tensorflow/tfjs-converter': 4.16.0(@tensorflow/tfjs-core@4.16.0) + '@tensorflow/tfjs-core': 4.16.0 + '@tensorflow/tfjs-data': 4.16.0(@tensorflow/tfjs-core@4.16.0)(seedrandom@3.0.5) + '@tensorflow/tfjs-layers': 4.16.0(@tensorflow/tfjs-core@4.16.0) argparse: 1.0.10 chalk: 4.1.2 core-js: 3.29.1 @@ -523,39 +523,31 @@ packages: - seedrandom dev: true - /@types/dom-mediacapture-transform@0.1.7: - resolution: {integrity: sha512-xrFtEIDCn+VeMEYm4JdjLEOeho3dsTxOxx4hDqCA0WRrENF4DMTF9JaTzTRUVc5rI58j9nRTxIZlU1Wqfr08PA==} + /@types/dom-mediacapture-transform@0.1.9: + resolution: {integrity: sha512-/K96dASG23bqF+VAftybbI5SUj9qSsdsSKZglm7Bq/sIaEve5z8I+GdClARcSQMAAVkH7bc83UI1jiH/qc5LMw==} dependencies: - '@types/dom-webcodecs': 0.1.8 + '@types/dom-webcodecs': 0.1.11 dev: false - /@types/dom-webcodecs@0.1.8: - resolution: {integrity: sha512-KThTPaGQJLITk8Q0XkEkz+GqFdoWDyQfbyeJmfEUagB15TZQdNx5AqP2b7GP6vkVM6X/6T1Z8EHxA8RgHfY9BA==} + /@types/dom-webcodecs@0.1.11: + resolution: {integrity: sha512-yPEZ3z7EohrmOxbk/QTAa0yonMFkNkjnVXqbGb7D4rMr+F1dGQ8ZUFxXkyLLJuiICPejZ0AZE9Rrk9wUCczx4A==} dev: false - /@types/estree@1.0.2: - resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/fs-extra@8.1.3: - resolution: {integrity: sha512-7IdV01N0u/CaVO0fuY1YmEg14HQN3+EW8mpNgg6NEfxEl/lzCa5OxlBu3iFsCAdamnYOcTQ7oEi43Xc/67Rgzw==} + /@types/fs-extra@8.1.5: + resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} dependencies: - '@types/node': 20.8.0 + '@types/node': 20.11.0 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.8.0 - dev: true - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - - /@types/json-schema@7.0.13: - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} + '@types/node': 20.11.0 dev: true /@types/long@4.0.2: @@ -566,312 +558,37 @@ packages: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/node-fetch@2.6.5: - resolution: {integrity: sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==} + /@types/node-fetch@2.6.10: + resolution: {integrity: sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==} dependencies: - '@types/node': 20.5.7 + '@types/node': 20.11.0 form-data: 4.0.0 dev: true - /@types/node@20.5.7: - resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} - dev: true - - /@types/node@20.8.0: - resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} + /@types/node@20.11.0: + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} + dependencies: + undici-types: 5.26.5 dev: true /@types/offscreencanvas@2019.3.0: resolution: {integrity: sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==} dev: true - /@types/offscreencanvas@2019.7.1: - resolution: {integrity: sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==} + /@types/offscreencanvas@2019.7.3: + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} dev: true /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true - /@types/seedrandom@2.4.30: - resolution: {integrity: sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==} - dev: true - - /@types/semver@7.5.1: - resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} + /@types/seedrandom@2.4.34: + resolution: {integrity: sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==} dev: true - /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} - dev: true - - /@types/webgl-ext@0.0.30: - resolution: {integrity: sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==} - dev: true - - /@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 5.60.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 5.60.0 - '@typescript-eslint/type-utils': 5.60.0(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.60.0(eslint@8.51.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.51.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.9.0 - '@typescript-eslint/parser': 6.7.5(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.7.5 - '@typescript-eslint/type-utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.5 - debug: 4.3.4 - eslint: 8.51.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.60.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.60.0 - '@typescript-eslint/types': 5.60.0 - '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.51.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.7.5(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.7.5 - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.5 - debug: 4.3.4 - eslint: 8.51.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.60.0: - resolution: {integrity: sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.60.0 - '@typescript-eslint/visitor-keys': 5.60.0 - dev: true - - /@typescript-eslint/scope-manager@6.7.5: - resolution: {integrity: sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/visitor-keys': 6.7.5 - dev: true - - /@typescript-eslint/type-utils@5.60.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.60.0(eslint@8.51.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.51.0 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/type-utils@6.7.5(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.51.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.60.0: - resolution: {integrity: sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/types@6.7.5: - resolution: {integrity: sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.60.0(typescript@5.2.2): - resolution: {integrity: sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.60.0 - '@typescript-eslint/visitor-keys': 5.60.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree@6.7.5(typescript@5.2.2): - resolution: {integrity: sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/visitor-keys': 6.7.5 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.60.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.1 - '@typescript-eslint/scope-manager': 5.60.0 - '@typescript-eslint/types': 5.60.0 - '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.2.2) - eslint: 8.51.0 - eslint-scope: 5.1.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils@6.7.5(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 6.7.5 - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) - eslint: 8.51.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.60.0: - resolution: {integrity: sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.60.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@typescript-eslint/visitor-keys@6.7.5: - resolution: {integrity: sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.7.5 - eslint-visitor-keys: 3.4.3 - dev: true - - /@webgpu/types@0.1.30: - resolution: {integrity: sha512-9AXJSmL3MzY8ZL//JjudA//q+2kBRGhLBFpkdGksWIuxrMy81nFrCzj2Am+mbh8WoU6rXmv7cY5E3rdlyru2Qg==} + /@webgpu/types@0.1.38: + resolution: {integrity: sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==} dev: true /@zeit/schemas@2.29.0: @@ -886,29 +603,6 @@ packages: negotiator: 0.6.3 dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - /ajv@8.11.0: resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} dependencies: @@ -964,10 +658,6 @@ packages: sprintf-js: 1.0.3 dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -981,11 +671,6 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: true - /boxen@7.0.0: resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} engines: {node: '>=14.16'} @@ -1000,13 +685,6 @@ packages: wrap-ansi: 8.1.0 dev: true - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.51 - dev: true - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1032,23 +710,11 @@ packages: engines: {node: '>=6'} dev: true - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - dependencies: - run-applescript: 5.0.0 - dev: true - /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - /camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} @@ -1178,55 +844,16 @@ packages: ms: 2.0.0 dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: true - - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - dev: true - - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: true - /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1239,13 +866,6 @@ packages: path-type: 4.0.0 dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true @@ -1263,150 +883,10 @@ packages: engines: {node: '>=6'} dev: true - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-prettier@9.0.0(eslint@8.51.0): - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.51.0 - dev: true - - /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.51.0)(prettier@3.0.3): - resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.51.0 - eslint-config-prettier: 9.0.0(eslint@8.51.0) - prettier: 3.0.3 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.5 - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.51.0: - resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@eslint-community/regexpp': 4.9.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.51.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.22.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1422,31 +902,12 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: true - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1456,33 +917,18 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - /fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: punycode: 1.4.1 dev: true - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} dependencies: reusify: 1.0.4 dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.1.0 - dev: true - /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1490,27 +936,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} - dependencies: - flatted: 3.2.9 - keyv: 4.5.3 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true - /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -1541,8 +966,8 @@ packages: dev: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true /get-caller-file@2.0.5: @@ -1562,13 +987,6 @@ packages: is-glob: 4.0.3 dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -1591,13 +1009,6 @@ packages: once: 1.4.0 dev: true - /globals@13.22.0: - resolution: {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - /globby@10.0.1: resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} engines: {node: '>=8'} @@ -1605,21 +1016,9 @@ packages: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 glob: 7.2.3 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -1628,24 +1027,16 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 dev: true /human-signals@2.1.0: @@ -1653,29 +1044,11 @@ packages: engines: {node: '>=10.17.0'} dev: true - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} dev: true - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -1698,10 +1071,10 @@ packages: builtin-modules: 3.3.0 dev: true - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.3 + hasown: 2.0.0 dev: true /is-docker@2.2.1: @@ -1710,12 +1083,6 @@ packages: hasBin: true dev: true - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true - /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1733,14 +1100,6 @@ packages: is-extglob: 2.1.1 dev: true - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: true - /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} dev: true @@ -1750,11 +1109,6 @@ packages: engines: {node: '>=0.12.0'} dev: true - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - /is-plain-object@3.0.1: resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} engines: {node: '>=0.10.0'} @@ -1768,7 +1122,7 @@ packages: /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: - '@types/estree': 1.0.2 + '@types/estree': 1.0.5 dev: true /is-stream@2.0.1: @@ -1776,11 +1130,6 @@ packages: engines: {node: '>=8'} dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -1792,29 +1141,10 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true @@ -1825,42 +1155,10 @@ packages: graceful-fs: 4.2.11 dev: true - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - /lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} dev: true @@ -1924,11 +1222,6 @@ packages: engines: {node: '>=6'} dev: true - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -1957,18 +1250,6 @@ packages: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -1993,13 +1274,6 @@ packages: path-key: 3.1.1 dev: true - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} @@ -2018,61 +1292,6 @@ packages: mimic-fn: 2.1.0 dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -2087,11 +1306,6 @@ packages: engines: {node: '>=8'} dev: true - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -2105,39 +1319,17 @@ packages: engines: {node: '>=8'} dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.3.0 - dev: true - - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} - engines: {node: '>=14'} - hasBin: true - dev: true - /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} dev: true @@ -2188,16 +1380,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve@1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -2207,51 +1394,40 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - /rollup-plugin-copy@3.5.0: resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} engines: {node: '>=8.3'} dependencies: - '@types/fs-extra': 8.1.3 + '@types/fs-extra': 8.1.5 colorette: 1.4.0 fs-extra: 8.1.0 globby: 10.0.1 is-plain-object: 3.0.1 dev: true - /rollup@4.1.4: - resolution: {integrity: sha512-U8Yk1lQRKqCkDBip/pMYT+IKaN7b7UesK3fLSTuHBoBJacCE+oBqo/dfG/gkUdQNNB2OBmRP98cn2C2bkYZkyw==} + /rollup@4.9.5: + resolution: {integrity: sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.1.4 - '@rollup/rollup-android-arm64': 4.1.4 - '@rollup/rollup-darwin-arm64': 4.1.4 - '@rollup/rollup-darwin-x64': 4.1.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.1.4 - '@rollup/rollup-linux-arm64-gnu': 4.1.4 - '@rollup/rollup-linux-arm64-musl': 4.1.4 - '@rollup/rollup-linux-x64-gnu': 4.1.4 - '@rollup/rollup-linux-x64-musl': 4.1.4 - '@rollup/rollup-win32-arm64-msvc': 4.1.4 - '@rollup/rollup-win32-ia32-msvc': 4.1.4 - '@rollup/rollup-win32-x64-msvc': 4.1.4 + '@rollup/rollup-android-arm-eabi': 4.9.5 + '@rollup/rollup-android-arm64': 4.9.5 + '@rollup/rollup-darwin-arm64': 4.9.5 + '@rollup/rollup-darwin-x64': 4.9.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.5 + '@rollup/rollup-linux-arm64-gnu': 4.9.5 + '@rollup/rollup-linux-arm64-musl': 4.9.5 + '@rollup/rollup-linux-riscv64-gnu': 4.9.5 + '@rollup/rollup-linux-x64-gnu': 4.9.5 + '@rollup/rollup-linux-x64-musl': 4.9.5 + '@rollup/rollup-win32-arm64-msvc': 4.9.5 + '@rollup/rollup-win32-ia32-msvc': 4.9.5 + '@rollup/rollup-win32-x64-msvc': 4.9.5 fsevents: 2.3.3 dev: true - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - dependencies: - execa: 5.1.1 - dev: true - /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -2270,14 +1446,6 @@ packages: resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /serve-handler@6.1.5: resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} dependencies: @@ -2323,8 +1491,8 @@ packages: engines: {node: '>=8'} dev: true - /shiki@0.14.4: - resolution: {integrity: sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==} + /shiki@0.14.7: + resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.0 @@ -2393,21 +1561,11 @@ packages: engines: {node: '>=6'} dev: true - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2420,23 +1578,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.4.2 - tslib: 2.6.2 - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2448,80 +1589,44 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.2.2 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils@3.21.0(typescript@5.2.2): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.2.2 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} dev: true - /typedoc@0.25.2(typescript@5.2.2): - resolution: {integrity: sha512-286F7BeATBiWe/qC4PCOCKlSTwfnsLbC/4cZ68oGBbvAqb9vV33quEOXx7q176OXotD+JdEerdQ1OZGJ818lnA==} + /typedoc@0.25.7(typescript@5.3.3): + resolution: {integrity: sha512-m6A6JjQRg39p2ZVRIN3NKXgrN8vzlHhOS+r9ymUYtcUP/TIQPvWSq7YgE5ZjASfv5Vd5BW5xrir6Gm2XNNcOow==} engines: {node: '>= 16'} hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x dependencies: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.3 - shiki: 0.14.4 - typescript: 5.2.2 + shiki: 0.14.7 + typescript: 5.3.3 dev: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - /update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} dependencies: @@ -2532,7 +1637,7 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true /vary@1.1.2: @@ -2601,10 +1706,6 @@ packages: engines: {node: '>=10'} dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -2622,8 +1723,3 @@ packages: y18n: 5.0.8 yargs-parser: 20.2.9 dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true