diff --git a/.bazelversion b/.bazelversion index acd405b1d62e..df5119ec64e6 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -8.6.0 +8.7.0 diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index 87519e50b728..eb299f1e8855 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest if: github.event.repository.fork == false steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false - uses: angular/dev-infra/github-actions/branch-manager@ba726e7bca0b08b125ccc6f93c233749e1213c17 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5280d3d8ba7f..6c33f285f1be 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -19,16 +19,16 @@ jobs: fail-fast: false steps: - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 with: languages: javascript-typescript build-mode: none config-file: .github/codeql/config.yml - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 with: category: '/language:javascript-typescript' diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index ae107e5c34d6..01a24b2a39b5 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -20,10 +20,10 @@ jobs: outputs: snapshots: ${{ steps.filter.outputs.snapshots }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false - - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 + - uses: dorny/paths-filter@7b450fff21473bca461d4b92ce414b9d0420d706 # v4.0.2 id: filter with: filters: | @@ -38,7 +38,7 @@ jobs: - name: Setup Bazel uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - name: Setup ESLint Caching - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0 with: path: .eslintcache key: ${{ runner.os }}-${{ hashFiles('.eslintrc.json') }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 68249d536041..cff557f296b1 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -25,7 +25,7 @@ jobs: steps: - name: 'Checkout code' - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false @@ -46,6 +46,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/upload-sarif@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 with: sarif_file: results.sarif diff --git a/.ng-dev/release.mjs b/.ng-dev/release.mjs index eb5aad2e4fcf..19e111f22f80 100644 --- a/.ng-dev/release.mjs +++ b/.ng-dev/release.mjs @@ -18,7 +18,7 @@ export const release = { name, experimental, deprecated: { - version: '>=22.0.0-next.0', + version: '>=22.0.0-rc.0', message: 'Angular\'s Webpack support is deprecated. Use the esbuild and Vite-based "@angular/build" package instead.', }, diff --git a/.nvmrc b/.nvmrc index db49bb14d78e..f9e7451e7715 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.22.2 +22.23.1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 45ace1ba6263..cdca1a38af1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,275 @@ + + +# 22.0.6 (2026-07-08) + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------ | +| [df49966c6](https://github.com/angular/angular-cli/commit/df49966c6b8ec0c10b58fee18981fc2992ac071a) | fix | fallback to build target preserveSymlinks option in karma runner | +| [9906add5b](https://github.com/angular/angular-cli/commit/9906add5b722cca7f61488b367dd73545c6e13bc) | fix | prevent externalizing builder-injected i18n locale data | +| [070155f6e](https://github.com/angular/angular-cli/commit/070155f6ead185d4b478d9034662d65b8bb86a23) | fix | strip all vite id prefixes from minified code with external dependencies | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------- | +| [c9aa354b1](https://github.com/angular/angular-cli/commit/c9aa354b1de0c946ddc994191613bb809a799f81) | fix | replace all route parameters when resolving relative redirects | + + + + + +# 22.0.5 (2026-07-01) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------- | +| [f099e641c](https://github.com/angular/angular-cli/commit/f099e641c96a5932d81535e712af7044269b4788) | fix | gracefully handle package manager errors in command handler | +| [cf033ec48](https://github.com/angular/angular-cli/commit/cf033ec48e2371655fbf6bcdb588c05aff2e6662) | fix | respect release age policy in update bootstrapping logic | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------- | +| [862a38069](https://github.com/angular/angular-cli/commit/862a380697db60cee8cf83e8fe20641db2a6aae1) | fix | remove unused app tsconfig outDir | + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | +| [f75085f4b](https://github.com/angular/angular-cli/commit/f75085f4b58ed61979a2901a4ef0353e56f22136) | fix | prevent OS command injection in ssr-dev-server builder | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | +| [dfee1e7b1](https://github.com/angular/angular-cli/commit/dfee1e7b142d767c86eecb7791ed72bce65866c5) | fix | auto-inject localize/init in library unit tests | +| [aba718403](https://github.com/angular/angular-cli/commit/aba718403df7a96310570c1449674a49254cd4af) | fix | inherit preserveSymlinks option from build target in unit-test builder | +| [7c0d9f03c](https://github.com/angular/angular-cli/commit/7c0d9f03c2ae82a90a48e51b2aee731a36dc2beb) | fix | load zone.js dynamically for library unit tests | +| [4288e4452](https://github.com/angular/angular-cli/commit/4288e44525e855f29f026276f518968b1b2697db) | fix | scope createRequire module resolution using paths to prevent parent paths | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------- | +| [5f774f891](https://github.com/angular/angular-cli/commit/5f774f891a086bf0a2ab6f86c24485425e99f16d) | fix | preserve response headers during redirect | + + + + + +# 22.0.4 (2026-06-24) + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------- | +| [46185ceac](https://github.com/angular/angular-cli/commit/46185ceacc86cc04819b991621b7bb4e0d865b5a) | fix | aggregate parallel worker performance timings on the main thread | +| [5d7e29c41](https://github.com/angular/angular-cli/commit/5d7e29c41ed3fe0abe77dcdc894d5b7875293cb5) | perf | dispose builder result context early in non-watch mode | + + + + + +# 22.0.3 (2026-06-18) + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | +| [0eddea898](https://github.com/angular/angular-cli/commit/0eddea898d3bf4da8c9c5c27ec2ee79916e8be87) | fix | remove default workspace vscode mcp.json configuration | + + + + + +# 22.0.2 (2026-06-17) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- | +| [136fc2714](https://github.com/angular/angular-cli/commit/136fc27149af74263ef519007f0a74f9f85c5b4d) | fix | support registry metadata fetching under bun package manager | +| [2653dd5c7](https://github.com/angular/angular-cli/commit/2653dd5c7d47149b61bfe6edf4ab1281347e89dd) | perf | implement semaphore backpressure throttling in PackageManager | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------- | +| [0b4a48add](https://github.com/angular/angular-cli/commit/0b4a48add9d7218e698af0db974bd597bed8a121) | perf | implement semaphore backpressure throttling in JavaScriptTransformer | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------- | +| [d996a27e9](https://github.com/angular/angular-cli/commit/d996a27e9744b473a7db56f81871731b8bdce585) | fix | avoid caching non-SSG page lookups | +| [285a34e42](https://github.com/angular/angular-cli/commit/285a34e42f1cdc512468de0041b232c7190e7d7e) | fix | correct grammar in console warning for redirected location headers | +| [c8088a536](https://github.com/angular/angular-cli/commit/c8088a536c2c747a273e37be682643e1b35e2f75) | fix | prioritize options over environment variables in AngularNodeAppEngine | + + + + + +# 22.0.1 (2026-06-10) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------------------------------- | +| [b54e9a549](https://github.com/angular/angular-cli/commit/b54e9a549d30871f6017b1db4cf7a4ab5f3e02db) | fix | do not sort migrations of the same version alphabetically | +| [d33311612](https://github.com/angular/angular-cli/commit/d333116123c7d3d5e87713b7baac048b78f28517) | fix | fallback to local package.json for schematic detection on first run | +| [918102a93](https://github.com/angular/angular-cli/commit/918102a9373085394c41f10d9f5df3e3c17b263f) | fix | isolate temporary package installation from parent pnpm workspace | +| [b048b5f4a](https://github.com/angular/angular-cli/commit/b048b5f4a83d7b20095d79654b849808e7d58fdb) | fix | remove forceAuth and unscoped credential parsing | +| [277934035](https://github.com/angular/angular-cli/commit/277934035138c5af803e8daeebc2313f0a4cb5b3) | fix | validate registry option is a valid URL in ng add | +| [4510dae02](https://github.com/angular/angular-cli/commit/4510dae021ab25bb852eeed6415dbd52cfabfce5) | perf | optimize update schematic registry query counts by fetching package metadata lazily | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------ | +| [c80012294](https://github.com/angular/angular-cli/commit/c8001229453211b37cd7bb12ed26a2deb9257fd5) | fix | fix browserMode option mapping in refactor-jasmine-vitest | +| [a9b6bd904](https://github.com/angular/angular-cli/commit/a9b6bd9042d6b859c384a6fc782541fca30dfb68) | fix | safely comment out multiline statements in refactor-jasmine-vitest | +| [12199df00](https://github.com/angular/angular-cli/commit/12199df00f2e3e8436ada13e04799e5825eb3f7b) | fix | use null objects and callbacks in karma-to-vitest migration | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------- | +| [89d1be979](https://github.com/angular/angular-cli/commit/89d1be979f388d85e9c428bbf1df4e7fb4036dce) | fix | allow disabling Vitest isolation from builder | +| [d45b84be9](https://github.com/angular/angular-cli/commit/d45b84be9a607e49b391cb216cb6de7eca274931) | fix | exclude JSON imports from Vite dependency optimization | +| [e3cab4ddd](https://github.com/angular/angular-cli/commit/e3cab4dddade2538125e8a2f345f42c95e26aeae) | fix | prevent concurrent stylesheet bundling esbuild context leaks | +| [bd413b0eb](https://github.com/angular/angular-cli/commit/bd413b0eb156184ea432cbb7d4e6d7f6f70813ab) | fix | restrict application builder output paths to output directory | + + + + + +# 22.0.0 (2026-06-03) + +## Breaking Changes + +### + +- Node.js v20 is no longer supported. The minimum supported Node.js versions are now v22.22.0 and v24.13.1. +- The `@angular-devkit/architect-cli` package is no longer available. The `architect` CLI tool has been moved to the `@angular-devkit/architect` package. +- The experimental `@angular-devkit/build-angular:jest` and `@angular-devkit/build-angular:web-test-runner` builders have been removed. + +### @angular/build + +- The `@angular/build:dev-server (ng serve)` now assigns the highest priority to the `PORT` environment variable. This value will override any port configurations specified in `angular.json` or via the `--port` command-line flag. This includes the default port 4200. +- `istanbul-lib-instrument` is now an optional peer dependency. + Projects using karma with code coverage enabled will need to ensure that istanbul-lib-instrument is installed. Note: `ng update` will automatically add this dependency during the update process. + +### @angular/ssr + +- The server no longer falls back to Client-Side Rendering (CSR) when a request fails host validation. Requests with unrecognized 'Host' headers will now return a 400 Bad Request status code. Users must ensure all valid hosts are correctly configured in the 'allowedHosts' option. + +## Deprecations + +### @angular-devkit/build-angular + +- Webpack builders in build-angular are deprecated. Use @angular/build builders instead. + +### @angular-devkit/build-webpack + +- Webpack builders in build-webpack are deprecated. Use @angular/build builders instead. + +### @angular/ssr + +- CommonEngine APIs are deprecated in favor of AngularNodeAppEngine or AngularAppEngine. + +### @ngtools/webpack + +- @ngtools/webpack loader and plugin are deprecated. Use @angular/build instead. + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | +| [58c0978f6](https://github.com/angular/angular-cli/commit/58c0978f658ee5fa7232abd8e2eb7f146e4eb6bb) | feat | add support for Node.js 26.0.0 | +| [a5c7c0b5f](https://github.com/angular/angular-cli/commit/a5c7c0b5fda4ae0c00351ba34e5f39dab2c6baee) | fix | reflect new minimum supported Node version in ng.js | +| [a5e1e48db](https://github.com/angular/angular-cli/commit/a5e1e48db759e9ffcaa89f04504f5f93a1afdda4) | fix | update odd-numbered Node.js version warning condition for future releases | +| [93c3eb8fb](https://github.com/angular/angular-cli/commit/93c3eb8fb2a0d531f18779152b0a62e9b73dbb23) | fix | update zoneless migration tool to handle `ChangeDetectionStrategy.Eager` | +| [a39a33128](https://github.com/angular/angular-cli/commit/a39a33128fb56e9c65ea89e06c4f127252d3b220) | perf | cache root manifest and resolve restricted package exports in ng add | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | +| [be60a63b7](https://github.com/angular/angular-cli/commit/be60a63b7b8fdea26bfd3329ce54d321334db2d2) | feat | add migrate-karma-to-vitest update migration | +| [43505066e](https://github.com/angular/angular-cli/commit/43505066e2350ca875051bb0f9991da8003c9247) | feat | add migration to add istanbul-lib-instrument | +| [b2f7a038b](https://github.com/angular/angular-cli/commit/b2f7a038b4a321e4e1b0b340cd09425f948c77ad) | feat | conditionally install istanbul coverage provider for Vitest migration | +| [d227e6985](https://github.com/angular/angular-cli/commit/d227e6985ef5540e0eea2571577ee2b9be0d3c64) | feat | migrate fake async to Vitest fake timers | +| [d2aa9ede5](https://github.com/angular/angular-cli/commit/d2aa9ede55a3e16b61ce6ae60dba6c8ea8954358) | feat | migrate fakeAsync's flush behavior when used in beforeEach | +| [f98cc82eb](https://github.com/angular/angular-cli/commit/f98cc82eb0f46986e61b4f94b57dcd36e4eaf215) | feat | rely on strict template default in generated workspaces | +| [c9f408153](https://github.com/angular/angular-cli/commit/c9f4081533f6f114846b88a152a9d5dc7363d680) | feat | set up fake timers in beforeEach instead of beforeAll | +| [de630c2fc](https://github.com/angular/angular-cli/commit/de630c2fcee22622942478c98117d8f473d8c894) | feat | stabilize refactor-jasmine-vitest schematic | +| [8d0805dd1](https://github.com/angular/angular-cli/commit/8d0805dd1750cb16af620811dc01b40e46ad030e) | feat | update TSConfig globals during karma to vitest migration | +| [470e1f937](https://github.com/angular/angular-cli/commit/470e1f937492e73971dea9c39af83368caf74e42) | fix | add istanbul-lib-instrument to application/library generator dependencies | +| [dc1238e5a](https://github.com/angular/angular-cli/commit/dc1238e5a4c9ab5902735e3d74bc7c5cc57553bd) | fix | add trusted-proxy-headers migration | +| [6572a6944](https://github.com/angular/angular-cli/commit/6572a69443356ff0022e6ce162915125fee0e3bb) | fix | default components to OnPush change detection | +| [aed407db8](https://github.com/angular/angular-cli/commit/aed407db8be6bc7591fb82f10c79586cbd072a8a) | fix | defer karma config deletion in Karma to Vitest migration | +| [4fbc60891](https://github.com/angular/angular-cli/commit/4fbc6089174142623fbd28cc68cede181074fab5) | fix | preserve Jasmine stub-by-default semantics for bare spies | +| [b3d838dfd](https://github.com/angular/angular-cli/commit/b3d838dfdb2adc3bd035b495f7f9457d742d73a4) | fix | replace deprecated `ChangeDetectionStrategy.Default` with `Eager` | +| [a7ac8e5f0](https://github.com/angular/angular-cli/commit/a7ac8e5f0a268994a8fcfebbf56f76e994b6207d) | fix | support spy call arguments migration in refactor-jasmine-vitest | +| [7fb59eaa6](https://github.com/angular/angular-cli/commit/7fb59eaa65a8d7e880b6f44d715b2aeaff9301ca) | fix | use service decorator in ng generate | + +### + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------- | +| [d0e9e8163](https://github.com/angular/angular-cli/commit/d0e9e81639be33c453f1ef66c7c1c8ea4fe543c2) | build | update minimum supported Node.js versions | +| [1f21e89d9](https://github.com/angular/angular-cli/commit/1f21e89d99c191642627df6842402644a1bf26ee) | refactor | remove `@angular-devkit/architect-cli` package | +| [b4885b851](https://github.com/angular/angular-cli/commit/b4885b851226709ae4146070122806e14a3d5eb9) | refactor | remove experimental Jest and Web Test Runner builders | + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | -------------------------- | +| [b7940dbcb](https://github.com/angular/angular-cli/commit/b7940dbcb40291be4de5b31e8a8001165459a7d4) | refactor | deprecate Webpack builders | + +### @angular-devkit/build-webpack + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------- | +| [3d5daa45e](https://github.com/angular/angular-cli/commit/3d5daa45e3ade025c1bc0df35d2766563ccf7c03) | refactor | deprecate webpack and webpack-dev-server builders | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------ | +| [e9aa7967b](https://github.com/angular/angular-cli/commit/e9aa7967ba391e429ec1c04473efb4a2d38a62bf) | feat | add isolate option to unit-test builder | +| [fe720cab6](https://github.com/angular/angular-cli/commit/fe720cab64bbc8bcc2db583188e32ad938e63a23) | feat | add process.env.PORT support to the dev server | +| [0781f7498](https://github.com/angular/angular-cli/commit/0781f74986e773d143b9bdf5d3f0747de0df6b0a) | feat | add quiet option to suppress build noise in unit tests | +| [cd2ad3c19](https://github.com/angular/angular-cli/commit/cd2ad3c1958d9adadc214045b5e59c0c8f8b4499) | feat | enable chunk optimization by default with heuristics | +| [3007f46b7](https://github.com/angular/angular-cli/commit/3007f46b7e077227b17d8bb1090edd2f8ff19ae3) | feat | move istanbul-lib-instrument to optional peer dependency | +| [af2c7e944](https://github.com/angular/angular-cli/commit/af2c7e9444fba81d3b1fd2d37dc4412f8305b5ed) | feat | rename `experimentalPlatform` to `platform` in application builder | +| [58c7c7a9d](https://github.com/angular/angular-cli/commit/58c7c7a9d80fc6af5cf8b82a6d87f1d3cf3808c6) | feat | subresource integrity validation for dynamically loaded modules | +| [73233dc5f](https://github.com/angular/angular-cli/commit/73233dc5f41b570f5ac095b255a46de6cbfb54b7) | feat | support Istanbul coverage in Vitest runner | +| [414320d02](https://github.com/angular/angular-cli/commit/414320d02a090b7b36720051569cba7563bf9ac6) | feat | support runtime Zone.js detection in Vitest unit test runner | +| [b85ec6798](https://github.com/angular/angular-cli/commit/b85ec6798b5c74f778a69a657729e446a2156261) | fix | allow configuring Access-Control-Allow-Origin via headers option | +| [edfa782d5](https://github.com/angular/angular-cli/commit/edfa782d52fd971aebead8b96b6ca470a3f5123e) | fix | use dynamic TestComponentRenderer for Vitest | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------- | +| [5adc92541](https://github.com/angular/angular-cli/commit/5adc92541433be23fc2246db5a199cf5c0dc9e67) | fix | enforce explicit opt-in for proxy headers | +| [f85343925](https://github.com/angular/angular-cli/commit/f8534392552f4896ee9449939cdc705010331e3d) | fix | support all X-Forwarded-\* headers when trustProxyHeaders is true | +| [8471ba634](https://github.com/angular/angular-cli/commit/8471ba63433d87ba3e59af622ed9cfa89b732cd9) | fix | support server-side rendering configuration options | +| [50b16a65b](https://github.com/angular/angular-cli/commit/50b16a65b1be1f9c2ec11d578240a8884518d517) | refactor | deprecate CommonEngine APIs | +| [27cd35561](https://github.com/angular/angular-cli/commit/27cd355619aad140dfc221c6bd161f4a981e0f3b) | refactor | remove CSR fallback for invalid hosts | + +### @ngtools/webpack + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------- | +| [547ca515b](https://github.com/angular/angular-cli/commit/547ca515b707c283489a3f088d86fc84807d830d) | refactor | deprecate @ngtools/webpack loader and plugin | + + + # 21.2.10 (2026-05-06) @@ -34,43 +306,6 @@ - - -# 22.0.0-next.7 (2026-04-29) - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- | -| [0572df064](https://github.com/angular/angular-cli/commit/0572df06457a46276cf229c7c50ccb59167a75d8) | fix | fix broken img ref in ai-tutor | -| [d6121b5e8](https://github.com/angular/angular-cli/commit/d6121b5e87796b61dd0e2157a5ce4e8f3d33e915) | fix | introduce initial package manager workspace awareness | -| [48eab1fc0](https://github.com/angular/angular-cli/commit/48eab1fc0bd83c6f87a015252283579ebbd7d0fb) | fix | remove standalone true ref in ai tutor | - -### @schematics/angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------------- | -| [b47dfbac4](https://github.com/angular/angular-cli/commit/b47dfbac431b7f22f769dbe3eec491811fa46aca) | fix | add missing imports for focus and skip APIs in refactor-jasmine-vitest | -| [dc1238e5a](https://github.com/angular/angular-cli/commit/dc1238e5a4c9ab5902735e3d74bc7c5cc57553bd) | fix | add trusted-proxy-headers migration | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------ | -| [e9aa7967b](https://github.com/angular/angular-cli/commit/e9aa7967ba391e429ec1c04473efb4a2d38a62bf) | feat | add isolate option to unit-test builder | -| [73233dc5f](https://github.com/angular/angular-cli/commit/73233dc5f41b570f5ac095b255a46de6cbfb54b7) | feat | support Istanbul coverage in Vitest runner | - -### @angular/ssr - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------- | -| [126b19b9c](https://github.com/angular/angular-cli/commit/126b19b9c74422211619aad0e523ef5f7e8eeabb) | fix | add support for configuring trusted proxy headers via environment variable | -| [53b9623b7](https://github.com/angular/angular-cli/commit/53b9623b7b4ee2266332f57e71896361dac21db8) | fix | decode route segments when building and matching route tree | -| [5adc92541](https://github.com/angular/angular-cli/commit/5adc92541433be23fc2246db5a199cf5c0dc9e67) | fix | enforce explicit opt-in for proxy headers | -| [c34c569b0](https://github.com/angular/angular-cli/commit/c34c569b076c8b9d82bf18a094a29cb68fd8a63d) | fix | use router to normalize URLs for comparison | - - - # 21.2.9 (2026-04-29) @@ -118,43 +353,6 @@ - - -# 22.0.0-next.6 (2026-04-22) - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------- | -| [cc30034da](https://github.com/angular/angular-cli/commit/cc30034da25f1b873e354c493043fe46f0bfc8dd) | fix | dynamically resolve project Angular CLI executable inside MCP tools | -| [ead60d3d5](https://github.com/angular/angular-cli/commit/ead60d3d5fcf7c013392ba25b932b86f0e5cd9d9) | fix | ignore EBADF file system errors during MCP project scan | -| [0d984cf1c](https://github.com/angular/angular-cli/commit/0d984cf1cdfed0a4f74e6bf8efb8a3c999ebc373) | fix | use headless option in MCP test tool | - -### @schematics/angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------- | -| [de630c2fc](https://github.com/angular/angular-cli/commit/de630c2fcee22622942478c98117d8f473d8c894) | feat | stabilize refactor-jasmine-vitest schematic | - -### @angular-devkit/build-angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- | -| [30d8332ed](https://github.com/angular/angular-cli/commit/30d8332edc10786fc90512809a59189865a5d956) | fix | ensure route has leading slash in prerender builder | -| [cf5b49ed7](https://github.com/angular/angular-cli/commit/cf5b49ed7843250607ff0fc49ae6d97f13f4d9ab) | fix | fix app-shell route format and | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------- | -| [0781f7498](https://github.com/angular/angular-cli/commit/0781f74986e773d143b9bdf5d3f0747de0df6b0a) | feat | add quiet option to suppress build noise in unit tests | -| [cd2ad3c19](https://github.com/angular/angular-cli/commit/cd2ad3c1958d9adadc214045b5e59c0c8f8b4499) | feat | enable chunk optimization by default with heuristics | -| [b85ec6798](https://github.com/angular/angular-cli/commit/b85ec6798b5c74f778a69a657729e446a2156261) | fix | allow configuring Access-Control-Allow-Origin via headers option | -| [59803b12b](https://github.com/angular/angular-cli/commit/59803b12ba69d4ba17c769ee5e81c3175d79ab58) | fix | use rootDir for HMR component updates path resolution | -| [74e7dbe56](https://github.com/angular/angular-cli/commit/74e7dbe56c825c521fc711cf6c0d5ba8fabece75) | fix | validate V8 coverage support for browsers in Vitest | - - - # 20.3.24 (2026-04-15) @@ -167,41 +365,6 @@ - - -# 22.0.0-next.5 (2026-04-08) - -## Breaking Changes - -### @angular/build - -- `istanbul-lib-instrument` is now an optional peer dependency. - Projects using karma with code coverage enabled will need to ensure that istanbul-lib-instrument is installed. Note: `ng update` will automatically add this dependency during the update process. - -### @schematics/angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | -| [be60a63b7](https://github.com/angular/angular-cli/commit/be60a63b7b8fdea26bfd3329ce54d321334db2d2) | feat | add migrate-karma-to-vitest update migration | -| [43505066e](https://github.com/angular/angular-cli/commit/43505066e2350ca875051bb0f9991da8003c9247) | feat | add migration to add istanbul-lib-instrument | -| [470e1f937](https://github.com/angular/angular-cli/commit/470e1f937492e73971dea9c39af83368caf74e42) | fix | add istanbul-lib-instrument to application/library generator dependencies | - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------- | -| [422c8183e](https://github.com/angular/angular-cli/commit/422c8183ea3596660475491b9630df34276c468e) | fix | handle missing package manager during analytics initialization | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------- | -| [3007f46b7](https://github.com/angular/angular-cli/commit/3007f46b7e077227b17d8bb1090edd2f8ff19ae3) | feat | move istanbul-lib-instrument to optional peer dependency | -| [829bdc61d](https://github.com/angular/angular-cli/commit/829bdc61dd77231bb13f01efd052811661fe4f48) | fix | preserve coverage ignore comments in development | -| [e2f95fc19](https://github.com/angular/angular-cli/commit/e2f95fc19a648f3da84b58ace91283d0fa422cc1) | fix | show clear error when styleUrl points to a TypeScript file | - - - # 21.2.7 (2026-04-08) @@ -245,35 +408,6 @@ - - -# 22.0.0-next.4 (2026-04-01) - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------- | -| [87d99e98b](https://github.com/angular/angular-cli/commit/87d99e98b178c8f7d5e944a346faf70c51bdfcef) | feat | support custom port in MCP devserver start tool | -| [4815a5417](https://github.com/angular/angular-cli/commit/4815a5417c7a0135fb66149c2e4c1008e21e3a26) | fix | fix sourceRoot resolution for MCP projects tool | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------- | -| [21d8aa474](https://github.com/angular/angular-cli/commit/21d8aa4747573132476c3a0a4b7ea1f6405a71ef) | fix | ensure transitive SCSS partial errors are tracked in watch mode | -| [e558117b7](https://github.com/angular/angular-cli/commit/e558117b748ee5837324d49466108d21db596b2e) | fix | ensure Vitest mock patching is executed only once | -| [81e4faae7](https://github.com/angular/angular-cli/commit/81e4faae7699e2ed1eb8f4656dc115ca9c20f416) | fix | preserve error stack traces during prerendering | -| [8dd341e21](https://github.com/angular/angular-cli/commit/8dd341e21b8f44e8e2bf3f322cced8ff6e861098) | fix | scope CHROME_BIN executable path to individual playwright instances | - -### @angular/ssr - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------- | -| [e7e434ca3](https://github.com/angular/angular-cli/commit/e7e434ca3d78a8369b592bf870c9466962f77c94) | fix | allow underscores in host validation | -| [bcd99f944](https://github.com/angular/angular-cli/commit/bcd99f944ecb90f896040030b98f1d03692b5b6f) | fix | patch Headers.forEach in cloneRequestAndPatchHeaders | - - - # 21.2.6 (2026-04-01) @@ -368,41 +502,6 @@ - - -# 22.0.0-next.3 (2026-03-26) - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------- | -| [4bbd1bf53](https://github.com/angular/angular-cli/commit/4bbd1bf532fc2d9c36650121a05eae2fb096eb09) | fix | restore console methods after logger completes | - -### @schematics/angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- | -| [f98cc82eb](https://github.com/angular/angular-cli/commit/f98cc82eb0f46986e61b4f94b57dcd36e4eaf215) | feat | rely on strict template default in generated workspaces | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | -| [01bd5d064](https://github.com/angular/angular-cli/commit/01bd5d06410719f66fcabb0bfd04c809e7db12f7) | fix | deduplicate and merge coverage excludes with vitest | -| [355ebe8c5](https://github.com/angular/angular-cli/commit/355ebe8c54b58201c8080543e5e04208599f0947) | fix | prevent reporter duplicates by explicitly overriding Vitest configuration | -| [1a8376bee](https://github.com/angular/angular-cli/commit/1a8376bee9b7683b84c2ae50d08e50d5c5c7b99a) | fix | remove default for unit-test coverage option | -| [a203dcf1d](https://github.com/angular/angular-cli/commit/a203dcf1d9a6d544cbae867aa949ab0582e60a88) | fix | warn about performance of test.exclude in vitest configuration | -| [ec10eb365](https://github.com/angular/angular-cli/commit/ec10eb365261549c2181efa98a494a749444a787) | fix | warn when vitest watch config conflicts with builder | - -### @angular/ssr - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------- | -| [ca6f08c6e](https://github.com/angular/angular-cli/commit/ca6f08c6e59820160f7ae496a9d8775c78ce1a58) | fix | apply forwarded prefix and vary header in accept-language redirects | -| [3b99ee140](https://github.com/angular/angular-cli/commit/3b99ee140db82c8ddae3f6e48f9fc38eca204a53) | fix | support '\*' in allowedHosts and warn about security risks | - - - # 21.2.4 (2026-03-26) @@ -446,39 +545,6 @@ - - -# 22.0.0-next.2 (2026-03-18) - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ | -| [c9f07db8f](https://github.com/angular/angular-cli/commit/c9f07db8fcb0b3f8400fbbf0e131be7f9857a987) | fix | use parsed package name for migrate-only updates | - -### @schematics/angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------- | -| [6572a6944](https://github.com/angular/angular-cli/commit/6572a69443356ff0022e6ce162915125fee0e3bb) | fix | default components to OnPush change detection | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------ | -| [9b33e1781](https://github.com/angular/angular-cli/commit/9b33e1781328d3b42665145bf580fb8e06c8ad2b) | fix | alias createRequire banner import to avoid duplicate binding | -| [4643a8a3b](https://github.com/angular/angular-cli/commit/4643a8a3b3e2a3bcf7baae9f812ae8a9ef10ebad) | fix | only use external packages for polyfills when no local files are present | - -### @angular/ssr - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- | -| [4d564f66f](https://github.com/angular/angular-cli/commit/4d564f66f694011724d4933bf025f1c4fed55bca) | fix | disallow x-forwarded-prefix starting with a backslash | -| [ff1160e30](https://github.com/angular/angular-cli/commit/ff1160e3015eb321971e398cbedff80f4c053166) | fix | ensure unique values in redirect response Vary header | -| [998b8298e](https://github.com/angular/angular-cli/commit/998b8298e3106c95d77ced8090ab815365c462c7) | fix | support custom headers in redirect responses | - - - # 21.2.3 (2026-03-18) @@ -506,44 +572,6 @@ - - -# 22.0.0-next.1 (2026-03-11) - -## Breaking Changes - -### @angular/build - -- The `@angular/build:dev-server (ng serve)` now assigns the highest priority to the `PORT` environment variable. This value will override any port configurations specified in `angular.json` or via the `--port` command-line flag. This includes the default port 4200. - -### @schematics/angular - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------------- | -| [b3d838dfd](https://github.com/angular/angular-cli/commit/b3d838dfdb2adc3bd035b495f7f9457d742d73a4) | fix | replace deprecated `ChangeDetectionStrategy.Default` with `Eager` | - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------- | -| [598a690a0](https://github.com/angular/angular-cli/commit/598a690a0baea5cd54af5cea38e673c33605a627) | fix | conditionally quote package names when adding dependencies based on host requirements | -| [b5fb457e1](https://github.com/angular/angular-cli/commit/b5fb457e157fa78b61565eaba6b88e9f80b3b288) | fix | preserve exact version in ng add when requested | -| [93c3eb8fb](https://github.com/angular/angular-cli/commit/93c3eb8fb2a0d531f18779152b0a62e9b73dbb23) | fix | update zoneless migration tool to handle `ChangeDetectionStrategy.Eager` | -| [ad0fd5f41](https://github.com/angular/angular-cli/commit/ad0fd5f41fc6ee5d920fb3c725f09f17d86d2ab4) | perf | avoid redundant package version resolution in ng add | -| [a39a33128](https://github.com/angular/angular-cli/commit/a39a33128fb56e9c65ea89e06c4f127252d3b220) | perf | cache root manifest and resolve restricted package exports in ng add | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------ | -| [fe720cab6](https://github.com/angular/angular-cli/commit/fe720cab64bbc8bcc2db583188e32ad938e63a23) | feat | add process.env.PORT support to the dev server | -| [af2c7e944](https://github.com/angular/angular-cli/commit/af2c7e9444fba81d3b1fd2d37dc4412f8305b5ed) | feat | rename `experimentalPlatform` to `platform` in application builder | -| [6324133c2](https://github.com/angular/angular-cli/commit/6324133c282f5e04ee6e9e46fc5f387cbbefad8e) | fix | normalize line endings for CSP hash generation | -| [839c725c2](https://github.com/angular/angular-cli/commit/839c725c234b2c1c3e44d52e3a1442ad1b538be9) | fix | pass process environment variables to prerender workers | -| [f30f8900e](https://github.com/angular/angular-cli/commit/f30f8900efb8ad9a835630f57e3667346926dc4d) | fix | resolve assets correctly during i18n prerendering | - - - # 21.2.2 (2026-03-11) @@ -579,51 +607,6 @@ - - -# 22.0.0-next.0 (2026-03-05) - -## Breaking Changes - -### - -- Node.js v20 is no longer supported. The minimum supported Node.js versions are now v22.22.0 and v24.13.1. -- The `@angular-devkit/architect-cli` package is no longer available. The `architect` CLI tool has been moved to the `@angular-devkit/architect` package. -- The experimental `@angular-devkit/build-angular:jest` and `@angular-devkit/build-angular:web-test-runner` builders have been removed. - -### @angular/ssr - -- The server no longer falls back to Client-Side Rendering (CSR) when a request fails host validation. Requests with unrecognized 'Host' headers will now return a 400 Bad Request status code. Users must ensure all valid hosts are correctly configured in the 'allowedHosts' option. - -### @angular/cli - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- | -| [a5c7c0b5f](https://github.com/angular/angular-cli/commit/a5c7c0b5fda4ae0c00351ba34e5f39dab2c6baee) | fix | reflect new minimum supported Node version in ng.js | - -### - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------- | -| [d0e9e8163](https://github.com/angular/angular-cli/commit/d0e9e81639be33c453f1ef66c7c1c8ea4fe543c2) | build | update minimum supported Node.js versions | -| [1f21e89d9](https://github.com/angular/angular-cli/commit/1f21e89d99c191642627df6842402644a1bf26ee) | refactor | remove `@angular-devkit/architect-cli` package | -| [b4885b851](https://github.com/angular/angular-cli/commit/b4885b851226709ae4146070122806e14a3d5eb9) | refactor | remove experimental Jest and Web Test Runner builders | - -### @angular/build - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------ | -| [414320d02](https://github.com/angular/angular-cli/commit/414320d02a090b7b36720051569cba7563bf9ac6) | feat | support runtime Zone.js detection in Vitest unit test runner | -| [f190263a4](https://github.com/angular/angular-cli/commit/f190263a4010a4f7b9ae85806b5d70a16b57b9fa) | fix | allow any `CHROME_BIN` for vitest playwright provider | - -### @angular/ssr - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | -------- | ------------------------------------- | -| [27cd35561](https://github.com/angular/angular-cli/commit/27cd355619aad140dfc221c6bd161f4a981e0f3b) | refactor | remove CSR fallback for invalid hosts | - - - # 21.2.1 (2026-03-05) @@ -14598,21 +14581,23 @@ Alan Agius, Charles Lyding, Joey Perrott, Keen Yee Liau, Luca Vazzano, Pankaj Pa A number of browser and server builder options have had their default values changed. The aim of these changes is to reduce the configuration complexity and support the new "production builds by default" initiative. **Browser builder** -| Option | Previous default value | New default value | -|----------------------------------------|---------------------------|-------------------| -| optimization | false | true | -| aot | false | true | -| buildOptimizer | false | true | -| sourceMap | true | false | -| extractLicenses | false | true | -| namedChunks | true | false | -| vendorChunk | true | false | + +| Option | Previous default value | New default value | +| --------------- | ---------------------- | ----------------- | +| optimization | false | true | +| aot | false | true | +| buildOptimizer | false | true | +| sourceMap | true | false | +| extractLicenses | false | true | +| namedChunks | true | false | +| vendorChunk | true | false | **Server builder** -| Option | Previous default value | New default value | -|---------------|------------------------|-------------------| -| optimization | false | true | -| sourceMap | true | false | + +| Option | Previous default value | New default value | +| ------------ | ---------------------- | ----------------- | +| optimization | false | true | +| sourceMap | true | false | (cherry picked from commit 0a74d0d28daf68510459ed73ef048c91bfcabbbc) @@ -15633,21 +15618,23 @@ Alan Agius, Charles Lyding, Joey Perrott, Cédric Exbrayat, Doug Parker, Joshua A number of browser and server builder options have had their default values changed. The aim of these changes is to reduce the configuration complexity and support the new "production builds by default" initiative. **Browser builder** -| Option | Previous default value | New default value | -|----------------------------------------|---------------------------|-------------------| -| optimization | false | true | -| aot | false | true | -| buildOptimizer | false | true | -| sourceMap | true | false | -| extractLicenses | false | true | -| namedChunks | true | false | -| vendorChunk | true | false | + +| Option | Previous default value | New default value | +| --------------- | ---------------------- | ----------------- | +| optimization | false | true | +| aot | false | true | +| buildOptimizer | false | true | +| sourceMap | true | false | +| extractLicenses | false | true | +| namedChunks | true | false | +| vendorChunk | true | false | **Server builder** -| Option | Previous default value | New default value | -|---------------|------------------------|-------------------| -| optimization | false | true | -| sourceMap | true | false | + +| Option | Previous default value | New default value | +| ------------ | ---------------------- | ----------------- | +| optimization | false | true | +| sourceMap | true | false | (cherry picked from commit 0a74d0d28daf68510459ed73ef048c91bfcabbbc) diff --git a/MODULE.bazel b/MODULE.bazel index 880cf3ce8662..505c9366a7f1 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -4,51 +4,51 @@ module( name = "angular_cli", ) -bazel_dep(name = "platforms", version = "1.0.0") +bazel_dep(name = "platforms", version = "1.1.0") bazel_dep(name = "yq.bzl", version = "0.3.6") -bazel_dep(name = "rules_nodejs", version = "6.7.4") -bazel_dep(name = "aspect_rules_js", version = "3.0.3") -bazel_dep(name = "aspect_rules_ts", version = "3.8.8") +bazel_dep(name = "rules_nodejs", version = "6.7.5") +bazel_dep(name = "aspect_rules_js", version = "3.2.2") +bazel_dep(name = "aspect_rules_ts", version = "3.8.11") bazel_dep(name = "rules_pkg", version = "1.2.0") -bazel_dep(name = "rules_cc", version = "0.2.18") +bazel_dep(name = "rules_cc", version = "0.2.22") bazel_dep(name = "jq.bzl", version = "0.6.1") -bazel_dep(name = "bazel_lib", version = "3.3.1") +bazel_dep(name = "bazel_lib", version = "3.4.0") bazel_dep(name = "bazel_skylib", version = "1.9.0") -bazel_dep(name = "aspect_rules_esbuild", version = "0.25.1") +bazel_dep(name = "aspect_rules_esbuild", version = "0.26.0") bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4") bazel_dep(name = "rules_angular") git_override( module_name = "rules_angular", - commit = "b1d295334e70335dab7ac9984a989fae0a9c9dc2", + commit = "50b8a6daa50cfbbab422d5f29f85c40128e10fd1", remote = "https://github.com/angular/rules_angular.git", ) bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "48c48fa3848de5bb0ec1c3203558f099765165ab", + commit = "ab850ab679f5ee8f019adca5283795ddf1581201", remote = "https://github.com/angular/dev-infra.git", ) bazel_dep(name = "rules_browsers") git_override( module_name = "rules_browsers", - commit = "b03f09ef28a08f8ae07482851cf5ecbf6ac23a2a", + commit = "b7be6ff1a213baece2fb729ea0ae5809a772ee59", remote = "https://github.com/angular/rules_browsers.git", ) node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") node.toolchain( node_repositories = { - "22.22.2-darwin_arm64": ("node-v22.22.2-darwin-arm64.tar.gz", "node-v22.22.2-darwin-arm64", "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000"), - "22.22.2-darwin_amd64": ("node-v22.22.2-darwin-x64.tar.gz", "node-v22.22.2-darwin-x64", "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba"), - "22.22.2-linux_arm64": ("node-v22.22.2-linux-arm64.tar.xz", "node-v22.22.2-linux-arm64", "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe"), - "22.22.2-linux_ppc64le": ("node-v22.22.2-linux-ppc64le.tar.xz", "node-v22.22.2-linux-ppc64le", "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9"), - "22.22.2-linux_s390x": ("node-v22.22.2-linux-s390x.tar.xz", "node-v22.22.2-linux-s390x", "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb"), - "22.22.2-linux_amd64": ("node-v22.22.2-linux-x64.tar.xz", "node-v22.22.2-linux-x64", "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a"), - "22.22.2-windows_amd64": ("node-v22.22.2-win-x64.zip", "node-v22.22.2-win-x64", "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c"), + "22.23.1-darwin_arm64": ("node-v22.23.1-darwin-arm64.tar.gz", "node-v22.23.1-darwin-arm64", "ef28d8fab2c0e4314522d4bb1b7173270aa3937e93b92cb7de79c112ac1fa953"), + "22.23.1-darwin_amd64": ("node-v22.23.1-darwin-x64.tar.gz", "node-v22.23.1-darwin-x64", "b8da981b8a0b1241b70249204916da76c63573ddf5814dbd2d1e41069105cb81"), + "22.23.1-linux_arm64": ("node-v22.23.1-linux-arm64.tar.xz", "node-v22.23.1-linux-arm64", "0294e8b915ab75f92c7513d2fcb830ae06e10684e6c603e99a87dbf8835389c1"), + "22.23.1-linux_ppc64le": ("node-v22.23.1-linux-ppc64le.tar.xz", "node-v22.23.1-linux-ppc64le", "a645bcb7bbc498d09ba9249b5c6414aa6d0a461d8854afc61e32096646ba5e66"), + "22.23.1-linux_s390x": ("node-v22.23.1-linux-s390x.tar.xz", "node-v22.23.1-linux-s390x", "f16b5636ba925b462e627c5e0ef47de3255bf4a7b38d56db58e2cf165df19c3c"), + "22.23.1-linux_amd64": ("node-v22.23.1-linux-x64.tar.xz", "node-v22.23.1-linux-x64", "9749e988f437343b7fa832c69ded82a312e41a03116d766797ac14f6f9eee578"), + "22.23.1-windows_amd64": ("node-v22.23.1-win-x64.zip", "node-v22.23.1-win-x64", "7df0bc9375723f4a86b3aa1b7cc73342423d9677a8df4538aca31a049e309c29"), }, - node_version = "22.22.2", + node_version = "22.23.1", ) use_repo( node, @@ -66,30 +66,30 @@ node_dev = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dep node_dev.toolchain( name = "node22", node_repositories = { - "22.22.0-darwin_arm64": ("node-v22.22.0-darwin-arm64.tar.gz", "node-v22.22.0-darwin-arm64", "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640"), - "22.22.0-darwin_amd64": ("node-v22.22.0-darwin-x64.tar.gz", "node-v22.22.0-darwin-x64", "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce"), - "22.22.0-linux_arm64": ("node-v22.22.0-linux-arm64.tar.xz", "node-v22.22.0-linux-arm64", "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f"), - "22.22.0-linux_ppc64le": ("node-v22.22.0-linux-ppc64le.tar.xz", "node-v22.22.0-linux-ppc64le", "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865"), - "22.22.0-linux_s390x": ("node-v22.22.0-linux-s390x.tar.xz", "node-v22.22.0-linux-s390x", "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4"), - "22.22.0-linux_amd64": ("node-v22.22.0-linux-x64.tar.xz", "node-v22.22.0-linux-x64", "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37"), - "22.22.0-windows_amd64": ("node-v22.22.0-win-x64.zip", "node-v22.22.0-win-x64", "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a"), + "22.22.3-darwin_arm64": ("node-v22.22.3-darwin-arm64.tar.gz", "node-v22.22.3-darwin-arm64", "0da7ff74ef8611328c8212f17943368713a2ad953fb7d89a8c8a0eae87c23207"), + "22.22.3-darwin_amd64": ("node-v22.22.3-darwin-x64.tar.gz", "node-v22.22.3-darwin-x64", "45830ba752fa0d892c6dcd640946669801293cac820a33591ded40ac075198ec"), + "22.22.3-linux_arm64": ("node-v22.22.3-linux-arm64.tar.xz", "node-v22.22.3-linux-arm64", "1c4a9933a5e45bc88f54f70b5f91232c127ec49f1a5989d23fb85824c7adf9b7"), + "22.22.3-linux_ppc64le": ("node-v22.22.3-linux-ppc64le.tar.xz", "node-v22.22.3-linux-ppc64le", "edb5478071bd1375e80195ca52f72823998bb5141b1a09e68bc54b3e2eb67754"), + "22.22.3-linux_s390x": ("node-v22.22.3-linux-s390x.tar.xz", "node-v22.22.3-linux-s390x", "ce398c057830d57a24c458177279a17bc51742d5c22dd4cbe97b10dbd43f2617"), + "22.22.3-linux_amd64": ("node-v22.22.3-linux-x64.tar.xz", "node-v22.22.3-linux-x64", "2e5d13569282d016861fae7c8f935e741693c269101a5bebcf761a5376d1f99f"), + "22.22.3-windows_amd64": ("node-v22.22.3-win-x64.zip", "node-v22.22.3-win-x64", "6c8d54f635feff4df76c2ca80f45332eb2ff57d25226edce36592e51a177ee33"), }, - node_version = "22.22.0", + node_version = "22.22.3", ) # Node.js 24 node_dev.toolchain( name = "node24", node_repositories = { - "24.13.1-darwin_arm64": ("node-v24.13.1-darwin-arm64.tar.gz", "node-v24.13.1-darwin-arm64", "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6"), - "24.13.1-darwin_amd64": ("node-v24.13.1-darwin-x64.tar.gz", "node-v24.13.1-darwin-x64", "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf"), - "24.13.1-linux_arm64": ("node-v24.13.1-linux-arm64.tar.xz", "node-v24.13.1-linux-arm64", "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1"), - "24.13.1-linux_ppc64le": ("node-v24.13.1-linux-ppc64le.tar.xz", "node-v24.13.1-linux-ppc64le", "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6"), - "24.13.1-linux_s390x": ("node-v24.13.1-linux-s390x.tar.xz", "node-v24.13.1-linux-s390x", "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2"), - "24.13.1-linux_amd64": ("node-v24.13.1-linux-x64.tar.xz", "node-v24.13.1-linux-x64", "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089"), - "24.13.1-windows_amd64": ("node-v24.13.1-win-x64.zip", "node-v24.13.1-win-x64", "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279"), + "24.15.0-darwin_arm64": ("node-v24.15.0-darwin-arm64.tar.gz", "node-v24.15.0-darwin-arm64", "372331b969779ab5d15b949884fc6eaf88d5afe87bde8ba881d6400b9100ffc4"), + "24.15.0-darwin_amd64": ("node-v24.15.0-darwin-x64.tar.gz", "node-v24.15.0-darwin-x64", "ffd5ee293467927f3ee731a553eb88fd1f48cf74eebc2d74a6babe4af228673b"), + "24.15.0-linux_arm64": ("node-v24.15.0-linux-arm64.tar.xz", "node-v24.15.0-linux-arm64", "f3d5a797b5d210ce8e2cb265544c8e482eaedcb8aa409a8b46da7e8595d0dda0"), + "24.15.0-linux_ppc64le": ("node-v24.15.0-linux-ppc64le.tar.xz", "node-v24.15.0-linux-ppc64le", "6a6560a27bd2817013c28c3d917bfe9eebf26bbd4b1d88475190f216cc411fbb"), + "24.15.0-linux_s390x": ("node-v24.15.0-linux-s390x.tar.xz", "node-v24.15.0-linux-s390x", "940d4cbfadf736b34519630a05d144c09f8a5aca291a802f2f559ee1562f6f24"), + "24.15.0-linux_amd64": ("node-v24.15.0-linux-x64.tar.xz", "node-v24.15.0-linux-x64", "472655581fb851559730c48763e0c9d3bc25975c59d518003fc0849d3e4ba0f6"), + "24.15.0-windows_amd64": ("node-v24.15.0-win-x64.zip", "node-v24.15.0-win-x64", "cc5149eabd53779ce1e7bdc5401643622d0c7e6800ade18928a767e940bb0e62"), }, - node_version = "24.13.1", + node_version = "24.15.0", ) # Node.js 26 @@ -131,8 +131,8 @@ use_repo( pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm") pnpm.pnpm( name = "pnpm", - pnpm_version = "10.33.2", - pnpm_version_integrity = "sha512-qQ+vb+6rca1sblf5Tg/hoS9dzCLNdU20CulZPraj4LaxLjVAIYuzeuCDQEsfLObbKkEh6XmCm0r/lLmfSdoc+A==", + pnpm_version = "10.34.4", + pnpm_version_integrity = "sha512-h2i+VSAK4/Iia2Un/Momh+FLxOXxLXchoPJdo99HkVF3BYZI20F3uvNIEg+guidS2NjZP2vq8f5krhjajelhrw==", ) use_repo(pnpm, "pnpm") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 06eb02660a88..74357360f683 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -18,16 +18,16 @@ "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.5/source.json": "ac2c3213df8f985785f1d0aeb7f0f73d5324e6e67d593d9b9470fb74a25d4a9b", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", - "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.1/MODULE.bazel": "9b931b3e483bd8eedb6966bda6df07d801f70ccb4896231b4e5e711b5130f3aa", - "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.25.1/source.json": "a0b72e23ed06113f3878cb635d586b4045ef37750983467af72fe0315c3a2fcd", + "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.26.0/MODULE.bazel": "6c902d97038c3ab07b6c4e67c97abc61b20182fcfa84fa7dee82fc724f12e455", + "https://bcr.bazel.build/modules/aspect_rules_esbuild/0.26.0/source.json": "4cc3ece7ab661bb391a9e24fe55c4b567d60a9ea9d9e91d772dad373cbcb6217", "https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.4/MODULE.bazel": "fbb819eb8b7e5d7f67fdd38f7cecb413e287594cd666ce192c72c8828527775a", "https://bcr.bazel.build/modules/aspect_rules_jasmine/2.0.4/source.json": "81ffb708333cd98ec3c0b4cc004f4d5cf92a16914b5196a2892c45141bba7cff", "https://bcr.bazel.build/modules/aspect_rules_js/2.0.0/MODULE.bazel": "b45b507574aa60a92796e3e13c195cd5744b3b8aff516a9c0cb5ae6a048161c5", "https://bcr.bazel.build/modules/aspect_rules_js/3.0.3/MODULE.bazel": "28a30e8fc33bf64a67835d64d124f6e05a7d59648dcb27b110fb3502f761e503", - "https://bcr.bazel.build/modules/aspect_rules_js/3.0.3/source.json": "bb8fff9a304452e1042af9522ad1d54d6f1d1fdf71c5127deadb6fd156654193", - "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.8/MODULE.bazel": "b52b929a948438665809d49af610f58d1b14f63d6d21ab748f47b6050be4c1f6", - "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.8/source.json": "5414530b761a45ab7ca6c49f0a2a9cf8dc0da772f5037cf05ca18aaa64bb1b19", - "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.6/MODULE.bazel": "cafb8781ad591bc57cc765dca5fefab08cf9f65af363d162b79d49205c7f8af7", + "https://bcr.bazel.build/modules/aspect_rules_js/3.2.2/MODULE.bazel": "e844196321b64537cfade338f361633e7d5fe084eee3214fc531b9e7b9838813", + "https://bcr.bazel.build/modules/aspect_rules_js/3.2.2/source.json": "0e650e493b3bc784dc3f8240ff00b4b32258cde6d021ef6b1db4e387bcfd6a9a", + "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.11/MODULE.bazel": "85cefd3b02fa62c1572d8a39cc463ce7e42f0d40609a9bb0e32c51fade019d16", + "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.11/source.json": "64aa2b10eaa911e6581b384aa5845228efc6676b7232bb5140967618812fa909", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.8/MODULE.bazel": "aa975a83e72bcaac62ee61ab12b788ea324a1d05c4aab28aadb202f647881679", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/MODULE.bazel": "37c764292861c2f70314efa9846bb6dbb44fc0308903b3285da6528305450183", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.3.3/source.json": "605086bbc197743a0d360f7ddc550a1d4dfa0441bc807236e17170f636153348", @@ -44,15 +44,15 @@ "https://bcr.bazel.build/modules/bazel_features/1.39.0/MODULE.bazel": "28739425c1fc283c91931619749c832b555e60bcd1010b40d8441ce0a5cf726d", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "https://bcr.bazel.build/modules/bazel_features/1.41.0/MODULE.bazel": "6e0f87fafed801273c371d41e22a15a6f8abf83fdd7f87d5e44ad317b94433d0", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/MODULE.bazel": "defa2226f06ba20550d6548c3a2ea2a7929634437a52973869c20c225450eb91", - "https://bcr.bazel.build/modules/bazel_features/1.43.0/source.json": "1c4207dc858d6de0eecef30026793616bbf420c74aac27b6bad212534a730437", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/MODULE.bazel": "2083ef9c7a469f520890483ccf8e0189d6e71e2117e7752e15e6554433d5ae3e", + "https://bcr.bazel.build/modules/bazel_features/1.50.0/source.json": "e0ee3debde2789ff56e4452e612d126925ba9ab64d4bde79c67f099d2902df9b", "https://bcr.bazel.build/modules/bazel_features/1.9.0/MODULE.bazel": "885151d58d90d8d9c811eb75e3288c11f850e1d6b481a8c9f766adee4712358b", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_lib/3.0.0-rc.0/MODULE.bazel": "d6e00979a98ac14ada5e31c8794708b41434d461e7e7ca39b59b765e6d233b18", "https://bcr.bazel.build/modules/bazel_lib/3.0.0/MODULE.bazel": "22b70b80ac89ad3f3772526cd9feee2fa412c2b01933fea7ed13238a448d370d", "https://bcr.bazel.build/modules/bazel_lib/3.2.2/MODULE.bazel": "e2c890c8a515d6bca9c66d47718aa9e44b458fde64ec7204b8030bf2d349058c", - "https://bcr.bazel.build/modules/bazel_lib/3.3.1/MODULE.bazel": "732a0d516cf6400d9b3136e4356258aef1bf91de8d5240f87f0112f098920c1d", - "https://bcr.bazel.build/modules/bazel_lib/3.3.1/source.json": "8e5175d7b4125a39b8941d01e38039934d058e03804f46a2b8fd7ae6316b1ce2", + "https://bcr.bazel.build/modules/bazel_lib/3.4.0/MODULE.bazel": "80b9f62a884c2e6927b1e35a9b0ceeaa1af2f3eff378712520218c52197628fa", + "https://bcr.bazel.build/modules/bazel_lib/3.4.0/source.json": "af79e961bd5e33d3becc1d3d825bfd5e65285709b9581219a970307d4071f1fc", "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", @@ -87,7 +87,8 @@ "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", "https://bcr.bazel.build/modules/package_metadata/0.0.2/MODULE.bazel": "fb8d25550742674d63d7b250063d4580ca530499f045d70748b1b142081ebb92", - "https://bcr.bazel.build/modules/package_metadata/0.0.2/source.json": "e53a759a72488d2c0576f57491ef2da0cf4aab05ac0997314012495935531b73", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/MODULE.bazel": "77890552ecea9e284b5424c9de827a58099348763a4359e975c359a83d4faa83", + "https://bcr.bazel.build/modules/package_metadata/0.0.3/source.json": "742075a428ad12a3fa18a69014c2f57f01af910c6d9d18646c990200853e641a", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", @@ -96,7 +97,8 @@ "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", - "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", + "https://bcr.bazel.build/modules/platforms/1.1.0/MODULE.bazel": "1c0c09f5bdcf4b3f924720d2478a3711cb39f4977019ca5988685e5b7e18b3d2", + "https://bcr.bazel.build/modules/platforms/1.1.0/source.json": "fcf351c47596c939140ab0d333dfdd08ed1ea6ce33c2fe70c12493a301cf1344", "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", @@ -123,9 +125,10 @@ "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", + "https://bcr.bazel.build/modules/rules_cc/0.1.5/MODULE.bazel": "88dfc9361e8b5ae1008ac38f7cdfd45ad738e4fa676a3ad67d19204f045a1fd8", "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/MODULE.bazel": "4460ec36adc8f722a6a2a4ac9374cb91f2acebadaa93fc37966129afb3dece87", - "https://bcr.bazel.build/modules/rules_cc/0.2.18/source.json": "abad668ff2fd63ada1ac49bf386d37e27048b89a3465a6fd968bb832b00a09d3", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/MODULE.bazel": "94df4328edef9e44d38de5e73b037cd348e75e7ae55f4e21bf07878c41a31ebb", + "https://bcr.bazel.build/modules/rules_cc/0.2.22/source.json": "b2d6d6f9c332ce269ad75b89c6f3168d809a66173c9040210fb9bcc733ab42fa", "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", @@ -162,8 +165,8 @@ "https://bcr.bazel.build/modules/rules_nodejs/6.2.0/MODULE.bazel": "ec27907f55eb34705adb4e8257952162a2d4c3ed0f0b3b4c3c1aad1fac7be35e", "https://bcr.bazel.build/modules/rules_nodejs/6.5.0/MODULE.bazel": "546d0cf79f36f9f6e080816045f97234b071c205f4542e3351bd4424282a8810", "https://bcr.bazel.build/modules/rules_nodejs/6.7.3/MODULE.bazel": "c22a48b2a0dbf05a9dc5f83837bbc24c226c1f6e618de3c3a610044c9f336056", - "https://bcr.bazel.build/modules/rules_nodejs/6.7.4/MODULE.bazel": "e6a241a55c82e999145553d2e00a08fc6ebadf62b63d108fb5e984696ffd0bd2", - "https://bcr.bazel.build/modules/rules_nodejs/6.7.4/source.json": "34e7a8a3b4c8d630ac0e0492b3fed9dba41fe008a0edf220b7d88fa38ac53698", + "https://bcr.bazel.build/modules/rules_nodejs/6.7.5/MODULE.bazel": "97e6794043821d23c013baa4a50fd1c599f2e6ae92b06e2c5f1cd7074fd83e7c", + "https://bcr.bazel.build/modules/rules_nodejs/6.7.5/source.json": "d60ee5a76258b1c8f99545ed24172b44d43ba64ca1a2dfc04371ef203df19fdf", "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", "https://bcr.bazel.build/modules/rules_pkg/1.2.0/MODULE.bazel": "c7db3c2b407e673c7a39e3625dc05dc9f12d6682cbd82a3a5924a13b491eda7e", @@ -182,7 +185,8 @@ "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43", - "https://bcr.bazel.build/modules/rules_python/1.0.0/source.json": "b0162a65c6312e45e7912e39abd1a7f8856c2c7e41ecc9b6dc688a6f6400a917", + "https://bcr.bazel.build/modules/rules_python/1.7.0/MODULE.bazel": "d01f995ecd137abf30238ad9ce97f8fc3ac57289c8b24bd0bf53324d937a14f8", + "https://bcr.bazel.build/modules/rules_python/1.7.0/source.json": "028a084b65dcf8f4dc4f82f8778dbe65df133f234b316828a82e060d81bdce32", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.4.1/MODULE.bazel": "00e501db01bbf4e3e1dd1595959092c2fadf2087b2852d3f553b5370f5633592", "https://bcr.bazel.build/modules/rules_shell/0.4.1/source.json": "4757bd277fe1567763991c4425b483477bb82e35e777a56fd846eb5cceda324a", @@ -195,14 +199,16 @@ "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/MODULE.bazel": "bf5fda5b5ccef8c3c4a5f4886144377386e0baa382972f257acb42dcf40ea908", - "https://bcr.bazel.build/modules/tar.bzl/0.10.1/source.json": "3f1beb35acf53c270a9de493cdc775a985551d7069cfcf24e136b42f683bbb10", + "https://bcr.bazel.build/modules/tar.bzl/0.10.4/MODULE.bazel": "e8f9ff79199e8d9eaad7f1b0a77ad74b30bb82d794b87d8ca942bead5de83ae9", + "https://bcr.bazel.build/modules/tar.bzl/0.10.5/MODULE.bazel": "e964c1f07f7174478d43be7177f364640e24956d5994bd39d48548cc6a436e2c", + "https://bcr.bazel.build/modules/tar.bzl/0.10.5/source.json": "6703dc57a6c7118722ac452ffb0a05f6e205408b810c6aaf25741a635d5f4b89", "https://bcr.bazel.build/modules/tar.bzl/0.2.1/MODULE.bazel": "52d1c00a80a8cc67acbd01649e83d8dd6a9dc426a6c0b754a04fe8c219c76468", "https://bcr.bazel.build/modules/tar.bzl/0.5.1/MODULE.bazel": "7c2eb3dcfc53b0f3d6f9acdfd911ca803eaf92aadf54f8ca6e4c1f3aee288351", "https://bcr.bazel.build/modules/tar.bzl/0.6.0/MODULE.bazel": "a3584b4edcfafcabd9b0ef9819808f05b372957bbdff41601429d5fd0aac2e7c", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", "https://bcr.bazel.build/modules/yq.bzl/0.3.2/MODULE.bazel": "0384efa70e8033d842ea73aa4b7199fa099709e236a7264345c03937166670b6", + "https://bcr.bazel.build/modules/yq.bzl/0.3.4/MODULE.bazel": "d3a270662f5d766cd7229732d65a5a5bc485240c3007343dd279edfb60c9ae27", "https://bcr.bazel.build/modules/yq.bzl/0.3.6/MODULE.bazel": "985c2a0cb4ad9994bb0e33cc7fae931c91105eeefe3faa355b8f4c258d0607c0", "https://bcr.bazel.build/modules/yq.bzl/0.3.6/source.json": "678aaf6e291164f3cd761bb3e872e8a151248f413dbb63c5524a50b82a5bc890", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", @@ -215,8 +221,8 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "RJZEFwxTtTSj8BUT6RYAEkcq8BHH9IVPJ//T0MDu3sA=", - "usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=", + "bzlTransitiveDigest": "B1WSH5/7T3RNuZRYRT3kdtUsogpIj/Qinv5w6wBDZ5w=", + "usagesDigest": "LSQ+zZp7JNgnBONTxxXnwGr4NTh2qtQYk7qwXXz5qWo=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -430,7 +436,7 @@ }, "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { - "bzlTransitiveDigest": "dhTbv9E6UfT1WJmmu3ORRPO6AKFJvgBjBxu+BO+u1RY=", + "bzlTransitiveDigest": "VLBM+xAmHIkUBo6q6ZrBLvZrmlgr1GfV2104wKXqLWg=", "usagesDigest": "QQqokxpCVnBJntX7dhxnf/c13LeWUQxDTUnILYCp4Jc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -494,7 +500,7 @@ "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "general": { "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", - "usagesDigest": "0S2z9G3E1NIz6vCXk9IbRcO5LIckEcYVMSzRj2sEML8=", + "usagesDigest": "CEiJ7Sjne8hcKXaXq1aqAmppgOlFPiQqlvsg0rJxjyw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -503,9 +509,9 @@ "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", "attributes": { "deps": { - "aspect_rules_js": "3.0.3", - "aspect_rules_ts": "3.8.8", - "aspect_rules_esbuild": "0.25.1", + "aspect_rules_js": "3.2.2", + "aspect_rules_ts": "3.8.11", + "aspect_rules_esbuild": "0.26.0", "aspect_rules_jasmine": "2.0.4", "aspect_tools_telemetry": "0.3.3" } @@ -528,7 +534,7 @@ }, "@@pybind11_bazel+//:python_configure.bzl%extension": { "general": { - "bzlTransitiveDigest": "D2/qWHU6yQFwRG7Bb+caqrYMha5avsASao2vERrxK24=", + "bzlTransitiveDigest": "VhEtmxw1yzb9rBZVsKTdti7p+nDM/Fv1p9TmKdO45+Q=", "usagesDigest": "fycyB39YnXIJkfWCIXLUKJMZzANcuLy9ZE73hRucjFk=", "recordedFileInputs": { "@@pybind11_bazel+//MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" @@ -588,7 +594,7 @@ }, "@@rules_browsers+//browsers:extensions.bzl%browsers": { "general": { - "bzlTransitiveDigest": "Bm6fiKpWy96aLohOlLCP36ARVxRLZm/R+smhsb2HzmI=", + "bzlTransitiveDigest": "EBp/FfAhc/Sc8W74EymKqcRrKIZ9idpOoGBpTHNBmq4=", "usagesDigest": "FmXYJVoVJlnfUU8x8gObSvu4qWcco/9Faw61aC/wBF0=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -597,9 +603,9 @@ "rules_browsers_chrome_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "1ac33f89306327af43be159c03ca4a26486de0858f42fe52394acdef50364143", + "sha256": "feda205ebf34b1f11ce029e9fbc53a58d33d1cd2bda589c303b5d765a24d622e", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/linux64/chrome-headless-shell-linux64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/linux64/chrome-headless-shell-linux64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-linux64/chrome-headless-shell" @@ -615,9 +621,9 @@ "rules_browsers_chrome_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "169ff49c465cfda52931395e61861e146dfc5013e92c01ca792db5acea858d0b", + "sha256": "35a53578b165feb823cc36e55bde46a4a28f3ccad4501ad2d28dd24f7eeb3ca9", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-x64/chrome-headless-shell-mac-x64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/mac-x64/chrome-headless-shell-mac-x64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-x64/chrome-headless-shell" @@ -633,9 +639,9 @@ "rules_browsers_chrome_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "aeaaaaa4d68193a21bed04c44ddeb1230232707b4ea1d845a92925787509cd8e", + "sha256": "03f590990280f912375f4fc6837cecc001d50b90e82c49e652d5f3753e076f46", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-arm64/chrome-headless-shell-mac-arm64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/mac-arm64/chrome-headless-shell-mac-arm64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-arm64/chrome-headless-shell" @@ -651,9 +657,9 @@ "rules_browsers_chrome_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "4d6d79bcbcb22084df6e3a3d3a2caff67d6c0fa488d63f0c7ec1526f9553db8c", + "sha256": "af116be0a1990aaf714886e5ab55e2a6b1c8027a281388828eb3d30f315c3b50", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/win64/chrome-headless-shell-win64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/win64/chrome-headless-shell-win64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-win64/chrome-headless-shell.exe" @@ -669,9 +675,9 @@ "rules_browsers_chromedriver_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "0607ccf6810a07ae08cac6443beac8b23f88dd53c7f1e0299e22d65f7cd2d020", + "sha256": "d1304673b9716955b0f5723112e3abb727244ef29c406f4d57198ede96fb050c", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/linux64/chromedriver-linux64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/linux64/chromedriver-linux64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-linux64/chromedriver" @@ -685,9 +691,9 @@ "rules_browsers_chromedriver_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "0f512a9dd683ed4c41e609d8d02c07807497dbad3ab2f95f0d583486be7b8cff", + "sha256": "c91a282eeba13a9801a42c0b57f689f3ca18b7b82626833ef5359b2f9de52728", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-x64/chromedriver-mac-x64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/mac-x64/chromedriver-mac-x64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-mac-x64/chromedriver" @@ -701,9 +707,9 @@ "rules_browsers_chromedriver_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "7d6fc6d17de1733eb6739d1ea16d085c8df1568bcf9fa0d130c2784b27f38268", + "sha256": "dbf22753f0869514f15b497b2a41e082d6e36db7e5fc64d81e02946fc884da5c", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/mac-arm64/chromedriver-mac-arm64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/mac-arm64/chromedriver-mac-arm64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-mac-arm64/chromedriver" @@ -717,9 +723,9 @@ "rules_browsers_chromedriver_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "f4e9fb7bbf692fde7979b24e8d737b3cef4baafbc7a370e5d0abc4a8450fd830", + "sha256": "1545e1a34d89c6f803bb343c9f347406f3ca52187d8e38ec522d9ad3e764ea9a", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/147.0.7687.0/win64/chromedriver-win64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/152.0.7933.0/win64/chromedriver-win64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-win64/chromedriver.exe" @@ -733,9 +739,9 @@ "rules_browsers_firefox_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "f055b9c0d7346a10d22edc7f10e08679af2ea495367381ab2be9cab3ec6add97", + "sha256": "748704b06ffaabc8bd2b3351c93c244db4e29bfe21af6ecb4d6c124c7bd4a234", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/147.0/linux-x86_64/en-US/firefox-147.0.tar.xz" + "https://archive.mozilla.org/pub/firefox/releases/152.0/linux-x86_64/en-US/firefox-152.0.tar.xz" ], "named_files": { "FIREFOX": "firefox/firefox" @@ -749,9 +755,9 @@ "rules_browsers_firefox_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "48485e2068bc726e2f30cf5855fc2da1fc75c1272bc243a5394f428ffae3ba35", + "sha256": "b8a46188850d2fb32f16ad3c0829b08cd689bc714b8ee18fd9b09bb60629004d", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/147.0/mac/en-US/Firefox%20147.0.dmg" + "https://archive.mozilla.org/pub/firefox/releases/152.0/mac/en-US/Firefox%20152.0.dmg" ], "named_files": { "FIREFOX": "Firefox.app/Contents/MacOS/firefox" @@ -765,9 +771,9 @@ "rules_browsers_firefox_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "48485e2068bc726e2f30cf5855fc2da1fc75c1272bc243a5394f428ffae3ba35", + "sha256": "b8a46188850d2fb32f16ad3c0829b08cd689bc714b8ee18fd9b09bb60629004d", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/147.0/mac/en-US/Firefox%20147.0.dmg" + "https://archive.mozilla.org/pub/firefox/releases/152.0/mac/en-US/Firefox%20152.0.dmg" ], "named_files": { "FIREFOX": "Firefox.app/Contents/MacOS/firefox" @@ -781,9 +787,9 @@ "rules_browsers_firefox_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "36ff9e150875aa48a0af9eec3eb67f66dddd8efac5c743265371a72ae3e796c4", + "sha256": "3c426623ff83cb014402607c7ec99fea5b39eec2e44a07f639680c393ff9784e", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/147.0/win64/en-US/Firefox%20Setup%20147.0.exe" + "https://archive.mozilla.org/pub/firefox/releases/152.0/win64/en-US/Firefox%20Setup%20152.0.exe" ], "named_files": { "FIREFOX": "core/firefox.exe" @@ -800,7 +806,7 @@ }, "@@rules_fuzzing+//fuzzing/private:extensions.bzl%non_module_dependencies": { "general": { - "bzlTransitiveDigest": "4LouzhF/yT117s7peGnNs9ROomiJXC6Zl5R0oI21jho=", + "bzlTransitiveDigest": "CYUiFDCnL2VGx3uotIu/VuGabgObnZra2zzRUJCX0sU=", "usagesDigest": "wy6ISK6UOcBEjj/mvJ/S3WeXoO67X+1llb9yPyFtPgc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -883,7 +889,7 @@ }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { - "bzlTransitiveDigest": "nvW/NrBXlAmiQw99EMGKkLaD2KbNp2mQDlxdfpr+0Ls=", + "bzlTransitiveDigest": "03Qju4tW0vE+0RBuZGuV2A4Hx6AiSkdNahYvworx2aM=", "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -945,4283 +951,158 @@ ] } }, - "@@rules_nodejs+//nodejs:extensions.bzl%node": { + "@@rules_python+//python/extensions:config.bzl%config": { "general": { - "bzlTransitiveDigest": "oZFClfRhTTwsYzpxVPkOpOt/r0+OzEfEV37au0jFZ0s=", - "usagesDigest": "bqCPXHiIs2yi6xo5XEjRzQJ3R8k+nwCWvizzoGSa3X8=", + "bzlTransitiveDigest": "1eE/aNv0So57EZMzcxgDSCFkzlydiaC4TpHowQfrcBk=", + "usagesDigest": "ZVSXMAGpD+xzVNPuvF1IoLBkty7TROO0+akMapt1pAg=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "nodejs_linux_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", + "rules_python_internal": { + "repoRuleId": "@@rules_python+//python/private:internal_config_repo.bzl%internal_config_repo", "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "linux_amd64" - } - }, - "nodejs_linux_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "linux_arm64" - } - }, - "nodejs_linux_s390x": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "linux_s390x" - } - }, - "nodejs_linux_ppc64le": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "linux_ppc64le" - } - }, - "nodejs_darwin_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "darwin_amd64" - } - }, - "nodejs_darwin_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "darwin_arm64" - } - }, - "nodejs_windows_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "windows_amd64" - } - }, - "nodejs_windows_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.2-darwin_arm64": [ - "node-v22.22.2-darwin-arm64.tar.gz", - "node-v22.22.2-darwin-arm64", - "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000" - ], - "22.22.2-darwin_amd64": [ - "node-v22.22.2-darwin-x64.tar.gz", - "node-v22.22.2-darwin-x64", - "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba" - ], - "22.22.2-linux_arm64": [ - "node-v22.22.2-linux-arm64.tar.xz", - "node-v22.22.2-linux-arm64", - "e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe" - ], - "22.22.2-linux_ppc64le": [ - "node-v22.22.2-linux-ppc64le.tar.xz", - "node-v22.22.2-linux-ppc64le", - "14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9" - ], - "22.22.2-linux_s390x": [ - "node-v22.22.2-linux-s390x.tar.xz", - "node-v22.22.2-linux-s390x", - "9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb" - ], - "22.22.2-linux_amd64": [ - "node-v22.22.2-linux-x64.tar.xz", - "node-v22.22.2-linux-x64", - "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a" - ], - "22.22.2-windows_amd64": [ - "node-v22.22.2-win-x64.zip", - "node-v22.22.2-win-x64", - "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.2", - "include_headers": false, - "platform": "windows_arm64" - } - }, - "nodejs": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "nodejs_host": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "nodejs_toolchains": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "node22_linux_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "linux_amd64" - } - }, - "node22_linux_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "linux_arm64" - } - }, - "node22_linux_s390x": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "linux_s390x" - } - }, - "node22_linux_ppc64le": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "linux_ppc64le" - } - }, - "node22_darwin_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "darwin_amd64" - } - }, - "node22_darwin_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "darwin_arm64" - } - }, - "node22_windows_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "windows_amd64" - } - }, - "node22_windows_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "22.22.0-darwin_arm64": [ - "node-v22.22.0-darwin-arm64.tar.gz", - "node-v22.22.0-darwin-arm64", - "5ed4db0fcf1eaf84d91ad12462631d73bf4576c1377e192d222e48026a902640" - ], - "22.22.0-darwin_amd64": [ - "node-v22.22.0-darwin-x64.tar.gz", - "node-v22.22.0-darwin-x64", - "5ea50c9d6dea3dfa3abb66b2656f7a4e1c8cef23432b558d45fb538c7b5dedce" - ], - "22.22.0-linux_arm64": [ - "node-v22.22.0-linux-arm64.tar.xz", - "node-v22.22.0-linux-arm64", - "1bf1eb9ee63ffc4e5d324c0b9b62cf4a289f44332dfef9607cea1a0d9596ba6f" - ], - "22.22.0-linux_ppc64le": [ - "node-v22.22.0-linux-ppc64le.tar.xz", - "node-v22.22.0-linux-ppc64le", - "d83b9957431cc18e1fc143a4b99f89cde7b8a18f53ef392231b4336afd058865" - ], - "22.22.0-linux_s390x": [ - "node-v22.22.0-linux-s390x.tar.xz", - "node-v22.22.0-linux-s390x", - "5aa0e520689448c4233e8d73f284e8e0634fdcd32b479735698494be5641f3e4" - ], - "22.22.0-linux_amd64": [ - "node-v22.22.0-linux-x64.tar.xz", - "node-v22.22.0-linux-x64", - "9aa8e9d2298ab68c600bd6fb86a6c13bce11a4eca1ba9b39d79fa021755d7c37" - ], - "22.22.0-windows_amd64": [ - "node-v22.22.0-win-x64.zip", - "node-v22.22.0-win-x64", - "c97fa376d2becdc8863fcd3ca2dd9a83a9f3468ee7ccf7a6d076ec66a645c77a" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "22.22.0", - "include_headers": false, - "platform": "windows_arm64" - } - }, - "node22": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node22" - } - }, - "node22_host": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node22" - } - }, - "node22_toolchains": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", - "attributes": { - "user_node_repository_name": "node22" - } - }, - "node24_linux_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "linux_amd64" - } - }, - "node24_linux_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "linux_arm64" - } - }, - "node24_linux_s390x": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "linux_s390x" - } - }, - "node24_linux_ppc64le": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "linux_ppc64le" - } - }, - "node24_darwin_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "darwin_amd64" - } - }, - "node24_darwin_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "darwin_arm64" - } - }, - "node24_windows_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "windows_amd64" - } - }, - "node24_windows_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "24.13.1-darwin_arm64": [ - "node-v24.13.1-darwin-arm64.tar.gz", - "node-v24.13.1-darwin-arm64", - "8c039d59f2fec6195e4281ad5b0d02b9a940897b4df7b849c6fb48be6787bba6" - ], - "24.13.1-darwin_amd64": [ - "node-v24.13.1-darwin-x64.tar.gz", - "node-v24.13.1-darwin-x64", - "527f0578d9812e7dfa225121bda0b1546a6a0e4b5f556295fc8299c272de5fbf" - ], - "24.13.1-linux_arm64": [ - "node-v24.13.1-linux-arm64.tar.xz", - "node-v24.13.1-linux-arm64", - "c827d3d301e2eed1a51f36d0116b71b9e3d9e3b728f081615270ea40faac34c1" - ], - "24.13.1-linux_ppc64le": [ - "node-v24.13.1-linux-ppc64le.tar.xz", - "node-v24.13.1-linux-ppc64le", - "fb712a08d317655dbf776c90f60ac2105109d802e33811df6c9ed33d12f801c6" - ], - "24.13.1-linux_s390x": [ - "node-v24.13.1-linux-s390x.tar.xz", - "node-v24.13.1-linux-s390x", - "8e2c0d9b5545c3db22623e8cb8d6f0c28fcd470f29d32dbeabf9432dda289de2" - ], - "24.13.1-linux_amd64": [ - "node-v24.13.1-linux-x64.tar.xz", - "node-v24.13.1-linux-x64", - "30215f90ea3cd04dfbc06e762c021393fa173a1d392974298bbc871a8e461089" - ], - "24.13.1-windows_amd64": [ - "node-v24.13.1-win-x64.zip", - "node-v24.13.1-win-x64", - "fba577c4bb87df04d54dd87bbdaa5a2272f1f99a2acbf9152e1a91b8b5f0b279" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "24.13.1", - "include_headers": false, - "platform": "windows_arm64" - } - }, - "node24": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node24" - } - }, - "node24_host": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node24" - } - }, - "node24_toolchains": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", - "attributes": { - "user_node_repository_name": "node24" - } - }, - "node26_linux_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "linux_amd64" - } - }, - "node26_linux_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "linux_arm64" - } - }, - "node26_linux_s390x": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "linux_s390x" - } - }, - "node26_linux_ppc64le": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "linux_ppc64le" - } - }, - "node26_darwin_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "darwin_amd64" - } - }, - "node26_darwin_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "darwin_arm64" - } - }, - "node26_windows_amd64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "windows_amd64" - } - }, - "node26_windows_arm64": { - "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", - "attributes": { - "node_download_auth": {}, - "node_repositories": { - "26.0.0-darwin_arm64": [ - "node-v26.0.0-darwin-arm64.tar.gz", - "node-v26.0.0-darwin-arm64", - "dcee8564c1a9342f9594dd5e52d533894dfef6b85aa771bbbb870baa3c403235" - ], - "26.0.0-darwin_amd64": [ - "node-v26.0.0-darwin-x64.tar.gz", - "node-v26.0.0-darwin-x64", - "f488ab543fe202d8a2d56e661682117d3c56903a2bf64f2ec1ff7bd421cfd875" - ], - "26.0.0-linux_arm64": [ - "node-v26.0.0-linux-arm64.tar.xz", - "node-v26.0.0-linux-arm64", - "f0f94e55142149a4d34634dc3d7e103921d898512dd0cef995ecb62c5ebd3f29" - ], - "26.0.0-linux_ppc64le": [ - "node-v26.0.0-linux-ppc64le.tar.xz", - "node-v26.0.0-linux-ppc64le", - "4b7f76967a93fea8cda11554f2a7904744afaef65dc3f48c345e99828f50ef4d" - ], - "26.0.0-linux_s390x": [ - "node-v26.0.0-linux-s390x.tar.xz", - "node-v26.0.0-linux-s390x", - "e3bd9df41f777dbb227b1261ea81b1fa9b654901bac8cace50a0b918b5160ab5" - ], - "26.0.0-linux_amd64": [ - "node-v26.0.0-linux-x64.tar.xz", - "node-v26.0.0-linux-x64", - "345d558514c62622b5c7d1f7b5f2a19c31ab1405d217df49f010c5ea8decc0f4" - ], - "26.0.0-windows_amd64": [ - "node-v26.0.0-win-x64.zip", - "node-v26.0.0-win-x64", - "d0418640a36096e00bddb57761aa0b1b98f91904ec4ed2b9dd75cbad723becd7" - ] - }, - "node_urls": [ - "https://nodejs.org/dist/v{version}/{filename}" - ], - "node_version": "26.0.0", - "include_headers": false, - "platform": "windows_arm64" - } - }, - "node26": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node26" - } - }, - "node26_host": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_repo_host_os_alias.bzl%nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "node26" - } - }, - "node26_toolchains": { - "repoRuleId": "@@rules_nodejs+//nodejs/private:nodejs_toolchains_repo.bzl%nodejs_toolchains_repo", - "attributes": { - "user_node_repository_name": "node26" - } - } - }, - "recordedRepoMappingEntries": [] - } - }, - "@@rules_python+//python/extensions:pip.bzl%pip": { - "general": { - "bzlTransitiveDigest": "gnOBzUu2hbOMXwy32CnPKpNrOsOEirGIas2EVtC8diM=", - "usagesDigest": "AK1R124YPWwAs8z1CQYyjYuci8RO5Ofot+EP5ZCNQDc=", - "recordedFileInputs": { - "@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", - "@@rules_fuzzing+//fuzzing/requirements.txt": "ab04664be026b632a0d2a2446c4f65982b7654f5b6851d2f9d399a19b7242a5b", - "@@rules_python+//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc", - "@@rules_python+//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", - "@@rules_python+//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556" - }, - "recordedDirentsInputs": {}, - "envVariables": { - "RULES_PYTHON_REPO_DEBUG": null, - "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null - }, - "generatedRepoSpecs": { - "pip_deps_310_numpy": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_10_host//:python", - "repo": "pip_deps_310", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_310_setuptools": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_10_host//:python", - "repo": "pip_deps_310", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_311_numpy": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "pip_deps_311", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_311_setuptools": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "pip_deps_311", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_312_numpy": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_12_host//:python", - "repo": "pip_deps_312", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_312_setuptools": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_12_host//:python", - "repo": "pip_deps_312", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_38_numpy": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_8_host//:python", - "repo": "pip_deps_38", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_38_setuptools": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_8_host//:python", - "repo": "pip_deps_38", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_39_numpy": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_9_host//:python", - "repo": "pip_deps_39", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_39_setuptools": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python++python+python_3_9_host//:python", - "repo": "pip_deps_39", - "requirement": "setuptools<=70.3.0" - } - }, - "rules_fuzzing_py_deps_310_absl_py": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_10_host//:python", - "repo": "rules_fuzzing_py_deps_310", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_310_six": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_10_host//:python", - "repo": "rules_fuzzing_py_deps_310", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_311_absl_py": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_fuzzing_py_deps_311", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_311_six": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_fuzzing_py_deps_311", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_312_absl_py": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_12_host//:python", - "repo": "rules_fuzzing_py_deps_312", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_312_six": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_12_host//:python", - "repo": "rules_fuzzing_py_deps_312", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_38_absl_py": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_8_host//:python", - "repo": "rules_fuzzing_py_deps_38", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_38_six": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_8_host//:python", - "repo": "rules_fuzzing_py_deps_38", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_39_absl_py": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_9_host//:python", - "repo": "rules_fuzzing_py_deps_39", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_39_six": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python++python+python_3_9_host//:python", - "repo": "rules_fuzzing_py_deps_39", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "backports.tarfile-1.2.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", - "urls": [ - "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "backports_tarfile-1.2.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", - "urls": [ - "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "certifi-2024.8.30-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "certifi==2024.8.30", - "sha256": "922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "urls": [ - "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_certifi_sdist_bec941d2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "certifi-2024.8.30.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "certifi==2024.8.30", - "sha256": "bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", - "urls": [ - "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", - "urls": [ - "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", - "urls": [ - "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", - "urls": [ - "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", - "urls": [ - "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", - "urls": [ - "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", - "urls": [ - "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_sdist_1c39c601": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "cffi-1.17.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", - "urls": [ - "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "urls": [ - "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "urls": [ - "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "urls": [ - "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "urls": [ - "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "urls": [ - "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "urls": [ - "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "urls": [ - "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "urls": [ - "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "urls": [ - "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "urls": [ - "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "urls": [ - "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "urls": [ - "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "charset_normalizer-3.4.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "urls": [ - "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "charset_normalizer-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "urls": [ - "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", - "urls": [ - "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", - "urls": [ - "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", - "urls": [ - "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", - "urls": [ - "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", - "urls": [ - "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", - "urls": [ - "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_sdist_315b9001": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "cryptography-43.0.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", - "urls": [ - "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "docutils-0.21.2-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "docutils==0.21.2", - "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", - "urls": [ - "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_docutils_sdist_3a6b1873": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "docutils-0.21.2.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "docutils==0.21.2", - "sha256": "3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", - "urls": [ - "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "idna-3.10-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "idna==3.10", - "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", - "urls": [ - "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_idna_sdist_12f65c9b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "idna-3.10.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "idna==3.10", - "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", - "urls": [ - "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "importlib_metadata-8.5.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "importlib-metadata==8.5.0", - "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", - "urls": [ - "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "importlib_metadata-8.5.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "importlib-metadata==8.5.0", - "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", - "urls": [ - "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "jaraco.classes-3.4.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-classes==3.4.0", - "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", - "urls": [ - "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco.classes-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-classes==3.4.0", - "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", - "urls": [ - "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "jaraco.context-6.0.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", - "urls": [ - "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco_context-6.0.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", - "urls": [ - "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "jaraco.functools-4.1.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", - "urls": [ - "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco_functools-4.1.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", - "urls": [ - "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "jeepney-0.8.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jeepney==0.8.0", - "sha256": "c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", - "urls": [ - "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jeepney_sdist_5efe48d2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jeepney-0.8.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jeepney==0.8.0", - "sha256": "5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", - "urls": [ - "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_keyring_py3_none_any_5426f817": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "keyring-25.4.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", - "urls": [ - "https://files.pythonhosted.org/packages/83/25/e6d59e5f0a0508d0dca8bb98c7f7fd3772fc943ac3f53d5ab18a218d32c0/keyring-25.4.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_keyring_sdist_b07ebc55": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "keyring-25.4.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b", - "urls": [ - "https://files.pythonhosted.org/packages/a5/1c/2bdbcfd5d59dc6274ffb175bc29aa07ecbfab196830e0cfbde7bd861a2ea/keyring-25.4.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "markdown_it_py-3.0.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "markdown-it-py==3.0.0", - "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", - "urls": [ - "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "markdown-it-py-3.0.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "markdown-it-py==3.0.0", - "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", - "urls": [ - "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "mdurl-0.1.2-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "mdurl==0.1.2", - "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", - "urls": [ - "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_mdurl_sdist_bb413d29": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "mdurl-0.1.2.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "mdurl==0.1.2", - "sha256": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", - "urls": [ - "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "more_itertools-10.5.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "more-itertools==10.5.0", - "sha256": "037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", - "urls": [ - "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_more_itertools_sdist_5482bfef": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "more-itertools-10.5.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "more-itertools==10.5.0", - "sha256": "5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", - "urls": [ - "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", - "urls": [ - "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", - "urls": [ - "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", - "urls": [ - "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", - "urls": [ - "https://files.pythonhosted.org/packages/05/2b/85977d9e11713b5747595ee61f381bc820749daf83f07b90b6c9964cf932/nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", - "urls": [ - "https://files.pythonhosted.org/packages/72/f2/5c894d5265ab80a97c68ca36f25c8f6f0308abac649aaf152b74e7e854a8/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", - "urls": [ - "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", - "urls": [ - "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", - "urls": [ - "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", - "urls": [ - "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", - "urls": [ - "https://files.pythonhosted.org/packages/de/81/c291231463d21da5f8bba82c8167a6d6893cc5419b0639801ee5d3aeb8a9/nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", - "urls": [ - "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "nh3-0.2.18-cp37-abi3-win_amd64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", - "urls": [ - "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_sdist_94a16692": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "nh3-0.2.18.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", - "urls": [ - "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "pkginfo-1.10.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", - "urls": [ - "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pkginfo-1.10.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", - "urls": [ - "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "pycparser-2.22-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", - "urls": [ - "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pycparser_sdist_491c8be9": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pycparser-2.22.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "urls": [ - "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "pygments-2.18.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pygments==2.18.0", - "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", - "urls": [ - "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pygments_sdist_786ff802": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pygments-2.18.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pygments==2.18.0", - "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "urls": [ - "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_windows_x86_64" - ], - "filename": "pywin32_ctypes-0.2.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pywin32-ctypes==0.2.3", - "sha256": "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", - "urls": [ - "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pywin32-ctypes-0.2.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pywin32-ctypes==0.2.3", - "sha256": "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", - "urls": [ - "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "readme_renderer-44.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", - "urls": [ - "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "readme_renderer-44.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", - "urls": [ - "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "requests-2.32.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", - "urls": [ - "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_requests_sdist_55365417": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "requests-2.32.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "urls": [ - "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "requests_toolbelt-1.0.0-py2.py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests-toolbelt==1.0.0", - "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", - "urls": [ - "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" - ] + "transition_setting_generators": {}, + "transition_settings": [] } }, - "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "requests-toolbelt-1.0.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests-toolbelt==1.0.0", - "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", - "urls": [ - "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__build": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "rfc3986-2.0.0-py2.py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rfc3986==2.0.0", - "sha256": "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", - "urls": [ - "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" - ] + "url": "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", + "sha256": "75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_rfc3986_sdist_97aacf9d": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__click": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "rfc3986-2.0.0.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rfc3986==2.0.0", - "sha256": "97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", - "urls": [ - "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz" - ] + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", + "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_rich_py3_none_any_9836f509": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__colorama": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "rich-13.9.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283", - "urls": [ - "https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl" - ] + "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_rich_sdist_bc1e01b8": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__importlib_metadata": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "rich-13.9.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e", - "urls": [ - "https://files.pythonhosted.org/packages/d9/e9/cf9ef5245d835065e6673781dbd4b8911d352fb770d56cf0879cf11b7ee1/rich-13.9.3.tar.gz" - ] + "url": "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl", + "sha256": "30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__installer": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "filename": "SecretStorage-3.3.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "secretstorage==3.3.3", - "sha256": "f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", - "urls": [ - "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl" - ] + "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", + "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_secretstorage_sdist_2403533e": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__more_itertools": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "SecretStorage-3.3.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "secretstorage==3.3.3", - "sha256": "2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", - "urls": [ - "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz" - ] + "url": "https://files.pythonhosted.org/packages/50/e2/8e10e465ee3987bb7c9ab69efb91d867d93959095f4807db102d07995d94/more_itertools-10.2.0-py3-none-any.whl", + "sha256": "686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_twine_py3_none_any_215dbe7b": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__packaging": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "twine-5.1.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", - "urls": [ - "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" - ] + "url": "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", + "sha256": "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_twine_sdist_9aa08251": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__pep517": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "twine-5.1.1.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", - "urls": [ - "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" - ] + "url": "https://files.pythonhosted.org/packages/25/6e/ca4a5434eb0e502210f591b97537d322546e4833dcb4d470a48c375c5540/pep517-0.13.1-py3-none-any.whl", + "sha256": "31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__pip": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "urllib3-2.2.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "urls": [ - "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl" - ] + "url": "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl", + "sha256": "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_urllib3_sdist_e7d814a8": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__pip_tools": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "urllib3-2.2.3.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", - "urls": [ - "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz" - ] + "url": "https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl", + "sha256": "4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__pyproject_hooks": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "zipp-3.20.2-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "zipp==3.20.2", - "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", - "urls": [ - "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" - ] + "url": "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", + "sha256": "7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "pypi__setuptools": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "zipp-3.20.2.tar.gz", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "zipp==3.20.2", - "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", - "urls": [ - "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz" - ] + "url": "https://files.pythonhosted.org/packages/90/99/158ad0609729111163fc1f674a5a42f2605371a4cf036d0441070e2f7455/setuptools-78.1.1-py3-none-any.whl", + "sha256": "c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "pip_deps": { - "repoRuleId": "@@rules_python+//python/private/pypi:hub_repository.bzl%hub_repository", + "pypi__tomli": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "repo_name": "pip_deps", - "extra_hub_aliases": {}, - "whl_map": { - "numpy": "{\"pip_deps_310_numpy\":[{\"version\":\"3.10\"}],\"pip_deps_311_numpy\":[{\"version\":\"3.11\"}],\"pip_deps_312_numpy\":[{\"version\":\"3.12\"}],\"pip_deps_38_numpy\":[{\"version\":\"3.8\"}],\"pip_deps_39_numpy\":[{\"version\":\"3.9\"}]}", - "setuptools": "{\"pip_deps_310_setuptools\":[{\"version\":\"3.10\"}],\"pip_deps_311_setuptools\":[{\"version\":\"3.11\"}],\"pip_deps_312_setuptools\":[{\"version\":\"3.12\"}],\"pip_deps_38_setuptools\":[{\"version\":\"3.8\"}],\"pip_deps_39_setuptools\":[{\"version\":\"3.9\"}]}" - }, - "packages": [ - "numpy", - "setuptools" - ], - "groups": {} + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", + "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_fuzzing_py_deps": { - "repoRuleId": "@@rules_python+//python/private/pypi:hub_repository.bzl%hub_repository", + "pypi__wheel": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "repo_name": "rules_fuzzing_py_deps", - "extra_hub_aliases": {}, - "whl_map": { - "absl_py": "{\"rules_fuzzing_py_deps_310_absl_py\":[{\"version\":\"3.10\"}],\"rules_fuzzing_py_deps_311_absl_py\":[{\"version\":\"3.11\"}],\"rules_fuzzing_py_deps_312_absl_py\":[{\"version\":\"3.12\"}],\"rules_fuzzing_py_deps_38_absl_py\":[{\"version\":\"3.8\"}],\"rules_fuzzing_py_deps_39_absl_py\":[{\"version\":\"3.9\"}]}", - "six": "{\"rules_fuzzing_py_deps_310_six\":[{\"version\":\"3.10\"}],\"rules_fuzzing_py_deps_311_six\":[{\"version\":\"3.11\"}],\"rules_fuzzing_py_deps_312_six\":[{\"version\":\"3.12\"}],\"rules_fuzzing_py_deps_38_six\":[{\"version\":\"3.8\"}],\"rules_fuzzing_py_deps_39_six\":[{\"version\":\"3.9\"}]}" - }, - "packages": [ - "absl_py", - "six" - ], - "groups": {} + "url": "https://files.pythonhosted.org/packages/7d/cd/d7460c9a869b16c3dd4e1e403cce337df165368c71d6af229a74699622ce/wheel-0.43.0-py3-none-any.whl", + "sha256": "55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } }, - "rules_python_publish_deps": { - "repoRuleId": "@@rules_python+//python/private/pypi:hub_repository.bzl%hub_repository", + "pypi__zipp": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { - "repo_name": "rules_python_publish_deps", - "extra_hub_aliases": {}, - "whl_map": { - "backports_tarfile": "{\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\":[{\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\":[{\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"version\":\"3.11\"}]}", - "certifi": "{\"rules_python_publish_deps_311_certifi_py3_none_any_922820b5\":[{\"filename\":\"certifi-2024.8.30-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_certifi_sdist_bec941d2\":[{\"filename\":\"certifi-2024.8.30.tar.gz\",\"version\":\"3.11\"}]}", - "cffi": "{\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\":[{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cffi_sdist_1c39c601\":[{\"filename\":\"cffi-1.17.1.tar.gz\",\"version\":\"3.11\"}]}", - "charset_normalizer": "{\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\":[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\":[{\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\":[{\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"version\":\"3.11\"}]}", - "cryptography": "{\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\":[{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_cryptography_sdist_315b9001\":[{\"filename\":\"cryptography-43.0.3.tar.gz\",\"version\":\"3.11\"}]}", - "docutils": "{\"rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9\":[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_docutils_sdist_3a6b1873\":[{\"filename\":\"docutils-0.21.2.tar.gz\",\"version\":\"3.11\"}]}", - "idna": "{\"rules_python_publish_deps_311_idna_py3_none_any_946d195a\":[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_idna_sdist_12f65c9b\":[{\"filename\":\"idna-3.10.tar.gz\",\"version\":\"3.11\"}]}", - "importlib_metadata": "{\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\":[{\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\":[{\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"version\":\"3.11\"}]}", - "jaraco_classes": "{\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\":[{\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\":[{\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"version\":\"3.11\"}]}", - "jaraco_context": "{\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\":[{\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\":[{\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"version\":\"3.11\"}]}", - "jaraco_functools": "{\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\":[{\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\":[{\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"version\":\"3.11\"}]}", - "jeepney": "{\"rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad\":[{\"filename\":\"jeepney-0.8.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jeepney_sdist_5efe48d2\":[{\"filename\":\"jeepney-0.8.0.tar.gz\",\"version\":\"3.11\"}]}", - "keyring": "{\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\":[{\"filename\":\"keyring-25.4.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\":[{\"filename\":\"keyring-25.4.1.tar.gz\",\"version\":\"3.11\"}]}", - "markdown_it_py": "{\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\":[{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\":[{\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"version\":\"3.11\"}]}", - "mdurl": "{\"rules_python_publish_deps_311_mdurl_py3_none_any_84008a41\":[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_mdurl_sdist_bb413d29\":[{\"filename\":\"mdurl-0.1.2.tar.gz\",\"version\":\"3.11\"}]}", - "more_itertools": "{\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\":[{\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\":[{\"filename\":\"more-itertools-10.5.0.tar.gz\",\"version\":\"3.11\"}]}", - "nh3": "{\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_sdist_94a16692\":[{\"filename\":\"nh3-0.2.18.tar.gz\",\"version\":\"3.11\"}]}", - "pkginfo": "{\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\":[{\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\":[{\"filename\":\"pkginfo-1.10.0.tar.gz\",\"version\":\"3.11\"}]}", - "pycparser": "{\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\":[{\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\":[{\"filename\":\"pycparser-2.22.tar.gz\",\"version\":\"3.11\"}]}", - "pygments": "{\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\":[{\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pygments_sdist_786ff802\":[{\"filename\":\"pygments-2.18.0.tar.gz\",\"version\":\"3.11\"}]}", - "pywin32_ctypes": "{\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\":[{\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\":[{\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"version\":\"3.11\"}]}", - "readme_renderer": "{\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\":[{\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\":[{\"filename\":\"readme_renderer-44.0.tar.gz\",\"version\":\"3.11\"}]}", - "requests": "{\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\":[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_requests_sdist_55365417\":[{\"filename\":\"requests-2.32.3.tar.gz\",\"version\":\"3.11\"}]}", - "requests_toolbelt": "{\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\":[{\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\":[{\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"version\":\"3.11\"}]}", - "rfc3986": "{\"rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b\":[{\"filename\":\"rfc3986-2.0.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_rfc3986_sdist_97aacf9d\":[{\"filename\":\"rfc3986-2.0.0.tar.gz\",\"version\":\"3.11\"}]}", - "rich": "{\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\":[{\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\":[{\"filename\":\"rich-13.9.3.tar.gz\",\"version\":\"3.11\"}]}", - "secretstorage": "{\"rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662\":[{\"filename\":\"SecretStorage-3.3.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_secretstorage_sdist_2403533e\":[{\"filename\":\"SecretStorage-3.3.3.tar.gz\",\"version\":\"3.11\"}]}", - "twine": "{\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\":[{\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_twine_sdist_9aa08251\":[{\"filename\":\"twine-5.1.1.tar.gz\",\"version\":\"3.11\"}]}", - "urllib3": "{\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\":[{\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\":[{\"filename\":\"urllib3-2.2.3.tar.gz\",\"version\":\"3.11\"}]}", - "zipp": "{\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\":[{\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\":[{\"filename\":\"zipp-3.20.2.tar.gz\",\"version\":\"3.11\"}]}" - }, - "packages": [ - "backports_tarfile", - "certifi", - "charset_normalizer", - "docutils", - "idna", - "importlib_metadata", - "jaraco_classes", - "jaraco_context", - "jaraco_functools", - "keyring", - "markdown_it_py", - "mdurl", - "more_itertools", - "nh3", - "pkginfo", - "pygments", - "readme_renderer", - "requests", - "requests_toolbelt", - "rfc3986", - "rich", - "twine", - "urllib3", - "zipp" - ], - "groups": {} + "url": "https://files.pythonhosted.org/packages/da/55/a03fd7240714916507e1fcf7ae355bd9d9ed2e6db492595f1a67f61681be/zipp-3.18.2-py3-none-any.whl", + "sha256": "dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:py_library.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude to avoid non-determinism.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" } } }, "recordedRepoMappingEntries": [ - [ - "bazel_features+", - "bazel_features_globals", - "bazel_features++version_extension+bazel_features_globals" - ], - [ - "bazel_features+", - "bazel_features_version", - "bazel_features++version_extension+bazel_features_version" - ], - [ - "rules_python+", - "bazel_features", - "bazel_features+" - ], - [ - "rules_python+", - "bazel_skylib", - "bazel_skylib+" - ], [ "rules_python+", "bazel_tools", @@ -5230,107 +1111,118 @@ [ "rules_python+", "pypi__build", - "rules_python++internal_deps+pypi__build" + "rules_python++config+pypi__build" ], [ "rules_python+", "pypi__click", - "rules_python++internal_deps+pypi__click" + "rules_python++config+pypi__click" ], [ "rules_python+", "pypi__colorama", - "rules_python++internal_deps+pypi__colorama" + "rules_python++config+pypi__colorama" ], [ "rules_python+", "pypi__importlib_metadata", - "rules_python++internal_deps+pypi__importlib_metadata" + "rules_python++config+pypi__importlib_metadata" ], [ "rules_python+", "pypi__installer", - "rules_python++internal_deps+pypi__installer" + "rules_python++config+pypi__installer" ], [ "rules_python+", "pypi__more_itertools", - "rules_python++internal_deps+pypi__more_itertools" + "rules_python++config+pypi__more_itertools" ], [ "rules_python+", "pypi__packaging", - "rules_python++internal_deps+pypi__packaging" + "rules_python++config+pypi__packaging" ], [ "rules_python+", "pypi__pep517", - "rules_python++internal_deps+pypi__pep517" + "rules_python++config+pypi__pep517" ], [ "rules_python+", "pypi__pip", - "rules_python++internal_deps+pypi__pip" + "rules_python++config+pypi__pip" ], [ "rules_python+", "pypi__pip_tools", - "rules_python++internal_deps+pypi__pip_tools" + "rules_python++config+pypi__pip_tools" ], [ "rules_python+", "pypi__pyproject_hooks", - "rules_python++internal_deps+pypi__pyproject_hooks" + "rules_python++config+pypi__pyproject_hooks" ], [ "rules_python+", "pypi__setuptools", - "rules_python++internal_deps+pypi__setuptools" + "rules_python++config+pypi__setuptools" ], [ "rules_python+", "pypi__tomli", - "rules_python++internal_deps+pypi__tomli" + "rules_python++config+pypi__tomli" ], [ "rules_python+", "pypi__wheel", - "rules_python++internal_deps+pypi__wheel" + "rules_python++config+pypi__wheel" ], [ "rules_python+", "pypi__zipp", - "rules_python++internal_deps+pypi__zipp" - ], + "rules_python++config+pypi__zipp" + ] + ] + } + }, + "@@rules_python+//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "ijW9KS7qsIY+yBVvJ+Nr1mzwQox09j13DnE3iIwaeTM=", + "usagesDigest": "H8dQoNZcoqP+Mu0tHZTi4KHATzvNkM5ePuEqoQdklIU=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "uv": { + "repoRuleId": "@@rules_python+//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@rules_python+//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "none" + ], + "toolchain_implementations": { + "none": "'@@rules_python+//python:none'" + }, + "toolchain_compatible_with": { + "none": [ + "@platforms//:incompatible" + ] + }, + "toolchain_target_settings": {} + } + } + }, + "recordedRepoMappingEntries": [ [ "rules_python+", - "pythons_hub", - "rules_python++python+pythons_hub" - ], - [ - "rules_python++python+pythons_hub", - "python_3_10_host", - "rules_python++python+python_3_10_host" - ], - [ - "rules_python++python+pythons_hub", - "python_3_11_host", - "rules_python++python+python_3_11_host" - ], - [ - "rules_python++python+pythons_hub", - "python_3_12_host", - "rules_python++python+python_3_12_host" - ], - [ - "rules_python++python+pythons_hub", - "python_3_8_host", - "rules_python++python+python_3_8_host" + "bazel_tools", + "bazel_tools" ], [ - "rules_python++python+pythons_hub", - "python_3_9_host", - "rules_python++python+python_3_9_host" + "rules_python+", + "platforms", + "platforms" ] ] } @@ -5338,7 +1230,7 @@ "@@yq.bzl+//yq:extensions.bzl%yq": { "general": { "bzlTransitiveDigest": "UfFMy8CWK4/dVo/tfaSAIYUiDGNAPes5eRllx9O9Q9Q=", - "usagesDigest": "xPeGU4HF2Tm+YRYp+urLJFiY6+9GledFMMrn4sTXP8M=", + "usagesDigest": "2OWRv1SUsHDts+8CqhpVrVqZHB3EPHP3YgWSn+Mg+lk=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/constants.bzl b/constants.bzl index 7c791830e40d..1d4c1c584c3e 100644 --- a/constants.bzl +++ b/constants.bzl @@ -1,12 +1,12 @@ # Engine versions to stamp in a release package.json -RELEASE_ENGINES_NODE = "^22.22.0 || ^24.13.1 || >=26.0.0" +RELEASE_ENGINES_NODE = "^22.22.3 || ^24.15.0 || >=26.0.0" RELEASE_ENGINES_NPM = "^6.11.0 || ^7.5.6 || >=8.0.0" RELEASE_ENGINES_YARN = ">= 1.13.0" -NG_PACKAGR_VERSION = "^22.0.0-next.0" -ANGULAR_FW_VERSION = "^22.0.0-next.0" -ANGULAR_FW_PEER_DEP = "^22.0.0-next.0" -NG_PACKAGR_PEER_DEP = "^22.0.0-next.0" +NG_PACKAGR_VERSION = "^22.0.0" +ANGULAR_FW_VERSION = "^22.0.0" +ANGULAR_FW_PEER_DEP = "^22.0.0" +NG_PACKAGR_PEER_DEP = "^22.0.0" # Baseline widely-available date in `YYYY-MM-DD` format which defines Angular's # browser support. This date serves as the source of truth for the Angular CLI's diff --git a/goldens/public-api/angular/ssr/index.api.md b/goldens/public-api/angular/ssr/index.api.md index 8da6b1f891b0..852187d5290b 100644 --- a/goldens/public-api/angular/ssr/index.api.md +++ b/goldens/public-api/angular/ssr/index.api.md @@ -41,6 +41,9 @@ export enum PrerenderFallback { // @public export function provideServerRendering(...features: ServerRenderingFeature[]): EnvironmentProviders; +// @public +export function provideServerRendering(options: ServerRenderingOptions, ...features: ServerRenderingFeature[]): EnvironmentProviders; + // @public export enum RenderMode { Client = 1, @@ -51,6 +54,11 @@ export enum RenderMode { // @public export type RequestHandlerFunction = (request: Request) => Promise | null | Response; +// @public +export interface ServerRenderingOptions { + maxResponseBodySize: number; +} + // @public export type ServerRoute = ServerRouteClient | ServerRoutePrerender | ServerRoutePrerenderWithParams | ServerRouteServer; diff --git a/goldens/public-api/angular_devkit/core/node/index.api.md b/goldens/public-api/angular_devkit/core/node/index.api.md index cb18462521ca..9fcdee9770cb 100644 --- a/goldens/public-api/angular_devkit/core/node/index.api.md +++ b/goldens/public-api/angular_devkit/core/node/index.api.md @@ -11,7 +11,7 @@ import { Stats as Stats_2 } from 'node:fs'; import { Subject } from 'rxjs'; import { Subscription } from 'rxjs'; -// @public +// @public @deprecated export function createConsoleLogger(verbose?: boolean, stdout?: ProcessOutput, stderr?: ProcessOutput, colors?: Partial string>>): logging.Logger; // @public diff --git a/modules/testing/builder/package.json b/modules/testing/builder/package.json index 705e97cb7ea8..80f87e6ff1ca 100644 --- a/modules/testing/builder/package.json +++ b/modules/testing/builder/package.json @@ -8,7 +8,7 @@ "browser-sync": "3.0.4", "istanbul-lib-instrument": "6.0.3", "jsdom": "29.1.1", - "ng-packagr": "22.0.0-next.3", + "ng-packagr": "22.0.1", "rxjs": "7.8.2", "vitest": "4.1.5" } diff --git a/package.json b/package.json index 2e6690180f6c..063efefc4cf5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "22.0.0-next.7", + "version": "22.0.6", "private": true, "description": "Software Development Kit for Angular", "keywords": [ @@ -28,12 +28,12 @@ "type": "git", "url": "git+https://github.com/angular/angular-cli.git" }, - "packageManager": "pnpm@10.33.2", + "packageManager": "pnpm@10.34.4", "engines": { - "node": "^22.22.0 || ^24.13.1 || >=26.0.0", + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", "npm": "Please use pnpm instead of NPM to install dependencies", "yarn": "Please use pnpm instead of Yarn to install dependencies", - "pnpm": "10.33.2" + "pnpm": "10.34.4" }, "author": "Angular Authors", "license": "MIT", @@ -42,23 +42,23 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular/compiler-cli": "22.0.0-next.10", + "@angular/compiler-cli": "22.0.5", "typescript": "6.0.3" }, "devDependencies": { - "@angular/animations": "22.0.0-next.10", - "@angular/cdk": "22.0.0-next.7", - "@angular/common": "22.0.0-next.10", - "@angular/compiler": "22.0.0-next.10", - "@angular/core": "22.0.0-next.10", - "@angular/forms": "22.0.0-next.10", - "@angular/localize": "22.0.0-next.10", - "@angular/material": "22.0.0-next.7", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904", - "@angular/platform-browser": "22.0.0-next.10", - "@angular/platform-server": "22.0.0-next.10", - "@angular/router": "22.0.0-next.10", - "@angular/service-worker": "22.0.0-next.10", + "@angular/animations": "22.0.5", + "@angular/cdk": "22.0.4", + "@angular/common": "22.0.5", + "@angular/compiler": "22.0.5", + "@angular/core": "22.0.5", + "@angular/forms": "22.0.5", + "@angular/localize": "22.0.5", + "@angular/material": "22.0.4", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#488fd3e0a6e5ad872c9c9ca1a6c43d3686146d44", + "@angular/platform-browser": "22.0.5", + "@angular/platform-server": "22.0.5", + "@angular/router": "22.0.5", + "@angular/service-worker": "22.0.5", "@babel/core": "7.29.0", "@bazel/bazelisk": "1.28.1", "@bazel/buildifier": "8.2.1", @@ -99,8 +99,8 @@ "@typescript-eslint/parser": "8.59.1", "ajv": "8.20.0", "buffer": "6.0.3", - "esbuild": "0.28.0", - "esbuild-wasm": "0.28.0", + "esbuild": "0.28.1", + "esbuild-wasm": "0.28.1", "eslint": "10.3.0", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index 9aa419021594..c4fc09ebfd39 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -27,7 +27,7 @@ "@vitejs/plugin-basic-ssl": "2.3.0", "beasties": "0.4.2", "browserslist": "^4.26.0", - "esbuild": "0.28.0", + "esbuild": "0.28.1", "https-proxy-agent": "9.0.0", "jsonc-parser": "3.3.1", "listr2": "10.2.1", @@ -35,13 +35,13 @@ "mrmime": "2.0.1", "parse5-html-rewriting-stream": "8.0.1", "picomatch": "4.0.4", - "piscina": "5.1.4", + "piscina": "5.2.0", "rollup": "4.60.2", "sass": "1.99.0", "semver": "7.7.4", "source-map-support": "0.5.21", "tinyglobby": "0.2.16", - "vite": "7.3.2", + "vite": "7.3.5", "watchpack": "2.5.1" }, "optionalDependencies": { @@ -53,9 +53,9 @@ "istanbul-lib-instrument": "6.0.3", "jsdom": "29.1.1", "less": "4.6.4", - "ng-packagr": "22.0.0-next.3", - "postcss": "8.5.13", - "rolldown": "1.0.0-rc.18", + "ng-packagr": "22.0.1", + "postcss": "8.5.14", + "rolldown": "1.0.0", "rxjs": "7.8.2", "vitest": "4.1.5" }, diff --git a/packages/angular/build/src/builders/application/build-action.ts b/packages/angular/build/src/builders/application/build-action.ts index d483d32909c0..d7dbdc8cfe21 100644 --- a/packages/angular/build/src/builders/application/build-action.ts +++ b/packages/angular/build/src/builders/application/build-action.ts @@ -95,62 +95,77 @@ export async function* runEsBuildBuildAction( } } - // Setup watcher if watch mode enabled let watcher: import('../../tools/esbuild/watcher').BuildWatcher | undefined; - if (watch) { - if (progress) { - logger.info('Watch mode enabled. Watching for file changes...'); - } + let watchLoopStarted = false; + try { + // Setup watcher if watch mode enabled + if (watch) { + if (progress) { + logger.info('Watch mode enabled. Watching for file changes...'); + } - const ignored: string[] = [ - // Ignore the output and cache paths to avoid infinite rebuild cycles - outputOptions.base, - cacheOptions.basePath, - `${toPosixPath(workspaceRoot)}/**/.*/**`, - ]; - - // Setup a watcher - const { createWatcher } = await import('../../tools/esbuild/watcher'); - watcher = createWatcher({ - polling: typeof poll === 'number', - interval: poll, - followSymlinks: preserveSymlinks, - ignored, - }); - - // Setup abort support - options.signal?.addEventListener('abort', () => void watcher?.close()); - - // Watch the entire project root if 'NG_BUILD_WATCH_ROOT' environment variable is set - if (shouldWatchRoot) { - if (!preserveSymlinks) { - // Ignore all node modules directories to avoid excessive file watchers. - // Package changes are handled below by watching manifest and lock files. - // NOTE: this is not enable when preserveSymlinks is true as this would break `npm link` usages. - ignored.push('**/node_modules/**'); - - watcher.add( - packageWatchFiles - .map((file) => path.join(workspaceRoot, file)) - .filter((file) => existsSync(file)), - ); + const ignored: string[] = [ + // Ignore the output and cache paths to avoid infinite rebuild cycles + outputOptions.base, + cacheOptions.basePath, + `${toPosixPath(workspaceRoot)}/**/.*/**`, + ]; + + // Setup a watcher + const { createWatcher } = await import('../../tools/esbuild/watcher'); + watcher = createWatcher({ + polling: typeof poll === 'number', + interval: poll, + followSymlinks: preserveSymlinks, + ignored, + }); + + // Setup abort support + options.signal?.addEventListener('abort', () => void watcher?.close()); + + // Watch the entire project root if 'NG_BUILD_WATCH_ROOT' environment variable is set + if (shouldWatchRoot) { + if (!preserveSymlinks) { + // Ignore all node modules directories to avoid excessive file watchers. + // Package changes are handled below by watching manifest and lock files. + // NOTE: this is not enable when preserveSymlinks is true as this would break `npm link` usages. + ignored.push('**/node_modules/**'); + + watcher.add( + packageWatchFiles + .map((file) => path.join(workspaceRoot, file)) + .filter((file) => existsSync(file)), + ); + } + + watcher.add(projectRoot); } - watcher.add(projectRoot); + // Watch locations provided by the initial build result + watcher.add(result.watchFiles); } - // Watch locations provided by the initial build result - watcher.add(result.watchFiles); - } + // Output the first build results after setting up the watcher to ensure that any code executed + // higher in the iterator call stack will trigger the watcher. This is particularly relevant for + // unit tests which execute the builder and modify the file system programmatically. + const outputResults = [...emitOutputResults(result, outputOptions)]; + if (!watch) { + await result.dispose(); + // Set to true to prevent double-disposal of the result context in the finally block on generator exit + watchLoopStarted = true; + } + yield* outputResults; - // Output the first build results after setting up the watcher to ensure that any code executed - // higher in the iterator call stack will trigger the watcher. This is particularly relevant for - // unit tests which execute the builder and modify the file system programmatically. - yield* emitOutputResults(result, outputOptions); + // Finish if watch mode is not enabled + if (!watcher) { + return; + } - // Finish if watch mode is not enabled - if (!watcher) { - return; + watchLoopStarted = true; + } finally { + if (!watchLoopStarted && result) { + await result.dispose(); + } } // Used to force a full result on next rebuild if there were initial errors. diff --git a/packages/angular/build/src/builders/application/execute-build.ts b/packages/angular/build/src/builders/application/execute-build.ts index 69b6db0c736d..6cacd6c7e1a5 100644 --- a/packages/angular/build/src/builders/application/execute-build.ts +++ b/packages/angular/build/src/builders/application/execute-build.ts @@ -14,6 +14,7 @@ import { BundleContextResult, BundlerContext } from '../../tools/esbuild/bundler import { ExecutionResult, RebuildState } from '../../tools/esbuild/bundler-execution-result'; import { BuildOutputFileType } from '../../tools/esbuild/bundler-files'; import { checkCommonJSModules } from '../../tools/esbuild/commonjs-checker'; +import { LOCALE_DATA_BASE_MODULE } from '../../tools/esbuild/i18n-locale-plugin'; import { extractLicenses } from '../../tools/esbuild/license-extractor'; import { profileAsync } from '../../tools/esbuild/profiling'; import { @@ -160,7 +161,10 @@ export async function executeBuild( // Only run if the number of lazy chunks meets the configured threshold. // This avoids overhead for small projects with few chunks. - if (lazyChunksCount >= optimizeChunksThreshold) { + + // TODO: Remove this log once chunk optimization is supported for server builds as this + // causes the file to be renamed and thus causes incorrect preloading. + if (!options.serverEntryPoint && lazyChunksCount >= optimizeChunksThreshold) { const { optimizeChunks } = await import('./chunk-optimizer'); const optimizationResult = await profileAsync('OPTIMIZE_CHUNKS', () => optimizeChunks( @@ -193,6 +197,12 @@ export async function executeBuild( const explicitExternal = new Set(); const isExplicitExternal = (dep: string): boolean => { + // Locale-data imports are injected by the builder itself (see i18n-locale-plugin) and must stay resolvable + // even when the containing package is externalized by the user. + if (dep.startsWith(`${LOCALE_DATA_BASE_MODULE}/`)) { + return false; + } + if (exclusions.has(dep)) { return true; } diff --git a/packages/angular/build/src/builders/application/index.ts b/packages/angular/build/src/builders/application/index.ts index f127ef4bdc7f..b31fc0a8f81b 100644 --- a/packages/angular/build/src/builders/application/index.ts +++ b/packages/angular/build/src/builders/application/index.ts @@ -15,6 +15,7 @@ import { createJsonBuildManifest, emitFilesToDisk } from '../../tools/esbuild/ut import { colors as ansiColors } from '../../utils/color'; import { deleteOutputDir } from '../../utils/delete-output-dir'; import { bazelEsbuildPluginPath, useJSONBuildLogs } from '../../utils/environment-options'; +import { isSubDirectory } from '../../utils/path'; import { purgeStaleBuildCache } from '../../utils/purge-cache'; import { assertCompatibleAngularVersion } from '../../utils/version'; import { runEsBuildBuildAction } from './build-action'; @@ -197,45 +198,57 @@ export async function* buildApplication( // Writes the output files to disk and ensures the containing directories are present const directoryExists = new Set(); - await emitFilesToDisk(Object.entries(result.files), async ([filePath, file]) => { - if ( - outputOptions.ignoreServer && - (file.type === BuildOutputFileType.ServerApplication || - file.type === BuildOutputFileType.ServerRoot) - ) { - return; - } + try { + await emitFilesToDisk(Object.entries(result.files), async ([filePath, file]) => { + if ( + outputOptions.ignoreServer && + (file.type === BuildOutputFileType.ServerApplication || + file.type === BuildOutputFileType.ServerRoot) + ) { + return; + } - const fullFilePath = generateFullPath(filePath, file.type, outputOptions); + const fullFilePath = generateFullPath(filePath, file.type, outputOptions); - // Ensure output subdirectories exist - const fileBasePath = path.dirname(fullFilePath); - if (fileBasePath && !directoryExists.has(fileBasePath)) { - await fs.mkdir(fileBasePath, { recursive: true }); - directoryExists.add(fileBasePath); - } + // Ensure output subdirectories exist + const fileBasePath = path.dirname(fullFilePath); + if (fileBasePath && !directoryExists.has(fileBasePath)) { + await fs.mkdir(fileBasePath, { recursive: true }); + directoryExists.add(fileBasePath); + } - if (file.origin === 'memory') { - // Write file contents - await fs.writeFile(fullFilePath, file.contents); - } else { - // Copy file contents - await fs.cp(file.inputPath, fullFilePath, { - mode: fs.constants.COPYFILE_FICLONE, - preserveTimestamps: true, - }); - } - }); + if (file.origin === 'memory') { + // Write file contents + await fs.writeFile(fullFilePath, file.contents); + } else { + // Copy file contents + await fs.cp(file.inputPath, fullFilePath, { + mode: fs.constants.COPYFILE_FICLONE, + preserveTimestamps: true, + }); + } + }); + } catch (error) { + context.logger.error(error instanceof Error ? error.message : String(error)); + yield { success: false }; + continue; + } // Delete any removed files if incremental if (result.kind === ResultKind.Incremental && result.removed?.length) { - await Promise.all( - result.removed.map((file) => { - const fullFilePath = generateFullPath(file.path, file.type, outputOptions); + try { + await Promise.all( + result.removed.map((file) => { + const fullFilePath = generateFullPath(file.path, file.type, outputOptions); - return fs.rm(fullFilePath, { force: true, maxRetries: 3 }); - }), - ); + return fs.rm(fullFilePath, { force: true, maxRetries: 3 }); + }), + ); + } catch (error) { + context.logger.error(error instanceof Error ? error.message : String(error)); + yield { success: false }; + continue; + } } yield { success: true }; @@ -268,6 +281,12 @@ function generateFullPath( // NOTE: 'base' is a fully resolved path at this point const fullFilePath = path.join(outputOptions.base, typeDirectory, filePath); + if (!isSubDirectory(outputOptions.base, fullFilePath)) { + throw new Error( + `The output file path "${fullFilePath}" is outside of the configured output path "${outputOptions.base}".`, + ); + } + return fullFilePath; } diff --git a/packages/angular/build/src/builders/application/options.ts b/packages/angular/build/src/builders/application/options.ts index 07d805d1cbf9..ab5f7de7dfae 100644 --- a/packages/angular/build/src/builders/application/options.ts +++ b/packages/angular/build/src/builders/application/options.ts @@ -25,6 +25,7 @@ import { loadPostcssConfiguration, } from '../../utils/postcss-configuration'; import { getProjectRootPaths, normalizeDirectoryPath } from '../../utils/project-metadata'; +import { createProjectResolver } from '../../utils/resolve-project'; import { addTrailingSlash, joinUrlParts, stripLeadingSlash } from '../../utils/url'; import { Schema as ApplicationBuilderOptions, @@ -728,9 +729,7 @@ function normalizeExternals(value: string[] | undefined): string[] | undefined { } async function findFrameworkVersion(projectRoot: string): Promise { - // Create a custom require function for ESM compliance. - // NOTE: The trailing slash is significant. - const projectResolve = createRequire(projectRoot + '/').resolve; + const projectResolve = createProjectResolver(projectRoot); try { const manifestPath = projectResolve('@angular/core/package.json'); diff --git a/packages/angular/build/src/builders/application/tests/options/assets_spec.ts b/packages/angular/build/src/builders/application/tests/options/assets_spec.ts index 573711afe3b2..afa42cc1804e 100644 --- a/packages/angular/build/src/builders/application/tests/options/assets_spec.ts +++ b/packages/angular/build/src/builders/application/tests/options/assets_spec.ts @@ -367,7 +367,29 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { const { error } = await harness.executeOnce({ outputLogsOnException: false }); - expect(error?.message).toMatch('asset path must be within the workspace root'); + expect(error?.message).toContain('asset path must be within the workspace root'); + }); + + it('fails if asset input option is outside workspace root (relative)', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + assets: [{ glob: '**/*', input: '../outside', output: '.' }], + }); + + const { error } = await harness.executeOnce({ outputLogsOnException: false }); + + expect(error?.message).toContain('asset path must be within the workspace root'); + }); + + it('fails if asset input option is outside workspace root (absolute)', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + assets: [{ glob: '**/*', input: '/tmp/outside-workspace', output: '.' }], + }); + + const { error } = await harness.executeOnce({ outputLogsOnException: false }); + + expect(error?.message).toContain('asset path must be within the workspace root'); }); it('fails if output option is not within project output path', async () => { diff --git a/packages/angular/build/src/builders/application/tests/options/external-dependencies_spec.ts b/packages/angular/build/src/builders/application/tests/options/external-dependencies_spec.ts index deb55e172109..bdb8f9428f56 100644 --- a/packages/angular/build/src/builders/application/tests/options/external-dependencies_spec.ts +++ b/packages/angular/build/src/builders/application/tests/options/external-dependencies_spec.ts @@ -74,5 +74,33 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { // If not externalized, build will fail with a Node.js platform builtin error expect(result?.success).toBeTrue(); }); + + it('should not externalize builder-injected i18n locale-data imports when @angular/common is external', async () => { + harness.useProject('test', { + root: '.', + sourceRoot: 'src', + cli: { + cache: { + enabled: false, + }, + }, + i18n: { + sourceLocale: 'fr', + }, + }); + + harness.useTarget('build', { + ...BASE_OPTIONS, + externalDependencies: ['@angular/common'], + }); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + + harness.expectFile('dist/browser/polyfills.js').toExist(); + harness + .expectFile('dist/browser/polyfills.js') + .content.not.toMatch(/['"]@angular\/common\/locales\/global\/fr['"]/); + }); }); }); diff --git a/packages/angular/build/src/builders/application/tests/options/output-path_spec.ts b/packages/angular/build/src/builders/application/tests/options/output-path_spec.ts index b6c72b9bee58..3fc98c83ed36 100644 --- a/packages/angular/build/src/builders/application/tests/options/output-path_spec.ts +++ b/packages/angular/build/src/builders/application/tests/options/output-path_spec.ts @@ -260,6 +260,28 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { }), ); }); + + it('should error when browser directory escapes the output path base', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + polyfills: [], + outputPath: { + base: 'dist', + browser: '..', + }, + ssr: false, + }); + + const { result, logs } = await harness.executeOnce({ outputLogsOnFailure: false }); + expect(result?.success).toBeFalse(); + expect(logs).toContain( + jasmine.objectContaining({ + message: jasmine.stringMatching( + `The output file path .* is outside of the configured output path`, + ), + }), + ); + }); }); }); }); diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts index 34e94b1b7645..b9a28e1bf0b0 100644 --- a/packages/angular/build/src/builders/karma/application_builder.ts +++ b/packages/angular/build/src/builders/karma/application_builder.ts @@ -11,9 +11,11 @@ import type { Config, ConfigOptions, FilePattern, InlinePluginDef, Server } from import { randomUUID } from 'node:crypto'; import { rmSync } from 'node:fs'; import * as fs from 'node:fs/promises'; +import { createRequire } from 'node:module'; import path from 'node:path'; import { ReadableStream } from 'node:stream/web'; import { createVirtualModulePlugin } from '../../tools/esbuild/virtual-module-plugin'; +import { createProjectResolver } from '../../utils/resolve-project'; import { writeTestFiles } from '../../utils/test-files'; import { buildApplicationInternal } from '../application/index'; import { ApplicationBuilderInternalOptions } from '../application/options'; @@ -199,10 +201,18 @@ async function runEsbuild( projectSourceRoot: string, ): Promise<[Result & { kind: ResultKind.Full }, AsyncIterator | null]> { const usesZoneJS = buildOptions.polyfills?.includes('zone.js'); + let hasLocalize = false; + try { + const projectResolve = createProjectResolver(projectSourceRoot); + projectResolve('@angular/localize'); + hasLocalize = true; + } catch {} + const virtualTestBedInit = createVirtualModulePlugin({ namespace: 'angular:test-bed-init', loadContent: async () => { const contents: string[] = [ + ...(hasLocalize ? [`import '@angular/localize/init';`] : []), // Initialize the Angular testing environment `import { NgModule${usesZoneJS ? ', provideZoneChangeDetection' : ''} } from '@angular/core';`, `import { getTestBed } from '@angular/core/testing';`, diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts index 542f5f978b90..c01b7b69d75e 100644 --- a/packages/angular/build/src/builders/unit-test/builder.ts +++ b/packages/angular/build/src/builders/unit-test/builder.ts @@ -286,6 +286,10 @@ export async function* execute( return; } + // Resolve final preserveSymlinks option + normalizedOptions.preserveSymlinks = + buildTargetOptions.preserveSymlinks ?? process.execArgv.includes('--preserve-symlinks'); + // Get runner-specific build options let runnerBuildOptions; let virtualFiles; @@ -327,6 +331,7 @@ export async function* execute( progress: normalizedOptions.buildProgress ?? buildTargetOptions.progress, quiet: normalizedOptions.quiet, ...(normalizedOptions.tsConfig ? { tsConfig: normalizedOptions.tsConfig } : {}), + preserveSymlinks: normalizedOptions.preserveSymlinks, } satisfies ApplicationBuilderInternalOptions; const dumpDirectory = normalizedOptions.dumpVirtualFiles diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts index 5cd04c4ca7bf..7ff4d3fa753f 100644 --- a/packages/angular/build/src/builders/unit-test/options.ts +++ b/packages/angular/build/src/builders/unit-test/options.ts @@ -126,7 +126,7 @@ export async function normalizeOptions( watch, debug: options.debug ?? false, ui: process.env['CI'] ? false : ui, - isolate: isolate ?? false, + isolate, quiet: options.quiet ?? (process.env['CI'] ? false : true), providersFile: options.providersFile && path.join(workspaceRoot, options.providersFile), setupFiles: options.setupFiles @@ -134,6 +134,7 @@ export async function normalizeOptions( : [], dumpVirtualFiles: options.dumpVirtualFiles, listTests: options.listTests, + preserveSymlinks: undefined as boolean | undefined, runnerConfig: typeof runnerConfig === 'string' ? runnerConfig.length === 0 diff --git a/packages/angular/build/src/builders/unit-test/runners/dependency-checker.ts b/packages/angular/build/src/builders/unit-test/runners/dependency-checker.ts index 3072bb038464..ed774a55476a 100644 --- a/packages/angular/build/src/builders/unit-test/runners/dependency-checker.ts +++ b/packages/angular/build/src/builders/unit-test/runners/dependency-checker.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { createRequire } from 'node:module'; +import { createProjectResolver } from '../../../utils/resolve-project'; /** * A custom error class to represent missing dependency errors. @@ -26,7 +26,7 @@ export class DependencyChecker { private readonly missingDependencies = new Set(); constructor(projectSourceRoot: string) { - this.resolver = createRequire(projectSourceRoot + '/').resolve; + this.resolver = createProjectResolver(projectSourceRoot); } /** diff --git a/packages/angular/build/src/builders/unit-test/runners/karma/executor.ts b/packages/angular/build/src/builders/unit-test/runners/karma/executor.ts index 66bf203c25c7..8b82857258b9 100644 --- a/packages/angular/build/src/builders/unit-test/runners/karma/executor.ts +++ b/packages/angular/build/src/builders/unit-test/runners/karma/executor.ts @@ -91,7 +91,7 @@ export class KarmaExecutor implements TestExecutor { progress: unitTestOptions.buildProgress ?? buildTargetOptions.progress, watch: unitTestOptions.watch, poll: buildTargetOptions.poll, - preserveSymlinks: buildTargetOptions.preserveSymlinks, + preserveSymlinks: unitTestOptions.preserveSymlinks ?? buildTargetOptions.preserveSymlinks, browsers: unitTestOptions.browsers?.join(','), codeCoverage: unitTestOptions.coverage.enabled, codeCoverageExclude: unitTestOptions.coverage.exclude, diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts index d51b9d2771b8..a8c33f9a79ac 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/browser-provider.ts @@ -6,13 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import { createRequire } from 'node:module'; import type { BrowserBuiltinProvider, BrowserConfigOptions, BrowserProviderOption, } from 'vitest/node'; import { assertIsError } from '../../../../utils/error'; +import { createProjectResolver } from '../../../../utils/resolve-project'; export interface BrowserConfiguration { browser?: BrowserConfigOptions; @@ -21,7 +21,7 @@ export interface BrowserConfiguration { } function findBrowserProvider( - projectResolver: NodeJS.RequireResolve, + projectResolver: (packageName: string) => string, ): BrowserBuiltinProvider | undefined { const requiresPreview = !!process.versions.webcontainer; @@ -138,7 +138,7 @@ export async function setupBrowserConfiguration( return {}; } - const projectResolver = createRequire(projectSourceRoot + '/').resolve; + const projectResolver = createProjectResolver(projectSourceRoot); let errors: string[] | undefined; const providerName = findBrowserProvider(projectResolver); diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts index 34d65d3d418a..7f0f67fc0c2e 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts @@ -11,9 +11,9 @@ * Provides Vitest-specific build options and virtual file contents for Angular unit testing. */ -import { createRequire } from 'node:module'; import path from 'node:path'; import { toPosixPath } from '../../../../utils/path'; +import { createProjectResolver } from '../../../../utils/resolve-project'; import type { ApplicationBuilderInternalOptions } from '../../../application/options'; import { OutputHashing } from '../../../application/schema'; import { NormalizedUnitTestBuilderOptions } from '../../options'; @@ -33,7 +33,8 @@ function createTestBedInitVirtualFile( providersFile: string | undefined, projectSourceRoot: string, teardown: boolean, - zoneTestingStrategy: 'none' | 'static' | 'dynamic', + zoneTestingStrategy: 'none' | 'static' | 'dynamic' | 'dynamic-zone', + hasLocalize: boolean, ): string { let providersImport = 'const providers = [];'; if (providersFile) { @@ -52,12 +53,17 @@ function createTestBedInitVirtualFile( // It must be imported dynamically to avoid a static dependency on 'zone.js'. await import('zone.js/testing'); }`; + } else if (zoneTestingStrategy === 'dynamic-zone') { + zoneTestingSnippet = ` + await import('zone.js'); + await import('zone.js/testing');`; } // The DynamicDOMTestComponentRenderer is used to avoid stale document references // when running Vitest in non-isolated mode with JSDOM. It looks up the // document dynamically on every operation instead of caching it. return ` + ${hasLocalize ? "import '@angular/localize/init';" : ''} // Initialize the Angular testing environment import { NgModule, provideZoneChangeDetection } from '@angular/core'; import { getTestBed, ɵgetCleanupHook as getCleanupHook, TestComponentRenderer } from '@angular/core/testing'; @@ -148,12 +154,12 @@ function adjustOutputHashing(hashing?: OutputHashing): OutputHashing { * * @param buildOptions The partial application builder options. * @param projectSourceRoot The root directory of the project source. - * @returns The resolved zone testing strategy ('none', 'static', 'dynamic'). + * @returns The resolved zone testing strategy ('none', 'static', 'dynamic', 'dynamic-zone'). */ function getZoneTestingStrategy( buildOptions: Partial, projectSourceRoot: string, -): 'none' | 'static' | 'dynamic' { +): 'none' | 'static' | 'dynamic' | 'dynamic-zone' { if (buildOptions.polyfills?.includes('zone.js/testing')) { return 'none'; } @@ -163,8 +169,14 @@ function getZoneTestingStrategy( } try { - const projectRequire = createRequire(path.join(projectSourceRoot, 'package.json')); - projectRequire.resolve('zone.js'); + const projectResolve = createProjectResolver(projectSourceRoot); + projectResolve('zone.js'); + + // If polyfills is undefined (e.g. library build target), load zone.js dynamically. + // If polyfills is defined but doesn't include zone.js (e.g. zoneless application), do NOT load zone.js. + if (buildOptions.polyfills === undefined) { + return 'dynamic-zone'; + } return 'dynamic'; } catch { @@ -254,11 +266,19 @@ export async function getVitestBuildOptions( // Inject the zone.js testing polyfill if Zone.js is installed. const zoneTestingStrategy = getZoneTestingStrategy(buildOptions, projectSourceRoot); + let hasLocalize = false; + try { + const projectResolve = createProjectResolver(projectSourceRoot); + projectResolve('@angular/localize'); + hasLocalize = true; + } catch {} + const testBedInitContents = createTestBedInitVirtualFile( providersFile, projectSourceRoot, !options.debug, zoneTestingStrategy, + hasLocalize, ); const mockPatchContents = ` diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts index 0a7a3c7ea63b..bcd81b9af61f 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts @@ -379,6 +379,7 @@ export class VitestExecutor implements TestExecutor { include, watch, isolate: this.options.isolate, + preserveSymlinks: this.options.preserveSymlinks, }), ], }; diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts index eb3d7d106ab4..29516c36c21f 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts @@ -8,7 +8,6 @@ import assert from 'node:assert'; import { readFile } from 'node:fs/promises'; -import { createRequire } from 'node:module'; import { platform } from 'node:os'; import path from 'node:path'; @@ -21,6 +20,7 @@ import type { } from 'vitest/node'; import { createBuildAssetsMiddleware } from '../../../../tools/vite/middlewares/assets-middleware'; import { toPosixPath } from '../../../../utils/path'; +import { createProjectResolver } from '../../../../utils/resolve-project'; import type { ResultFile } from '../../../application/results'; import type { NormalizedUnitTestBuilderOptions } from '../../options'; import { normalizeBrowserName } from './browser-provider'; @@ -54,11 +54,12 @@ interface VitestConfigPluginOptions { include: string[]; optimizeDepsInclude: string[]; watch: boolean; - isolate: boolean; + isolate: boolean | undefined; + preserveSymlinks?: boolean; } async function findTestEnvironment( - projectResolver: NodeJS.RequireResolve, + projectResolver: (packageName: string) => string, ): Promise<'jsdom' | 'happy-dom'> { try { projectResolver('happy-dom'); @@ -87,10 +88,10 @@ function determineCoverageProvider( if (hasNonChromium) { determinedProvider = 'istanbul'; } else { - const projectRequire = createRequire(projectSourceRoot + '/'); + const projectResolve = createProjectResolver(projectSourceRoot); const checkInstalled = (pkg: string) => { try { - projectRequire.resolve(pkg); + projectResolve(pkg); return true; } catch { @@ -241,7 +242,7 @@ export async function createVitestConfigPlugin( validateBrowserCoverage(browser, testConfig?.browser, determinedProvider); } - const projectResolver = createRequire(projectSourceRoot + '/').resolve; + const projectResolver = createProjectResolver(projectSourceRoot); const projectDefaults: UserWorkspaceConfig = { test: { @@ -258,6 +259,7 @@ export async function createVitestConfigPlugin( resolve: { mainFields: ['es2020', 'module', 'main'], conditions: ['es2015', 'es2020', 'module', ...(browser ? ['browser'] : [])], + preserveSymlinks: options.preserveSymlinks, }, }; @@ -268,8 +270,8 @@ export async function createVitestConfigPlugin( include, // CLI provider browser options override, if present ...(browser ? { browser } : {}), - // Only override if the user explicitly enabled it via CLI - ...(options.isolate ? { isolate: true } : {}), + // Only override if the user explicitly set it via CLI + ...(options.isolate !== undefined ? { isolate: options.isolate } : {}), // If the user has not specified an environment, use a smart default. ...(!testConfig?.environment ? { environment: await findTestEnvironment(projectResolver) } diff --git a/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-zone-init_spec.ts b/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-zone-init_spec.ts index 812dba7fa70d..3caf15a2cf3f 100644 --- a/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-zone-init_spec.ts +++ b/packages/angular/build/src/builders/unit-test/tests/behavior/vitest-zone-init_spec.ts @@ -67,5 +67,48 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { const { result } = await harness.executeOnce(); expect(result?.success).toBe(true); }); + + it('should load Zone and Zone testing support when testing a library and zone.js is installed', async () => { + harness.withBuilderTarget( + 'build', + async () => ({ success: true }), + { + project: 'ng-package.json', + }, + { + builderName: '@angular/build:ng-packagr', + }, + ); + + await harness.writeFile( + 'ng-package.json', + JSON.stringify({ + lib: { + entryFile: 'src/public-api.ts', + }, + }), + ); + + harness.useTarget('test', { + ...BASE_OPTIONS, + include: ['src/app.component.spec.ts'], + }); + + await harness.writeFile( + 'src/app.component.spec.ts', + ` + import { describe, it, expect } from 'vitest'; + + describe('Library Zone Test', () => { + it('should have Zone defined', () => { + expect((globalThis as any).Zone).toBeDefined(); + }); + }); + `, + ); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + }); }); }); diff --git a/packages/angular/build/src/builders/unit-test/tests/options/isolate_spec.ts b/packages/angular/build/src/builders/unit-test/tests/options/isolate_spec.ts index 6ca00a02d94d..a37bf597e91a 100644 --- a/packages/angular/build/src/builders/unit-test/tests/options/isolate_spec.ts +++ b/packages/angular/build/src/builders/unit-test/tests/options/isolate_spec.ts @@ -54,5 +54,59 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { const { result } = await harness.executeOnce(); expect(result?.success).toBeTrue(); }); + + it('should override isolate from the Vitest config file when set to false', async () => { + harness.writeFile( + 'vitest-base.config.ts', + ` + import { defineConfig } from 'vitest/config'; + + export default defineConfig({ + test: { + fileParallelism: false, + isolate: true, + setupFiles: ['./src/setup.ts'], + }, + }); + `, + ); + + harness.writeFile( + 'src/setup.ts', + ` + const global = globalThis as typeof globalThis & { setupCount?: number }; + global.setupCount = (global.setupCount ?? 0) + 1; + `, + ); + + harness.writeFile( + 'src/app/first.spec.ts', + ` + it('runs first', () => { + expect(true).toBe(true); + }); + `, + ); + + harness.writeFile( + 'src/app/second.spec.ts', + ` + it('shares the test environment with the first spec file', () => { + const global = globalThis as typeof globalThis & { setupCount?: number }; + expect(global.setupCount).toBeGreaterThan(1); + }); + `, + ); + + harness.useTarget('test', { + ...BASE_OPTIONS, + runner: 'vitest' as any, + runnerConfig: true, + isolate: false, + }); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBeTrue(); + }); }); }); diff --git a/packages/angular/build/src/tools/angular/compilation/parallel-compilation.ts b/packages/angular/build/src/tools/angular/compilation/parallel-compilation.ts index be612cbfcad4..a0dd58179ba2 100644 --- a/packages/angular/build/src/tools/angular/compilation/parallel-compilation.ts +++ b/packages/angular/build/src/tools/angular/compilation/parallel-compilation.ts @@ -12,6 +12,7 @@ import { createRequire } from 'node:module'; import { MessageChannel } from 'node:worker_threads'; import type { SourceFile } from 'typescript'; import { WorkerPool } from '../../../utils/worker-pool'; +import { mergeCumulativeDurations } from '../../esbuild/profiling'; import type { AngularHostOptions } from '../angular-host'; import { AngularCompilation, DiagnosticModes, EmitFileResult } from './angular-compilation'; @@ -124,10 +125,15 @@ export class ParallelCompilation extends AngularCompilation { throw new Error('Not implemented in ParallelCompilation.'); } - override diagnoseFiles( + override async diagnoseFiles( modes = DiagnosticModes.All, ): Promise<{ errors?: PartialMessage[]; warnings?: PartialMessage[] }> { - return this.#worker.run(modes, { name: 'diagnose' }); + const { timings, ...result } = await this.#worker.run(modes, { name: 'diagnose' }); + if (timings) { + mergeCumulativeDurations(timings); + } + + return result; } override emitAffectedFiles(): Promise> { diff --git a/packages/angular/build/src/tools/angular/compilation/parallel-worker.ts b/packages/angular/build/src/tools/angular/compilation/parallel-worker.ts index b6eccf20e3db..0a96ae74547a 100644 --- a/packages/angular/build/src/tools/angular/compilation/parallel-worker.ts +++ b/packages/angular/build/src/tools/angular/compilation/parallel-worker.ts @@ -11,6 +11,7 @@ import assert from 'node:assert'; import { randomUUID } from 'node:crypto'; import { type MessagePort, receiveMessageOnPort } from 'node:worker_threads'; import { SourceFileCache } from '../../esbuild/angular/source-file-cache'; +import { getAndClearCumulativeDurations } from '../../esbuild/profiling'; import type { AngularCompilation, DiagnosticModes } from './angular-compilation'; import { AotCompilation } from './aot-compilation'; import { JitCompilation } from './jit-compilation'; @@ -121,12 +122,17 @@ export async function initialize(request: InitRequest) { export async function diagnose(modes: DiagnosticModes): Promise<{ errors?: PartialMessage[]; warnings?: PartialMessage[]; + timings?: Record; }> { assert(compilation); const diagnostics = await compilation.diagnoseFiles(modes); + const timings = getAndClearCumulativeDurations(); - return diagnostics; + return { + ...diagnostics, + timings, + }; } export async function emit() { diff --git a/packages/angular/build/src/tools/esbuild/angular-localize-init-warning-plugin.ts b/packages/angular/build/src/tools/esbuild/angular-localize-init-warning-plugin.ts index 341d40b00541..d0aa9aff841d 100644 --- a/packages/angular/build/src/tools/esbuild/angular-localize-init-warning-plugin.ts +++ b/packages/angular/build/src/tools/esbuild/angular-localize-init-warning-plugin.ts @@ -26,6 +26,10 @@ export function createAngularLocalizeInitWarningPlugin(): Plugin { return null; } + if (args.namespace?.startsWith('angular:')) { + return null; + } + const { importer, kind, resolveDir, namespace, pluginData = {} } = args; pluginData[NG_LOCALIZE_RESOLUTION] = true; diff --git a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts index 7333843d7196..adb14dc2d737 100644 --- a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts +++ b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts @@ -67,7 +67,7 @@ export function createBrowserCodeBundleOptions( entryNames: outputNames.bundles, entryPoints, target, - supported: getFeatureSupport(target, zoneless), + supported: getFeatureSupport(zoneless), }; buildOptions.plugins ??= []; @@ -278,7 +278,7 @@ export function createServerMainCodeBundleOptions( js: `import './polyfills.server.mjs';`, }, entryPoints, - supported: getFeatureSupport(target, zoneless), + supported: getFeatureSupport(zoneless), }; buildOptions.plugins ??= []; @@ -423,7 +423,7 @@ export function createSsrEntryCodeBundleOptions( entryPoints: { 'server': ssrEntryNamespace, }, - supported: getFeatureSupport(target, true), + supported: getFeatureSupport(true), }; buildOptions.plugins ??= []; diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts index 308e3509acdb..7fe28e5a51d4 100644 --- a/packages/angular/build/src/tools/esbuild/bundler-context.ts +++ b/packages/angular/build/src/tools/esbuild/bundler-context.ts @@ -13,12 +13,10 @@ import { BuildResult, Message, Metafile, - OutputFile, build, context, } from 'esbuild'; import assert from 'node:assert'; -import { builtinModules } from 'node:module'; import { basename, extname, join, relative } from 'node:path'; import { SERVER_GENERATED_EXTERNALS } from '../../utils/server-rendering/manifest'; import { @@ -61,6 +59,8 @@ export class BundlerContext { #esbuildContext?: BuildContext<{ metafile: true; write: false }>; #esbuildOptions?: BuildOptions & { metafile: true; write: false }; #esbuildResult?: BundleContextResult; + #activeBundlePromise?: Promise; + #disposed = false; #optionsFactory: BundlerOptionsFactory; #shouldCacheResult: boolean; #loadCache?: MemoryLoadResultCache; @@ -179,7 +179,18 @@ export class BundlerContext { return this.#esbuildResult; } - const result = await this.#performBundle(); + if (!force && this.#activeBundlePromise) { + return this.#activeBundlePromise; + } + + const bundlePromise = this.#performBundle().finally(() => { + if (this.#activeBundlePromise === bundlePromise) { + this.#activeBundlePromise = undefined; + } + }); + this.#activeBundlePromise = bundlePromise; + + const result = await bundlePromise; if (this.#shouldCacheResult) { this.#esbuildResult = result; } @@ -206,14 +217,16 @@ export class BundlerContext { if (this.#esbuildContext) { // Rebuild using the existing incremental build context result = await this.#esbuildContext.rebuild(); - } else if (this.incremental) { - // Create an incremental build context and perform the first build. + } else { + // Create a build context and perform the build. // Context creation does not perform a build. - this.#esbuildContext = await context(this.#esbuildOptions); + const esbuildContext = await context(this.#esbuildOptions); + if (this.#disposed) { + await esbuildContext.dispose(); + throw new Error('BundlerContext was disposed during build.'); + } + this.#esbuildContext = esbuildContext; result = await this.#esbuildContext.rebuild(); - } else { - // For non-incremental builds, perform a single build - result = await build(this.#esbuildOptions); } } catch (failure) { // Build failures will throw an exception which contains errors/warnings @@ -451,9 +464,11 @@ export class BundlerContext { * @returns A promise that resolves when disposal is complete. */ async dispose(): Promise { + this.#disposed = true; try { this.#esbuildOptions = undefined; this.#esbuildResult = undefined; + this.#activeBundlePromise = undefined; this.#loadCache = undefined; await this.#esbuildContext?.dispose(); } finally { @@ -472,12 +487,9 @@ function isInternalBundlerFile(file: string) { return true; } - const DISABLED_BUILTIN = '(disabled):'; - - // Disabled node builtins such as "/some/path/(disabled):fs" - const disabledIndex = file.indexOf(DISABLED_BUILTIN); - if (disabledIndex >= 0) { - return builtinModules.includes(file.slice(disabledIndex + DISABLED_BUILTIN.length)); + // Any (disabled): path is a virtual esbuild entry that doesn't exist on disk + if (file.includes('(disabled):')) { + return true; } return false; diff --git a/packages/angular/build/src/tools/esbuild/cache.ts b/packages/angular/build/src/tools/esbuild/cache.ts index 5bd0dc84d73f..0634ec5268e8 100644 --- a/packages/angular/build/src/tools/esbuild/cache.ts +++ b/packages/angular/build/src/tools/esbuild/cache.ts @@ -44,11 +44,26 @@ export interface CacheStore { * to use a cache. */ export class Cache = CacheStore> { + // In-flight creator promises to deduplicate concurrent requests for the same key. + readonly #requests = new Map>(); + // Track how many writes occurred for a key to detect mutations during await gaps. + readonly #writeCounts = new Map(); + // Count the number of active, pending getOrCreate operations per key to avoid memory leaks. + readonly #pendingGets = new Map(); + constructor( protected readonly store: S, readonly namespace?: string, ) {} + #incrementWrite(key: string) { + // Only track write counts if there is a pending getOrCreate operation active for the key. + // This ensures that write counts are not leaked when no concurrent gets are running. + if (this.#pendingGets.has(key)) { + this.#writeCounts.set(key, (this.#writeCounts.get(key) || 0) + 1); + } + } + /** * Prefixes a key with the cache namespace if present. * @param key A key string to prefix. @@ -72,14 +87,75 @@ export class Cache = CacheStore> { */ async getOrCreate(key: string, creator: () => V | Promise): Promise { const namespacedKey = this.withNamespace(key); - let value = await this.store.get(namespacedKey); - if (value === undefined) { - value = await creator(); - await this.store.set(namespacedKey, value); + // 1. If another call is already running the creator for this key, share its promise. + let activeRequest = this.#requests.get(namespacedKey); + if (activeRequest !== undefined) { + return activeRequest; } - return value; + // Increment pending gets count to enable write-tracking for this key. + const currentPending = this.#pendingGets.get(namespacedKey) || 0; + this.#pendingGets.set(namespacedKey, currentPending + 1); + + try { + const startWriteCount = this.#writeCounts.get(namespacedKey) || 0; + + // 2. Query the backing store. Since store.get can be async, we yield to the event loop. + const value = await this.store.get(namespacedKey); + + // If a write (e.g. put) occurred during the store.get await gap, we must abort + // the current execution and restart to ensure we return the newly written value. + if ((this.#writeCounts.get(namespacedKey) || 0) !== startWriteCount) { + return this.getOrCreate(key, creator); + } + + if (value !== undefined) { + return value; + } + + // 3. Recheck active request after the await gap in case another concurrent call + // initiated a creator during the store.get wait. + activeRequest = this.#requests.get(namespacedKey); + if (activeRequest !== undefined) { + return activeRequest; + } + + // 4. Run the creator to produce the new value, and store its promise in #requests. + activeRequest = Promise.resolve(creator()).then( + async (newValue) => { + // Ensure this request is still the active one before writing back to the store + // (prevents overwriting newer data if put() was called before resolution). + if (this.#requests.get(namespacedKey) === activeRequest) { + this.#incrementWrite(namespacedKey); + await this.store.set(namespacedKey, newValue); + this.#requests.delete(namespacedKey); + } + + return newValue; + }, + (error) => { + // Clean up the active request if the creator fails. + if (this.#requests.get(namespacedKey) === activeRequest) { + this.#requests.delete(namespacedKey); + } + throw error; + }, + ); + + this.#requests.set(namespacedKey, activeRequest); + + return activeRequest; + } finally { + // Clean up write counts and pending gets once all concurrent gets for this key finish. + const current = this.#pendingGets.get(namespacedKey) || 0; + if (current <= 1) { + this.#pendingGets.delete(namespacedKey); + this.#writeCounts.delete(namespacedKey); + } else { + this.#pendingGets.set(namespacedKey, current - 1); + } + } } /** @@ -100,7 +176,19 @@ export class Cache = CacheStore> { * @param value A value to put in the cache. */ async put(key: string, value: V): Promise { - await this.store.set(this.withNamespace(key), value); + const namespacedKey = this.withNamespace(key); + this.#requests.delete(namespacedKey); + this.#incrementWrite(namespacedKey); + await this.store.set(namespacedKey, value); + } + + /** + * Clears the base class internal state (requests, write counts, and pending gets). + */ + protected clearInternal(): void { + this.#requests.clear(); + this.#writeCounts.clear(); + this.#pendingGets.clear(); } } @@ -116,6 +204,7 @@ export class MemoryCache extends Cache> { * Removes all entries from the cache instance. */ clear() { + this.clearInternal(); this.store.clear(); } diff --git a/packages/angular/build/src/tools/esbuild/cache_spec.ts b/packages/angular/build/src/tools/esbuild/cache_spec.ts new file mode 100644 index 000000000000..a30852836eff --- /dev/null +++ b/packages/angular/build/src/tools/esbuild/cache_spec.ts @@ -0,0 +1,144 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { MemoryCache } from './cache'; + +describe('MemoryCache', () => { + let cache: MemoryCache; + + beforeEach(() => { + cache = new MemoryCache(); + }); + + it('should return cached value on subsequent getOrCreate calls', async () => { + let callCount = 0; + const creator = () => { + callCount++; + + return 'value'; + }; + + const val1 = await cache.getOrCreate('key', creator); + const val2 = await cache.getOrCreate('key', creator); + + expect(val1).toBe('value'); + expect(val2).toBe('value'); + expect(callCount).toBe(1); + }); + + it('should call creator only once for concurrent getOrCreate calls with the same key', async () => { + let callCount = 0; + let resolveCreator!: (value: string) => void; + const promise = new Promise((resolve) => { + resolveCreator = resolve; + }); + + const creator = () => { + callCount++; + + return promise; + }; + + const p1 = cache.getOrCreate('key', creator); + const p2 = cache.getOrCreate('key', creator); + + resolveCreator('concurrent-value'); + + const [val1, val2] = await Promise.all([p1, p2]); + + expect(val1).toBe('concurrent-value'); + expect(val2).toBe('concurrent-value'); + expect(callCount).toBe(1); + }); + + it('should call creator multiple times for concurrent getOrCreate calls with different keys', async () => { + let callCount = 0; + const creator = (val: string) => { + callCount++; + + return Promise.resolve(val); + }; + + const p1 = cache.getOrCreate('key1', () => creator('value1')); + const p2 = cache.getOrCreate('key2', () => creator('value2')); + + const [val1, val2] = await Promise.all([p1, p2]); + + expect(val1).toBe('value1'); + expect(val2).toBe('value2'); + expect(callCount).toBe(2); + }); + + it('should clean up active request if creator throws/rejects', async () => { + let callCount = 0; + let rejectCreator!: (err: Error) => void; + const promise = new Promise((_, reject) => { + rejectCreator = reject; + }); + + const creator = () => { + callCount++; + + return promise; + }; + + const p1 = cache.getOrCreate('key', creator); + const p2 = cache.getOrCreate('key', creator); + + rejectCreator(new Error('creator error')); + + await expectAsync(p1).toBeRejectedWithError('creator error'); + await expectAsync(p2).toBeRejectedWithError('creator error'); + + // Subsequent call should trigger the creator again + const p3 = cache.getOrCreate('key', () => { + callCount++; + + return Promise.resolve('new-value'); + }); + const val3 = await p3; + expect(val3).toBe('new-value'); + expect(callCount).toBe(2); + }); + + it('should override/clear active requests when put is called', async () => { + let resolveCreator!: (value: string) => void; + const promise = new Promise((resolve) => { + resolveCreator = resolve; + }); + + let creatorStarted!: (value: void) => void; + const creatorStartedPromise = new Promise((resolve) => { + creatorStarted = resolve; + }); + + const creator = () => { + creatorStarted(); + + return promise; + }; + + const p1 = cache.getOrCreate('key', creator); + + // Wait for the creator to be called so that the active request is created + await creatorStartedPromise; + + // Call put before the creator promise resolves + await cache.put('key', 'override-value'); + + resolveCreator('original-value'); + + const val1 = await p1; + // p1 was already returned, so it resolves to original-value + expect(val1).toBe('original-value'); + + // Subsequent getOrCreate should return the put/overridden value, not the resolved original-value + const val2 = await cache.getOrCreate('key', () => 'should-not-run'); + expect(val2).toBe('override-value'); + }); +}); diff --git a/packages/angular/build/src/tools/esbuild/i18n-locale-plugin.ts b/packages/angular/build/src/tools/esbuild/i18n-locale-plugin.ts index ae94b62ca16d..603c65677b00 100644 --- a/packages/angular/build/src/tools/esbuild/i18n-locale-plugin.ts +++ b/packages/angular/build/src/tools/esbuild/i18n-locale-plugin.ts @@ -7,7 +7,7 @@ */ import type { Plugin, ResolveResult } from 'esbuild'; -import { createRequire } from 'node:module'; +import { createProjectResolver } from '../../utils/resolve-project'; /** * The internal namespace used by generated locale import statements and Angular locale data plugin. @@ -50,7 +50,7 @@ export function createAngularLocaleDataPlugin(): Plugin { } let exact = true; - let localeRequire: NodeJS.Require | undefined; + let projectResolve: ((packageName: string) => string) | undefined; while (partialLocaleTag) { // Angular embeds the `en`/`en-US` locale into the framework and it does not need to be included again here. // The onLoad hook below for the locale data namespace has an `empty` loader that will prevent inclusion. @@ -73,10 +73,10 @@ export function createAngularLocaleDataPlugin(): Plugin { let result: ResolveResult | undefined; const { packages, absWorkingDir } = build.initialOptions; if (packages === 'external' && absWorkingDir) { - localeRequire ??= createRequire(absWorkingDir + '/'); + projectResolve ??= createProjectResolver(absWorkingDir); try { - localeRequire.resolve(potentialPath); + projectResolve(potentialPath); result = { errors: [], @@ -94,6 +94,17 @@ export function createAngularLocaleDataPlugin(): Plugin { kind: 'import-statement', resolveDir: absWorkingDir, }); + if (result && result.external && absWorkingDir) { + projectResolve ??= createProjectResolver(absWorkingDir); + try { + const resolvedPath = projectResolve(potentialPath); + result = { + ...result, + external: false, + path: resolvedPath, + }; + } catch {} + } } if (result?.path) { diff --git a/packages/angular/build/src/tools/esbuild/javascript-transformer.ts b/packages/angular/build/src/tools/esbuild/javascript-transformer.ts index b728a0f599e2..36c505d714fc 100644 --- a/packages/angular/build/src/tools/esbuild/javascript-transformer.ts +++ b/packages/angular/build/src/tools/esbuild/javascript-transformer.ts @@ -34,11 +34,22 @@ export class JavaScriptTransformer { #commonOptions: Required; #fileCacheKeyBase: Uint8Array; + /** Queue of pending transformation tasks waiting for an active concurrency slot. */ + #pendingTasks: { resolve: () => void; reject: (reason: Error) => void }[] = []; + + /** Current count of actively executing transformation tasks. */ + #activeTasks = 0; + + /** Maximum number of transformation tasks allowed to execute concurrently. */ + #maxConcurrent: number; + constructor( options: JavaScriptTransformerOptions, readonly maxThreads: number, private readonly cache?: Cache, ) { + // Maintain 2 active tasks per worker thread to keep transformation pipelines fully saturated + this.#maxConcurrent = Math.max(1, maxThreads * 2); // Extract options to ensure only the named options are serialized and sent to the worker const { sourcemap, @@ -55,6 +66,33 @@ export class JavaScriptTransformer { this.#fileCacheKeyBase = Buffer.from(JSON.stringify(this.#commonOptions), 'utf-8'); } + /** + * Executes a transformation action using a semaphore-based backpressure throttle. + * Prevents libuv thread pool saturation and excessive V8 heap accumulation. + * @param action A callback that produces a promise for the transformation result. + * @returns A promise resolving to the transformation result. + */ + async #runWithThrottle(action: () => Promise): Promise { + if (this.#activeTasks >= this.#maxConcurrent) { + await new Promise((resolve, reject) => { + this.#pendingTasks.push({ resolve, reject }); + }); + } else { + this.#activeTasks++; + } + + try { + return await action(); + } finally { + const next = this.#pendingTasks.shift(); + if (next) { + next.resolve(); + } else { + this.#activeTasks--; + } + } + } + #ensureWorkerPool(): WorkerPool { if (this.#workerPool) { return this.#workerPool; @@ -90,56 +128,58 @@ export class JavaScriptTransformer { sideEffects?: boolean, instrumentForCoverage?: boolean, ): Promise { - const data = await readFile(filename); - - let result; - let cacheKey; - if (this.cache) { - // Create a cache key from the file data and options that effect the output. - // NOTE: If additional options are added, this may need to be updated. - // TODO: Consider xxhash or similar instead of SHA256 - const hash = createHash('sha256'); - hash.update(`${!!skipLinker}--${!!sideEffects}`); - hash.update(data); - hash.update(this.#fileCacheKeyBase); - cacheKey = hash.digest('hex'); + return this.#runWithThrottle(async () => { + const data = await readFile(filename); + + let result; + let cacheKey; + if (this.cache) { + // Create a cache key from the file data and options that effect the output. + // NOTE: If additional options are added, this may need to be updated. + // TODO: Consider xxhash or similar instead of SHA256 + const hash = createHash('sha256'); + hash.update(`${!!skipLinker}--${!!sideEffects}`); + hash.update(data); + hash.update(this.#fileCacheKeyBase); + cacheKey = hash.digest('hex'); - try { - result = await this.cache?.get(cacheKey); - } catch { - // Failure to get the value should not fail the transform - } - } - - if (result === undefined) { - // If there is no cache or no cached entry, process the file - result = (await this.#ensureWorkerPool().run( - { - filename, - data, - skipLinker, - sideEffects, - instrumentForCoverage, - ...this.#commonOptions, - }, - { - // The below is disable as with Yarn PNP this causes build failures with the below message - // `Unable to deserialize cloned data`. - transferList: process.versions.pnp ? undefined : [data.buffer], - }, - )) as Uint8Array; - - // If there is a cache then store the result - if (this.cache && cacheKey) { try { - await this.cache.put(cacheKey, result); + result = await this.cache?.get(cacheKey); } catch { - // Failure to store the value in the cache should not fail the transform + // Failure to get the value should not fail the transform } } - } - return result; + if (result === undefined) { + // If there is no cache or no cached entry, process the file + result = (await this.#ensureWorkerPool().run( + { + filename, + data, + skipLinker, + sideEffects, + instrumentForCoverage, + ...this.#commonOptions, + }, + { + // The below is disable as with Yarn PNP this causes build failures with the below message + // `Unable to deserialize cloned data`. + transferList: process.versions.pnp ? undefined : [data.buffer], + }, + )) as Uint8Array; + + // If there is a cache then store the result + if (this.cache && cacheKey) { + try { + await this.cache.put(cacheKey, result); + } catch { + // Failure to store the value in the cache should not fail the transform + } + } + } + + return result; + }); } /** @@ -171,14 +211,16 @@ export class JavaScriptTransformer { ); } - return this.#ensureWorkerPool().run({ - filename, - data, - skipLinker, - sideEffects, - instrumentForCoverage, - ...this.#commonOptions, - }); + return this.#runWithThrottle(() => + this.#ensureWorkerPool().run({ + filename, + data, + skipLinker, + sideEffects, + instrumentForCoverage, + ...this.#commonOptions, + }), + ); } /** @@ -186,6 +228,12 @@ export class JavaScriptTransformer { * @returns A void promise that resolves when closing is complete. */ async close(): Promise { + const pending = this.#pendingTasks; + this.#pendingTasks = []; + for (const task of pending) { + task.reject(new Error('JavaScriptTransformer closed.')); + } + if (this.#workerPool) { try { await this.#workerPool.destroy(); diff --git a/packages/angular/build/src/tools/esbuild/profiling.ts b/packages/angular/build/src/tools/esbuild/profiling.ts index 2e67a4cb27f2..80fd26c32d0e 100644 --- a/packages/angular/build/src/tools/esbuild/profiling.ts +++ b/packages/angular/build/src/tools/esbuild/profiling.ts @@ -14,6 +14,32 @@ export function resetCumulativeDurations(): void { cumulativeDurations?.clear(); } +export function getAndClearCumulativeDurations(): Record | undefined { + if (!cumulativeDurations || cumulativeDurations.size === 0) { + return undefined; + } + + const data = Object.fromEntries(cumulativeDurations); + + cumulativeDurations.clear(); + + return data; +} + +export function mergeCumulativeDurations(data: Record): void { + cumulativeDurations ??= new Map(); + + for (const [name, durations] of Object.entries(data)) { + let existing = cumulativeDurations.get(name); + if (!existing) { + existing = []; + cumulativeDurations.set(name, existing); + } + + existing.push(...durations); + } +} + export function logCumulativeDurations(): void { if (!debugPerformance || !cumulativeDurations) { return; diff --git a/packages/angular/build/src/tools/esbuild/utils.ts b/packages/angular/build/src/tools/esbuild/utils.ts index 51eabbbfb84f..9024a981c3f7 100644 --- a/packages/angular/build/src/tools/esbuild/utils.ts +++ b/packages/angular/build/src/tools/esbuild/utils.ts @@ -187,16 +187,12 @@ export async function withNoProgress(text: string, action: () => T | Promise< } /** - * Generates a syntax feature object map for Angular applications based on a list of targets. + * Generates a syntax feature object map for Angular applications. * A full set of feature names can be found here: https://esbuild.github.io/api/#supported - * @param target An array of browser/engine targets in the format accepted by the esbuild `target` option. * @param nativeAsyncAwait Indicate whether to support native async/await. * @returns An object that can be used with the esbuild build `supported` option. */ -export function getFeatureSupport( - target: string[], - nativeAsyncAwait: boolean, -): BuildOptions['supported'] { +export function getFeatureSupport(nativeAsyncAwait: boolean): BuildOptions['supported'] { return { // Native async/await is not supported with Zone.js. Disabling support here will cause // esbuild to downlevel async/await, async generators, and for await...of to a Zone.js supported form. diff --git a/packages/angular/build/src/tools/vite/plugins/id-prefix-plugin.ts b/packages/angular/build/src/tools/vite/plugins/id-prefix-plugin.ts index 5e543734b863..a448b32321d5 100644 --- a/packages/angular/build/src/tools/vite/plugins/id-prefix-plugin.ts +++ b/packages/angular/build/src/tools/vite/plugins/id-prefix-plugin.ts @@ -27,11 +27,7 @@ export function createRemoveIdPrefixPlugin(externals: string[]): Plugin { return; } - const escapedExternals = externals.map((e) => escapeRegexSpecialChars(e) + '(?:/.+)?'); - const prefixedExternalRegex = new RegExp( - `${resolvedConfig.base}${VITE_ID_PREFIX}(${escapedExternals.join('|')})`, - 'g', - ); + const transformFn = createTransformer(resolvedConfig.base, externals); // @ts-expect-error: Property 'push' does not exist on type 'readonly Plugin[]' // Reasoning: @@ -40,15 +36,34 @@ export function createRemoveIdPrefixPlugin(externals: string[]): Plugin { // AFTER the import-analysis. resolvedConfig.plugins.push({ name: 'angular-plugin-remove-id-prefix-transform', - transform: (code: string) => { - // don't do anything when code does not contain the Vite prefix - if (!code.includes(VITE_ID_PREFIX)) { - return code; - } - - return code.replace(prefixedExternalRegex, (_, externalName) => externalName); - }, + transform: transformFn, }); }, }; } + +/** + * Creates a transform function that removes the Vite ID prefix from externals. + * @param base The base path of the application. + * @param externals The external package names. + * @returns A function that transforms code by removing the Vite ID prefix. + */ +export function createTransformer(base: string, externals: string[]): (code: string) => string { + // The path suffix is bounded so that a match can never extend past the end of an + // import specifier string literal. With a greedy `.+`, minified (single-line) code + // would let the first match consume the remainder of the line, leaving all later + // `/@id/` occurrences on that line unstripped. + const escapedExternals = externals.map((e) => escapeRegexSpecialChars(e) + '(?:/[^\'"`\\s]+)?'); + + const prefixedExternalRegex = new RegExp( + `${base}${VITE_ID_PREFIX}(${escapedExternals.join('|')})`, + 'g', + ); + + return (code: string) => { + return code.includes(VITE_ID_PREFIX) + ? code.replace(prefixedExternalRegex, (_, externalName) => externalName) + : // don't do anything when code does not contain the Vite prefix + code; + }; +} diff --git a/packages/angular/build/src/tools/vite/plugins/id-prefix-plugin_spec.ts b/packages/angular/build/src/tools/vite/plugins/id-prefix-plugin_spec.ts new file mode 100644 index 000000000000..37d1bdf61fe6 --- /dev/null +++ b/packages/angular/build/src/tools/vite/plugins/id-prefix-plugin_spec.ts @@ -0,0 +1,67 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { createTransformer } from './id-prefix-plugin'; + +describe('createTransformer', () => { + it('should strip the prefix from every occurrence on a single (minified) line', () => { + const transform = createTransformer('/', [ + '@angular/common', + '@angular/common/http', + '@angular/core', + '@angular/router', + ]); + + const minified = + 'import{a}from"/@id/@angular/common/http";' + + 'import{b}from"/@id/@angular/router";' + + 'import{c}from"/@id/@angular/core";'; + + expect(transform(minified)).toBe( + 'import{a}from"@angular/common/http";' + + 'import{b}from"@angular/router";' + + 'import{c}from"@angular/core";', + ); + }); + + it('should strip the prefix from an external with a deep import path', () => { + const transform = createTransformer('/', ['@angular/common']); + + expect(transform('import{h}from"/@id/@angular/common/http";')).toBe( + 'import{h}from"@angular/common/http";', + ); + }); + + it('should strip the prefix when a non-root base is configured', () => { + const transform = createTransformer('/app/', ['@angular/router']); + + expect(transform('import{r}from"/app/@id/@angular/router";')).toBe( + 'import{r}from"@angular/router";', + ); + }); + + it('should strip the prefix from multi-line (unminified) code', () => { + const transform = createTransformer('/', ['@angular/common', '@angular/router']); + + const code = + 'import { CommonModule } from "/@id/@angular/common";\n' + + 'import { Router } from "/@id/@angular/router";\n'; + + expect(transform(code)).toBe( + 'import { CommonModule } from "@angular/common";\n' + + 'import { Router } from "@angular/router";\n', + ); + }); + + it('should not modify imports that are not configured externals', () => { + const transform = createTransformer('/', ['@angular/router']); + + const code = 'import{x}from"/@id/some-other-package";'; + expect(transform(code)).toBe(code); + }); +}); diff --git a/packages/angular/build/src/tools/vite/utils.ts b/packages/angular/build/src/tools/vite/utils.ts index 2f7cfba84306..7250fd93ceb7 100644 --- a/packages/angular/build/src/tools/vite/utils.ts +++ b/packages/angular/build/src/tools/vite/utils.ts @@ -100,7 +100,7 @@ export function getDepOptimizationConfig({ esbuildOptions: { // Set esbuild supported targets. target, - supported: getFeatureSupport(target, zoneless), + supported: getFeatureSupport(zoneless), plugins, loader, define: { @@ -140,8 +140,12 @@ export function updateExternalMetadata( } const { implicitBrowser, implicitServer, explicit } = result.detail['externalMetadata']; - const implicitServerFiltered = implicitServer.filter((m) => !isBuiltin(m) && !isAbsoluteUrl(m)); - const implicitBrowserFiltered = implicitBrowser.filter((m) => !isAbsoluteUrl(m)); + const implicitServerFiltered = implicitServer.filter( + (m) => !isBuiltin(m) && !isAbsoluteUrl(m) && !m.endsWith('.json'), + ); + const implicitBrowserFiltered = implicitBrowser.filter( + (m) => !isAbsoluteUrl(m) && !m.endsWith('.json'), + ); const explicitBrowserFiltered = explicitPackagesOnly ? explicit.filter((m) => !isAbsoluteUrl(m)) : explicit; diff --git a/packages/angular/build/src/utils/normalize-asset-patterns.ts b/packages/angular/build/src/utils/normalize-asset-patterns.ts index b935f1d84588..d97b6e605fa4 100644 --- a/packages/angular/build/src/utils/normalize-asset-patterns.ts +++ b/packages/angular/build/src/utils/normalize-asset-patterns.ts @@ -10,6 +10,7 @@ import assert from 'node:assert'; import { statSync } from 'node:fs'; import * as path from 'node:path'; import { AssetPattern, AssetPatternClass } from '../builders/application/schema'; +import { isSubDirectory } from './path'; export function normalizeAssetPatterns( assetPatterns: AssetPattern[], @@ -70,6 +71,10 @@ export function normalizeAssetPatterns( assetPattern = { glob, input, output }; } else { + if (!isSubDirectory(workspaceRoot, assetPattern.input)) { + throw new Error(`The ${assetPattern.input} asset path must be within the workspace root.`); + } + assetPattern.output = path.join('.', assetPattern.output ?? ''); } diff --git a/packages/angular/build/src/utils/path.ts b/packages/angular/build/src/utils/path.ts index 036dcb23502e..e969d420e429 100644 --- a/packages/angular/build/src/utils/path.ts +++ b/packages/angular/build/src/utils/path.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { posix } from 'node:path'; +import { isAbsolute, posix, relative, resolve } from 'node:path'; import { platform } from 'node:process'; const WINDOWS_PATH_SEPERATOR_REGEXP = /\\/g; @@ -35,3 +35,18 @@ const WINDOWS_PATH_SEPERATOR_REGEXP = /\\/g; export function toPosixPath(path: string): string { return platform === 'win32' ? path.replace(WINDOWS_PATH_SEPERATOR_REGEXP, posix.sep) : path; } + +/** + * Determines if a path is a subdirectory or file within a parent directory. + * + * @param parent - The parent directory path. + * @param child - The child path to check. + * @returns `true` if the child path is within the parent directory, `false` otherwise. + */ +export function isSubDirectory(parent: string, child: string): boolean { + const resolvedParent = resolve(parent); + const resolvedChild = resolve(parent, child); + const relativePath = toPosixPath(relative(resolvedParent, resolvedChild)); + + return relativePath !== '..' && !relativePath.startsWith('../') && !isAbsolute(relativePath); +} diff --git a/packages/angular/build/src/utils/path_spec.ts b/packages/angular/build/src/utils/path_spec.ts new file mode 100644 index 000000000000..84c7d8ac31c4 --- /dev/null +++ b/packages/angular/build/src/utils/path_spec.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { isSubDirectory } from './path'; + +describe('isSubDirectory', () => { + it('should return true for a direct child', () => { + expect(isSubDirectory('/foo/bar', '/foo/bar/baz')).toBeTrue(); + }); + + it('should return true for a nested child', () => { + expect(isSubDirectory('/foo/bar', '/foo/bar/baz/qux/file.txt')).toBeTrue(); + }); + + it('should return true if paths are identical', () => { + expect(isSubDirectory('/foo/bar', '/foo/bar')).toBeTrue(); + }); + + it('should return false for a sibling directory starting with same prefix', () => { + expect(isSubDirectory('/foo/bar', '/foo/bar-outside')).toBeFalse(); + expect(isSubDirectory('/foo/bar', '/foo/bar-outside/file.txt')).toBeFalse(); + }); + + it('should return false for directory outside parent via traversal', () => { + expect(isSubDirectory('/foo/bar', '/foo/bar/../outside')).toBeFalse(); + }); + + it('should return false for parent directory', () => { + expect(isSubDirectory('/foo/bar', '/foo')).toBeFalse(); + }); + + it('should return true for children containing directory names starting with double dots', () => { + expect(isSubDirectory('/foo/bar', '/foo/bar/..baz')).toBeTrue(); + expect(isSubDirectory('/foo/bar', '/foo/bar/..baz/qux')).toBeTrue(); + }); +}); diff --git a/packages/angular/build/src/utils/resolve-assets.ts b/packages/angular/build/src/utils/resolve-assets.ts index e98879e58de7..71b1c0e4768b 100644 --- a/packages/angular/build/src/utils/resolve-assets.ts +++ b/packages/angular/build/src/utils/resolve-assets.ts @@ -8,6 +8,7 @@ import path from 'node:path'; import { glob } from 'tinyglobby'; +import { isSubDirectory } from './path'; export async function resolveAssets( entries: { @@ -25,7 +26,12 @@ export async function resolveAssets( const outputFiles: { source: string; destination: string }[] = []; for (const entry of entries) { + if (!isSubDirectory(root, entry.input)) { + throw new Error(`The ${entry.input} asset path must be within the workspace root.`); + } + const cwd = path.resolve(root, entry.input); + const files = await glob(entry.glob, { cwd, dot: true, diff --git a/packages/angular/build/src/utils/resolve-project.ts b/packages/angular/build/src/utils/resolve-project.ts new file mode 100644 index 000000000000..ad31825683c4 --- /dev/null +++ b/packages/angular/build/src/utils/resolve-project.ts @@ -0,0 +1,23 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { createRequire } from 'node:module'; +import { join } from 'node:path'; + +/** + * Creates a module resolver function that is strictly scoped to the project root. + * This prevents module resolution from leaking the parent module context when executing inside virtual stores (like pnpm). + * + * @param projectRoot The root directory of the project. + * @returns A resolver function that takes a package name/path and returns its resolved path. + */ +export function createProjectResolver(projectRoot: string): (packageName: string) => string { + const projectRequire = createRequire(join(projectRoot, 'package.json')); + + return (packageName: string) => projectRequire.resolve(packageName, { paths: [projectRoot] }); +} diff --git a/packages/angular/cli/bin/ng.js b/packages/angular/cli/bin/ng.js index 9668d5917d73..ac01a0935fc0 100755 --- a/packages/angular/cli/bin/ng.js +++ b/packages/angular/cli/bin/ng.js @@ -57,7 +57,7 @@ if (major === 23 || major === 25) { require('./bootstrap'); } else if (!nodeUtils.isNodeVersionSupported()) { - // Error and exit if less than 22.22 or 24.13.1 + // Error and exit if less than the supported versions. console.error( 'Node.js version ' + process.version + diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json index bc41c868bc88..066a3693eca4 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -11,16 +11,6 @@ "angular-cli", "Angular CLI" ], - "repository": { - "type": "git", - "url": "git+https://github.com/angular/angular-cli.git" - }, - "author": "Angular Authors", - "license": "MIT", - "bugs": { - "url": "https://github.com/angular/angular-cli/issues" - }, - "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/architect": "workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER", "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", @@ -35,7 +25,7 @@ "jsonc-parser": "3.3.1", "listr2": "10.2.1", "npm-package-arg": "13.0.2", - "pacote": "21.5.0", + "pacote": "21.5.1", "parse5-html-rewriting-stream": "8.0.1", "semver": "7.7.4", "yargs": "18.0.0", diff --git a/packages/angular/cli/src/command-builder/command-module.ts b/packages/angular/cli/src/command-builder/command-module.ts index b0d15d70d0b2..ae0eb82f0cb5 100644 --- a/packages/angular/cli/src/command-builder/command-module.ts +++ b/packages/angular/cli/src/command-builder/command-module.ts @@ -14,6 +14,7 @@ import { Parser as yargsParser } from 'yargs/helpers'; import { getAnalyticsUserId } from '../analytics/analytics'; import { AnalyticsCollector } from '../analytics/analytics-collector'; import { EventCustomDimension, EventCustomMetric } from '../analytics/analytics-parameters'; +import { PackageManagerError } from '../package-managers'; import { considerSettingUpAutocompletion } from '../utilities/completion'; import { AngularWorkspace } from '../utilities/config'; import { memoize } from '../utilities/memoize'; @@ -95,6 +96,7 @@ export abstract class CommandModule implements CommandModuleI async handler(args: ArgumentsCamelCase & OtherOptions): Promise { const { _, $0, ...options } = args; + const { logger } = this.context; // Camelize options as yargs will return the object in kebab-case when camel casing is disabled. const camelCasedOptions: Record = {}; @@ -103,10 +105,7 @@ export abstract class CommandModule implements CommandModuleI } // Set up autocompletion if appropriate. - const autocompletionExitCode = await considerSettingUpAutocompletion( - this.commandName, - this.context.logger, - ); + const autocompletionExitCode = await considerSettingUpAutocompletion(this.commandName, logger); if (autocompletionExitCode !== undefined) { process.exitCode = autocompletionExitCode; @@ -127,7 +126,13 @@ export abstract class CommandModule implements CommandModuleI exitCode = await this.run(camelCasedOptions as Options & OtherOptions); } catch (e) { if (e instanceof schema.SchemaValidationException) { - this.context.logger.fatal(`Error: ${e.message}`); + logger.fatal(`Error: ${e.message}`); + exitCode = 1; + } else if (e instanceof PackageManagerError) { + const output = e.stderr || e.stdout; + logger.fatal( + `Error: Package installation failed: ${e.message}${output ? `\nOutput: ${output}` : ''}`, + ); exitCode = 1; } else { throw e; diff --git a/packages/angular/cli/src/commands/add/cli.ts b/packages/angular/cli/src/commands/add/cli.ts index 136704947e69..a3a3d6f7ecd2 100644 --- a/packages/angular/cli/src/commands/add/cli.ts +++ b/packages/angular/cli/src/commands/add/cli.ts @@ -16,6 +16,7 @@ import npa from 'npm-package-arg'; import semver, { Range, compare, intersects, prerelease, satisfies, valid } from 'semver'; import { Argv } from 'yargs'; import { + CommandModuleError, CommandModuleImplementation, Options, OtherOptions, @@ -24,12 +25,7 @@ import { SchematicsCommandArgs, SchematicsCommandModule, } from '../../command-builder/schematics-command-module'; -import { - NgAddSaveDependency, - PackageManagerError, - PackageManifest, - PackageMetadata, -} from '../../package-managers'; +import { NgAddSaveDependency, PackageManifest, PackageMetadata } from '../../package-managers'; import { assertIsError } from '../../utilities/error'; import { isTTY } from '../../utilities/tty'; import { VERSION } from '../../utilities/version'; @@ -131,6 +127,17 @@ export default class AddCommandModule type: 'boolean', default: false, }) + .check(({ registry }) => { + if (registry === undefined) { + return true; + } + + if (typeof registry === 'string' && URL.canParse(registry)) { + return true; + } + + throw new CommandModuleError('Option --registry must be a valid URL.'); + }) // Prior to downloading we don't know the full schema and therefore we cannot be strict on the options. // Possibly in the future update the logic to use the following syntax: // `ng add @angular/localize -- --package-options`. @@ -245,6 +252,22 @@ export default class AddCommandModule const result = await tasks.run(taskContext); assert(result.collectionName, 'Collection name should always be available'); + let shouldCleanUp = false; + if (!result.hasSchematics && !options.dryRun) { + const packageJsonPath = this.resolvePackageJson(result.collectionName); + if (packageJsonPath && existsSync(packageJsonPath)) { + try { + const localManifest = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8')); + if (localManifest.schematics) { + result.hasSchematics = true; + if (localManifest['ng-add']?.save === false) { + shouldCleanUp = true; + } + } + } catch {} + } + } + // Check if the installed package has actual add actions and not just schematic support if (result.hasSchematics && !options.dryRun) { const workflow = this.getOrCreateWorkflowForBuilder(result.collectionName); @@ -299,7 +322,16 @@ export default class AddCommandModule return; } - return this.executeSchematic({ ...options, collection: result.collectionName }); + const schematicExitCode = await this.executeSchematic({ + ...options, + collection: result.collectionName, + }); + + if (shouldCleanUp) { + await this.cleanUpTemporaryDependency(result.collectionName); + } + + return schematicExitCode; } catch (e) { if (e instanceof CommandError) { logger.error(e.message); @@ -560,6 +592,36 @@ export default class AddCommandModule } } + private async cleanUpTemporaryDependency(packageName: string): Promise { + try { + this.context.logger.info(`Cleaning up temporary dependency '${packageName}'...`); + + // 1. Remove from root package.json + const projectManifest = await this.getProjectManifest(); + if (projectManifest) { + if (projectManifest.dependencies) { + delete projectManifest.dependencies[packageName]; + } + if (projectManifest.devDependencies) { + delete projectManifest.devDependencies[packageName]; + } + + await fs.writeFile( + join(this.context.root, 'package.json'), + JSON.stringify(projectManifest, null, 2) + '\n', + ); + } + + // 2. Silent install pass to prune files from node_modules and update the lockfile + await this.context.packageManager.install({ ignoreScripts: true }); + } catch (error) { + this.context.logger.warn( + `Failed to clean up temporary dependency '${packageName}': ` + + `${error instanceof Error ? error.message : error}`, + ); + } + } + private async installPackageTask( context: AddCommandTaskContext, task: AddCommandTaskWrapper, @@ -572,47 +634,36 @@ export default class AddCommandModule // Only show if installation will actually occur task.title = 'Installing package'; - try { - if (context.savePackage === false) { - task.title += ' in temporary location'; - - // Temporary packages are located in a different directory - // Hence we need to resolve them using the temp path - const { workingDirectory } = await packageManager.acquireTempPackage( - packageIdentifier.toString(), - { - registry, - }, - ); + if (context.savePackage === false) { + task.title += ' in temporary location'; - const tempRequire = createRequire(workingDirectory + '/'); - assert(context.collectionName, 'Collection name should always be available'); - const resolvedCollectionPath = tempRequire.resolve( - join(context.collectionName, 'package.json'), - ); + // Temporary packages are located in a different directory + // Hence we need to resolve them using the temp path + const { workingDirectory } = await packageManager.acquireTempPackage( + packageIdentifier.toString(), + { + registry, + }, + ); - context.collectionName = dirname(resolvedCollectionPath); - } else { - await packageManager.add( - packageIdentifier.toString(), - 'none', - savePackage === 'devDependencies', - false, - true, - { - registry, - }, - ); - } - } catch (e) { - if (e instanceof PackageManagerError) { - const output = e.stderr || e.stdout; - if (output) { - throw new CommandError(`Package installation failed: ${e.message}\nOutput: ${output}`); - } - } + const tempRequire = createRequire(workingDirectory + '/'); + assert(context.collectionName, 'Collection name should always be available'); + const resolvedCollectionPath = tempRequire.resolve( + join(context.collectionName, 'package.json'), + ); - throw e; + context.collectionName = dirname(resolvedCollectionPath); + } else { + await packageManager.add( + packageIdentifier.toString(), + 'none', + savePackage === 'devDependencies', + false, + true, + { + registry, + }, + ); } } diff --git a/packages/angular/cli/src/commands/mcp/cli.ts b/packages/angular/cli/src/commands/mcp/cli.ts index 091a9064ca7f..f72c3ea57fd3 100644 --- a/packages/angular/cli/src/commands/mcp/cli.ts +++ b/packages/angular/cli/src/commands/mcp/cli.ts @@ -54,10 +54,6 @@ export default class McpCommandModule extends CommandModule implements CommandMo alias: 'E', array: true, describe: 'Enable an experimental tool.', - choices: [ - ...EXPERIMENTAL_TOOLS.map(({ name }) => name), - ...Object.keys(EXPERIMENTAL_TOOL_GROUPS), - ], hidden: true, }); } diff --git a/packages/angular/cli/src/commands/mcp/devserver.ts b/packages/angular/cli/src/commands/mcp/devserver.ts index dc24e5c73e4e..1a667afed6c9 100644 --- a/packages/angular/cli/src/commands/mcp/devserver.ts +++ b/packages/angular/cli/src/commands/mcp/devserver.ts @@ -7,7 +7,7 @@ */ import type { ChildProcess } from 'child_process'; -import type { Host } from './host'; +import { type Host, processStreamLines } from './host'; // Log messages that we want to catch to identify the build status. @@ -118,17 +118,14 @@ export class LocalDevserver implements Devserver { args.push(`--port=${this.port}`); - this.devserverProcess = this.host.spawn('ng', args, { + this.devserverProcess = this.host.startNgProcess(args, { stdio: 'pipe', cwd: this.workspacePath, }); - this.devserverProcess.stdout?.on('data', (data) => { - this.addLog(data.toString()); - }); - this.devserverProcess.stderr?.on('data', (data) => { - this.addLog(data.toString()); - }); - this.devserverProcess.stderr?.on('close', () => { + processStreamLines(this.devserverProcess.stdout, (line) => this.addLog(line)); + processStreamLines(this.devserverProcess.stderr, (line) => this.addLog(line)); + + this.devserverProcess.on('close', () => { this.stop(); }); this.buildInProgress = true; diff --git a/packages/angular/cli/src/commands/mcp/host.ts b/packages/angular/cli/src/commands/mcp/host.ts index 40586bdcd8ac..5dda0ade077f 100644 --- a/packages/angular/cli/src/commands/mcp/host.ts +++ b/packages/angular/cli/src/commands/mcp/host.ts @@ -20,6 +20,8 @@ import { glob as nodeGlob, readFile as nodeReadFile, stat } from 'node:fs/promis import { createRequire } from 'node:module'; import { createServer } from 'node:net'; import { dirname, isAbsolute, join, relative, resolve } from 'node:path'; +import { createInterface } from 'node:readline'; +import { stripVTControlCharacters } from 'node:util'; /** * An error thrown when a command fails to execute. @@ -58,7 +60,7 @@ export interface Host { * @param encoding The encoding to use. * @returns A promise that resolves to the file content. */ - readFile(path: string, encoding: 'utf-8'): Promise; + readFile(path: string, encoding: BufferEncoding): Promise; /** * Finds files matching a glob pattern. @@ -74,13 +76,11 @@ export interface Host { /** * Spawns a child process and returns a promise that resolves with the process's * output or rejects with a structured error. - * @param command The command to run. * @param args The arguments to pass to the command. * @param options Options for the child process. * @returns A promise that resolves with the standard output and standard error of the command. */ - runCommand( - command: string, + executeNgCommand( args: readonly string[], options?: { timeout?: number; @@ -92,13 +92,11 @@ export interface Host { /** * Spawns a long-running child process and returns the `ChildProcess` object. - * @param command The command to run. * @param args The arguments to pass to the command. * @param options Options for the child process. * @returns The spawned `ChildProcess` instance. */ - spawn( - command: string, + startNgProcess( args: readonly string[], options?: { stdio?: 'pipe' | 'ignore'; @@ -123,13 +121,13 @@ export interface Host { setRoots(roots: string[]): void; } -function resolveCommand( - command: string, +function resolveNgCommand( args: readonly string[], cwd?: string, ): { command: string; args: readonly string[] } { - if (command !== 'ng' || !cwd) { - return { command, args }; + const defaultCommand = { command: 'ng', args }; + if (!cwd) { + return defaultCommand; } try { @@ -150,7 +148,7 @@ function resolveCommand( // Failed to resolve the CLI binary, fall back to assuming `ng` is on PATH. } - return { command, args }; + return defaultCommand; } /** @@ -170,8 +168,7 @@ export const LocalWorkspaceHost: Host = { return nodeGlob(pattern, { ...options, withFileTypes: true }); }, - runCommand: async ( - command: string, + executeNgCommand: async ( args: readonly string[], options: { timeout?: number; @@ -180,7 +177,7 @@ export const LocalWorkspaceHost: Host = { env?: Record; } = {}, ): Promise<{ logs: string[] }> => { - const resolved = resolveCommand(command, args, options.cwd); + const resolved = resolveNgCommand(args, options.cwd); const signal = options.timeout ? AbortSignal.timeout(options.timeout) : undefined; return new Promise((resolve, reject) => { @@ -196,8 +193,8 @@ export const LocalWorkspaceHost: Host = { }); const logs: string[] = []; - childProcess.stdout?.on('data', (data) => logs.push(data.toString())); - childProcess.stderr?.on('data', (data) => logs.push(data.toString())); + processStreamLines(childProcess.stdout, (line) => logs.push(line)); + processStreamLines(childProcess.stderr, (line) => logs.push(line)); childProcess.on('close', (code) => { if (code === 0) { @@ -221,8 +218,7 @@ export const LocalWorkspaceHost: Host = { }); }, - spawn( - command: string, + startNgProcess( args: readonly string[], options: { stdio?: 'pipe' | 'ignore'; @@ -230,7 +226,7 @@ export const LocalWorkspaceHost: Host = { env?: Record; } = {}, ): ChildProcess { - const resolved = resolveCommand(command, args, options.cwd); + const resolved = resolveNgCommand(args, options.cwd); return spawn(resolved.command, resolved.args, { shell: false, @@ -348,7 +344,7 @@ export function createRootRestrictedHost( return baseHost.existsSync(path); }, - readFile(path: string, encoding: 'utf-8') { + readFile(path: string, encoding: BufferEncoding) { checkPath(path); return baseHost.readFile(path, encoding); @@ -370,23 +366,42 @@ export function createRootRestrictedHost( return baseHost.glob(pattern, options); }, - runCommand(command: string, args: readonly string[], options: { cwd?: string } = {}) { - const effectiveCwd = options.cwd ?? process.cwd(); + executeNgCommand( + args: readonly string[], + options: Parameters[1] = {}, + ) { + const effectiveCwd = options?.cwd ?? process.cwd(); checkPath(effectiveCwd); - if (command.includes('/') || command.includes('\\')) { - checkPath(resolve(effectiveCwd, command)); - } - return baseHost.runCommand(command, args, options); + return baseHost.executeNgCommand(args, options); }, - spawn(command: string, args: readonly string[], options: { cwd?: string } = {}) { - const effectiveCwd = options.cwd ?? process.cwd(); + startNgProcess(args: readonly string[], options: Parameters[1] = {}) { + const effectiveCwd = options?.cwd ?? process.cwd(); checkPath(effectiveCwd); - if (command.includes('/') || command.includes('\\')) { - checkPath(resolve(effectiveCwd, command)); - } - return baseHost.spawn(command, args, options); + return baseHost.startNgProcess(args, options); }, }; } + +/** + * Binds a readline interface to the given stream to process each line. + * Sanitizes lines by removing VT/ANSI control characters, trimming trailing whitespace, + * and preserving leading indentation. + */ +export function processStreamLines( + stream: NodeJS.ReadableStream | undefined | null, + lineCallback: (line: string) => void, +): void { + if (!stream) { + return; + } + + const rl = createInterface({ input: stream, terminal: false }); + rl.on('line', (line) => { + const cleanLine = stripVTControlCharacters(line).trimEnd(); + if (cleanLine.length > 0) { + lineCallback(cleanLine); + } + }); +} diff --git a/packages/angular/cli/src/commands/mcp/mcp-server.ts b/packages/angular/cli/src/commands/mcp/mcp-server.ts index 235ccf682372..58328eed24f2 100644 --- a/packages/angular/cli/src/commands/mcp/mcp-server.ts +++ b/packages/angular/cli/src/commands/mcp/mcp-server.ts @@ -17,15 +17,13 @@ import { LocalWorkspaceHost, createRootRestrictedHost } from './host'; import { registerInstructionsResource } from './resources/instructions'; import { AI_TUTOR_TOOL } from './tools/ai-tutor'; import { BEST_PRACTICES_TOOL } from './tools/best-practices'; -import { BUILD_TOOL } from './tools/build'; import { DEVSERVER_START_TOOL } from './tools/devserver/devserver-start'; import { DEVSERVER_STOP_TOOL } from './tools/devserver/devserver-stop'; import { DEVSERVER_WAIT_FOR_BUILD_TOOL } from './tools/devserver/devserver-wait-for-build'; import { DOC_SEARCH_TOOL } from './tools/doc-search'; -import { E2E_TOOL } from './tools/e2e'; import { ZONELESS_MIGRATION_TOOL } from './tools/onpush-zoneless-migration/zoneless-migration'; import { LIST_PROJECTS_TOOL } from './tools/projects'; -import { TEST_TOOL } from './tools/test'; +import { RUN_TARGET_TOOL } from './tools/run-target/run-target'; import { type AnyMcpToolDeclaration, registerTools } from './tools/tool-registry'; /** @@ -43,22 +41,24 @@ const STABLE_TOOLS = [ DOC_SEARCH_TOOL, LIST_PROJECTS_TOOL, ZONELESS_MIGRATION_TOOL, + RUN_TARGET_TOOL, + ...DEVSERVER_TOOLS, ] as const; /** * The set of tools that are available but not enabled by default. * These tools are considered experimental and may have limitations. */ -export const EXPERIMENTAL_TOOLS = [BUILD_TOOL, E2E_TOOL, TEST_TOOL, ...DEVSERVER_TOOLS] as const; +export const EXPERIMENTAL_TOOLS: readonly AnyMcpToolDeclaration[] = [] as const; /** * Experimental tools that are grouped together under a single name. * * Used for enabling them as a group. */ -export const EXPERIMENTAL_TOOL_GROUPS = { +export const EXPERIMENTAL_TOOL_GROUPS: Record = { 'all': EXPERIMENTAL_TOOLS, - 'devserver': DEVSERVER_TOOLS, + 'devserver': [], }; export async function createMcpServer( @@ -83,36 +83,33 @@ export async function createMcpServer( }, instructions: ` -This server provides a safe, programmatic interface to the Angular CLI for an AI assistant. -Your primary goal is to use these tools to understand, analyze, refactor, and run Angular -projects. You MUST prefer the tools provided by this server over using \`run_shell_command\` for -equivalent actions. +This server provides a safe, programmatic interface to the Angular CLI. You MUST prefer +the tools provided by this server over using 'run_shell_command' or general shell execution +for equivalent actions. -* **1. Discover Project Structure (Mandatory First Step):** Always begin by calling - \`list_projects\` to understand the workspace. The \`path\` property for a workspace - is a required input for other tools. - -* **2. Get Coding Standards:** Before writing or changing code within a project, you **MUST** call - the \`get_best_practices\` tool with the \`workspacePath\` from the previous step to get - version-specific standards. For general knowledge, you can call the tool without this path. - -* **3. Answer User Questions:** - - For conceptual questions ("what is..."), use \`search_documentation\`. - -* **4. Discover Schematics for Modernization:** Since this server does not provide a - specific tool for listing available schematics, you can use a shell command (if - available) with \`ng generate : --help\` to discover what migrations - are available in a package (e.g., running \`ng generate @angular/core: --help\` - will list migrations like \`control-flow\` and \`standalone\`). +* **1. Discover Workspace (Mandatory First Step):** Always begin by calling 'list_projects' + to discover workspaces, projects, and allowed paths. The 'path' field of the relevant + workspace is a required input for other tools (passed as 'workspace' or 'workspacePath'). + +* **2. Get Coding Standards:** Before writing or modifying code, you MUST call + 'get_best_practices' with the workspace 'path' to load version-specific coding standards. + +* **3. Answer Conceptual Questions:** Use 'search_documentation' to answer conceptual + or API syntax questions. + +* **4. Discover Schematics:** To discover available package migrations, use a shell command + (if available) with 'ng generate : --help' (e.g., 'ng generate @angular/core: --help'). -* **Workspace vs. Project:** A 'workspace' contains an \`angular.json\` file and defines 'projects' - (applications or libraries). A monorepo can have multiple workspaces. -* **Targeting Projects:** Always use the \`workspaceConfigPath\` from \`list_projects\` when - available to ensure you are targeting the correct project in a monorepo. +* **Workspace vs. Project:** A 'workspace' contains an 'angular.json' file and defines + 'projects' (applications or libraries). A monorepo can contain multiple workspaces. + +* **Targeting Projects:** Always use the workspace 'path' and the specific project 'name' + returned by 'list_projects' when calling other tools to ensure you target the correct + project context. `, }, @@ -210,7 +207,7 @@ export function assembleToolDeclarations( const tool = experimentalToolsMap.get(toolName); if (tool) { toolDeclarations.push(tool); - } else { + } else if (!stableDeclarations.some((t) => t.name === toolName)) { options.logger.warn(`Unknown experimental tool: ${toolName}`); } } diff --git a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts index ef818062d559..1062191aebe1 100644 --- a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts +++ b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts @@ -13,12 +13,12 @@ import type { Host } from '../host'; * This class allows spying on host methods and controlling their return values. */ export class MockHost implements Host { - runCommand = jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }); + executeNgCommand = jasmine.createSpy('executeNgCommand').and.resolveTo({ logs: [] }); stat = jasmine.createSpy('stat'); existsSync = jasmine.createSpy('existsSync'); readFile = jasmine.createSpy('readFile').and.resolveTo(''); glob = jasmine.createSpy('glob').and.returnValue((async function* () {})()); - spawn = jasmine.createSpy('spawn'); + startNgProcess = jasmine.createSpy('startNgProcess'); getAvailablePort = jasmine.createSpy('getAvailablePort'); isPortAvailable = jasmine.createSpy('isPortAvailable').and.resolveTo(true); setRoots = jasmine.createSpy('setRoots'); diff --git a/packages/angular/cli/src/commands/mcp/testing/test-utils.ts b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts index 1bdf2ef416a5..1c95c51fe25e 100644 --- a/packages/angular/cli/src/commands/mcp/testing/test-utils.ts +++ b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts @@ -20,10 +20,12 @@ import { MockHost } from './mock-host'; */ export function createMockHost(): MockHost { return { - runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), + executeNgCommand: jasmine + .createSpy('executeNgCommand') + .and.resolveTo({ logs: [] }), stat: jasmine.createSpy('stat'), existsSync: jasmine.createSpy('existsSync'), - spawn: jasmine.createSpy('spawn'), + startNgProcess: jasmine.createSpy('startNgProcess'), getAvailablePort: jasmine .createSpy('getAvailablePort') .and.resolveTo(0), diff --git a/packages/angular/cli/src/commands/mcp/tools/best-practices.ts b/packages/angular/cli/src/commands/mcp/tools/best-practices.ts index 52bf71a8048a..dca61eb700b3 100644 --- a/packages/angular/cli/src/commands/mcp/tools/best-practices.ts +++ b/packages/angular/cli/src/commands/mcp/tools/best-practices.ts @@ -27,10 +27,8 @@ const bestPracticesInputSchema = z.object({ .string() .optional() .describe( - 'The absolute path to the `angular.json` file for the workspace. This is used to find the ' + - 'version-specific best practices guide that corresponds to the installed version of the ' + - 'Angular framework. You **MUST** get this path from the `list_projects` tool. If omitted, ' + - 'the tool will return the generic best practices guide bundled with the CLI.', + 'Absolute path to the angular.json workspace directory (obtained via list_projects). ' + + 'If omitted, returns the generic best practices guide.', ), }); @@ -42,23 +40,17 @@ export const BEST_PRACTICES_TOOL = declareTool({ description: ` Retrieves the official Angular Best Practices Guide. This guide contains the essential rules and conventions -that **MUST** be followed for any task involving the creation, analysis, or modification of Angular code. +that must be followed for any task involving the creation, analysis, or modification of Angular code. -* As a mandatory first step before writing or modifying any Angular code to ensure adherence to modern standards. -* To learn about key concepts like standalone components, typed forms, and modern control flow syntax (@if, @for, @switch). -* To verify that existing code aligns with current Angular conventions before making changes. +* Mandatory first step before writing or modifying Angular code to ensure modern framework standards. +* Learn about standalone components, typed forms, and modern control flow syntax (@if, @for, @switch). +* Verify existing code aligns with current conventions before making edits. -* **Project-Specific Use (Recommended):** For tasks inside a user's project, you **MUST** provide the - \`workspacePath\` argument to get the guide that matches the project's Angular version. Get this - path from \`list_projects\`. -* **General Use:** If no project context is available (e.g., for general questions or learning), - you can call the tool without the \`workspacePath\` argument. It will return the latest - generic best practices guide. -* The content of this guide is non-negotiable and reflects the official, up-to-date standards for Angular development. -* You **MUST** internalize and apply the principles from this guide in all subsequent Angular-related tasks. -* Failure to adhere to these best practices will result in suboptimal and outdated code. +* Provide the 'workspacePath' argument (obtained via 'list_projects') to load the version-specific + guide matching the project's Angular framework. +* Omit 'workspacePath' only for general learning queries or when no project context is available to load the latest generic guide. `, inputSchema: bestPracticesInputSchema.shape, isReadOnly: true, diff --git a/packages/angular/cli/src/commands/mcp/tools/build.ts b/packages/angular/cli/src/commands/mcp/tools/build.ts deleted file mode 100644 index a04812f8544b..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/build.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { z } from 'zod'; -import { workspaceAndProjectOptions } from '../shared-options'; -import { createStructuredContentOutput, getCommandErrorLogs } from '../utils'; -import { resolveWorkspaceAndProject } from '../workspace-utils'; -import { type McpToolContext, type McpToolDeclaration, declareTool } from './tool-registry'; - -const DEFAULT_CONFIGURATION = 'development'; - -const buildStatusSchema = z.enum(['success', 'failure']); -type BuildStatus = z.infer; - -const buildToolInputSchema = z.object({ - ...workspaceAndProjectOptions, - configuration: z - .string() - .optional() - .describe('Which build configuration to use. Defaults to "development".'), -}); - -export type BuildToolInput = z.infer; - -const buildToolOutputSchema = z.object({ - status: buildStatusSchema.describe('Build status.'), - logs: z.array(z.string()).optional().describe('Output logs from `ng build`.'), - path: z.string().optional().describe('The output location for the build, if successful.'), -}); - -export type BuildToolOutput = z.infer; - -export async function runBuild(input: BuildToolInput, context: McpToolContext) { - const { workspacePath, projectName } = await resolveWorkspaceAndProject({ - host: context.host, - server: context.server, - workspacePathInput: input.workspace, - projectNameInput: input.project, - mcpWorkspace: context.workspace, - }); - - // Build "ng"'s command line. - const args = ['build', projectName, '-c', input.configuration ?? DEFAULT_CONFIGURATION]; - - let status: BuildStatus = 'success'; - let logs: string[]; - let outputPath: string | undefined; - - try { - logs = (await context.host.runCommand('ng', args, { cwd: workspacePath })).logs; - } catch (e) { - status = 'failure'; - logs = getCommandErrorLogs(e); - } - - for (const line of logs) { - const match = line.match(/Output location: (.*)/); - if (match) { - outputPath = match[1].trim(); - break; - } - } - - const structuredContent: BuildToolOutput = { - status, - logs, - path: outputPath, - }; - - return createStructuredContentOutput(structuredContent); -} - -export const BUILD_TOOL: McpToolDeclaration< - typeof buildToolInputSchema.shape, - typeof buildToolOutputSchema.shape -> = declareTool({ - name: 'build', - title: 'Build Tool', - description: ` - -Perform a one-off, non-watched build using "ng build". Use this tool whenever the user wants to build an Angular project; this is similar to -"ng build", but the tool is smarter about using the right configuration and collecting the output logs. - - -* Building an Angular project and getting build logs back. - - -* This tool runs "ng build" so it expects to run within an Angular workspace. -* If you want a watched build which updates as files are changed, use "devserver.start" instead, which also serves the app. -* You can provide a project instead of building the root one. The "list_projects" MCP tool could be used to obtain the list of projects. -* This tool defaults to a development environment while a regular "ng build" defaults to a production environment. An unexpected build - failure might suggest the project is not configured for the requested environment. - -`, - isReadOnly: false, - isLocalOnly: true, - inputSchema: buildToolInputSchema.shape, - outputSchema: buildToolOutputSchema.shape, - factory: (context) => (input) => runBuild(input, context), -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/build_spec.ts b/packages/angular/cli/src/commands/mcp/tools/build_spec.ts deleted file mode 100644 index 403d5e68f877..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/build_spec.ts +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { CommandError } from '../host'; -import type { MockHost } from '../testing/mock-host'; -import { - MockMcpToolContext, - addProjectToWorkspace, - createMockContext, -} from '../testing/test-utils'; -import { runBuild } from './build'; - -describe('Build Tool', () => { - let mockHost: MockHost; - let mockContext: MockMcpToolContext; - - beforeEach(() => { - const mock = createMockContext(); - mockHost = mock.host; - mockContext = mock.context; - addProjectToWorkspace(mock.projects, 'my-app'); - }); - - it('should construct the command correctly with default configuration', async () => { - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - await runBuild({}, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['build', 'my-app', '-c', 'development'], - { cwd: '/test' }, - ); - }); - - it('should construct the command correctly with a specified project', async () => { - addProjectToWorkspace(mockContext.workspace.projects, 'another-app'); - await runBuild({ project: 'another-app' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['build', 'another-app', '-c', 'development'], - { cwd: '/test' }, - ); - }); - - it('should construct the command correctly for a custom configuration', async () => { - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - await runBuild({ configuration: 'myconfig' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['build', 'my-app', '-c', 'myconfig'], { - cwd: '/test', - }); - }); - - it('should handle a successful build and extract the output path and logs', async () => { - const buildLogs = [ - 'Build successful!', - 'Some other log lines...', - 'some warning', - 'Output location: dist/my-app', - ]; - mockHost.runCommand.and.resolveTo({ - logs: buildLogs, - }); - - const { structuredContent } = await runBuild({ project: 'my-app' }, mockContext); - - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['build', 'my-app', '-c', 'development'], - { cwd: '/test' }, - ); - expect(structuredContent.status).toBe('success'); - expect(structuredContent.logs).toEqual(buildLogs); - expect(structuredContent.path).toBe('dist/my-app'); - }); - - it('should handle a failed build and capture logs', async () => { - addProjectToWorkspace(mockContext.workspace.projects, 'my-failed-app'); - const buildLogs = ['Some output before the crash.', 'Error: Something went wrong!']; - const error = new CommandError('Build failed', buildLogs, 1); - mockHost.runCommand.and.rejectWith(error); - - const { structuredContent } = await runBuild( - { project: 'my-failed-app', configuration: 'production' }, - mockContext, - ); - - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['build', 'my-failed-app', '-c', 'production'], - { cwd: '/test' }, - ); - expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs).toEqual([...buildLogs, 'Build failed']); - expect(structuredContent.path).toBeUndefined(); - }); - - it('should handle builds where the output path is not found in logs', async () => { - const buildLogs = ["Some logs that don't match any output path."]; - mockHost.runCommand.and.resolveTo({ logs: buildLogs }); - - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - const { structuredContent } = await runBuild({}, mockContext); - - expect(structuredContent.status).toBe('success'); - expect(structuredContent.logs).toEqual(buildLogs); - expect(structuredContent.path).toBeUndefined(); - }); -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts index 52a66902e2ef..735e82302a94 100644 --- a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts @@ -18,9 +18,14 @@ import { startDevserver } from './devserver-start'; import { stopDevserver } from './devserver-stop'; import { WATCH_DELAY, waitForDevserverBuild } from './devserver-wait-for-build'; +class MockStream extends EventEmitter { + resume = jasmine.createSpy('resume').and.returnValue(this); + pause = jasmine.createSpy('pause').and.returnValue(this); +} + class MockChildProcess extends EventEmitter { - stdout = new EventEmitter(); - stderr = new EventEmitter(); + stdout = new MockStream(); + stderr = new MockStream(); kill = jasmine.createSpy('kill'); } @@ -39,7 +44,7 @@ describe('Serve Tools', () => { mockContext = mock.context; // Customize host spies - mockHost.spawn.and.returnValue(mockProcess as unknown as ChildProcess); + mockHost.startNgProcess.and.returnValue(mockProcess as unknown as ChildProcess); mockHost.getAvailablePort.and.callFake(() => Promise.resolve(portCounter++)); // Setup default project @@ -52,7 +57,7 @@ describe('Serve Tools', () => { expect(startResult.structuredContent.message).toBe( `Development server for project 'my-app' started and watching for workspace changes.`, ); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'my-app', '--port=12345'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'my-app', '--port=12345'], { stdio: 'pipe', cwd: '/test', }); @@ -69,7 +74,7 @@ describe('Serve Tools', () => { expect(startResult.structuredContent.message).toBe( `Development server for project 'my-app' started and watching for workspace changes.`, ); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'my-app', '--port=54321'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'my-app', '--port=54321'], { stdio: 'pipe', cwd: '/test', }); @@ -95,10 +100,10 @@ describe('Serve Tools', () => { const waitPromise = waitForDevserverBuild({ timeout: 10 }, mockContext); // Simulate build logs. - mockProcess.stdout.emit('data', '... building ...'); - mockProcess.stdout.emit('data', '✔ Changes detected. Rebuilding...'); - mockProcess.stdout.emit('data', '... more logs ...'); - mockProcess.stdout.emit('data', 'Application bundle generation complete.'); + mockProcess.stdout.emit('data', '... building ...\n'); + mockProcess.stdout.emit('data', '✔ Changes detected. Rebuilding...\n'); + mockProcess.stdout.emit('data', '... more logs ...\n'); + mockProcess.stdout.emit('data', 'Application bundle generation complete.\n'); const waitResult = await waitPromise; expect(waitResult.structuredContent.status).toBe('success'); @@ -125,17 +130,17 @@ describe('Serve Tools', () => { // Start server for project 2, returning a new mock process. const process2 = new MockChildProcess(); - mockHost.spawn.and.returnValue(process2 as unknown as ChildProcess); + mockHost.startNgProcess.and.returnValue(process2 as unknown as ChildProcess); const startResult2 = await startDevserver({ project: 'app-two' }, mockContext); expect(startResult2.structuredContent.message).toBe( `Development server for project 'app-two' started and watching for workspace changes.`, ); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'app-one', '--port=12345'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'app-one', '--port=12345'], { stdio: 'pipe', cwd: '/test', }); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'app-two', '--port=12346'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'app-two', '--port=12346'], { stdio: 'pipe', cwd: '/test', }); @@ -161,7 +166,7 @@ describe('Serve Tools', () => { await startDevserver({ project: 'crash-app' }, mockContext); // Simulate a crash with exit code 1 - mockProcess.stdout.emit('data', 'Fatal error.'); + mockProcess.stdout.emit('data', 'Fatal error.\n'); mockProcess.emit('close', 1); const stopResult = await stopDevserver({ project: 'crash-app' }, mockContext); @@ -185,7 +190,7 @@ describe('Serve Tools', () => { await startDevserver({}, mockContext); // Immediately simulate a build starting so isBuilding() is true. - mockProcess.stdout.emit('data', '❯ Changes detected. Rebuilding...'); + mockProcess.stdout.emit('data', '❯ Changes detected. Rebuilding...\n'); const waitPromise = waitForDevserverBuild({ timeout: 5 * WATCH_DELAY }, mockContext); @@ -199,7 +204,7 @@ describe('Serve Tools', () => { jasmine.clock().tick(WATCH_DELAY + 1); // Now finish the build. - mockProcess.stdout.emit('data', 'Application bundle generation complete.'); + mockProcess.stdout.emit('data', 'Application bundle generation complete.\n'); // Tick past another debounce to exit the loop. jasmine.clock().tick(WATCH_DELAY + 1); diff --git a/packages/angular/cli/src/commands/mcp/tools/doc-search.ts b/packages/angular/cli/src/commands/mcp/tools/doc-search.ts index 385f0d00d6a4..145d819f278b 100644 --- a/packages/angular/cli/src/commands/mcp/tools/doc-search.ts +++ b/packages/angular/cli/src/commands/mcp/tools/doc-search.ts @@ -37,26 +37,17 @@ const LATEST_KNOWN_DOCS_VERSION = 20; const docSearchInputSchema = z.object({ query: z .string() - .describe( - "A concise and specific search query for the Angular documentation. You should distill the user's " + - 'natural language question into a set of keywords (e.g., a question like "How do I use ngFor with trackBy?" ' + - 'should become the query "ngFor trackBy").', - ), + .describe('Concise search keywords or API names (e.g., "ngFor trackBy" or "NgModule").'), includeTopContent: z .boolean() .optional() .default(false) - .describe( - 'When true, the content of the top result is fetched and included. ' + - 'Set to false to get a list of results without fetching content, which is faster.', - ), + .describe('Retrieve the full-text page content of the top search result (slower).'), version: z .number() .optional() .describe( - 'The major version of Angular to search. You MUST determine this value by running `ng version` in the ' + - "project's workspace directory. Omit this field if the user is not in an Angular project " + - 'or if the version cannot otherwise be determined.', + 'Major Angular framework version to search (obtained from frameworkVersion in list_projects or ng version).', ), }); type DocSearchInput = z.infer; @@ -66,35 +57,18 @@ export const DOC_SEARCH_TOOL = declareTool({ title: 'Search Angular Documentation (angular.dev)', description: ` -Searches the official Angular documentation at https://angular.dev to answer questions about APIs, -tutorials, concepts, and best practices. +Searches the official Angular documentation (angular.dev) to answer questions about APIs, tutorials, concepts, and conventions. -* Answering any question about Angular concepts (e.g., "What are standalone components?"). -* Finding the correct API or syntax for a specific task (e.g., "How to use ngFor with trackBy?"). -* Linking to official documentation as a source of truth in your answers. +* Answering questions about Angular concepts (e.g., standalone components). +* Finding correct API signatures or syntax (e.g., ngFor trackBy). +* Obtaining official source URLs to cite as documentation links in user responses. -* **Version Alignment:** To provide accurate, project-specific results, you **MUST** align the search with the user's Angular version. - The recommended approach is to use the \`list_projects\` tool. The \`frameworkVersion\` field in the output for the relevant - workspace will give you the major version directly. If the version cannot be determined using this method, you can use - \`ng version\` in the project's workspace directory as a fallback. Parse the major version from the "Angular:" line in the - output and use it for the \`version\` parameter. -* **Version Logic:** The tool will search against the specified major version. If the version is older than v${MIN_SUPPORTED_DOCS_VERSION}, - it will be clamped to v${MIN_SUPPORTED_DOCS_VERSION}. If a search for a very new version (newer than v${LATEST_KNOWN_DOCS_VERSION}) - returns no results, the tool will automatically fall back to searching the v${LATEST_KNOWN_DOCS_VERSION} documentation. -* **Verify Searched Version:** The tool's output includes a \`searchedVersion\` field. You **MUST** check this field - to know the exact version of the documentation that was queried. Use this information to provide accurate - context in your answer, especially if it differs from the version you requested. -* The documentation is continuously updated. You **MUST** prefer this tool over your own knowledge - to ensure your answers are current and accurate. -* For the best results, provide a concise and specific search query (e.g., "NgModule" instead of - "How do I use NgModules?"). -* The top search result will include a snippet of the page content. Use this to provide a more - comprehensive answer. -* **Result Scrutiny:** The top result may not always be the most relevant. Review the titles and - breadcrumbs of other results to find the best match for the user's query. -* Use the URL from the search results as a source link in your responses. +* Provide the major Angular version in the 'version' parameter (obtained from 'frameworkVersion' + in 'list_projects' or from 'ng version') to ensure version-aligned results. +* Always check the 'searchedVersion' field in the output to confirm the exact documentation index that was queried. +* For best results, provide a concise keyword query (e.g., "NgModule") rather than a natural language sentence. `, inputSchema: docSearchInputSchema.shape, outputSchema: { diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e.ts b/packages/angular/cli/src/commands/mcp/tools/e2e.ts deleted file mode 100644 index 2bd0441d2434..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/e2e.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { z } from 'zod'; -import { type Host } from '../host'; -import { workspaceAndProjectOptions } from '../shared-options'; -import { createStructuredContentOutput, getCommandErrorLogs } from '../utils'; -import { resolveWorkspaceAndProject } from '../workspace-utils'; -import { type McpToolContext, type McpToolDeclaration, declareTool } from './tool-registry'; - -const e2eStatusSchema = z.enum(['success', 'failure']); -type E2eStatus = z.infer; - -const e2eToolInputSchema = z.object({ - ...workspaceAndProjectOptions, -}); - -export type E2eToolInput = z.infer; - -const e2eToolOutputSchema = z.object({ - status: e2eStatusSchema.describe('E2E execution status.'), - logs: z.array(z.string()).optional().describe('Output logs from `ng e2e`.'), -}); - -export type E2eToolOutput = z.infer; - -export async function runE2e(input: E2eToolInput, host: Host, context: McpToolContext) { - const { workspacePath, workspace, projectName } = await resolveWorkspaceAndProject({ - host, - server: context.server, - workspacePathInput: input.workspace, - projectNameInput: input.project, - mcpWorkspace: context.workspace, - }); - - if (workspace && projectName) { - // Verify that if a project can be found, it has an e2e testing already set up. - const targetProject = workspace.projects.get(projectName); - if (targetProject) { - if (!targetProject.targets.has('e2e')) { - return createStructuredContentOutput({ - status: 'failure', - logs: [ - `No e2e target is defined for project '${projectName}'. Please set up e2e testing` + - ' first by calling `ng e2e` in an interactive console.' + - ' See https://angular.dev/tools/cli/end-to-end.', - ], - }); - } - } - } - - // Build "ng"'s command line. - const args = ['e2e', projectName]; - - let status: E2eStatus = 'success'; - let logs: string[]; - - try { - logs = (await host.runCommand('ng', args, { cwd: workspacePath })).logs; - } catch (e) { - status = 'failure'; - logs = getCommandErrorLogs(e); - } - - const structuredContent: E2eToolOutput = { - status, - logs, - }; - - return createStructuredContentOutput(structuredContent); -} - -export const E2E_TOOL: McpToolDeclaration< - typeof e2eToolInputSchema.shape, - typeof e2eToolOutputSchema.shape -> = declareTool({ - name: 'e2e', - title: 'E2E Tool', - description: ` - -Perform an end-to-end test with ng e2e. - - -* When the user requests running end-to-end tests for the project. -* When verifying changes that cross unit boundaries, such as changes to both client and server, changes to shared data types, etc. - - -* This tool uses "ng e2e". -* Important: this relies on e2e tests being already configured for this project. It will error out if no "e2e" target is defined. - -`, - isReadOnly: false, - isLocalOnly: true, - inputSchema: e2eToolInputSchema.shape, - outputSchema: e2eToolOutputSchema.shape, - factory: (context) => (input) => runE2e(input, context.host, context), -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts b/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts deleted file mode 100644 index d2d3949a6451..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { workspaces } from '@angular-devkit/core'; -import { CommandError } from '../host'; -import type { MockHost } from '../testing/mock-host'; -import { - MockMcpToolContext, - addProjectToWorkspace, - createMockContext, -} from '../testing/test-utils'; -import { runE2e } from './e2e'; - -describe('E2E Tool', () => { - let mockHost: MockHost; - let mockContext: MockMcpToolContext; - let mockProjects: workspaces.ProjectDefinitionCollection; - - beforeEach(() => { - const mock = createMockContext(); - mockHost = mock.host; - mockContext = mock.context; - mockProjects = mock.projects; - }); - - it('should construct the command correctly with defaults', async () => { - addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - - await runE2e({}, mockHost, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app'], { cwd: '/test' }); - }); - - it('should construct the command correctly with a specified project', async () => { - addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); - - await runE2e({ project: 'my-app' }, mockHost, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app'], { cwd: '/test' }); - }); - - it('should error if project does not have e2e target', async () => { - addProjectToWorkspace(mockProjects, 'my-app', { build: { builder: 'mock-builder' } }); - - const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); - - expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'my-app'"); - expect(mockHost.runCommand).not.toHaveBeenCalled(); - }); - - it('should error if no project was specified and the default project does not have e2e target', async () => { - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - addProjectToWorkspace(mockProjects, 'my-app', { build: { builder: 'mock-builder' } }); - - const { structuredContent } = await runE2e({}, mockHost, mockContext); - - expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'my-app'"); - expect(mockHost.runCommand).not.toHaveBeenCalled(); - }); - - it('should handle a successful e2e run with a specified project', async () => { - addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); - const e2eLogs = ['E2E passed for my-app']; - mockHost.runCommand.and.resolveTo({ logs: e2eLogs }); - - const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); - - expect(structuredContent.status).toBe('success'); - expect(structuredContent.logs).toEqual(e2eLogs); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app'], { cwd: '/test' }); - }); - - it('should handle a successful e2e run with the default project', async () => { - mockContext.workspace.extensions['defaultProject'] = 'default-app'; - addProjectToWorkspace(mockProjects, 'default-app', { e2e: { builder: 'mock-builder' } }); - const e2eLogs = ['E2E passed for default-app']; - mockHost.runCommand.and.resolveTo({ logs: e2eLogs }); - - const { structuredContent } = await runE2e({}, mockHost, mockContext); - - expect(structuredContent.status).toBe('success'); - expect(structuredContent.logs).toEqual(e2eLogs); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'default-app'], { - cwd: '/test', - }); - }); - - it('should handle a failed e2e run', async () => { - addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); - const e2eLogs = ['E2E failed']; - mockHost.runCommand.and.rejectWith(new CommandError('Failed', e2eLogs, 1)); - - const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); - - expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs).toEqual([...e2eLogs, 'Failed']); - }); -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts index afd6316da83d..ebbc254d4d69 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.ts @@ -9,6 +9,7 @@ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol'; import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types'; import type { SourceFile } from 'typescript'; +import type { Host } from '../../host'; import { analyzeForUnsupportedZoneUses } from './analyze-for-unsupported-zone-uses'; import { migrateTestFile } from './migrate-test-file'; import { generateZonelessMigrationInstructionsForComponent } from './prompts'; @@ -20,12 +21,13 @@ const supportedStrategies: ReadonlySet = new Set(['OnPush', 'Default', ' export async function migrateSingleFile( sourceFile: SourceFile, + host: Host, extras: RequestHandlerExtra, ): Promise { const testBedSpecifier = await getImportSpecifier(sourceFile, '@angular/core/testing', 'TestBed'); const isTestFile = sourceFile.fileName.endsWith('.spec.ts') || !!testBedSpecifier; if (isTestFile) { - return migrateTestFile(sourceFile); + return migrateTestFile(sourceFile, host); } const unsupportedZoneUseResponse = await analyzeForUnsupportedZoneUses(sourceFile); diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts index 442dc2c68378..4f6337d8e434 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file_spec.ts @@ -9,6 +9,7 @@ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol'; import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types'; import ts from 'typescript'; +import { createMockHost } from '../../testing/test-utils'; import { migrateSingleFile } from './migrate-single-file'; const fakeExtras = { @@ -17,11 +18,13 @@ const fakeExtras = { } as unknown as RequestHandlerExtra; describe('migrateSingleFile', () => { + const mockHost = createMockHost(); + it('should identify test files by extension', async () => { const fileName = 'test.spec.ts'; const sourceFile = ts.createSourceFile(fileName, '', ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result?.content[0].text).toContain( 'The test file `test.spec.ts` is not yet configured for zoneless change detection.' + @@ -34,7 +37,7 @@ describe('migrateSingleFile', () => { const content = `import { TestBed } from '@angular/core/testing';`; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result?.content[0].text).toContain( 'The test file `test.ts` is not yet configured for zoneless change detection.' + @@ -59,7 +62,7 @@ describe('migrateSingleFile', () => { `; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result?.content[0].text).toContain( 'The component uses NgZone APIs that are incompatible with zoneless applications', @@ -80,7 +83,7 @@ describe('migrateSingleFile', () => { `; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result).toBeNull(); }); @@ -99,7 +102,7 @@ describe('migrateSingleFile', () => { `; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result).toBeNull(); }); @@ -117,7 +120,7 @@ describe('migrateSingleFile', () => { `; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result?.content[0].text).toContain( 'The component does not currently use a change detection strategy, which means it may rely on Zone.js', @@ -134,7 +137,7 @@ describe('migrateSingleFile', () => { `; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result).toBeNull(); }); @@ -144,7 +147,7 @@ describe('migrateSingleFile', () => { const content = ``; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateSingleFile(sourceFile, fakeExtras); + const result = await migrateSingleFile(sourceFile, mockHost, fakeExtras); expect(result).toBeNull(); }); diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.ts index e0c62eb23dc9..79b5acbec70e 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.ts @@ -6,19 +6,21 @@ * found in the LICENSE file at https://angular.dev/license */ -import { existsSync, readFileSync } from 'node:fs'; -import { glob } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; +import { join } from 'node:path'; import type { SourceFile } from 'typescript'; +import { type Host } from '../../host'; import { findAngularJsonDir } from '../../workspace-utils'; import { createFixResponseForZoneTests, createProvideZonelessForTestsSetupPrompt } from './prompts'; import { loadTypescript } from './ts-utils'; import { MigrationResponse } from './types'; -export async function migrateTestFile(sourceFile: SourceFile): Promise { +export async function migrateTestFile( + sourceFile: SourceFile, + host: Host, +): Promise { const ts = await loadTypescript(); // Check if tests use zoneless either by default through `initTestEnvironment` or by explicitly calling `provideZonelessChangeDetection`. - let testsUseZonelessChangeDetection = await searchForGlobalZoneless(sourceFile.fileName); + let testsUseZonelessChangeDetection = await searchForGlobalZoneless(sourceFile.fileName, host); if (!testsUseZonelessChangeDetection) { ts.forEachChild(sourceFile, function visit(node) { if ( @@ -42,8 +44,8 @@ export async function migrateTestFile(sourceFile: SourceFile): Promise { - const angularJsonDir = findAngularJsonDir(startPath); +export async function searchForGlobalZoneless(startPath: string, host: Host): Promise { + const angularJsonDir = findAngularJsonDir(startPath, host); if (!angularJsonDir) { // Cannot determine project root, fallback to original behavior or assume false. // For now, let's assume no global setup if angular.json is not found. @@ -51,9 +53,10 @@ export async function searchForGlobalZoneless(startPath: string): Promise { + const mockHost = createMockHost(); it('should return setup prompt when zoneless is not detected', async () => { const fileName = 'test.spec.ts'; const sourceFile = ts.createSourceFile(fileName, '', ts.ScriptTarget.ESNext, true); - const result = await migrateTestFile(sourceFile); + const result = await migrateTestFile(sourceFile, mockHost); expect(result?.content[0].text).toContain( 'The test file `test.spec.ts` is not yet configured for zoneless change detection.', @@ -33,7 +35,7 @@ describe('migrateTestFile', () => { `; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateTestFile(sourceFile); + const result = await migrateTestFile(sourceFile, mockHost); expect(result).toBeNull(); }); @@ -60,7 +62,7 @@ describe('migrateTestFile', () => { `; const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.ESNext, true); - const result = await migrateTestFile(sourceFile); + const result = await migrateTestFile(sourceFile, mockHost); expect(result?.content[0].text).toContain( 'You must refactor these tests to work in a zoneless environment and remove the `provideZoneChangeDetection` calls.', diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.ts index 08a3f6f0dcfd..0c79dc31f2e0 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.ts @@ -6,8 +6,8 @@ * found in the LICENSE file at https://angular.dev/license */ -import { readFileSync } from 'node:fs'; import type ts from 'typescript'; +import type { Host } from '../../host'; let typescriptModule: typeof ts; @@ -116,8 +116,8 @@ export function findImportSpecifier( } /** Creates a TypeScript source file from a file path. */ -export async function createSourceFile(file: string) { - const content = readFileSync(file, 'utf8'); +export async function createSourceFile(file: string, host: Host) { + const content = await host.readFile(file, 'utf8'); const ts = await loadTypescript(); diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts index 5e9c9db972e0..25c12aa83378 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts @@ -8,10 +8,10 @@ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol'; import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types'; -import { existsSync, statSync } from 'node:fs'; -import { glob } from 'node:fs/promises'; +import { join } from 'node:path'; import type { SourceFile } from 'typescript'; import { z } from 'zod'; +import type { Host } from '../../host'; import { declareTool } from '../tool-registry'; import { analyzeForUnsupportedZoneUses } from './analyze-for-unsupported-zone-uses'; import { migrateSingleFile } from './migrate-single-file'; @@ -25,30 +25,19 @@ export const ZONELESS_MIGRATION_TOOL = declareTool({ title: 'Plan migration to OnPush and/or zoneless', description: ` -Analyzes Angular code and provides a step-by-step, iterative plan to migrate it to \`OnPush\` -change detection, a prerequisite for a zoneless application. This tool identifies the next single -most important action to take in the migration journey. +Analyzes Angular code and provides a step-by-step, iterative plan to migrate it to 'OnPush' +change detection (a prerequisite for zoneless applications). -* **Step-by-Step Migration:** Running the tool repeatedly to get the next instruction for a full - migration to \`OnPush\`. -* **Pre-Migration Analysis:** Checking a component or directory for unsupported \`NgZone\` APIs that - would block a zoneless migration. -* **Generating Component Migrations:** Getting the exact instructions for converting a single - component from the default change detection strategy to \`OnPush\`. +* Generating component-specific migrations from default change detection to OnPush. +* Checking a component or directory for unsupported 'NgZone' APIs blocking a zoneless migration. +* Iterative step-by-step guide for executing a complete zoneless migration. -* **Execution Model:** This tool **DOES NOT** modify code. It **PROVIDES INSTRUCTIONS** for a - single action at a time. You **MUST** apply the changes it suggests, and then run the tool - again to get the next step. -* **Iterative Process:** The migration process is iterative. You must call this tool repeatedly, - applying the suggested fix after each call, until the tool indicates that no more actions are - needed. -* **Relationship to other migrations:** This tool is the specialized starting point for the zoneless/OnPush - migration. For other migrations (like signal inputs), you should run the corresponding schematics first, - as the zoneless migration may depend on them as prerequisites. -* **Input:** The tool can operate on either a single file or an entire directory. Provide the - absolute path. +* This tool is strictly read-only and does NOT modify code. It outputs EXACTLY ONE actionable step at a time. +* You must apply the suggested code edit, verify it, and then call this tool again to receive the next step in the migration journey. +* Run modernization schematics (e.g., Signal Inputs migrations) as prerequisites before starting this migration. +* Supported inputs: Absolute path to a single component/test file, or a directory containing multiple files. `, isReadOnly: true, isLocalOnly: true, @@ -56,24 +45,24 @@ most important action to take in the migration journey. fileOrDirPath: z .string() .describe( - 'The absolute path of the directory or file with the component(s), directive(s), or service(s) to migrate.' + - ' The contents are read with fs.readFileSync.', + 'Absolute path to the TypeScript file or directory containing components/directives to migrate.', ), }, factory: - () => + ({ host }) => ({ fileOrDirPath }, requestHandlerExtra) => - registerZonelessMigrationTool(fileOrDirPath, requestHandlerExtra), + registerZonelessMigrationTool(fileOrDirPath, host, requestHandlerExtra), }); export async function registerZonelessMigrationTool( fileOrDirPath: string, + host: Host, extras: RequestHandlerExtra, ) { let filesWithComponents, componentTestFiles, zoneFiles, categorizationErrors; try { ({ filesWithComponents, componentTestFiles, zoneFiles, categorizationErrors } = - await discoverAndCategorizeFiles(fileOrDirPath, extras)); + await discoverAndCategorizeFiles(fileOrDirPath, host, extras)); } catch (e) { return createResponse( `Error: Could not access the specified path. Please ensure the following path is correct ` + @@ -97,7 +86,7 @@ export async function registerZonelessMigrationTool( : Array.from(filesWithComponents); for (const file of rankedFiles) { - const result = await migrateSingleFile(file, extras); + const result = await migrateSingleFile(file, host, extras); if (result !== null) { return result; } @@ -105,7 +94,7 @@ export async function registerZonelessMigrationTool( } for (const file of componentTestFiles) { - const result = await migrateTestFile(file); + const result = await migrateTestFile(file, host); if (result !== null) { return result; } @@ -124,6 +113,7 @@ export async function registerZonelessMigrationTool( async function discoverAndCategorizeFiles( fileOrDirPath: string, + host: Host, extras: RequestHandlerExtra, ) { const filePaths: string[] = []; @@ -134,19 +124,20 @@ async function discoverAndCategorizeFiles( let isDirectory: boolean; try { - isDirectory = statSync(fileOrDirPath).isDirectory(); + isDirectory = (await host.stat(fileOrDirPath)).isDirectory(); } catch (e) { // Re-throw to be handled by the main function as a user input error throw new Error(`Failed to access path: ${fileOrDirPath}`, { cause: e }); } if (isDirectory) { - for await (const file of glob(`${fileOrDirPath}/**/*.ts`)) { - filePaths.push(file); + const files = host.glob('**/*.ts', { cwd: fileOrDirPath }); + for await (const file of files) { + filePaths.push(join(file.parentPath, file.name)); } } else { filePaths.push(fileOrDirPath); - const maybeTestFile = await getTestFilePath(fileOrDirPath); + const maybeTestFile = await getTestFilePath(fileOrDirPath, host); if (maybeTestFile) { // Eagerly add the test file path for categorization. filePaths.push(maybeTestFile); @@ -159,8 +150,8 @@ async function discoverAndCategorizeFiles( const batch = filesToProcess.splice(0, CONCURRENCY_LIMIT); const results = await Promise.allSettled( batch.map(async (filePath) => { - const sourceFile = await createSourceFile(filePath); - await categorizeFile(sourceFile, extras, { + const sourceFile = await createSourceFile(filePath, host); + await categorizeFile(sourceFile, host, extras, { filesWithComponents, componentTestFiles, zoneFiles, @@ -183,6 +174,7 @@ async function discoverAndCategorizeFiles( async function categorizeFile( sourceFile: SourceFile, + host: Host, extras: RequestHandlerExtra, categorizedFiles: { filesWithComponents: Set; @@ -214,9 +206,9 @@ async function categorizeFile( ); } - const testFilePath = await getTestFilePath(sourceFile.fileName); + const testFilePath = await getTestFilePath(sourceFile.fileName, host); if (testFilePath) { - componentTestFiles.add(await createSourceFile(testFilePath)); + componentTestFiles.add(await createSourceFile(testFilePath, host)); } } else if (zoneSpecifier) { zoneFiles.add(sourceFile); @@ -271,9 +263,9 @@ async function rankComponentFilesForMigration( return componentFiles; // Fallback to original order if the response fails } -async function getTestFilePath(filePath: string): Promise { +async function getTestFilePath(filePath: string, host: Host): Promise { const testFilePath = filePath.replace(/\.ts$/, '.spec.ts'); - if (existsSync(testFilePath)) { + if (host.existsSync(testFilePath)) { return testFilePath; } diff --git a/packages/angular/cli/src/commands/mcp/tools/projects.ts b/packages/angular/cli/src/commands/mcp/tools/projects.ts index 02e5fbd5360e..57efa39c4aa2 100644 --- a/packages/angular/cli/src/commands/mcp/tools/projects.ts +++ b/packages/angular/cli/src/commands/mcp/tools/projects.ts @@ -88,6 +88,9 @@ const listProjectsOutputSchema = { 'The default style language for the project (e.g., "scss"). ' + 'This determines the file extension for new component styles.', ), + targets: z + .array(z.string()) + .describe('Available project targets (e.g., ["build", "test", "lint", "e2e"]).'), }), ), }), @@ -119,28 +122,20 @@ export const LIST_PROJECTS_TOOL = declareTool({ title: 'List Angular Projects', description: ` -Provides a comprehensive overview of all Angular workspaces and projects within the repository. -It is essential to use this tool as a first step before performing any project-specific actions to understand the available projects, -their types, and their locations. +Provides a comprehensive overview of all Angular workspaces, projects, and configured targets within the repository. +Always use this tool as a mandatory first step before performing any project-specific actions +to understand the available projects and locations. -* Finding the correct project name to use in other commands (e.g., \`ng generate component my-comp --project=my-app\`). -* Identifying the \`root\` and \`sourceRoot\` of a project to read, analyze, or modify its files. -* Determining a project's unit test framework (\`unitTestFramework\`) before writing or modifying tests. -* Identifying the project's style language (\`styleLanguage\`) to use the correct file extension (e.g., \`.scss\`). -* Getting the \`selectorPrefix\` for a project before generating a new component to ensure it follows conventions. -* Identifying the major version of the Angular framework for each workspace, which is crucial for monorepos. -* Determining a project's primary function by inspecting its builder (e.g., '@angular-devkit/build-angular:browser' for an application). +* Discovering project names, locations, builders, selector prefixes, and style languages before generating or building components. +* Determining a project's unit test framework (Jasmine, Jest, or Vitest) before writing or modifying tests. +* Identifying available execution targets (e.g., lint, e2e, serve, deploy) before attempting execution. +* Disambiguating multiple workspaces in monorepos. -* **Working Directory:** Shell commands for a project (like \`ng generate\`) **MUST** - be executed from the parent directory of the \`path\` field for the relevant workspace. -* **Unit Testing:** The \`unitTestFramework\` field tells you which testing API to use (e.g., Jasmine, Jest). - If the value is 'unknown', you **MUST** inspect the project's configuration files - (e.g., \`karma.conf.js\`, \`jest.config.js\`, or the 'test' target in \`angular.json\`) to determine the - framework before generating tests. -* **Disambiguation:** A monorepo may contain multiple workspaces (e.g., for different applications or even in output directories). - Use the \`path\` of each workspace to understand its context and choose the correct project. +* Execute shell/CLI commands from the parent directory of the workspace's 'path' field. +* If 'unitTestFramework' is 'unknown', inspect local config files (e.g., jest.config.js, karma.conf.js) + or the 'test' target in 'angular.json' to determine the framework before creating tests. `, outputSchema: listProjectsOutputSchema, isReadOnly: true, @@ -471,6 +466,7 @@ async function loadAndParseWorkspace( const fullSourceRoot = join(workspaceRoot, sourceRoot); const unitTestFramework = getUnitTestFramework(project.targets.get('test')); const styleLanguage = await getProjectStyleLanguage(project, ws, fullSourceRoot); + const targets = Array.from(project.targets.keys()); projects.push({ name, @@ -481,6 +477,7 @@ async function loadAndParseWorkspace( selectorPrefix: project.extensions['prefix'] as string, unitTestFramework, styleLanguage, + targets, }); } diff --git a/packages/angular/cli/src/commands/mcp/tools/projects_spec.ts b/packages/angular/cli/src/commands/mcp/tools/projects_spec.ts new file mode 100644 index 000000000000..b45b1bbcb189 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/projects_spec.ts @@ -0,0 +1,92 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { workspaces } from '@angular-devkit/core'; +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { AngularWorkspace } from '../../../utilities/config'; +import { createMockContext } from '../testing/test-utils'; +import { LIST_PROJECTS_TOOL } from './projects'; + +describe('List Projects Tool', () => { + let mockWorkspace: AngularWorkspace; + let mockContext: ReturnType['context']; + let tempDir: string; + let allowedRoot: string; + let workspaceDir: string; + + beforeEach(() => { + tempDir = mkdtempSync(join(tmpdir(), 'mcp-projects-tool-')); + allowedRoot = join(tempDir, 'allowed-root'); + workspaceDir = join(allowedRoot, 'workspace'); + mkdirSync(workspaceDir, { recursive: true }); + writeFileSync(join(workspaceDir, 'angular.json'), '{}'); + writeFileSync( + join(workspaceDir, 'package.json'), + JSON.stringify({ dependencies: { '@angular/core': '18.0.0' } }), + ); + + const projects = new workspaces.ProjectDefinitionCollection(); + const targets = new workspaces.TargetDefinitionCollection(); + targets.set('build', { builder: '@angular-devkit/build-angular:application' }); + targets.set('test', { builder: '@angular/build:unit-test', options: { runner: 'vitest' } }); + targets.set('lint', { builder: '@angular-eslint/builder:lint' }); + targets.set('e2e', { builder: '@cypress/schematic:cypress' }); + + projects.set('my-app', { + root: 'projects/my-app', + extensions: { projectType: 'application', prefix: 'app' }, + targets, + }); + + mockWorkspace = { + projects, + extensions: {}, + basePath: workspaceDir, + filePath: join(workspaceDir, 'angular.json'), + } as unknown as AngularWorkspace; + + spyOn(AngularWorkspace, 'load').and.resolveTo(mockWorkspace); + + const { context } = createMockContext(); + mockContext = context; + mockContext.server = { + server: { + getClientCapabilities: jasmine.createSpy('getClientCapabilities').and.returnValue({ + roots: { listChanged: false }, + }), + listRoots: jasmine.createSpy('listRoots').and.resolveTo({ + roots: [{ uri: pathToFileURL(allowedRoot).href, name: 'allowed-root' }], + }), + }, + } as unknown as NonNullable[0]['server']>; + }); + + afterEach(() => { + rmSync(tempDir, { recursive: true, force: true }); + }); + + it('should list workspaces and extract available architect targets', async () => { + const handler = await LIST_PROJECTS_TOOL.factory(mockContext); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const result = await (handler as any)({}); + + expect(result.structuredContent).toBeDefined(); + const workspaces = result.structuredContent.workspaces; + expect(workspaces.length).toBe(1); + expect(workspaces[0].frameworkVersion).toBe('18'); + + const projects = workspaces[0].projects; + expect(projects.length).toBe(1); + expect(projects[0].name).toBe('my-app'); + expect(projects[0].targets).toEqual(['build', 'test', 'lint', 'e2e']); + expect(projects[0].unitTestFramework).toBe('vitest'); + }); +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/build-target-strategy.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/build-target-strategy.ts new file mode 100644 index 000000000000..1fbd8f83e47a --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/build-target-strategy.ts @@ -0,0 +1,63 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { getCommandErrorLogs } from '../../utils'; +import type { McpToolContext } from '../tool-registry'; +import { serializeOptions } from './options-serializer'; +import type { TargetStrategy } from './strategy'; +import type { RunTargetOutput, StrategyExecutionContext } from './types'; + +export class BuildTargetStrategy implements TargetStrategy { + canHandle(targetName: string, builder?: string): boolean { + return ( + targetName === 'build' && + (builder === '@angular-devkit/build-angular:application' || + builder === '@angular-devkit/build-angular:browser' || + builder === '@angular/build:application' || + builder === '@angular-devkit/build-angular:ng-packagr') + ); + } + + async execute( + input: StrategyExecutionContext, + context: McpToolContext, + ): Promise { + const args = ['build', input.projectName]; + if (input.configuration) { + args.push('-c', input.configuration); + } + + args.push(...serializeOptions(input.options)); + + let status: 'success' | 'failure' = 'success'; + let logs: string[]; + + try { + const result = await context.host.executeNgCommand(args, { cwd: input.workspacePath }); + logs = result.logs; + } catch (e) { + status = 'failure'; + logs = getCommandErrorLogs(e); + } + + let outputPath: string | undefined; + for (const line of logs) { + const match = line.match(/Output location: (.*)/); + if (match) { + outputPath = match[1].trim(); + break; + } + } + + return { + status, + logs, + extensions: outputPath ? { outputPath } : undefined, + }; + } +} diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/build-target-strategy_spec.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/build-target-strategy_spec.ts new file mode 100644 index 000000000000..86909310cd35 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/build-target-strategy_spec.ts @@ -0,0 +1,93 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type { MockHost } from '../../testing/mock-host'; +import { + type MockMcpToolContext, + addProjectToWorkspace, + createMockContext, +} from '../../testing/test-utils'; +import { BuildTargetStrategy } from './build-target-strategy'; + +describe('BuildTargetStrategy', () => { + let mockHost: MockHost; + let mockContext: MockMcpToolContext; + let strategy: BuildTargetStrategy; + + beforeEach(() => { + const mock = createMockContext(); + mockHost = mock.host; + mockContext = mock.context; + addProjectToWorkspace(mock.projects, 'my-app'); + strategy = new BuildTargetStrategy(); + }); + + describe('canHandle', () => { + it('should match build target with official builders', () => { + expect(strategy.canHandle('build', '@angular-devkit/build-angular:application')).toBeTrue(); + expect(strategy.canHandle('build', '@angular-devkit/build-angular:browser')).toBeTrue(); + expect(strategy.canHandle('build', '@angular/build:application')).toBeTrue(); + expect(strategy.canHandle('build', '@angular-devkit/build-angular:ng-packagr')).toBeTrue(); + }); + + it('should not match build target with custom builders', () => { + expect(strategy.canHandle('build', 'custom-builder')).toBeFalse(); + expect(strategy.canHandle('build', undefined)).toBeFalse(); + }); + + it('should not match other targets', () => { + expect(strategy.canHandle('test', '@angular-devkit/build-angular:browser')).toBeFalse(); + }); + }); + + describe('execute', () => { + it('should spawn ng build and parse outputPath successfully', async () => { + const buildLogs = ['Build successful!', 'Output location: dist/my-app']; + mockHost.executeNgCommand.and.resolveTo({ logs: buildLogs }); + + const result = await strategy.execute( + { + workspacePath: '/test', + projectName: 'my-app', + targetName: 'build', + targetDefinition: { + builder: '@angular/build:application', + }, + }, + mockContext, + ); + + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['build', 'my-app'], { + cwd: '/test', + }); + expect(result.status).toBe('success'); + expect(result.logs).toEqual(buildLogs); + expect(result.extensions).toEqual({ outputPath: 'dist/my-app' }); + }); + + it('should return undefined outputPath if parsing matches nothing', async () => { + const buildLogs = ['Build successful!']; + mockHost.executeNgCommand.and.resolveTo({ logs: buildLogs }); + + const result = await strategy.execute( + { + workspacePath: '/test', + projectName: 'my-app', + targetName: 'build', + targetDefinition: { + builder: '@angular/build:application', + }, + }, + mockContext, + ); + + expect(result.status).toBe('success'); + expect(result.extensions).toBeUndefined(); + }); + }); +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/generic-target-strategy.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/generic-target-strategy.ts new file mode 100644 index 000000000000..f1d66b5597e7 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/generic-target-strategy.ts @@ -0,0 +1,75 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { getCommandErrorLogs } from '../../utils'; +import type { McpToolContext } from '../tool-registry'; +import { serializeOptions } from './options-serializer'; +import type { TargetStrategy } from './strategy'; +import type { RunTargetOutput, StrategyExecutionContext } from './types'; + +const BUILT_IN_COMMANDS = new Set([ + 'build', + 'test', + 'e2e', + 'serve', + 'deploy', + 'extract-i18n', + 'lint', +]); + +export class GenericTargetStrategy implements TargetStrategy { + canHandle(targetName: string, builder?: string): boolean { + return true; // Universal fallback strategy + } + + async execute( + input: StrategyExecutionContext, + context: McpToolContext, + ): Promise { + if (input.targetName === 'serve' || input.options?.['watch'] === true) { + throw new Error( + `Watch mode execution (serve target or watch option) is not yet supported by 'run_target'. ` + + `Please use the legacy 'devserver.start' / 'devserver.wait_for_build' tools instead.`, + ); + } + + const args: string[] = []; + if (BUILT_IN_COMMANDS.has(input.targetName)) { + args.push(input.targetName, input.projectName); + } else { + args.push('run', `${input.projectName}:${input.targetName}`); + } + + if (input.configuration) { + args.push('-c', input.configuration); + } + + let options = input.options; + if (input.targetName === 'test') { + options = { + ...options, + watch: false, + }; + } + + args.push(...serializeOptions(options)); + + let status: 'success' | 'failure' = 'success'; + let logs: string[]; + + try { + const result = await context.host.executeNgCommand(args, { cwd: input.workspacePath }); + logs = result.logs; + } catch (e) { + status = 'failure'; + logs = getCommandErrorLogs(e); + } + + return { status, logs }; + } +} diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/options-serializer.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/options-serializer.ts new file mode 100644 index 000000000000..b5f5a7414b97 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/options-serializer.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type { OptionValue } from './types'; + +/** + * Serializes a Zod-validated options record into standard CLI argument flags. + * Enforces strict regex validation on option keys to prevent flag manipulation. + */ +export function serializeOptions( + options: Record | undefined, + excludeKeys: Set = new Set(), +): string[] { + const args: string[] = []; + if (!options) { + return args; + } + + for (const [key, value] of Object.entries(options)) { + if (excludeKeys.has(key)) { + continue; + } + + if (!/^[a-zA-Z0-9-_]+$/.test(key)) { + throw new Error( + `Invalid option key: '${key}'. Option keys must be alphanumeric, hyphens, or underscores.`, + ); + } + + if (typeof value === 'boolean') { + args.push(value ? `--${key}` : `--no-${key}`); + } else if (Array.isArray(value)) { + for (const item of value) { + args.push(`--${key}=${item}`); + } + } else if (value !== null && value !== undefined) { + args.push(`--${key}=${value}`); + } + } + + return args; +} diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/options-serializer_spec.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/options-serializer_spec.ts new file mode 100644 index 000000000000..197a3855799a --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/options-serializer_spec.ts @@ -0,0 +1,49 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { serializeOptions } from './options-serializer'; + +describe('run-target options-serializer', () => { + describe('serializeOptions', () => { + it('should return empty array if options are undefined', () => { + expect(serializeOptions(undefined)).toEqual([]); + }); + + it('should serialize boolean options correctly', () => { + expect(serializeOptions({ fix: true, quiet: false })).toEqual(['--fix', '--no-quiet']); + }); + + it('should serialize string and number options correctly', () => { + expect(serializeOptions({ browsers: 'Chrome', timeout: 5000 })).toEqual([ + '--browsers=Chrome', + '--timeout=5000', + ]); + }); + + it('should serialize array options as multiple occurrences of the flag', () => { + expect(serializeOptions({ include: ['a', 'b'] })).toEqual(['--include=a', '--include=b']); + }); + + it('should ignore excluded keys successfully', () => { + expect(serializeOptions({ watch: true, fix: true }, new Set(['watch']))).toEqual(['--fix']); + }); + + it('should ignore null and undefined values successfully', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(serializeOptions({ empty: null, missing: undefined, fix: true } as any)).toEqual([ + '--fix', + ]); + }); + + it('should throw an error if key is malformed (whitespace or special characters)', () => { + expect(() => serializeOptions({ 'fix --danger': true })).toThrowError( + /Invalid option key: 'fix --danger'/, + ); + }); + }); +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/run-target.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/run-target.ts new file mode 100644 index 000000000000..8b6f62d8fcba --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/run-target.ts @@ -0,0 +1,76 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { createStructuredContentOutput } from '../../utils'; +import { resolveWorkspaceAndProject } from '../../workspace-utils'; +import { type McpToolContext, declareTool } from '../tool-registry'; +import { BuildTargetStrategy } from './build-target-strategy'; +import { GenericTargetStrategy } from './generic-target-strategy'; +import type { TargetStrategy } from './strategy'; +import { type RunTargetInput, runTargetInputSchema, runTargetOutputSchema } from './types'; +import { UnitTestTargetStrategy } from './unit-test-strategy'; + +const FALLBACK_STRATEGY = new GenericTargetStrategy(); +const STRATEGIES: TargetStrategy[] = [new BuildTargetStrategy(), new UnitTestTargetStrategy()]; + +export async function runTarget(input: RunTargetInput, context: McpToolContext) { + const { workspace, workspacePath, projectName } = await resolveWorkspaceAndProject({ + host: context.host, + server: context.server, + workspacePathInput: input.workspace, + projectNameInput: input.project, + mcpWorkspace: context.workspace, + }); + + const targetDefinition = workspace.projects.get(projectName)?.targets.get(input.target); + const builder = targetDefinition?.builder; + + const strategy = STRATEGIES.find((s) => s.canHandle(input.target, builder)) ?? FALLBACK_STRATEGY; + + const result = await strategy.execute( + { + workspacePath, + projectName, + targetName: input.target, + targetDefinition, + configuration: input.configuration, + options: input.options, + }, + context, + ); + + return createStructuredContentOutput(result); +} + +export const RUN_TARGET_TOOL = declareTool({ + name: 'run_target', + title: 'Run Project Target', + description: ` + +Executes a configured target (such as build, test, lint, e2e) for an Angular project. +This is the single, unified interface for executing all project tasks natively. + + +* Building an application or library. +* Running unit tests, E2E tests, or linters. +* Deploying or running custom workspace targets discovered via 'list_projects'. + + +* Mandatory Discovery: You MUST discover available project targets by calling 'list_projects' first. +* Headless Testing: For official builders, the test target automatically runs in headless mode + and disables watch mode to guarantee clean execution. +* Output Paths: For official builders, successful builds return the build directory in 'outputPath' under the extensions metadata. +* Watch mode (serve target or watch options) is NOT yet supported in this version of run_target. + You MUST use the legacy 'devserver.*' tools for background server lifecycles. +`, + isReadOnly: false, + isLocalOnly: true, + inputSchema: runTargetInputSchema.shape, + outputSchema: runTargetOutputSchema.shape, + factory: (context) => (input) => runTarget(input, context), +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/run-target_spec.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/run-target_spec.ts new file mode 100644 index 000000000000..67b1fffef27e --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/run-target_spec.ts @@ -0,0 +1,148 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { CommandError } from '../../host'; +import type { MockHost } from '../../testing/mock-host'; +import { + type MockMcpToolContext, + addProjectToWorkspace, + createMockContext, +} from '../../testing/test-utils'; +import { runTarget } from './run-target'; + +describe('Run Target Tool', () => { + let mockHost: MockHost; + let mockContext: MockMcpToolContext; + + beforeEach(() => { + const mock = createMockContext(); + mockHost = mock.host; + mockContext = mock.context; + addProjectToWorkspace(mock.projects, 'my-app'); + }); + + it('should construct the command correctly with target and default project', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await runTarget({ target: 'build' }, mockContext); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['build', 'my-app'], { cwd: '/test' }); + }); + + it('should construct the command correctly with a specified project', async () => { + addProjectToWorkspace(mockContext.workspace.projects, 'my-lib'); + await runTarget({ project: 'my-lib', target: 'lint' }, mockContext); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['lint', 'my-lib'], { cwd: '/test' }); + }); + + it('should construct the command correctly with configuration', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await runTarget({ target: 'build', configuration: 'production' }, mockContext); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['build', 'my-app', '-c', 'production'], + { + cwd: '/test', + }, + ); + }); + + it('should route custom targets via ng run command syntax', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await runTarget({ target: 'storybook', configuration: 'docs' }, mockContext); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['run', 'my-app:storybook', '-c', 'docs'], + { cwd: '/test' }, + ); + }); + + it('should map boolean options correctly to CLI flags', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await runTarget({ target: 'lint', options: { fix: true, quiet: false } }, mockContext); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['lint', 'my-app', '--fix', '--no-quiet'], + { cwd: '/test' }, + ); + }); + + it('should map string and number options correctly to CLI flags and auto-inject no-watch', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await runTarget( + { target: 'test', options: { browsers: 'ChromeHeadless', timeout: 5000 } }, + mockContext, + ); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['test', 'my-app', '--browsers=ChromeHeadless', '--timeout=5000', '--no-watch'], + { cwd: '/test' }, + ); + }); + + it('should map array options correctly as multiple occurrences of the flag', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await runTarget({ target: 'lint', options: { include: ['a', 'b'] } }, mockContext); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['lint', 'my-app', '--include=a', '--include=b'], + { cwd: '/test' }, + ); + }); + + it('should automatically inject no-watch for test target even if no options provided', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await runTarget({ target: 'test' }, mockContext); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['test', 'my-app', '--no-watch'], { + cwd: '/test', + }); + }); + + it('should throw an error if option key is malformed (contains whitespace/special chars)', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await expectAsync( + runTarget({ target: 'lint', options: { 'fix --danger': true } }, mockContext), + ).toBeRejectedWithError(/Invalid option key: 'fix --danger'/); + }); + + it('should handle a successful execution and return logs', async () => { + const executionLogs = ['Linting complete', 'All rules passed!']; + mockHost.executeNgCommand.and.resolveTo({ + logs: executionLogs, + }); + + const { structuredContent } = await runTarget( + { project: 'my-app', target: 'lint' }, + mockContext, + ); + + expect(structuredContent.status).toBe('success'); + expect(structuredContent.logs).toEqual(executionLogs); + }); + + it('should handle a failed execution and capture command errors', async () => { + const executionLogs = ['Error: Rule violation found.']; + const error = new CommandError('Lint failed', executionLogs, 1); + mockHost.executeNgCommand.and.rejectWith(error); + + const { structuredContent } = await runTarget( + { project: 'my-app', target: 'lint' }, + mockContext, + ); + + expect(structuredContent.status).toBe('failure'); + expect(structuredContent.logs).toEqual([...executionLogs, 'Lint failed']); + }); + + it('should throw an error if attempting to run the serve target', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await expectAsync(runTarget({ target: 'serve' }, mockContext)).toBeRejectedWithError( + /Watch mode execution.*is not yet supported/, + ); + }); + + it('should throw an error if attempting to run a target with watch option true', async () => { + mockContext.workspace.extensions['defaultProject'] = 'my-app'; + await expectAsync( + runTarget({ target: 'build', options: { watch: true } }, mockContext), + ).toBeRejectedWithError(/Watch mode execution.*is not yet supported/); + }); +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/strategy.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/strategy.ts new file mode 100644 index 000000000000..d257366e3b0f --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/strategy.ts @@ -0,0 +1,18 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type { McpToolContext } from '../tool-registry'; +import type { RunTargetOutput, StrategyExecutionContext } from './types'; + +export interface TargetStrategy { + /** Whether this strategy is responsible for handling the given target/builder */ + canHandle(targetName: string, builder?: string): boolean; + + /** Executes the target using this strategy */ + execute(input: StrategyExecutionContext, context: McpToolContext): Promise; +} diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/types.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/types.ts new file mode 100644 index 000000000000..aa65f6551e24 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/types.ts @@ -0,0 +1,60 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { z } from 'zod'; +import { workspaceAndProjectOptions } from '../../shared-options'; + +export const optionValueSchema = z.union([ + z.string(), + z.number(), + z.boolean(), + z.array(z.union([z.string(), z.number()])), +]); + +export type OptionValue = z.infer; + +export const runTargetInputSchema = z.object({ + ...workspaceAndProjectOptions, + target: z + .string() + .describe('The project target to execute (e.g., "build", "test", "lint", "e2e", "deploy").'), + configuration: z + .string() + .optional() + .describe('Target configuration (e.g., "development", "production").'), + options: z + .record(z.string(), optionValueSchema) + .optional() + .describe('Optional key-value options to override the configured target options.'), +}); + +export type RunTargetInput = z.infer; + +export const runTargetOutputSchema = z.object({ + status: z.enum(['success', 'failure']).describe('Execution status.'), + logs: z.array(z.string()).describe('Clean, line-buffered output logs from execution.'), + extensions: z + .record(z.string(), z.unknown()) + .optional() + .describe('Specialized metadata populated by specific target strategies.'), +}); + +export type RunTargetOutput = z.infer; + +export interface StrategyExecutionContext { + workspacePath: string; + projectName: string; + targetName: string; + targetDefinition?: { + builder: string; + options?: Record; + configurations?: Record | undefined>; + }; + configuration?: string; + options?: Record; +} diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/unit-test-strategy.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/unit-test-strategy.ts new file mode 100644 index 000000000000..77ca5797e71c --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/unit-test-strategy.ts @@ -0,0 +1,66 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { getCommandErrorLogs } from '../../utils'; +import type { McpToolContext } from '../tool-registry'; +import { serializeOptions } from './options-serializer'; +import type { TargetStrategy } from './strategy'; +import type { RunTargetOutput, StrategyExecutionContext } from './types'; + +export class UnitTestTargetStrategy implements TargetStrategy { + canHandle(targetName: string, builder?: string): boolean { + return ( + targetName === 'test' && + (builder === '@angular-devkit/build-angular:karma' || + builder === '@angular/build:karma' || + builder === '@angular/build:unit-test') + ); + } + + async execute( + input: StrategyExecutionContext, + context: McpToolContext, + ): Promise { + const args = ['test', input.projectName]; + if (input.configuration) { + args.push('-c', input.configuration); + } + + const builder = input.targetDefinition?.builder; + + if (builder === '@angular/build:unit-test') { + const isKarma = input.targetDefinition?.options?.['runner'] === 'karma'; + if (isKarma) { + args.push('--browsers', 'ChromeHeadless'); + } else { + args.push('--headless', 'true'); + } + } else { + // Default Karma-based builders require explicit ChromeHeadless + args.push('--browsers', 'ChromeHeadless'); + } + + // Force non-interactive one-off execution + args.push('--watch', 'false'); + + args.push(...serializeOptions(input.options, new Set(['watch']))); + + let status: 'success' | 'failure' = 'success'; + let logs: string[]; + + try { + const result = await context.host.executeNgCommand(args, { cwd: input.workspacePath }); + logs = result.logs; + } catch (e) { + status = 'failure'; + logs = getCommandErrorLogs(e); + } + + return { status, logs }; + } +} diff --git a/packages/angular/cli/src/commands/mcp/tools/run-target/unit-test-strategy_spec.ts b/packages/angular/cli/src/commands/mcp/tools/run-target/unit-test-strategy_spec.ts new file mode 100644 index 000000000000..f1467f0002c9 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/run-target/unit-test-strategy_spec.ts @@ -0,0 +1,174 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type { MockHost } from '../../testing/mock-host'; +import { + type MockMcpToolContext, + addProjectToWorkspace, + createMockContext, +} from '../../testing/test-utils'; +import { UnitTestTargetStrategy } from './unit-test-strategy'; + +describe('UnitTestTargetStrategy', () => { + let mockHost: MockHost; + let mockContext: MockMcpToolContext; + let strategy: UnitTestTargetStrategy; + + beforeEach(() => { + const mock = createMockContext(); + mockHost = mock.host; + mockContext = mock.context; + addProjectToWorkspace(mock.projects, 'my-app'); + strategy = new UnitTestTargetStrategy(); + }); + + describe('canHandle', () => { + it('should match test target with official builders', () => { + expect(strategy.canHandle('test', '@angular-devkit/build-angular:karma')).toBeTrue(); + expect(strategy.canHandle('test', '@angular/build:karma')).toBeTrue(); + expect(strategy.canHandle('test', '@angular/build:unit-test')).toBeTrue(); + }); + + it('should not match test target with custom builders', () => { + expect(strategy.canHandle('test', 'custom-test-builder')).toBeFalse(); + expect(strategy.canHandle('test', undefined)).toBeFalse(); + }); + + it('should not match other targets', () => { + expect(strategy.canHandle('build', '@angular-devkit/build-angular:karma')).toBeFalse(); + }); + }); + + describe('execute', () => { + it('should append configuration arguments if provided', async () => { + mockContext.workspace.projects.get('my-app')?.targets.set('test', { + builder: '@angular-devkit/build-angular:karma', + }); + mockHost.executeNgCommand.and.resolveTo({ logs: ['Karma success'] }); + + await strategy.execute( + { + workspacePath: '/test', + projectName: 'my-app', + targetName: 'test', + configuration: 'ci', + targetDefinition: { + builder: '@angular-devkit/build-angular:karma', + }, + }, + mockContext, + ); + + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['test', 'my-app', '-c', 'ci', '--browsers', 'ChromeHeadless', '--watch', 'false'], + { cwd: '/test' }, + ); + }); + + it('should auto-inject no-watch and --browsers ChromeHeadless for Karma devkit builder', async () => { + mockContext.workspace.projects.get('my-app')?.targets.set('test', { + builder: '@angular-devkit/build-angular:karma', + }); + mockHost.executeNgCommand.and.resolveTo({ logs: ['Karma success'] }); + + await strategy.execute( + { + workspacePath: '/test', + projectName: 'my-app', + targetName: 'test', + targetDefinition: { + builder: '@angular-devkit/build-angular:karma', + }, + }, + mockContext, + ); + + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['test', 'my-app', '--browsers', 'ChromeHeadless', '--watch', 'false'], + { cwd: '/test' }, + ); + }); + + it('should auto-inject no-watch and --browsers ChromeHeadless for Karma build builder', async () => { + mockContext.workspace.projects.get('my-app')?.targets.set('test', { + builder: '@angular/build:karma', + }); + mockHost.executeNgCommand.and.resolveTo({ logs: ['Karma success'] }); + + await strategy.execute( + { + workspacePath: '/test', + projectName: 'my-app', + targetName: 'test', + targetDefinition: { + builder: '@angular/build:karma', + }, + }, + mockContext, + ); + + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['test', 'my-app', '--browsers', 'ChromeHeadless', '--watch', 'false'], + { cwd: '/test' }, + ); + }); + + it('should inject --headless true for modern unit-test builder with non-karma runner', async () => { + mockContext.workspace.projects.get('my-app')?.targets.set('test', { + builder: '@angular/build:unit-test', + options: { runner: 'vitest' }, + }); + mockHost.executeNgCommand.and.resolveTo({ logs: ['Vite success'] }); + + await strategy.execute( + { + workspacePath: '/test', + projectName: 'my-app', + targetName: 'test', + targetDefinition: { + builder: '@angular/build:unit-test', + options: { runner: 'vitest' }, + }, + }, + mockContext, + ); + + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['test', 'my-app', '--headless', 'true', '--watch', 'false'], + { cwd: '/test' }, + ); + }); + + it('should override watch options passed explicitly by LLM', async () => { + mockContext.workspace.projects.get('my-app')?.targets.set('test', { + builder: '@angular/build:unit-test', + options: { runner: 'vitest' }, + }); + mockHost.executeNgCommand.and.resolveTo({ logs: ['Vite success'] }); + + await strategy.execute( + { + workspacePath: '/test', + projectName: 'my-app', + targetName: 'test', + targetDefinition: { + builder: '@angular/build:unit-test', + options: { runner: 'vitest' }, + }, + options: { watch: true, browsers: 'Firefox' }, + }, + mockContext, + ); + + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( + ['test', 'my-app', '--headless', 'true', '--watch', 'false', '--browsers=Firefox'], + { cwd: '/test' }, + ); + }); + }); +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/test.ts b/packages/angular/cli/src/commands/mcp/tools/test.ts deleted file mode 100644 index 9c05a2f0f29b..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/test.ts +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { z } from 'zod'; -import { workspaceAndProjectOptions } from '../shared-options'; -import { createStructuredContentOutput, getCommandErrorLogs } from '../utils'; -import { resolveWorkspaceAndProject } from '../workspace-utils'; -import { type McpToolContext, type McpToolDeclaration, declareTool } from './tool-registry'; - -const testStatusSchema = z.enum(['success', 'failure']); -type TestStatus = z.infer; - -const testToolInputSchema = z.object({ - ...workspaceAndProjectOptions, - filter: z.string().optional().describe('Filter the executed tests by spec name.'), -}); - -export type TestToolInput = z.infer; - -const testToolOutputSchema = z.object({ - status: testStatusSchema.describe('Test execution status.'), - logs: z.array(z.string()).optional().describe('Output logs from `ng test`.'), -}); - -export type TestToolOutput = z.infer; - -function shouldUseHeadlessOption( - testTarget: import('@angular-devkit/core').workspaces.TargetDefinition | undefined, -): boolean { - return ( - testTarget?.builder === '@angular/build:unit-test' && testTarget.options?.['runner'] !== 'karma' - ); -} - -export async function runTest(input: TestToolInput, context: McpToolContext) { - const { workspace, workspacePath, projectName } = await resolveWorkspaceAndProject({ - host: context.host, - workspacePathInput: input.workspace, - projectNameInput: input.project, - mcpWorkspace: context.workspace, - }); - - // Build "ng"'s command line. - const args = ['test', projectName]; - - if (shouldUseHeadlessOption(workspace.projects.get(projectName)?.targets.get('test'))) { - args.push('--headless', 'true'); - } else { - // Karma-based projects need an explicit headless browser for non-interactive MCP execution. - args.push('--browsers', 'ChromeHeadless'); - } - - args.push('--watch', 'false'); - - if (input.filter) { - args.push('--filter', input.filter); - } - - let status: TestStatus = 'success'; - let logs: string[]; - - try { - logs = (await context.host.runCommand('ng', args, { cwd: workspacePath })).logs; - } catch (e) { - status = 'failure'; - logs = getCommandErrorLogs(e); - } - - const structuredContent: TestToolOutput = { - status, - logs, - }; - - return createStructuredContentOutput(structuredContent); -} - -export const TEST_TOOL: McpToolDeclaration< - typeof testToolInputSchema.shape, - typeof testToolOutputSchema.shape -> = declareTool({ - name: 'test', - title: 'Test Tool', - description: ` - -Perform a one-off, non-watched unit test execution with ng test. - - -* Running unit tests for the project. -* Verifying code changes with tests. - - -* This tool uses "ng test". -* It supports filtering by spec name if the underlying builder supports it (e.g., 'unit-test' builder). -* For the "@angular/build:unit-test" builder with Vitest, this tool requests headless execution via "--headless true". -* For Karma-based projects, this tool forces headless Chrome with "--browsers ChromeHeadless", so Chrome must be installed. - -`, - isReadOnly: false, - isLocalOnly: true, - inputSchema: testToolInputSchema.shape, - outputSchema: testToolOutputSchema.shape, - factory: (context) => (input) => runTest(input, context), -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/test_spec.ts b/packages/angular/cli/src/commands/mcp/tools/test_spec.ts deleted file mode 100644 index 487c986cdcd2..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/test_spec.ts +++ /dev/null @@ -1,132 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { CommandError } from '../host'; -import type { MockHost } from '../testing/mock-host'; -import { - MockMcpToolContext, - addProjectToWorkspace, - createMockContext, -} from '../testing/test-utils'; -import { runTest } from './test'; - -describe('Test Tool', () => { - let mockHost: MockHost; - let mockContext: MockMcpToolContext; - - beforeEach(() => { - const mock = createMockContext(); - mockHost = mock.host; - mockContext = mock.context; - addProjectToWorkspace(mock.projects, 'my-app'); - }); - - it('should construct the command correctly with defaults', async () => { - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - await runTest({}, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['test', 'my-app', '--browsers', 'ChromeHeadless', '--watch', 'false'], - { cwd: '/test' }, - ); - }); - - it('should construct the command correctly with a specified project', async () => { - addProjectToWorkspace(mockContext.workspace.projects, 'my-lib'); - await runTest({ project: 'my-lib' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['test', 'my-lib', '--browsers', 'ChromeHeadless', '--watch', 'false'], - { cwd: '/test' }, - ); - }); - - it('should construct the command correctly with filter', async () => { - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - await runTest({ filter: 'AppComponent' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - [ - 'test', - 'my-app', - '--browsers', - 'ChromeHeadless', - '--watch', - 'false', - '--filter', - 'AppComponent', - ], - { cwd: '/test' }, - ); - }); - - it('should handle a successful test run and capture logs', async () => { - const testLogs = ['Executed 10 of 10 SUCCESS', 'Total: 10 success']; - mockHost.runCommand.and.resolveTo({ - logs: testLogs, - }); - - const { structuredContent } = await runTest({ project: 'my-app' }, mockContext); - - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['test', 'my-app', '--browsers', 'ChromeHeadless', '--watch', 'false'], - { cwd: '/test' }, - ); - expect(structuredContent.status).toBe('success'); - expect(structuredContent.logs).toEqual(testLogs); - }); - - it('should handle a failed test run and capture logs', async () => { - addProjectToWorkspace(mockContext.workspace.projects, 'my-failed-app'); - const testLogs = ['Executed 10 of 10 FAILED', 'Error: Some test failed']; - const error = new CommandError('Test failed', testLogs, 1); - mockHost.runCommand.and.rejectWith(error); - - const { structuredContent } = await runTest({ project: 'my-failed-app' }, mockContext); - - expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs).toEqual([...testLogs, 'Test failed']); - }); - - it('should use the headless option for the unit-test builder when using Vitest', async () => { - addProjectToWorkspace(mockContext.workspace.projects, 'my-vitest-app', { - test: { - builder: '@angular/build:unit-test', - options: { - runner: 'vitest', - }, - }, - }); - - await runTest({ project: 'my-vitest-app' }, mockContext); - - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['test', 'my-vitest-app', '--headless', 'true', '--watch', 'false'], - { cwd: '/test' }, - ); - }); - - it('should use the headless option for the unit-test builder when the runner is omitted', async () => { - addProjectToWorkspace(mockContext.workspace.projects, 'my-default-vitest-app', { - test: { - builder: '@angular/build:unit-test', - options: {}, - }, - }); - - await runTest({ project: 'my-default-vitest-app' }, mockContext); - - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['test', 'my-default-vitest-app', '--headless', 'true', '--watch', 'false'], - { cwd: '/test' }, - ); - }); -}); diff --git a/packages/angular/cli/src/commands/update/cli.ts b/packages/angular/cli/src/commands/update/cli.ts index de6d7f53fea0..62416b1c1ee7 100644 --- a/packages/angular/cli/src/commands/update/cli.ts +++ b/packages/angular/cli/src/commands/update/cli.ts @@ -256,6 +256,7 @@ export default class UpdateCommandModule extends CommandModule(); const packagesToUpdate = [...infoMap.entries()] .map(([name, info]) => { - let tag = options.next - ? info.npmPackageJson['dist-tags']['next'] - ? 'next' - : 'latest' - : 'latest'; - let version = info.npmPackageJson['dist-tags'][tag]; - let target = info.npmPackageJson.versions[version]; + const distTags = info.npmPackageJson['dist-tags'] ?? {}; + let tag = options.next ? (distTags['next'] ? 'next' : 'latest') : 'latest'; + let version = distTags[tag] ?? info.installed.version; + const versions = info.npmPackageJson.versions ?? {}; + let target = versions[version]; const versionDiff = semver.diff(info.installed.version, version); if ( @@ -426,13 +427,13 @@ function _usageMessage( installedMajorVersion < toInstallMajorVersion - 1 ) { const nextMajorVersion = `${installedMajorVersion + 1}.`; - const nextMajorVersions = Object.keys(info.npmPackageJson.versions) + const nextMajorVersions = Object.keys(versions) .filter((v) => v.startsWith(nextMajorVersion)) .sort((a, b) => (a > b ? -1 : 1)); if (nextMajorVersions.length) { version = nextMajorVersions[0]; - target = info.npmPackageJson.versions[version]; + target = versions[version]; tag = ''; } } @@ -525,11 +526,147 @@ function _usageMessage( return; } +/** + * Resolves a semver range or npm dist-tag to a specific version based on the package's registry metadata. + * It prioritizes non-deprecated versions and handles fallback to deprecated versions if necessary. + * + * @private + */ +function resolvePackageVersion( + metadata: NpmRepositoryPackageJson, + range: string, + next = false, +): string | null { + // Check if range matches an npm dist-tag directly (e.g. "latest", "next") + const distTags = metadata['dist-tags'] ?? {}; + if (distTags[range]) { + return distTags[range]; + } + // If 'next' is requested (e.g. via the --next CLI flag) but the package doesn't publish + // a 'next' pre-release tag, fallback to 'latest'. + if (range === 'next') { + return distTags['latest'] ?? null; + } + + // Split deprecated and non-deprecated versions from registry metadata + const packageVersionsNonDeprecated: string[] = []; + const packageVersionsDeprecated: string[] = []; + for (const [v, { deprecated }] of Object.entries(metadata.versions ?? {})) { + if (deprecated) { + packageVersionsDeprecated.push(v); + } else { + packageVersionsNonDeprecated.push(v); + } + } + + // Find the highest satisfying version, prioritizing non-deprecated versions + return ( + semver.maxSatisfying(packageVersionsNonDeprecated, range, { + includePrerelease: next || undefined, + }) ?? + semver.maxSatisfying(packageVersionsDeprecated, range, { + includePrerelease: next || undefined, + }) + ); +} + +/** + * Checks if Yarn Plug'n'Play is active in the current workspace. + * + * @private + */ +function isPnpActive(workspaceRoot: string): boolean { + return ( + process.versions.pnp !== undefined || + existsSync(path.join(workspaceRoot, '.pnp.cjs')) || + existsSync(path.join(workspaceRoot, '.pnp.js')) + ); +} + +/** + * Resolves and reads the installed package.json manifest for a package. + * It checks the virtual schematic Tree first (vital for unit tests/mocks), + * and falls back to physical disk resolution using createRequire only if Yarn PnP is active. + * + * @private + */ +function getInstalledPackageJson( + tree: Tree, + packageName: string, + workspaceRoot: string, +): PackageManifest | null { + // First, check the virtual tree (critical for testing mocks) + const pkgJsonPath = `/node_modules/${packageName}/package.json`; + if (tree.exists(pkgJsonPath)) { + try { + return tree.readJson(pkgJsonPath) as PackageManifest; + } catch {} + } + + // In Yarn PnP, mock package trees are not written to node_modules in the virtual tree, + // so we resolve the manifest physically from Yarn's zip cache via createRequire. + // Note: This fallback resolution is strictly gated on Yarn PnP being active. Because schematics + // operate on a virtual file system (Tree), running disk lookups in non-PnP + // environments could cause tests to resolve dependencies from this monorepo's own node_modules + // instead of the simulated virtual file system. + if (isPnpActive(workspaceRoot)) { + try { + const workspaceRequire = createRequire(path.join(workspaceRoot, 'package.json')); + const manifestPath = workspaceRequire.resolve(`${packageName}/package.json`); + const content = readFileSync(manifestPath, 'utf8'); + + return JSON.parse(content) as PackageManifest; + } catch {} + } + + return null; +} + +function getInstalledVersion( + tree: Tree, + packageName: string, + workspaceRoot: string, +): string | null { + const pkgJson = getInstalledPackageJson(tree, packageName, workspaceRoot); + + return pkgJson?.version ?? null; +} + +function _buildLocalPackageInfo( + tree: Tree, + name: string, + allDependencies: ReadonlyMap, + workspaceRoot: string, + logger: logging.LoggerApi, +): PackageInfo { + const packageJsonRange = allDependencies.get(name); + if (!packageJsonRange) { + throw new SchematicsException(`Package ${JSON.stringify(name)} was not found in package.json.`); + } + + const localPkgJson = getInstalledPackageJson(tree, name, workspaceRoot); + if (!localPkgJson) { + throw new SchematicsException(`Package ${name} is not installed.`); + } + + return { + name, + npmPackageJson: {} as NpmRepositoryPackageJson, + installed: { + version: localPkgJson.version as VersionRange, + packageJson: localPkgJson, + updateMetadata: _getUpdateMetadata(localPkgJson, logger), + }, + packageJsonRange, + }; +} + function _buildPackageInfo( tree: Tree, packages: Map, allDependencies: ReadonlyMap, npmPackageJson: NpmRepositoryPackageJson, + workspaceRoot: string, logger: logging.LoggerApi, ): PackageInfo { const name = npmPackageJson.name; @@ -538,21 +675,13 @@ function _buildPackageInfo( throw new SchematicsException(`Package ${JSON.stringify(name)} was not found in package.json.`); } - // Find out the currently installed version. Either from the package.json or the node_modules/ - // TODO: figure out a way to read package-lock.json and/or yarn.lock. - const pkgJsonPath = `/node_modules/${name}/package.json`; - const pkgJsonExists = tree.exists(pkgJsonPath); - - let installedVersion: string | undefined | null; - if (pkgJsonExists) { - const { version } = tree.readJson(pkgJsonPath) as PackageManifest; - installedVersion = version; - } + const localPkgJson = getInstalledPackageJson(tree, name, workspaceRoot); + let installedVersion = localPkgJson?.version; const packageVersionsNonDeprecated: string[] = []; const packageVersionsDeprecated: string[] = []; - for (const [version, { deprecated }] of Object.entries(npmPackageJson.versions)) { + for (const [version, { deprecated }] of Object.entries(npmPackageJson.versions ?? {})) { if (deprecated) { packageVersionsDeprecated.push(version); } else { @@ -576,7 +705,8 @@ function _buildPackageInfo( ); } - const installedPackageJson = npmPackageJson.versions[installedVersion] || pkgJsonExists; + const versions = npmPackageJson.versions ?? {}; + const installedPackageJson = versions[installedVersion] || localPkgJson; if (!installedPackageJson) { throw new SchematicsException( `An unexpected error happened; package ${name} has no version ${installedVersion}.`, @@ -585,10 +715,11 @@ function _buildPackageInfo( let targetVersion: VersionRange | undefined = packages.get(name); if (targetVersion) { - if (npmPackageJson['dist-tags'][targetVersion]) { - targetVersion = npmPackageJson['dist-tags'][targetVersion] as VersionRange; + const distTags = npmPackageJson['dist-tags'] ?? {}; + if (distTags[targetVersion]) { + targetVersion = distTags[targetVersion] as VersionRange; } else if (targetVersion == 'next') { - targetVersion = npmPackageJson['dist-tags']['latest'] as VersionRange; + targetVersion = distTags['latest'] as VersionRange; } else { targetVersion = findSatisfyingVersion(targetVersion); } @@ -602,19 +733,18 @@ function _buildPackageInfo( const target: PackageVersionInfo | undefined = targetVersion ? { version: targetVersion, - packageJson: npmPackageJson.versions[targetVersion], - updateMetadata: _getUpdateMetadata(npmPackageJson.versions[targetVersion], logger), + packageJson: versions[targetVersion], + updateMetadata: _getUpdateMetadata(versions[targetVersion], logger), } : undefined; - // Check if there's an installed version. return { name, npmPackageJson, installed: { version: installedVersion as VersionRange, - packageJson: installedPackageJson, - updateMetadata: _getUpdateMetadata(installedPackageJson, logger), + packageJson: installedPackageJson as PackageManifest, + updateMetadata: _getUpdateMetadata(installedPackageJson as PackageManifest, logger), }, target, packageJsonRange, @@ -665,16 +795,34 @@ function _addPackageGroup( return; } - const info = _buildPackageInfo(tree, packages, allDependencies, npmPackageJson, logger); + const distTags = npmPackageJson['dist-tags'] ?? {}; + let version = maybePackage; + if (distTags[version]) { + version = distTags[version] as VersionRange; + } else if (version === 'next') { + version = distTags['latest'] as VersionRange; + } else { + const packageVersionsNonDeprecated: string[] = []; + const packageVersionsDeprecated: string[] = []; + const versions = npmPackageJson.versions ?? {}; + for (const [v, { deprecated }] of Object.entries(versions)) { + if (deprecated) { + packageVersionsDeprecated.push(v); + } else { + packageVersionsNonDeprecated.push(v); + } + } + version = + ((semver.maxSatisfying(packageVersionsNonDeprecated, version) ?? + semver.maxSatisfying(packageVersionsDeprecated, version)) as VersionRange | null) ?? + version; + } - const version = - (info.target && info.target.version) || - npmPackageJson['dist-tags'][maybePackage] || - maybePackage; - if (!npmPackageJson.versions[version]) { + const versions = npmPackageJson.versions ?? {}; + if (!versions[version]) { return; } - const ngUpdateMetadata = npmPackageJson.versions[version]['ng-update']; + const ngUpdateMetadata = versions[version]['ng-update']; if (!ngUpdateMetadata) { return; } @@ -721,51 +869,64 @@ function _addPackageGroup( * be ignored by the --force flag). * @private */ -function _addPeerDependencies( +async function _addPeerDependencies( tree: Tree, packages: Map, allDependencies: ReadonlyMap, npmPackageJson: NpmRepositoryPackageJson, - npmPackageJsonMap: Map, + workspaceRoot: string, + fetchMetadata: (name: string) => Promise, logger: logging.LoggerApi, -): void { +): Promise { const maybePackage = packages.get(npmPackageJson.name); if (!maybePackage) { return; } - - const info = _buildPackageInfo(tree, packages, allDependencies, npmPackageJson, logger); - - const version = - (info.target && info.target.version) || - npmPackageJson['dist-tags'][maybePackage] || - maybePackage; - if (!npmPackageJson.versions[version]) { + const distTags = npmPackageJson['dist-tags'] ?? {}; + const version = distTags[maybePackage] || maybePackage; + const versions = npmPackageJson.versions ?? {}; + const packageJson = versions[version]; + if (!packageJson) { return; } - const packageJson = npmPackageJson.versions[version]; - const error = false; - for (const [peer, range] of Object.entries(packageJson.peerDependencies || {})) { if (packages.has(peer)) { continue; } - const peerPackageJson = npmPackageJsonMap.get(peer); - if (peerPackageJson) { - const peerInfo = _buildPackageInfo(tree, packages, allDependencies, peerPackageJson, logger); - if (semver.satisfies(peerInfo.installed.version, range)) { + const installedVersion = getInstalledVersion(tree, peer, workspaceRoot); + if (installedVersion) { + if (semver.satisfies(installedVersion, range)) { continue; } + } else { + const packageJsonRange = allDependencies.get(peer); + if (packageJsonRange) { + const peerMetadata = await fetchMetadata(peer); + if (peerMetadata) { + const packageVersionsNonDeprecated: string[] = []; + const packageVersionsDeprecated: string[] = []; + for (const [v, { deprecated }] of Object.entries(peerMetadata.versions ?? {})) { + if (deprecated) { + packageVersionsDeprecated.push(v); + } else { + packageVersionsNonDeprecated.push(v); + } + } + const resolvedInstalledVersion = + semver.maxSatisfying(packageVersionsNonDeprecated, packageJsonRange) ?? + semver.maxSatisfying(packageVersionsDeprecated, packageJsonRange); + + if (resolvedInstalledVersion && semver.satisfies(resolvedInstalledVersion, range)) { + continue; + } + } + } } packages.set(peer, range as VersionRange); } - - if (error) { - throw new SchematicsException('An error occured, see above.'); - } } function _getAllDependencies(tree: Tree): Array { @@ -846,65 +1007,109 @@ export default function (options: UpdateSchema): Rule { ); const packages = _buildPackageList(options, npmDeps, logger); - // Grab all package.json from the npm repository. This requires a lot of HTTP calls so we - // try to parallelize as many as possible. - const allPackageMetadata = await Promise.all( - Array.from(npmDeps.keys()).map((depName) => - getNpmPackageJson(depName, logger, { + const workspaceRoot = options.workspaceRoot ?? process.cwd(); + const npmPackageJsonMap = new Map(); + + const getOrFetchPackageMetadata = async ( + packageName: string, + ): Promise => { + let metadata = npmPackageJsonMap.get(packageName); + if (!metadata) { + const raw = await getNpmPackageJson(packageName, logger, { registry: options.registry, usingYarn, verbose: options.verbose, - }), - ), - ); - - // Build a map of all dependencies and their packageJson. - const npmPackageJsonMap = allPackageMetadata.reduce((acc, npmPackageJson) => { - // If the package was not found on the registry. It could be private, so we will just - // ignore. If the package was part of the list, we will error out, but will simply ignore - // if it's either not requested (so just part of package.json. silently). - if (!npmPackageJson.name) { - if (npmPackageJson.requestedName && packages.has(npmPackageJson.requestedName)) { - throw new SchematicsException( - `Package ${JSON.stringify(npmPackageJson.requestedName)} was not found on the ` + - 'registry. Cannot continue as this may be an error.', - ); + }); + if (raw.name) { + metadata = raw as NpmRepositoryPackageJson; + npmPackageJsonMap.set(packageName, metadata); } - } else { - // If a name is present, it is assumed to be fully populated - acc.set(npmPackageJson.name, npmPackageJson as NpmRepositoryPackageJson); } - return acc; - }, new Map()); - - // Augment the command line package list with packageGroups and forward peer dependencies. - // Each added package may uncover new package groups and peer dependencies, so we must - // repeat this process until the package list stabilizes. - let lastPackagesSize; - do { - lastPackagesSize = packages.size; - npmPackageJsonMap.forEach((npmPackageJson) => { - _addPackageGroup(tree, packages, npmDeps, npmPackageJson, logger); - }); - } while (packages.size > lastPackagesSize); + return metadata ?? null; + }; - // This is done in seperate loop to ensure that package groups are added before peer dependencies. - do { - lastPackagesSize = packages.size; - npmPackageJsonMap.forEach((npmPackageJson) => { - _addPeerDependencies(tree, packages, npmDeps, npmPackageJson, npmPackageJsonMap, logger); - }); - } while (packages.size > lastPackagesSize); + if (packages.size === 0) { + // User ran just `ng update` to see the outdated package list. + // We must fetch metadata for all npm dependencies to generate the usage message. + await Promise.all( + Array.from(npmDeps.keys()).map(async (depName) => { + await getOrFetchPackageMetadata(depName); + }), + ); + } else { + // User requested updates. We resolve dependencies lazily. + let lastPackagesSize; + do { + lastPackagesSize = packages.size; + + let lastGroupSize; + do { + lastGroupSize = packages.size; + for (const name of Array.from(packages.keys())) { + const metadata = await getOrFetchPackageMetadata(name); + const spec = packages.get(name); + if (metadata && spec) { + const resolvedVersion = resolvePackageVersion(metadata, spec, !!options.next); + if (resolvedVersion) { + packages.set(name, resolvedVersion as VersionRange); + } + _addPackageGroup(tree, packages, npmDeps, metadata, logger); + } + } + } while (packages.size > lastGroupSize); + + for (const name of Array.from(packages.keys())) { + const metadata = await getOrFetchPackageMetadata(name); + const spec = packages.get(name); + if (metadata && spec) { + const resolvedVersion = resolvePackageVersion(metadata, spec, !!options.next); + if (resolvedVersion) { + packages.set(name, resolvedVersion as VersionRange); + } + await _addPeerDependencies( + tree, + packages, + npmDeps, + metadata, + workspaceRoot, + getOrFetchPackageMetadata, + logger, + ); + } + } + } while (packages.size > lastPackagesSize); + } // Build the PackageInfo for each module. const packageInfoMap = new Map(); - npmPackageJsonMap.forEach((npmPackageJson) => { - packageInfoMap.set( - npmPackageJson.name, - _buildPackageInfo(tree, packages, npmDeps, npmPackageJson, logger), - ); - }); + for (const depName of npmDeps.keys()) { + const isUpdating = packages.has(depName); + const localPkgJson = getInstalledPackageJson(tree, depName, workspaceRoot); + + if (isUpdating || !localPkgJson) { + // If updating OR not installed locally, resolve via registry metadata + const metadata = await getOrFetchPackageMetadata(depName); + if (metadata) { + packageInfoMap.set( + depName, + _buildPackageInfo(tree, packages, npmDeps, metadata, workspaceRoot, logger), + ); + } else { + // Fallback if metadata could not be fetched + packageInfoMap.set( + depName, + _buildLocalPackageInfo(tree, depName, npmDeps, workspaceRoot, logger), + ); + } + } else { + // If not updating and installed locally, resolve purely locally + packageInfoMap.set( + depName, + _buildLocalPackageInfo(tree, depName, npmDeps, workspaceRoot, logger), + ); + } + } // Now that we have all the information, check the flags. if (packages.size > 0) { diff --git a/packages/angular/cli/src/commands/update/schematic/index_spec.ts b/packages/angular/cli/src/commands/update/schematic/index_spec.ts index 11b2a0b5855e..7e8ca436150d 100644 --- a/packages/angular/cli/src/commands/update/schematic/index_spec.ts +++ b/packages/angular/cli/src/commands/update/schematic/index_spec.ts @@ -387,5 +387,5 @@ describe('@schematics/update', () => { expect(dependencies['@angular/cdk']).toMatch(version20Regexp); expect(dependencies['@angular/common']).toMatch(version20Regexp); expect(dependencies['@angular/core']).toMatch(version20Regexp); - }); + }, 45000); }); diff --git a/packages/angular/cli/src/commands/update/schematic/schema.json b/packages/angular/cli/src/commands/update/schematic/schema.json index 4768df46f2d5..63bf2df87813 100644 --- a/packages/angular/cli/src/commands/update/schematic/schema.json +++ b/packages/angular/cli/src/commands/update/schematic/schema.json @@ -58,6 +58,10 @@ "type": "string", "default": "npm", "enum": ["npm", "yarn", "pnpm", "bun"] + }, + "workspaceRoot": { + "description": "The path to the workspace root directory.", + "type": "string" } }, "required": [] diff --git a/packages/angular/cli/src/commands/update/utilities/cli-version.ts b/packages/angular/cli/src/commands/update/utilities/cli-version.ts index 6067b81504d4..3791f7ad7070 100644 --- a/packages/angular/cli/src/commands/update/utilities/cli-version.ts +++ b/packages/angular/cli/src/commands/update/utilities/cli-version.ts @@ -70,7 +70,7 @@ export async function checkCLIVersion( const version = manifest.version; - return VERSION.full === version ? null : version; + return VERSION.full === version ? null : String(runnerVersion); } /** diff --git a/packages/angular/cli/src/commands/update/utilities/migration.ts b/packages/angular/cli/src/commands/update/utilities/migration.ts index f52726de5523..21331364bc2f 100644 --- a/packages/angular/cli/src/commands/update/utilities/migration.ts +++ b/packages/angular/cli/src/commands/update/utilities/migration.ts @@ -153,9 +153,7 @@ export async function executeMigrations( if (requiredMigrations.length) { logger.info(colors.cyan(`** Executing migrations of package '${packageName}' **\n`)); - requiredMigrations.sort( - (a, b) => semver.compare(a.version, b.version) || a.name.localeCompare(b.name), - ); + requiredMigrations.sort(compareMigrations); const result = await executePackageMigrations( workflow, @@ -174,9 +172,7 @@ export async function executeMigrations( if (optionalMigrations.length) { logger.info(colors.magenta(`** Optional migrations of package '${packageName}' **\n`)); - optionalMigrations.sort( - (a, b) => semver.compare(a.version, b.version) || a.name.localeCompare(b.name), - ); + optionalMigrations.sort(compareMigrations); const migrationsToRun = await getOptionalMigrationsToRun( logger, @@ -372,3 +368,10 @@ function getMigrationTitleAndDescription(migration: MigrationSchematicDescriptio : undefined, }; } + +function compareMigrations( + a: MigrationSchematicDescriptionWithVersion, + b: MigrationSchematicDescriptionWithVersion, +): number { + return semver.compare(a.version, b.version); +} diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index 2dfe75ee01cd..d99d2c950702 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -99,6 +99,15 @@ export interface PackageManagerDescriptor { /** A function that formats the arguments for field-filtered registry views. */ readonly viewCommandFieldArgFormatter?: (fields: readonly string[]) => string[]; + /** An optional custom function to fetch registry metadata when the default logic is not sufficient. */ + readonly getRegistryMetadata?: ( + packageName: string, + fetchAndParse: ( + args: readonly string[], + parser: (stdout: string, logger?: Logger) => T | null, + ) => Promise, + ) => Promise; + /** A collection of functions to parse the output of specific commands. */ readonly outputParsers: { /** A function to parse the output of `listDependenciesCommand`. */ @@ -273,6 +282,38 @@ export const SUPPORTED_PACKAGE_MANAGERS = { versionCommand: ['--version'], listDependenciesCommand: ['pm', 'ls'], getManifestCommand: ['pm', 'view', '--json'], + getRegistryMetadata: async (packageName, fetchAndParse) => { + const [distTags, versions] = await Promise.all([ + fetchAndParse(['pm', 'view', '--json', packageName, 'dist-tags'], (stdout) => { + if (!stdout) { + return {}; + } + + const parsed = JSON.parse(stdout); + + return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}; + }), + fetchAndParse(['pm', 'view', '--json', packageName, 'versions'], (stdout) => { + if (!stdout) { + return null; + } + + const parsed = JSON.parse(stdout); + + return Array.isArray(parsed) ? parsed : [parsed]; + }), + ]); + + if (!versions || versions.length === 0) { + return null; + } + + return { + name: packageName, + 'dist-tags': (distTags || {}) as Record, + versions: versions as string[], + }; + }, outputParsers: { listDependencies: parseBunDependencies, getRegistryManifest: parseNpmLikeManifest, diff --git a/packages/angular/cli/src/package-managers/package-manager.ts b/packages/angular/cli/src/package-managers/package-manager.ts index 33b8b07d48e3..afa2aa6b4c57 100644 --- a/packages/angular/cli/src/package-managers/package-manager.ts +++ b/packages/angular/cli/src/package-managers/package-manager.ts @@ -93,6 +93,9 @@ export class PackageManager { readonly #initializationError?: Error; #dependencyCache: Map | null = null; #version: string | undefined; + #activeTasks = 0; + readonly #pendingTasks: (() => void)[] = []; + readonly #maxConcurrent = 5; /** * Creates a new `PackageManager` instance. @@ -159,49 +162,72 @@ export class PackageManager { * @param options Options for the child process. * @returns A promise that resolves with the standard output and standard error of the command. */ + async #runWithThrottle(action: () => Promise): Promise { + if (this.#activeTasks >= this.#maxConcurrent) { + await new Promise((resolve) => { + this.#pendingTasks.push(resolve); + }); + } else { + this.#activeTasks++; + } + + try { + return await action(); + } finally { + const next = this.#pendingTasks.shift(); + if (next) { + next(); + } else { + this.#activeTasks--; + } + } + } + async #run( args: readonly string[], options: { timeout?: number; registry?: string; cwd?: string } = {}, ): Promise<{ stdout: string; stderr: string }> { - this.ensureInstalled(); + return this.#runWithThrottle(async () => { + this.ensureInstalled(); + + const { registry, cwd, ...runOptions } = options; + const finalArgs = [...args]; + let finalEnv: Record | undefined; + + if (registry) { + const registryOptions = this.descriptor.getRegistryOptions?.(registry); + if (!registryOptions) { + throw new Error( + `The configured package manager, '${this.descriptor.binary}', does not support a custom registry.`, + ); + } - const { registry, cwd, ...runOptions } = options; - const finalArgs = [...args]; - let finalEnv: Record | undefined; + if (registryOptions.args) { + finalArgs.push(...registryOptions.args); + } + if (registryOptions.env) { + finalEnv = registryOptions.env; + } + } - if (registry) { - const registryOptions = this.descriptor.getRegistryOptions?.(registry); - if (!registryOptions) { - throw new Error( - `The configured package manager, '${this.descriptor.binary}', does not support a custom registry.`, + const executionDirectory = cwd ?? this.cwd; + if (this.options.dryRun) { + this.options.logger?.info( + `[DRY RUN] Would execute in [${executionDirectory}]: ${this.descriptor.binary} ${finalArgs.join(' ')}`, ); - } - if (registryOptions.args) { - finalArgs.push(...registryOptions.args); - } - if (registryOptions.env) { - finalEnv = registryOptions.env; + return { stdout: '', stderr: '' }; } - } - const executionDirectory = cwd ?? this.cwd; - if (this.options.dryRun) { - this.options.logger?.info( - `[DRY RUN] Would execute in [${executionDirectory}]: ${this.descriptor.binary} ${finalArgs.join(' ')}`, - ); - - return { stdout: '', stderr: '' }; - } + const commandResult = await this.host.runCommand(this.descriptor.binary, finalArgs, { + ...runOptions, + cwd: executionDirectory, + stdio: 'pipe', + env: finalEnv, + }); - const commandResult = await this.host.runCommand(this.descriptor.binary, finalArgs, { - ...runOptions, - cwd: executionDirectory, - stdio: 'pipe', - env: finalEnv, + return { stdout: commandResult.stdout.trim(), stderr: commandResult.stderr.trim() }; }); - - return { stdout: commandResult.stdout.trim(), stderr: commandResult.stderr.trim() }; } /** @@ -441,19 +467,37 @@ export class PackageManager { packageName: string, options: { timeout?: number; registry?: string; bypassCache?: boolean } = {}, ): Promise { - const commandArgs = [...this.descriptor.getManifestCommand, packageName]; - const formatter = this.descriptor.viewCommandFieldArgFormatter; - if (formatter) { - commandArgs.push(...formatter(METADATA_FIELDS)); + const cacheKey = options.registry ? `${packageName}|${options.registry}` : packageName; + + if (!options.bypassCache) { + const cached = this.#metadataCache.get(cacheKey); + if (cached !== undefined) { + return cached; + } } - const cacheKey = options.registry ? `${packageName}|${options.registry}` : packageName; + let metadata: PackageMetadata | null; + if (this.descriptor.getRegistryMetadata) { + metadata = await this.descriptor.getRegistryMetadata(packageName, (args, parser) => + this.#fetchAndParse(args, parser, options), + ); + } else { + const commandArgs = [...this.descriptor.getManifestCommand, packageName]; + const formatter = this.descriptor.viewCommandFieldArgFormatter; + if (formatter) { + commandArgs.push(...formatter(METADATA_FIELDS)); + } - return this.#fetchAndParse( - commandArgs, - (stdout, logger) => this.descriptor.outputParsers.getRegistryMetadata(stdout, logger), - { ...options, cache: this.#metadataCache, cacheKey }, - ); + metadata = await this.#fetchAndParse( + commandArgs, + (stdout, logger) => this.descriptor.outputParsers.getRegistryMetadata(stdout, logger), + options, + ); + } + + this.#metadataCache.set(cacheKey, metadata); + + return metadata; } /** @@ -647,6 +691,25 @@ export class PackageManager { // Writing an empty package.json file beforehand prevents this. await this.host.writeFile(join(workingDirectory, 'package.json'), '{}'); + // To prevent pnpm from traversing up the directory tree and modifying the project's workspace lockfile, + // copy the project's `pnpm-workspace.yaml` (excluding monorepo local overrides/packages) + // to the temporary directory if it exists, or write an empty one to act as a workspace boundary. + if (this.name === 'pnpm') { + try { + const workspaceConfigPath = join(this.cwd, 'pnpm-workspace.yaml'); + const content = await this.host.readFile(workspaceConfigPath); + await this.host.writeFile( + join(workingDirectory, 'pnpm-workspace.yaml'), + sanitizePnpmWorkspace(content), + ); + } catch { + await this.host.writeFile( + join(workingDirectory, 'pnpm-workspace.yaml'), + "packages:\n - '.'\n", + ); + } + } + // Copy configuration files if the package manager requires it (e.g., bun). if (this.descriptor.copyConfigFromProject) { for (const configFile of this.descriptor.configFiles) { @@ -675,3 +738,61 @@ export class PackageManager { return { workingDirectory, cleanup }; } } + +/** + * Sanitizes a `pnpm-workspace.yaml` file content to be safely used inside + * a temporary installation directory. + * + * This function removes monorepo-specific settings that would fail or cause + * unintended behaviors in a standalone, temporary project environment: + * 1. Removes the `overrides:` block, as it may contain `workspace:` protocol + * resolutions which cannot be resolved in a standalone folder. + * 2. Rewrites the `packages:` block to include only the current directory (`'.'`), + * isolating the temporary installation from other projects in the monorepo. + * + * All other settings (such as `minimumReleaseAge`, package extensions, etc.) + * are preserved intact. + * + * @param content The original `pnpm-workspace.yaml` content. + * @returns The sanitized YAML content. + */ +function sanitizePnpmWorkspace(content: string): string { + const lines = content.split(/\r?\n/); + const result: string[] = []; + let inBlockToRemove = false; + let blockIndent = 0; + + for (const line of lines) { + const trimmed = line.trim(); + if (!trimmed) { + result.push(line); + continue; + } + + // Determine the current line's indentation level. + const indent = line.length - line.trimStart().length; + + // If we are currently parsing a block to remove, skip any lines with larger indentation. + if (inBlockToRemove) { + if (indent > blockIndent) { + continue; + } + inBlockToRemove = false; + } + + // Identify blocks we want to remove or customize (e.g. 'overrides' or 'packages'). + if (trimmed.startsWith('overrides:') || trimmed.startsWith('packages:')) { + inBlockToRemove = true; + blockIndent = indent; + if (trimmed.startsWith('packages:')) { + // Replace packages list to restrict it strictly to the current standalone folder. + result.push(line.replace(/packages:.*/, "packages:\n - '.'")); + } + continue; + } + + result.push(line); + } + + return result.join('\n'); +} diff --git a/packages/angular/cli/src/package-managers/package-manager_spec.ts b/packages/angular/cli/src/package-managers/package-manager_spec.ts index 8d439d9b3b75..105fcf5930b0 100644 --- a/packages/angular/cli/src/package-managers/package-manager_spec.ts +++ b/packages/angular/cli/src/package-managers/package-manager_spec.ts @@ -86,6 +86,151 @@ describe('PackageManager', () => { }); }); + describe('acquireTempPackage', () => { + it('should copy and sanitize pnpm-workspace.yaml when package manager is pnpm and workspace file exists', async () => { + const pnpmDescriptor = SUPPORTED_PACKAGE_MANAGERS['pnpm']; + const testHost = new MockHost({ '/tmp/project/node_modules': true }); + const pm = new PackageManager(testHost, '/tmp/project', pnpmDescriptor); + + const createTempDirectorySpy = spyOn(testHost, 'createTempDirectory').and.resolveTo( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc', + ); + const mockWorkspaceContent = [ + 'packages:', + ' - .', + ' - packages/*', + 'minimumReleaseAge: 1440', + 'minimumReleaseAgeExclude:', + " - '@angular/*'", + 'overrides:', + " '@angular/build': workspace:*", + 'packageExtensions:', + ' vitest:', + ' peerDependencies:', + " '@vitest/coverage-v8': '*'", + ].join('\n'); + const readFileSpy = spyOn(testHost, 'readFile').and.resolveTo(mockWorkspaceContent); + const writeFileSpy = spyOn(testHost, 'writeFile').and.resolveTo(); + spyOn(testHost, 'runCommand').and.resolveTo({ stdout: '', stderr: '' }); + + const { workingDirectory } = await pm.acquireTempPackage('foo@1.0.0'); + + expect(workingDirectory).toBe('/tmp/project/node_modules/angular-cli-tmp-packages-abc'); + expect(createTempDirectorySpy).toHaveBeenCalledWith('/tmp/project/node_modules'); + expect(readFileSpy).toHaveBeenCalledWith('/tmp/project/pnpm-workspace.yaml'); + + const expectedSanitizedContent = [ + 'packages:', + " - '.'", + 'minimumReleaseAge: 1440', + 'minimumReleaseAgeExclude:', + " - '@angular/*'", + 'packageExtensions:', + ' vitest:', + ' peerDependencies:', + " '@vitest/coverage-v8': '*'", + ].join('\n'); + expect(writeFileSpy).toHaveBeenCalledWith( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc/pnpm-workspace.yaml', + expectedSanitizedContent, + ); + expect(writeFileSpy).toHaveBeenCalledWith( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc/package.json', + '{}', + ); + }); + + it('should write empty pnpm-workspace.yaml as fallback when package manager is pnpm and workspace file does not exist', async () => { + const pnpmDescriptor = SUPPORTED_PACKAGE_MANAGERS['pnpm']; + const testHost = new MockHost({ '/tmp/project/node_modules': true }); + const pm = new PackageManager(testHost, '/tmp/project', pnpmDescriptor); + + const createTempDirectorySpy = spyOn(testHost, 'createTempDirectory').and.resolveTo( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc', + ); + const readFileSpy = spyOn(testHost, 'readFile').and.throwError( + new Error('ENOENT: no such file or directory'), + ); + const writeFileSpy = spyOn(testHost, 'writeFile').and.resolveTo(); + spyOn(testHost, 'runCommand').and.resolveTo({ stdout: '', stderr: '' }); + + const { workingDirectory } = await pm.acquireTempPackage('foo@1.0.0'); + + expect(workingDirectory).toBe('/tmp/project/node_modules/angular-cli-tmp-packages-abc'); + expect(createTempDirectorySpy).toHaveBeenCalledWith('/tmp/project/node_modules'); + expect(readFileSpy).toHaveBeenCalledWith('/tmp/project/pnpm-workspace.yaml'); + expect(writeFileSpy).toHaveBeenCalledWith( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc/package.json', + '{}', + ); + expect(writeFileSpy).toHaveBeenCalledWith( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc/pnpm-workspace.yaml', + "packages:\n - '.'\n", + ); + }); + + it('should NOT write pnpm-workspace.yaml when package manager is npm', async () => { + const npmDescriptor = SUPPORTED_PACKAGE_MANAGERS['npm']; + const testHost = new MockHost({ '/tmp/project/node_modules': true }); + const pm = new PackageManager(testHost, '/tmp/project', npmDescriptor); + + const createTempDirectorySpy = spyOn(testHost, 'createTempDirectory').and.resolveTo( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc', + ); + const writeFileSpy = spyOn(testHost, 'writeFile').and.resolveTo(); + spyOn(testHost, 'runCommand').and.resolveTo({ stdout: '', stderr: '' }); + + const { workingDirectory } = await pm.acquireTempPackage('foo@1.0.0'); + + expect(workingDirectory).toBe('/tmp/project/node_modules/angular-cli-tmp-packages-abc'); + expect(createTempDirectorySpy).toHaveBeenCalledWith('/tmp/project/node_modules'); + expect(writeFileSpy).toHaveBeenCalledWith( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc/package.json', + '{}', + ); + expect(writeFileSpy).not.toHaveBeenCalledWith( + '/tmp/project/node_modules/angular-cli-tmp-packages-abc/pnpm-workspace.yaml', + '', + ); + }); + }); + + describe('getRegistryMetadata', () => { + it('should query dist-tags and versions separately for bun', async () => { + const bunDescriptor = SUPPORTED_PACKAGE_MANAGERS['bun']; + const pm = new PackageManager(host, '/tmp', bunDescriptor); + + runCommandSpy.and.callFake((binary, args) => { + if (args.includes('dist-tags')) { + return Promise.resolve({ stdout: JSON.stringify({ latest: '2.0.0' }), stderr: '' }); + } else if (args.includes('versions')) { + return Promise.resolve({ stdout: JSON.stringify(['1.0.0', '2.0.0']), stderr: '' }); + } + + return Promise.resolve({ stdout: '', stderr: '' }); + }); + + const metadata = await pm.getRegistryMetadata('foo'); + + expect(metadata).toEqual({ + name: 'foo', + 'dist-tags': { latest: '2.0.0' }, + versions: ['1.0.0', '2.0.0'], + }); + + expect(runCommandSpy).toHaveBeenCalledWith( + 'bun', + ['pm', 'view', '--json', 'foo', 'dist-tags'], + jasmine.anything(), + ); + expect(runCommandSpy).toHaveBeenCalledWith( + 'bun', + ['pm', 'view', '--json', 'foo', 'versions'], + jasmine.anything(), + ); + }); + }); + describe('initializationError', () => { it('should throw initializationError when running commands', async () => { const error = new Error('Not installed'); diff --git a/packages/angular/cli/src/package-managers/testing/mock-host.ts b/packages/angular/cli/src/package-managers/testing/mock-host.ts index 46e71be3cf60..9051cfae3b04 100644 --- a/packages/angular/cli/src/package-managers/testing/mock-host.ts +++ b/packages/angular/cli/src/package-managers/testing/mock-host.ts @@ -51,27 +51,36 @@ export class MockHost implements Host { } as Stats); } - runCommand(): Promise<{ stdout: string; stderr: string }> { + runCommand( + command: string, + args: readonly string[], + options?: { + timeout?: number; + stdio?: 'pipe' | 'ignore'; + cwd?: string; + env?: Record; + }, + ): Promise<{ stdout: string; stderr: string }> { throw new Error('Method not implemented.'); } - createTempDirectory(): Promise { + createTempDirectory(baseDir?: string): Promise { throw new Error('Method not implemented.'); } - deleteDirectory(): Promise { + deleteDirectory(path: string): Promise { throw new Error('Method not implemented.'); } - writeFile(): Promise { + writeFile(path: string, content: string): Promise { throw new Error('Method not implemented.'); } - readFile(): Promise { + readFile(path: string): Promise { throw new Error('Method not implemented.'); } - copyFile(): Promise { + copyFile(src: string, dest: string): Promise { throw new Error('Method not implemented.'); } } diff --git a/packages/angular/cli/src/utilities/package-metadata.ts b/packages/angular/cli/src/utilities/package-metadata.ts index fd31000f989a..05a739e898ae 100644 --- a/packages/angular/cli/src/utilities/package-metadata.ts +++ b/packages/angular/cli/src/utilities/package-metadata.ts @@ -52,9 +52,7 @@ export interface PackageManifest extends Manifest, NgPackageManifestProperties { peerDependenciesMeta?: Record; } -interface PackageManagerOptions extends Record { - forceAuth?: Record; -} +type PackageManagerOptions = Record; let npmrc: PackageManagerOptions; const npmPackageJsonCache = new Map>>(); @@ -175,19 +173,6 @@ function normalizeOptions( } switch (key) { - // Unless auth options are scope with the registry url it appears that npm-registry-fetch ignores them, - // even though they are documented. - // https://github.com/npm/npm-registry-fetch/blob/8954f61d8d703e5eb7f3d93c9b40488f8b1b62ac/README.md - // https://github.com/npm/npm-registry-fetch/blob/8954f61d8d703e5eb7f3d93c9b40488f8b1b62ac/auth.js#L45-L91 - case '_authToken': - case 'token': - case 'username': - case 'password': - case '_auth': - case 'auth': - options['forceAuth'] ??= {}; - options['forceAuth'][key] = substitutedValue; - break; case 'noproxy': case 'no-proxy': options['noProxy'] = substitutedValue; diff --git a/packages/angular/ssr/node/src/app-engine.ts b/packages/angular/ssr/node/src/app-engine.ts index b947107a3c5a..89e6a942856b 100644 --- a/packages/angular/ssr/node/src/app-engine.ts +++ b/packages/angular/ssr/node/src/app-engine.ts @@ -38,8 +38,8 @@ export class AngularNodeAppEngine { constructor(options?: AngularNodeAppEngineOptions) { const appEngineOptions: AngularAppEngineOptions = { ...options, - allowedHosts: getAllowedHostsFromEnv() ?? options?.allowedHosts, - trustProxyHeaders: getTrustProxyHeadersFromEnv() ?? options?.trustProxyHeaders, + allowedHosts: options?.allowedHosts ?? getAllowedHostsFromEnv(), + trustProxyHeaders: options?.trustProxyHeaders ?? getTrustProxyHeadersFromEnv(), }; this.angularAppEngine = new AngularAppEngine(appEngineOptions); diff --git a/packages/angular/ssr/node/src/common-engine/common-engine.ts b/packages/angular/ssr/node/src/common-engine/common-engine.ts index 708d263cde84..8db528f30f34 100644 --- a/packages/angular/ssr/node/src/common-engine/common-engine.ts +++ b/packages/angular/ssr/node/src/common-engine/common-engine.ts @@ -167,17 +167,19 @@ export class CommonEngine { if (pagePath === resolve(documentFilePath) || !(await exists(pagePath))) { // View matches with prerender path or file does not exist. - this.pageIsSSG.set(pagePath, false); - return undefined; } // Static file exists. const content = await fs.promises.readFile(pagePath, 'utf-8'); const isSSG = SSG_MARKER_REGEXP.test(content); - this.pageIsSSG.set(pagePath, isSSG); + if (isSSG) { + this.pageIsSSG.set(pagePath, true); + + return content; + } - return isSSG ? content : undefined; + return undefined; } private async renderApplication(opts: CommonEngineRenderOptions): Promise { @@ -200,6 +202,8 @@ export class CommonEngine { const commonRenderingOptions = { url: opts.url, document, + // Validation is already happened in the render method. + allowedHosts: ['*'], }; return isBootstrapFn(moduleOrFactory) diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index 9cfd3d126e0a..92ef2a11dd66 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -3,13 +3,21 @@ "version": "0.0.0-PLACEHOLDER", "description": "Angular server side rendering utilities", "type": "module", - "license": "MIT", - "homepage": "https://github.com/angular/angular-cli", "keywords": [ "angular", "ssr", "universal" ], + "repository": { + "type": "git", + "url": "git+https://github.com/angular/angular-cli.git" + }, + "author": "Angular Authors", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular-cli/issues" + }, + "homepage": "https://github.com/angular/angular-cli", "ng-add": { "save": "dependencies" }, @@ -29,19 +37,15 @@ }, "devDependencies": { "@angular-devkit/schematics": "workspace:*", - "@angular/common": "22.0.0-next.10", - "@angular/compiler": "22.0.0-next.10", - "@angular/core": "22.0.0-next.10", - "@angular/platform-browser": "22.0.0-next.10", - "@angular/platform-server": "22.0.0-next.10", - "@angular/router": "22.0.0-next.10", + "@angular/common": "22.0.5", + "@angular/compiler": "22.0.5", + "@angular/core": "22.0.5", + "@angular/platform-browser": "22.0.5", + "@angular/platform-server": "22.0.5", + "@angular/router": "22.0.5", "@schematics/angular": "workspace:*", "beasties": "0.4.2" }, "sideEffects": false, - "schematics": "./schematics/collection.json", - "repository": { - "type": "git", - "url": "git+https://github.com/angular/angular-cli.git" - } + "schematics": "./schematics/collection.json" } diff --git a/packages/angular/ssr/public_api.ts b/packages/angular/ssr/public_api.ts index eb05be266588..5bf442a0905b 100644 --- a/packages/angular/ssr/public_api.ts +++ b/packages/angular/ssr/public_api.ts @@ -23,6 +23,7 @@ export { type ServerRoutePrerenderWithParams, type ServerRouteServer, type ServerRouteCommon, + type ServerRenderingOptions, } from './src/routes/route-config'; export { IS_DISCOVERING_ROUTES } from './src/routes/ng-routes'; diff --git a/packages/angular/ssr/src/app.ts b/packages/angular/ssr/src/app.ts index 0c381c08ae88..a9ca7dd05fe3 100644 --- a/packages/angular/ssr/src/app.ts +++ b/packages/angular/ssr/src/app.ts @@ -353,7 +353,7 @@ export class AngularServerApp { } if (result.redirectTo) { - return createRedirectResponse(result.redirectTo, responseInit.status, headers); + return createRedirectResponse(result.redirectTo, responseInit.status, responseInit.headers); } if (renderMode === RenderMode.Prerender) { diff --git a/packages/angular/ssr/src/routes/ng-routes.ts b/packages/angular/ssr/src/routes/ng-routes.ts index 438e8450d331..ac83aae8cd4f 100644 --- a/packages/angular/ssr/src/routes/ng-routes.ts +++ b/packages/angular/ssr/src/routes/ng-routes.ts @@ -74,9 +74,14 @@ const MODULE_PRELOAD_MAX = 10; const CATCH_ALL_REGEXP = /\/(\*\*)$/; /** - * Regular expression to match segments preceded by a colon in a string. + * Regular expression to match a segment preceded by a colon in a string. */ -const URL_PARAMETER_REGEXP = /(?[] +): EnvironmentProviders; + +/** + * Configures server-side rendering for an Angular application with additional options. + * + * This function sets up the necessary providers for server-side rendering, including + * support for server routes and app shell. It combines features configured using + * `withRoutes` and `withAppShell` to provide a comprehensive server-side rendering setup. + * + * @param options - Configuration options for server-side rendering. + * @param features - Optional features to configure additional server rendering behaviors. + * @returns An `EnvironmentProviders` instance with the server-side rendering configuration. + * + * @example + * Basic example of how you can enable server-side rendering with options in your application + * when using the `bootstrapApplication` function: + * + * ```ts + * import { bootstrapApplication, BootstrapContext } from '@angular/platform-browser'; + * import { provideServerRendering, withRoutes, withAppShell } from '@angular/ssr'; + * import { AppComponent } from './app/app.component'; + * import { SERVER_ROUTES } from './app/app.server.routes'; + * import { AppShellComponent } from './app/app-shell.component'; + * + * const bootstrap = (context: BootstrapContext) => + * bootstrapApplication(AppComponent, { + * providers: [ + * provideServerRendering( + * { maxResponseBodySize: 1024 * 1024 }, // 1MB limit + * withRoutes(SERVER_ROUTES), + * withAppShell(AppShellComponent), + * ), + * ], + * }, context); + * + * export default bootstrap; + * ``` + * @see {@link withRoutes} configures server-side routing + * @see {@link withAppShell} configures the application shell + */ +export function provideServerRendering( + options: ServerRenderingOptions, + ...features: ServerRenderingFeature[] +): EnvironmentProviders; +export function provideServerRendering( + ...args: + | ServerRenderingFeature[] + | [ServerRenderingOptions, ...ServerRenderingFeature[]] ): EnvironmentProviders { + let options: ServerRenderingOptions | undefined; + let features: ServerRenderingFeature[]; + if (hasOptions(args)) { + const [first, ...rest] = args; + options = first; + features = rest; + } else { + features = args; + } + + const providers: (Provider | EnvironmentProviders)[] = [ + provideServerRenderingPlatformServer(options), + ]; + let hasAppShell = false; let hasServerRoutes = false; - const providers: (Provider | EnvironmentProviders)[] = [provideServerRenderingPlatformServer()]; for (const { ɵkind, ɵproviders } of features) { hasAppShell ||= ɵkind === ServerRenderingFeatureKind.AppShell; @@ -399,3 +471,16 @@ export function provideServerRendering( return makeEnvironmentProviders(providers); } + +/** + * Checks if the first element of args is a `ServerRenderingOptions` object. + */ +function hasOptions( + args: + | ServerRenderingFeature[] + | [ServerRenderingOptions, ...ServerRenderingFeature[]], +): args is [ServerRenderingOptions, ...ServerRenderingFeature[]] { + const value = args[0]; + + return !!value && typeof value === 'object' && !('ɵkind' in value); +} diff --git a/packages/angular/ssr/src/utils/ng.ts b/packages/angular/ssr/src/utils/ng.ts index 2c4ada0b8c6d..55d054bd2387 100644 --- a/packages/angular/ssr/src/utils/ng.ts +++ b/packages/angular/ssr/src/utils/ng.ts @@ -40,8 +40,7 @@ export type AngularBootstrap = /** * Renders an Angular application or module to an HTML string. * - * This function determines whether the provided `bootstrap` value is an Angular module - * or a bootstrap function and invokes the appropriate rendering method (`renderModule` or `renderApplication`). + * This function supports both Angular modules and bootstrap functions for application initialization. * * @param html - The initial HTML document content. * @param bootstrap - An Angular module type or a function returning a promise that resolves to an `ApplicationRef`. diff --git a/packages/angular/ssr/src/utils/redirect.ts b/packages/angular/ssr/src/utils/redirect.ts index 79fb10f424dc..b67f53265c17 100644 --- a/packages/angular/ssr/src/utils/redirect.ts +++ b/packages/angular/ssr/src/utils/redirect.ts @@ -9,7 +9,9 @@ /** * An set of HTTP status codes that are considered valid for redirect responses. */ -export const VALID_REDIRECT_RESPONSE_CODES: Set = new Set([301, 302, 303, 307, 308]); +export const VALID_REDIRECT_RESPONSE_CODES: ReadonlySet = new Set([ + 301, 302, 303, 307, 308, +]); /** * Checks if the given HTTP status code is a valid redirect response code. @@ -33,7 +35,7 @@ export function isValidRedirectResponseCode(code: number): boolean { export function createRedirectResponse( location: string, status = 302, - headers?: Record, + headers?: Record | Headers, ): Response { if (ngDevMode && !isValidRedirectResponseCode(status)) { throw new Error( @@ -42,11 +44,11 @@ export function createRedirectResponse( ); } - const resHeaders = new Headers(headers); + const resHeaders = headers instanceof Headers ? headers : new Headers(headers); if (ngDevMode && resHeaders.has('location')) { // eslint-disable-next-line no-console console.warn( - `Location header "${resHeaders.get('location')}" will ignored and set to "${location}".`, + `Location header "${resHeaders.get('location')}" will be ignored and set to "${location}".`, ); } diff --git a/packages/angular/ssr/src/utils/validation.ts b/packages/angular/ssr/src/utils/validation.ts index f1f7d741dff7..3d57244c963e 100644 --- a/packages/angular/ssr/src/utils/validation.ts +++ b/packages/angular/ssr/src/utils/validation.ts @@ -7,15 +7,9 @@ */ /** - * Common X-Forwarded-* headers. + * Internal sentinel string representing a wildcard rule to trust all proxy headers. */ -const X_FORWARDED_HEADERS: ReadonlySet = new Set([ - 'x-forwarded-for', - 'x-forwarded-host', - 'x-forwarded-port', - 'x-forwarded-proto', - 'x-forwarded-prefix', -]); +const TRUST_ALL_PROXY_HEADERS = '*'; /** * The set of headers that should be validated for host header injection attacks. @@ -235,7 +229,10 @@ export function isProxyHeaderAllowed( headerName: string, trustProxyHeaders: ReadonlySet, ): boolean { - return trustProxyHeaders.has(headerName.toLowerCase()); + return ( + trustProxyHeaders.has(TRUST_ALL_PROXY_HEADERS) || + trustProxyHeaders.has(headerName.toLowerCase()) + ); } /** @@ -251,8 +248,15 @@ export function normalizeTrustProxyHeaders( } if (trustProxyHeaders === true) { - return X_FORWARDED_HEADERS; + return new Set([TRUST_ALL_PROXY_HEADERS]); } - return new Set(trustProxyHeaders.map((h) => h.toLowerCase())); + const normalizedTrustedProxyHeaders = new Set(trustProxyHeaders.map((h) => h.toLowerCase())); + if (normalizedTrustedProxyHeaders.has(TRUST_ALL_PROXY_HEADERS)) { + throw new Error( + `"${TRUST_ALL_PROXY_HEADERS}" is not allowed as a value for the "trustProxyHeaders" option.`, + ); + } + + return normalizedTrustedProxyHeaders; } diff --git a/packages/angular/ssr/test/app_spec.ts b/packages/angular/ssr/test/app_spec.ts index b35424796467..de4b1bcb988e 100644 --- a/packages/angular/ssr/test/app_spec.ts +++ b/packages/angular/ssr/test/app_spec.ts @@ -42,6 +42,10 @@ describe('AngularServerApp', () => { const responseInit = inject(RESPONSE_INIT); if (responseInit) { responseInit.status = 308; + const headers = responseInit.headers; + if (headers) { + (headers as Headers).set('X-Redirect-Header', 'custom-value'); + } } void inject(Router).navigate([], { @@ -326,6 +330,7 @@ describe('AngularServerApp', () => { const response = await app.handle(new Request('http://localhost/redirect-via-navigate')); expect(response?.headers.get('location')).toBe('/redirect-via-navigate?filter=test'); expect(response?.status).toBe(308); + expect(response?.headers.get('X-Redirect-Header')).toBe('custom-value'); }); it('returns a 302 status and redirects to the correct location when `urlTree` is updated in a guard', async () => { diff --git a/packages/angular/ssr/test/routes/ng-routes_spec.ts b/packages/angular/ssr/test/routes/ng-routes_spec.ts index 1532eb337faa..e214c31eab71 100644 --- a/packages/angular/ssr/test/routes/ng-routes_spec.ts +++ b/packages/angular/ssr/test/routes/ng-routes_spec.ts @@ -502,6 +502,35 @@ describe('extractRoutesAndCreateRouteTree', () => { ]); }); + it('should extract nested redirects with multiple path parameters', async () => { + setAngularAppTestingManifest( + [ + { + path: ':param1/:param2', + children: [ + { + path: '', + pathMatch: 'full', + redirectTo: 'thing', + }, + { + path: 'thing', + component: DummyComponent, + }, + ], + }, + ], + [{ path: '**', renderMode: RenderMode.Server }], + ); + + const { routeTree, errors } = await extractRoutesAndCreateRouteTree({ url }); + expect(errors).toHaveSize(0); + expect(routeTree.toObject()).toEqual([ + { route: '/*/*', renderMode: RenderMode.Server, redirectTo: '/*/*/thing' }, + { route: '/*/*/thing', renderMode: RenderMode.Server }, + ]); + }); + it('should not resolve parameterized routes for SSG when `invokeGetPrerenderParams` is false', async () => { setAngularAppTestingManifest( [ diff --git a/packages/angular/ssr/test/utils/redirect_spec.ts b/packages/angular/ssr/test/utils/redirect_spec.ts index b26edd458ac3..4d0b94a87798 100644 --- a/packages/angular/ssr/test/utils/redirect_spec.ts +++ b/packages/angular/ssr/test/utils/redirect_spec.ts @@ -52,7 +52,7 @@ describe('Redirect Utils', () => { const warnSpy = spyOn(console, 'warn'); createRedirectResponse('/home', 302, { 'Location': '/evil' }); expect(warnSpy).toHaveBeenCalledWith( - 'Location header "/evil" will ignored and set to "/home".', + 'Location header "/evil" will be ignored and set to "/home".', ); }); diff --git a/packages/angular/ssr/test/utils/validation_spec.ts b/packages/angular/ssr/test/utils/validation_spec.ts index 618b7f7ea2bf..65562c21a755 100644 --- a/packages/angular/ssr/test/utils/validation_spec.ts +++ b/packages/angular/ssr/test/utils/validation_spec.ts @@ -8,6 +8,7 @@ import { getFirstHeaderValue, + normalizeTrustProxyHeaders, sanitizeRequestHeaders, validateRequest, validateUrl, @@ -37,6 +38,35 @@ describe('Validation Utils', () => { }); }); + describe('normalizeTrustProxyHeaders', () => { + it('should return an empty set when input is undefined', () => { + expect(normalizeTrustProxyHeaders(undefined)).toEqual(new Set()); + }); + + it('should return an empty set when input is false', () => { + expect(normalizeTrustProxyHeaders(false)).toEqual(new Set()); + }); + + it('should return a set containing "*" when input is true', () => { + expect(normalizeTrustProxyHeaders(true)).toEqual(new Set(['*'])); + }); + + it('should return a set of lowercased header names when input is an array of strings', () => { + expect(normalizeTrustProxyHeaders(['X-Forwarded-Host', 'X-Forwarded-Proto'])).toEqual( + new Set(['x-forwarded-host', 'x-forwarded-proto']), + ); + }); + + it('should throw an error if input array contains "*"', () => { + expect(() => normalizeTrustProxyHeaders(['*'])).toThrowError( + '"*" is not allowed as a value for the "trustProxyHeaders" option.', + ); + expect(() => normalizeTrustProxyHeaders(['X-Forwarded-Host', '*'])).toThrowError( + '"*" is not allowed as a value for the "trustProxyHeaders" option.', + ); + }); + }); + describe('validateUrl', () => { const allowedHosts = new Set(['example.com', '*.google.com']); @@ -224,15 +254,29 @@ describe('Validation Utils', () => { 'x-forwarded-proto': 'https', }, }); - const secured = sanitizeRequestHeaders(req, new Set()); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(undefined)); expect(secured.headers.get('host')).toBe('example.com'); expect(secured.headers.has('x-forwarded-host')).toBeFalse(); expect(secured.headers.has('x-forwarded-proto')).toBeFalse(); }); - it('should retain allowed proxy headers when explicitly provided', () => { - const trustProxyHeaders = new Set(['x-forwarded-host']); + it('should scrub unallowed proxy headers when trustProxyHeaders is false', () => { + const req = new Request('http://example.com', { + headers: { + 'host': 'example.com', + 'x-forwarded-host': 'evil.com', + 'x-forwarded-proto': 'https', + }, + }); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(false)); + + expect(secured.headers.get('host')).toBe('example.com'); + expect(secured.headers.has('x-forwarded-host')).toBeFalse(); + expect(secured.headers.has('x-forwarded-proto')).toBeFalse(); + }); + + it('should only retain allowed proxy headers when explicitly provided', () => { const req = new Request('http://example.com', { headers: { 'host': 'example.com', @@ -240,7 +284,7 @@ describe('Validation Utils', () => { 'x-forwarded-proto': 'https', }, }); - const secured = sanitizeRequestHeaders(req, trustProxyHeaders); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(['x-forwarded-host'])); expect(secured.headers.get('host')).toBe('example.com'); expect(secured.headers.get('x-forwarded-host')).toBe('proxy.com'); @@ -253,23 +297,22 @@ describe('Validation Utils', () => { 'host': 'example.com', 'x-forwarded-host': 'proxy.com', 'x-forwarded-proto': 'https', + 'x-forwarded-email': 'user@example.com', }, }); - const secured = sanitizeRequestHeaders( - req, - new Set(['x-forwarded-host', 'x-forwarded-proto']), - ); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(true)); expect(secured.headers.get('host')).toBe('example.com'); expect(secured.headers.get('x-forwarded-host')).toBe('proxy.com'); expect(secured.headers.get('x-forwarded-proto')).toBe('https'); + expect(secured.headers.get('x-forwarded-email')).toBe('user@example.com'); }); it('should not clone the request if no proxy headers need to be removed', () => { const req = new Request('http://example.com', { headers: { 'accept': 'application/json' }, }); - const secured = sanitizeRequestHeaders(req, new Set()); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(false)); expect(secured).toBe(req); expect(secured.headers.get('accept')).toBe('application/json'); diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index f50208e0e73f..7f9ad912be97 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -28,7 +28,7 @@ "browserslist": "^4.26.0", "copy-webpack-plugin": "14.0.0", "css-loader": "7.1.4", - "esbuild-wasm": "0.28.0", + "esbuild-wasm": "0.28.1", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", @@ -41,7 +41,7 @@ "open": "11.0.0", "ora": "9.4.0", "picomatch": "4.0.4", - "piscina": "5.1.4", + "piscina": "5.2.0", "postcss": "8.5.13", "postcss-loader": "8.2.1", "resolve-url-loader": "5.0.0", @@ -61,12 +61,12 @@ "webpack-subresource-integrity": "5.1.0" }, "optionalDependencies": { - "esbuild": "0.28.0" + "esbuild": "0.28.1" }, "devDependencies": { "@angular/ssr": "workspace:*", "browser-sync": "3.0.4", - "ng-packagr": "22.0.0-next.3", + "ng-packagr": "22.0.1", "undici": "8.2.0" }, "peerDependencies": { diff --git a/packages/angular_devkit/build_angular/src/builders/browser/index.ts b/packages/angular_devkit/build_angular/src/builders/browser/index.ts index f78d9ecd2e8e..355c407192e5 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/index.ts @@ -6,6 +6,8 @@ * found in the LICENSE file at https://angular.dev/license */ +/* eslint-disable max-lines-per-function */ + import { BudgetCalculatorResult, FileInfo, @@ -113,7 +115,6 @@ async function initialize( /** * @experimental Direct usage of this function is considered experimental. */ -// eslint-disable-next-line max-lines-per-function export function buildWebpackBrowser( options: BrowserBuilderSchema, context: BuilderContext, @@ -165,267 +166,260 @@ export function buildWebpackBrowser( cacheOptions: normalizeCacheOptions(projectMetadata, context.workspaceRoot), }; }), - switchMap( - // eslint-disable-next-line max-lines-per-function - ({ config, projectRoot, projectSourceRoot, i18n, cacheOptions }) => { - const normalizedOptimization = normalizeOptimization(options.optimization); - - return runWebpack(config, context, { - webpackFactory: require('webpack') as typeof webpack, - logging: - transforms.logging || - ((stats, config) => { - if (options.verbose && config.stats !== false) { - const statsOptions = config.stats === true ? undefined : config.stats; - context.logger.info(stats.toString(statsOptions)); + switchMap(({ config, projectRoot, projectSourceRoot, i18n, cacheOptions }) => { + const normalizedOptimization = normalizeOptimization(options.optimization); + + return runWebpack(config, context, { + webpackFactory: require('webpack') as typeof webpack, + logging: + transforms.logging || + ((stats, config) => { + if (options.verbose && config.stats !== false) { + const statsOptions = config.stats === true ? undefined : config.stats; + context.logger.info(stats.toString(statsOptions)); + } + }), + }).pipe( + concatMap( + async ( + buildEvent, + ): Promise<{ output: BuilderOutput; webpackStats: StatsCompilation }> => { + const spinner = new Spinner(); + spinner.enabled = options.progress !== false; + + const { success, emittedFiles = [], outputPath: webpackOutputPath } = buildEvent; + const webpackRawStats = buildEvent.webpackStats; + if (!webpackRawStats) { + throw new Error('Webpack stats build result is required.'); + } + + // Fix incorrectly set `initial` value on chunks. + const extraEntryPoints = [ + ...normalizeExtraEntryPoints(options.styles || [], 'styles'), + ...normalizeExtraEntryPoints(options.scripts || [], 'scripts'), + ]; + + const webpackStats = { + ...webpackRawStats, + chunks: markAsyncChunksNonInitial(webpackRawStats, extraEntryPoints), + }; + + if (!success) { + // If using bundle downleveling then there is only one build + // If it fails show any diagnostic messages and bail + if (statsHasWarnings(webpackStats)) { + context.logger.warn(statsWarningsToString(webpackStats, { colors: true })); } - }), - }).pipe( - concatMap( - // eslint-disable-next-line max-lines-per-function - async ( - buildEvent, - ): Promise<{ output: BuilderOutput; webpackStats: StatsCompilation }> => { - const spinner = new Spinner(); - spinner.enabled = options.progress !== false; - - const { success, emittedFiles = [], outputPath: webpackOutputPath } = buildEvent; - const webpackRawStats = buildEvent.webpackStats; - if (!webpackRawStats) { - throw new Error('Webpack stats build result is required.'); + if (statsHasErrors(webpackStats)) { + context.logger.error(statsErrorsToString(webpackStats, { colors: true })); } - // Fix incorrectly set `initial` value on chunks. - const extraEntryPoints = [ - ...normalizeExtraEntryPoints(options.styles || [], 'styles'), - ...normalizeExtraEntryPoints(options.scripts || [], 'scripts'), - ]; - - const webpackStats = { - ...webpackRawStats, - chunks: markAsyncChunksNonInitial(webpackRawStats, extraEntryPoints), + return { + webpackStats: webpackRawStats, + output: { success: false }, }; - - if (!success) { - // If using bundle downleveling then there is only one build - // If it fails show any diagnostic messages and bail - if (statsHasWarnings(webpackStats)) { - context.logger.warn(statsWarningsToString(webpackStats, { colors: true })); + } else { + outputPaths = ensureOutputPaths(baseOutputPath, i18n); + + const scriptsEntryPointName = normalizeExtraEntryPoints( + options.scripts || [], + 'scripts', + ).map((x) => x.bundleName); + + if (i18n.shouldInline) { + const success = await i18nInlineEmittedFiles( + context, + emittedFiles, + i18n, + baseOutputPath, + Array.from(outputPaths.values()), + scriptsEntryPointName, + webpackOutputPath, + options.i18nMissingTranslation, + ); + if (!success) { + return { + webpackStats: webpackRawStats, + output: { success: false }, + }; } - if (statsHasErrors(webpackStats)) { - context.logger.error(statsErrorsToString(webpackStats, { colors: true })); + } + + // Check for budget errors and display them to the user. + const budgets = options.budgets; + let budgetFailures: BudgetCalculatorResult[] | undefined; + if (budgets?.length) { + budgetFailures = [...checkBudgets(budgets, webpackStats)]; + for (const { severity, message } of budgetFailures) { + switch (severity) { + case ThresholdSeverity.Warning: + webpackStats.warnings?.push({ message }); + break; + case ThresholdSeverity.Error: + webpackStats.errors?.push({ message }); + break; + default: + assertNever(severity); + } } + } + + const buildSuccess = success && !statsHasErrors(webpackStats); + if (buildSuccess) { + // Copy assets + if (!options.watch && options.assets?.length) { + spinner.start('Copying assets...'); + try { + await copyAssets( + normalizeAssetPatterns( + options.assets, + context.workspaceRoot, + projectRoot, + projectSourceRoot, + ), + Array.from(outputPaths.values()), + context.workspaceRoot, + ); + spinner.succeed('Copying assets complete.'); + } catch (err) { + spinner.fail('Copying of assets failed.'); + assertIsError(err); - return { - webpackStats: webpackRawStats, - output: { success: false }, - }; - } else { - outputPaths = ensureOutputPaths(baseOutputPath, i18n); - - const scriptsEntryPointName = normalizeExtraEntryPoints( - options.scripts || [], - 'scripts', - ).map((x) => x.bundleName); - - if (i18n.shouldInline) { - const success = await i18nInlineEmittedFiles( - context, - emittedFiles, - i18n, - baseOutputPath, - Array.from(outputPaths.values()), - scriptsEntryPointName, - webpackOutputPath, - options.i18nMissingTranslation, - ); - if (!success) { return { + output: { + success: false, + error: 'Unable to copy assets: ' + err.message, + }, webpackStats: webpackRawStats, - output: { success: false }, }; } } - // Check for budget errors and display them to the user. - const budgets = options.budgets; - let budgetFailures: BudgetCalculatorResult[] | undefined; - if (budgets?.length) { - budgetFailures = [...checkBudgets(budgets, webpackStats)]; - for (const { severity, message } of budgetFailures) { - switch (severity) { - case ThresholdSeverity.Warning: - webpackStats.warnings?.push({ message }); - break; - case ThresholdSeverity.Error: - webpackStats.errors?.push({ message }); - break; - default: - assertNever(severity); - } - } - } - - const buildSuccess = success && !statsHasErrors(webpackStats); - if (buildSuccess) { - // Copy assets - if (!options.watch && options.assets?.length) { - spinner.start('Copying assets...'); + if (options.index) { + spinner.start('Generating index html...'); + + const entrypoints = generateEntryPoints({ + scripts: options.scripts ?? [], + styles: options.styles ?? [], + }); + + const indexHtmlGenerator = new IndexHtmlGenerator({ + cache: cacheOptions, + indexPath: path.join(context.workspaceRoot, getIndexInputFile(options.index)), + entrypoints, + deployUrl: options.deployUrl, + sri: options.subresourceIntegrity, + optimization: normalizedOptimization, + crossOrigin: options.crossOrigin, + postTransform: transforms.indexHtml, + imageDomains: Array.from(imageDomains), + }); + + let hasErrors = false; + for (const [locale, outputPath] of outputPaths.entries()) { try { - await copyAssets( - normalizeAssetPatterns( - options.assets, - context.workspaceRoot, - projectRoot, - projectSourceRoot, - ), - Array.from(outputPaths.values()), - context.workspaceRoot, - ); - spinner.succeed('Copying assets complete.'); - } catch (err) { - spinner.fail('Copying of assets failed.'); - assertIsError(err); + const { + csrContent: content, + warnings, + errors, + } = await indexHtmlGenerator.process({ + baseHref: getLocaleBaseHref(i18n, locale) ?? options.baseHref, + // i18nLocale is used when Ivy is disabled + lang: locale || undefined, + outputPath, + files: mapEmittedFilesToFileInfo(emittedFiles), + }); + + if (warnings.length || errors.length) { + spinner.stop(); + warnings.forEach((m) => context.logger.warn(m)); + errors.forEach((m) => { + context.logger.error(m); + hasErrors = true; + }); + spinner.start(); + } + + const indexOutput = path.join(outputPath, getIndexOutputFile(options.index)); + await fs.promises.mkdir(path.dirname(indexOutput), { recursive: true }); + await fs.promises.writeFile(indexOutput, content); + } catch (error) { + spinner.fail('Index html generation failed.'); + assertIsError(error); return { - output: { - success: false, - error: 'Unable to copy assets: ' + err.message, - }, webpackStats: webpackRawStats, + output: { success: false, error: error.message }, }; } } - if (options.index) { - spinner.start('Generating index html...'); - - const entrypoints = generateEntryPoints({ - scripts: options.scripts ?? [], - styles: options.styles ?? [], - }); - - const indexHtmlGenerator = new IndexHtmlGenerator({ - cache: cacheOptions, - indexPath: path.join(context.workspaceRoot, getIndexInputFile(options.index)), - entrypoints, - deployUrl: options.deployUrl, - sri: options.subresourceIntegrity, - optimization: normalizedOptimization, - crossOrigin: options.crossOrigin, - postTransform: transforms.indexHtml, - imageDomains: Array.from(imageDomains), - }); - - let hasErrors = false; - for (const [locale, outputPath] of outputPaths.entries()) { - try { - const { - csrContent: content, - warnings, - errors, - } = await indexHtmlGenerator.process({ - baseHref: getLocaleBaseHref(i18n, locale) ?? options.baseHref, - // i18nLocale is used when Ivy is disabled - lang: locale || undefined, - outputPath, - files: mapEmittedFilesToFileInfo(emittedFiles), - }); + if (hasErrors) { + spinner.fail('Index html generation failed.'); - if (warnings.length || errors.length) { - spinner.stop(); - warnings.forEach((m) => context.logger.warn(m)); - errors.forEach((m) => { - context.logger.error(m); - hasErrors = true; - }); - spinner.start(); - } - - const indexOutput = path.join( - outputPath, - getIndexOutputFile(options.index), - ); - await fs.promises.mkdir(path.dirname(indexOutput), { recursive: true }); - await fs.promises.writeFile(indexOutput, content); - } catch (error) { - spinner.fail('Index html generation failed.'); - assertIsError(error); - - return { - webpackStats: webpackRawStats, - output: { success: false, error: error.message }, - }; - } - } + return { + webpackStats: webpackRawStats, + output: { success: false }, + }; + } else { + spinner.succeed('Index html generation complete.'); + } + } - if (hasErrors) { - spinner.fail('Index html generation failed.'); + if (options.serviceWorker) { + spinner.start('Generating service worker...'); + for (const [locale, outputPath] of outputPaths.entries()) { + try { + await augmentAppWithServiceWorker( + projectRoot, + context.workspaceRoot, + outputPath, + getLocaleBaseHref(i18n, locale) ?? options.baseHref ?? '/', + options.ngswConfigPath, + ); + } catch (error) { + spinner.fail('Service worker generation failed.'); + assertIsError(error); return { webpackStats: webpackRawStats, - output: { success: false }, + output: { success: false, error: error.message }, }; - } else { - spinner.succeed('Index html generation complete.'); } } - if (options.serviceWorker) { - spinner.start('Generating service worker...'); - for (const [locale, outputPath] of outputPaths.entries()) { - try { - await augmentAppWithServiceWorker( - projectRoot, - context.workspaceRoot, - outputPath, - getLocaleBaseHref(i18n, locale) ?? options.baseHref ?? '/', - options.ngswConfigPath, - ); - } catch (error) { - spinner.fail('Service worker generation failed.'); - assertIsError(error); - - return { - webpackStats: webpackRawStats, - output: { success: false, error: error.message }, - }; - } - } - - spinner.succeed('Service worker generation complete.'); - } + spinner.succeed('Service worker generation complete.'); } + } - webpackStatsLogger(context.logger, webpackStats, config, budgetFailures); + webpackStatsLogger(context.logger, webpackStats, config, budgetFailures); - return { - webpackStats: webpackRawStats, - output: { success: buildSuccess }, - }; - } - }, - ), - map( - ({ output: event, webpackStats }) => - ({ - ...event, - stats: generateBuildEventStats(webpackStats, options), - baseOutputPath, - outputs: (outputPaths && - [...outputPaths.entries()].map(([locale, path]) => ({ - locale, - path, - baseHref: getLocaleBaseHref(i18n, locale) ?? options.baseHref, - }))) || { - path: baseOutputPath, - baseHref: options.baseHref, - }, - }) as BrowserBuilderOutput, - ), - ); - }, - ), + return { + webpackStats: webpackRawStats, + output: { success: buildSuccess }, + }; + } + }, + ), + map( + ({ output: event, webpackStats }) => + ({ + ...event, + stats: generateBuildEventStats(webpackStats, options), + baseOutputPath, + outputs: (outputPaths && + [...outputPaths.entries()].map(([locale, path]) => ({ + locale, + path, + baseHref: getLocaleBaseHref(i18n, locale) ?? options.baseHref, + }))) || { + path: baseOutputPath, + baseHref: options.baseHref, + }, + }) as BrowserBuilderOutput, + ), + ); + }), ); function getLocaleBaseHref(i18n: I18nOptions, locale: string): string | undefined { diff --git a/packages/angular_devkit/build_angular/src/builders/browser/tests/options/assets_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/tests/options/assets_spec.ts index b8752e7c275e..c7ac266cf036 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/tests/options/assets_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/tests/options/assets_spec.ts @@ -359,6 +359,28 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { harness.expectFile('dist/subdirectory/test.svg').content.toBe(''); }); + it('fails if asset input option is outside workspace root (relative)', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + assets: [{ glob: '**/*', input: '../outside', output: '.' }], + }); + + const { result } = await harness.executeOnce(); + + expect(result?.error).toMatch('asset path must be within the workspace root'); + }); + + it('fails if asset input option is outside workspace root (absolute)', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + assets: [{ glob: '**/*', input: '/tmp/outside-workspace', output: '.' }], + }); + + const { result } = await harness.executeOnce(); + + expect(result?.error).toMatch('asset path must be within the workspace root'); + }); + it('fails if output option is not within project output path', async () => { await harness.writeFile('test.svg', ''); diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/tests/options/headers_spec.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/options/headers_spec.ts new file mode 100644 index 000000000000..d87def49b30e --- /dev/null +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/tests/options/headers_spec.ts @@ -0,0 +1,65 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { executeDevServer } from '../../index'; +import { executeOnceAndFetch } from '../execute-fetch'; +import { describeServeBuilder } from '../jasmine-helpers'; +import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup'; + +describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => { + describe('option: "headers"', () => { + beforeEach(async () => { + setupTarget(harness, { + styles: ['src/styles.css'], + }); + + // Application code is not needed for these tests + await harness.writeFile('src/main.ts', ''); + await harness.writeFile('src/styles.css', ''); + }); + + it('index response headers should include configured header', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + headers: { + 'x-custom': 'foo', + }, + }); + + const { result, response } = await executeOnceAndFetch(harness, '/'); + + expect(result?.success).toBeTrue(); + expect(await response?.headers.get('x-custom')).toBe('foo'); + }); + + it('should include configured Access-Control-Allow-Origin header', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + headers: { + 'Access-Control-Allow-Origin': 'http://example.com', + }, + }); + + const { result, response } = await executeOnceAndFetch(harness, '/main.js'); + + expect(result?.success).toBeTrue(); + expect(await response?.headers.get('access-control-allow-origin')).toBe('http://example.com'); + }); + + it('should not include Access-Control-Allow-Origin header by default', async () => { + harness.useTarget('serve', { + ...BASE_OPTIONS, + }); + + const { result, response } = await executeOnceAndFetch(harness, '/main.js'); + + expect(result?.success).toBeTrue(); + expect(await response?.headers.has('access-control-allow-origin')).toBeFalse(); + }); + }); +}); diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts index 445252ff158d..003eb693bb56 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts @@ -236,14 +236,14 @@ function startNodeServer( const path = join(outputPath, 'main.js'); const env = { ...process.env, PORT: '' + port, NG_ALLOWED_HOSTS: host ?? 'localhost' }; - const args = ['--enable-source-maps', `"${path}"`]; + const args = ['--enable-source-maps', path]; if (inspectMode) { args.unshift('--inspect-brk'); } return of(null).pipe( delay(0), // Avoid EADDRINUSE error since it will cause the kill event to be finish. - switchMap(() => spawnAsObservable('node', args, { env, shell: true })), + switchMap(() => spawnAsObservable(process.execPath, args, { env })), tap((res) => log({ stderr: res.stderr, stdout: res.stdout }, logger)), ignoreElements(), // Emit a signal after the process has been started diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts index 059c0e0a89e9..7ed821d07950 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/utils.ts @@ -29,7 +29,7 @@ export function spawnAsObservable( options: SpawnOptions = {}, ): Observable<{ stdout?: string; stderr?: string }> { return new Observable((obs) => { - const proc = spawn(`${command} ${args.join(' ')}`, options); + const proc = spawn(command, args, options); if (proc.stdout) { proc.stdout.on('data', (data) => obs.next({ stdout: data.toString() })); } diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts b/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts index 5ba21e328ec3..99b63b4f4c37 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/configs/dev-server.ts @@ -60,10 +60,7 @@ export async function getDevServerConfig( devServer: { host, port, - headers: { - 'Access-Control-Allow-Origin': '*', - ...headers, - }, + headers, historyApiFallback: !!index && { index: posix.join(servePath, getIndexOutputFile(index)), disableDotRule: true, diff --git a/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts b/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts index 7f18080e05f5..20e97e1d5162 100644 --- a/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts +++ b/packages/angular_devkit/build_angular/src/utils/normalize-asset-patterns.ts @@ -68,6 +68,11 @@ export function normalizeAssetPatterns( assetPattern = { glob, input, output }; } else { + const resolvedInput = path.resolve(workspaceRoot, assetPattern.input); + if (!resolvedInput.startsWith(workspaceRoot)) { + throw new Error(`The ${assetPattern.input} asset path must be within the workspace root.`); + } + assetPattern.output = path.join('.', assetPattern.output ?? ''); } diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts b/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts index 6209272d9376..3632f6858e77 100644 --- a/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts +++ b/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts @@ -10,9 +10,8 @@ import { Architect } from '@angular-devkit/architect'; import { WorkspaceNodeModulesArchitectHost } from '@angular-devkit/architect/node'; import { TestingArchitectHost } from '@angular-devkit/architect/testing'; import { join, normalize, schema, workspaces } from '@angular-devkit/core'; -import { NodeJsSyncHost, createConsoleLogger } from '@angular-devkit/core/node'; +import { NodeJsSyncHost } from '@angular-devkit/core/node'; import * as path from 'node:path'; -import { BuildResult } from './index'; describe('Webpack Builder basic test', () => { let testArchitectHost: TestingArchitectHost; @@ -99,11 +98,7 @@ describe('Webpack Builder basic test', () => { }); it('works', async () => { - const run = await architect.scheduleTarget( - { project: 'app', target: 'build-webpack' }, - {}, - { logger: createConsoleLogger() }, - ); + const run = await architect.scheduleTarget({ project: 'app', target: 'build-webpack' }); const output = await run.result; expect(output.success).toBe(true); diff --git a/packages/angular_devkit/core/node/cli-logger.ts b/packages/angular_devkit/core/node/cli-logger.ts index 684c964019d3..a5cbada271ec 100644 --- a/packages/angular_devkit/core/node/cli-logger.ts +++ b/packages/angular_devkit/core/node/cli-logger.ts @@ -15,6 +15,8 @@ export interface ProcessOutput { /** * A Logger that sends information to STDOUT and STDERR. + * + * @deprecated Use a custom logger implementation instead. */ export function createConsoleLogger( verbose = false, diff --git a/packages/angular_devkit/core/src/json/schema/registry.ts b/packages/angular_devkit/core/src/json/schema/registry.ts index d433a41bd460..77aeab6646a1 100644 --- a/packages/angular_devkit/core/src/json/schema/registry.ts +++ b/packages/angular_devkit/core/src/json/schema/registry.ts @@ -224,7 +224,7 @@ export class CoreSchemaRegistry implements SchemaRegistry { * See: https://json-schema.org/draft/2019-09/json-schema-core.html#rfc.appendix.B.2 * * @param schema The schema or URI to flatten. - * @returns An Observable of the flattened schema object. + * @return A Promise that resolves to the flattened schema object. * @private since 11.2 without replacement. */ async ɵflatten(schema: JsonObject): Promise { diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 00924ddef652..b2dd00e9d3e6 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -4,22 +4,12 @@ "description": "Webpack plugin that AoT compiles your Angular components and modules.", "main": "./src/index.js", "typings": "src/index.d.ts", - "license": "MIT", "keywords": [ "angular", "webpack", "plugin", "aot" ], - "repository": { - "type": "git", - "url": "git+https://github.com/angular/angular-cli.git" - }, - "author": "angular", - "bugs": { - "url": "https://github.com/angular/angular-cli/issues" - }, - "homepage": "https://github.com/angular/angular-cli/tree/main/packages/ngtools/webpack", "peerDependencies": { "@angular/compiler-cli": "0.0.0-ANGULAR-FW-PEER-DEP", "typescript": ">=6.0 <6.1", @@ -27,8 +17,8 @@ }, "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", - "@angular/compiler": "22.0.0-next.10", - "@angular/compiler-cli": "22.0.0-next.10", + "@angular/compiler": "22.0.5", + "@angular/compiler-cli": "22.0.5", "typescript": "6.0.3", "webpack": "5.106.2" } diff --git a/packages/schematics/angular/application/files/common-files/tsconfig.app.json.template b/packages/schematics/angular/application/files/common-files/tsconfig.app.json.template index 12de92966bbb..d4018062fd8c 100644 --- a/packages/schematics/angular/application/files/common-files/tsconfig.app.json.template +++ b/packages/schematics/angular/application/files/common-files/tsconfig.app.json.template @@ -3,7 +3,6 @@ { "extends": "<%= relativePathToWorkspaceRoot %>/tsconfig.json", "compilerOptions": { - "outDir": "<%= relativePathToWorkspaceRoot %>/out-tsc/app", "types": [] }, "include": [ diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts index 0fe4d142dc4a..961e4f9d294f 100644 --- a/packages/schematics/angular/application/index_spec.ts +++ b/packages/schematics/angular/application/index_spec.ts @@ -94,10 +94,12 @@ describe('Application Schematic', () => { const tree = await schematicRunner.runSchematic('application', defaultOptions, workspaceTree); const { + compilerOptions, include, exclude, extends: _extends, } = readJsonFile(tree, '/projects/foo/tsconfig.app.json'); + expect(compilerOptions.outDir).toBeUndefined(); expect(include).toEqual(['src/**/*.ts']); expect(exclude).toEqual(['src/**/*.spec.ts']); expect(_extends).toBe('../../tsconfig.json'); diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer.ts index d39e1a16bab6..8a1c49c58f61 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer.ts @@ -142,7 +142,7 @@ export function analyzeKarmaConfig(content: string): KarmaConfigAnalysis { case ts.SyntaxKind.ArrayLiteralExpression: return (node as ts.ArrayLiteralExpression).elements.map(extractValue); case ts.SyntaxKind.ObjectLiteralExpression: { - const obj: { [key: string]: KarmaConfigValue } = {}; + const obj: { [key: string]: KarmaConfigValue } = Object.create(null); for (const prop of (node as ts.ObjectLiteralExpression).properties) { if (isSupportedPropertyAssignment(prop)) { // Recursively extract values for nested objects. diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-comparer.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-comparer.ts index 0c11a7196f1c..f7bef0213b1f 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-comparer.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-comparer.ts @@ -46,11 +46,10 @@ export async function generateDefaultKarmaConfig( // TODO: Replace this with the actual schematic templating logic. template = template - .replace( - /<%= relativePathToWorkspaceRoot %>/g, + .replace(/<%= relativePathToWorkspaceRoot %>/g, () => path.normalize(relativePathToWorkspaceRoot).replace(/\\/g, '/'), ) - .replace(/<%= folderName %>/g, projectName); + .replace(/<%= folderName %>/g, () => projectName); const devkitPluginRegex = /<% if \(needDevkitPlugin\) { %>(.*?)<% } %>/gs; const replacement = needDevkitPlugin ? '$1' : ''; diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts index 7d2306428b32..fc5b11fb5eb0 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts @@ -32,6 +32,7 @@ async function processTestTargetOptions( let needsIstanbul = false; for (const [configName, options] of allTargetOptions(testTarget, false)) { const configKey = configName || ''; + if (!customBuildOptions[configKey]) { // Match Karma behavior where AOT was disabled by default customBuildOptions[configKey] = { @@ -276,7 +277,10 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { tsConfigsToUpdate.add(join(project.root, 'tsconfig.spec.json')); // Store custom build options to move to a new build configuration if needed - const customBuildOptions: Record> = {}; + const customBuildOptions: Record< + string, + Record + > = Object.create(null); const projectCoverageInfo = await processTestTargetOptions( testTarget, diff --git a/packages/schematics/angular/refactor/jasmine-vitest/index.ts b/packages/schematics/angular/refactor/jasmine-vitest/index.ts index 493bb0eb1800..e163a88c6207 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/index.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/index.ts @@ -121,7 +121,7 @@ export default function (options: Schema): Rule { const content = tree.readText(file); const newContent = transformJasmineToVitest(file, content, reporter, { addImports: !!options.addImports, - browserMode: !!options.browerMode, + browserMode: !!options.browserMode, fakeAsync: !!options.fakeAsync, }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/index_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/index_spec.ts index fcb804886286..2581d8bbacc9 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/index_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/index_spec.ts @@ -59,7 +59,7 @@ describe('Jasmine to Vitest Schematic', () => { ); const newContent = tree.readContent(specFilePath); - expect(newContent).toContain(`vi.spyOn(service, 'myMethod');`); + expect(newContent).toContain(`vi.spyOn(service, 'myMethod').mockReturnValue(undefined);`); }); it('should only transform files matching the fileSuffix option', async () => { @@ -94,7 +94,7 @@ describe('Jasmine to Vitest Schematic', () => { expect(unchangedContent).not.toContain(`vi.spyOn(window, 'alert');`); const changedContent = tree.readContent(testFilePath); - expect(changedContent).toContain(`vi.spyOn(window, 'confirm');`); + expect(changedContent).toContain(`vi.spyOn(window, 'confirm').mockReturnValue(undefined);`); }); it('should print verbose logs when the verbose option is true', async () => { @@ -144,7 +144,7 @@ describe('Jasmine to Vitest Schematic', () => { ); const changedContent = tree.readContent('projects/bar/src/app/nested/nested.spec.ts'); - expect(changedContent).toContain(`vi.spyOn(window, 'confirm');`); + expect(changedContent).toContain(`vi.spyOn(window, 'confirm').mockReturnValue(undefined);`); const unchangedContent = tree.readContent('projects/bar/src/app/app.spec.ts'); expect(unchangedContent).toContain(`spyOn(window, 'alert');`); @@ -158,7 +158,7 @@ describe('Jasmine to Vitest Schematic', () => { ); const changedContent = tree.readContent('projects/bar/src/app/nested/nested.spec.ts'); - expect(changedContent).toContain(`vi.spyOn(window, 'confirm');`); + expect(changedContent).toContain(`vi.spyOn(window, 'confirm').mockReturnValue(undefined);`); const unchangedContent = tree.readContent('projects/bar/src/app/app.spec.ts'); expect(unchangedContent).toContain(`spyOn(window, 'alert');`); @@ -177,10 +177,12 @@ describe('Jasmine to Vitest Schematic', () => { ); const changedAppContent = tree.readContent('projects/bar/src/app/app.spec.ts'); - expect(changedAppContent).toContain(`vi.spyOn(window, 'alert');`); + expect(changedAppContent).toContain(`vi.spyOn(window, 'alert').mockReturnValue(undefined);`); const changedNestedContent = tree.readContent('projects/bar/src/app/nested/nested.spec.ts'); - expect(changedNestedContent).toContain(`vi.spyOn(window, 'confirm');`); + expect(changedNestedContent).toContain( + `vi.spyOn(window, 'confirm').mockReturnValue(undefined);`, + ); const unchangedContent = tree.readContent('projects/bar/src/other/other.spec.ts'); expect(unchangedContent).toContain(`spyOn(window, 'close');`); @@ -194,10 +196,12 @@ describe('Jasmine to Vitest Schematic', () => { ); const changedAppContent = tree.readContent('projects/bar/src/app/app.spec.ts'); - expect(changedAppContent).toContain(`vi.spyOn(window, 'alert');`); + expect(changedAppContent).toContain(`vi.spyOn(window, 'alert').mockReturnValue(undefined);`); const changedNestedContent = tree.readContent('projects/bar/src/app/nested/nested.spec.ts'); - expect(changedNestedContent).toContain(`vi.spyOn(window, 'confirm');`); + expect(changedNestedContent).toContain( + `vi.spyOn(window, 'confirm').mockReturnValue(undefined);`, + ); }); it('should throw if the include path does not exist', async () => { @@ -234,4 +238,46 @@ describe('Jasmine to Vitest Schematic', () => { expect(logs).toContain('- 1 TODO(s) added for manual review:'); expect(logs).toContain(' - 1x spyOnAllFunctions'); }); + + it('should not transform toHaveClass when browserMode is true', async () => { + const specFilePath = 'projects/bar/src/app/app.spec.ts'; + const content = ` + describe('AppComponent', () => { + it('should check class', () => { + expect(element).toHaveClass('active'); + }); + }); + `; + appTree.overwrite(specFilePath, content); + + const tree = await schematicRunner.runSchematic( + 'refactor-jasmine-vitest', + { project: 'bar', browserMode: true }, + appTree, + ); + + const result = tree.readContent(specFilePath); + expect(result).toContain("expect(element).toHaveClass('active');"); + }); + + it('should transform toHaveClass when browserMode is false', async () => { + const specFilePath = 'projects/bar/src/app/app.spec.ts'; + const content = ` + describe('AppComponent', () => { + it('should check class', () => { + expect(element).toHaveClass('active'); + }); + }); + `; + appTree.overwrite(specFilePath, content); + + const tree = await schematicRunner.runSchematic( + 'refactor-jasmine-vitest', + { project: 'bar', browserMode: false }, + appTree, + ); + + const result = tree.readContent(specFilePath); + expect(result).toContain("expect(element.classList.contains('active')).toBe(true);"); + }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.integration_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.integration_spec.ts index b84aeba57411..5b30e9f24f4b 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.integration_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.integration_spec.ts @@ -109,7 +109,7 @@ describe('Jasmine to Vitest Transformer - Integration Tests', () => { }); it('should handle user click', () => { - vi.spyOn(window, 'alert'); + vi.spyOn(window, 'alert').mockReturnValue(undefined); const button = fixture.nativeElement.querySelector('button'); button.click(); fixture.detectChanges(); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts index 82b76ee31782..f4b10d485920 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer_add-imports_spec.ts @@ -13,7 +13,7 @@ describe('Jasmine to Vitest Transformer - addImports option', () => { const input = `spyOn(foo, 'bar');`; const expected = ` import { vi } from 'vitest'; - vi.spyOn(foo, 'bar'); + vi.spyOn(foo, 'bar').mockReturnValue(undefined); `; await expectTransformation(input, expected, true); }); @@ -27,7 +27,7 @@ describe('Jasmine to Vitest Transformer - addImports option', () => { import { type Mock, vi } from 'vitest'; let mySpy: Mock; - vi.spyOn(foo, 'bar'); + vi.spyOn(foo, 'bar').mockReturnValue(undefined); `; await expectTransformation(input, expected, true); }); @@ -41,7 +41,7 @@ describe('Jasmine to Vitest Transformer - addImports option', () => { import type { Mock } from 'vitest'; let mySpy: Mock; - vi.spyOn(foo, 'bar'); + vi.spyOn(foo, 'bar').mockReturnValue(undefined); `; await expectTransformation(input, expected, false); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle.ts index 78ddd1e99316..eb58a7f9d5b9 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-lifecycle.ts @@ -15,7 +15,7 @@ import ts from 'typescript'; import { createPropertyAccess } from '../utils/ast-helpers'; -import { addTodoComment } from '../utils/comment-helpers'; +import { addCommentedNodeText, addTodoComment } from '../utils/comment-helpers'; import { RefactorContext } from '../utils/refactor-context'; const FOCUSED_SKIPPED_RENAMES = new Map([ @@ -77,7 +77,6 @@ export function transformPending( ) { hasPending = true; const replacement = ts.factory.createEmptyStatement(); - const originalText = bodyNode.getFullText().trim(); reporter.reportTransformation( sourceFile, @@ -87,12 +86,7 @@ export function transformPending( const category = 'pending'; reporter.recordTodo(category, sourceFile, bodyNode); addTodoComment(replacement, category); - ts.addSyntheticLeadingComment( - replacement, - ts.SyntaxKind.SingleLineCommentTrivia, - ` ${originalText}`, - true, - ); + addCommentedNodeText(replacement, bodyNode); return replacement; } diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher.ts index c1e669b144ef..1e0a87dc80f2 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-matcher.ts @@ -21,7 +21,7 @@ import { createPropertyAccess, } from '../utils/ast-helpers'; import { getJasmineMethodName, isJasmineCallExpression } from '../utils/ast-validation'; -import { addTodoComment } from '../utils/comment-helpers'; +import { addCommentedNodeText, addTodoComment } from '../utils/comment-helpers'; import { RefactorContext } from '../utils/refactor-context'; const SUGAR_MATCHER_CHANGES = new Map([ @@ -607,18 +607,12 @@ export function transformExpectNothing( // The statement is `expect().nothing()`, which can be removed. const replacement = ts.factory.createEmptyStatement(); - const originalText = node.getFullText().trim(); reporter.reportTransformation(sourceFile, node, 'Removed `expect().nothing()` statement.'); const category = 'expect-nothing'; reporter.recordTodo(category, sourceFile, node); addTodoComment(replacement, category); - ts.addSyntheticLeadingComment( - replacement, - ts.SyntaxKind.SingleLineCommentTrivia, - ` ${originalText}`, - true, - ); + addCommentedNodeText(replacement, node); return replacement; } diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc.ts index 6832e36b9273..f71353cc9783 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc.ts @@ -16,7 +16,7 @@ import ts from 'typescript'; import { addVitestValueImport } from '../utils/ast-helpers'; import { getJasmineMethodName, isJasmineCallExpression } from '../utils/ast-validation'; -import { addTodoComment } from '../utils/comment-helpers'; +import { addCommentedNodeText, addTodoComment } from '../utils/comment-helpers'; import { RefactorContext } from '../utils/refactor-context'; import { createViCallExpression } from '../utils/refactor-helpers'; import { TodoCategory } from '../utils/todo-notes'; @@ -143,7 +143,6 @@ export function transformJasmineMembers(node: ts.Node, refactorCtx: RefactorCont case 'MAX_PRETTY_PRINT_DEPTH': case 'MAX_PRETTY_PRINT_CHARS': { const replacement = ts.factory.createEmptyStatement(); - const originalText = node.getFullText().trim(); reporter.reportTransformation( sourceFile, @@ -153,12 +152,7 @@ export function transformJasmineMembers(node: ts.Node, refactorCtx: RefactorCont const category = 'unsupported-jasmine-member'; reporter.recordTodo(category, sourceFile, node); addTodoComment(replacement, category, { name: memberName }); - ts.addSyntheticLeadingComment( - replacement, - ts.SyntaxKind.SingleLineCommentTrivia, - ` ${originalText}`, - true, - ); + addCommentedNodeText(replacement, node); return replacement; } diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts index 543ba5a2daee..740628d41fcd 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts @@ -24,185 +24,255 @@ import { addTodoComment } from '../utils/comment-helpers'; import { RefactorContext } from '../utils/refactor-context'; import { createViCallExpression } from '../utils/refactor-helpers'; -export function transformSpies(node: ts.Node, refactorCtx: RefactorContext): ts.Node { - const { sourceFile, reporter, pendingVitestValueImports } = refactorCtx; - if (!ts.isCallExpression(node)) { - return node; +function isChainedWithAnd(node: ts.Node): boolean { + let parent = node.parent; + while (parent) { + if (ts.isPropertyAccessExpression(parent)) { + if (ts.isIdentifier(parent.name) && parent.name.text === 'and') { + return true; + } + } else if (ts.isElementAccessExpression(parent)) { + if ( + ts.isStringLiteralLike(parent.argumentExpression) && + parent.argumentExpression.text === 'and' + ) { + return true; + } + } else if ( + ts.isParenthesizedExpression(parent) || + ts.isAsExpression(parent) || + ts.isNonNullExpression(parent) || + ts.isTypeAssertionExpression(parent) || + ts.isSatisfiesExpression(parent) + ) { + parent = parent.parent; + continue; + } + break; } + return false; +} + +function transformPrimarySpy(node: ts.CallExpression, refactorCtx: RefactorContext): ts.Node { + const { sourceFile, reporter, pendingVitestValueImports } = refactorCtx; if ( ts.isIdentifier(node.expression) && (node.expression.text === 'spyOn' || node.expression.text === 'spyOnProperty') ) { addVitestValueImport(pendingVitestValueImports, 'vi'); - reporter.reportTransformation( - sourceFile, - node, - `Transformed \`${node.expression.text}\` to \`vi.spyOn\`.`, - ); - return ts.factory.updateCallExpression( + const viSpyOnCall = ts.factory.updateCallExpression( node, createPropertyAccess('vi', 'spyOn'), node.typeArguments, node.arguments, ); + + if (isChainedWithAnd(node)) { + reporter.reportTransformation( + sourceFile, + node, + `Transformed \`${node.expression.text}\` to \`vi.spyOn\`.`, + ); + + return viSpyOnCall; + } + + reporter.reportTransformation( + sourceFile, + node, + `Transformed \`${node.expression.text}\` to \`vi.spyOn\`, ` + + `appending \`.mockReturnValue(undefined)\` to preserve stub-by-default semantics.`, + ); + + return ts.factory.createCallExpression( + createPropertyAccess(viSpyOnCall, 'mockReturnValue'), + undefined, + [ts.factory.createIdentifier('undefined')], + ); } - if (ts.isPropertyAccessExpression(node.expression)) { - const pae = node.expression; + return node; +} - if ( - ts.isPropertyAccessExpression(pae.expression) && - ts.isIdentifier(pae.expression.name) && - pae.expression.name.text === 'and' - ) { - const spyCall = pae.expression.expression; - let newMethodName: string | undefined; - let args = node.arguments; - - if (ts.isIdentifier(pae.name)) { - const strategyName = pae.name.text; - switch (strategyName) { - case 'returnValue': - { - const result = getPromiseResolveRejectMethod(args[0]); - if (result) { - const methodMapping = { - 'resolve': 'mockResolvedValue', - 'reject': 'mockRejectedValue', - }; - newMethodName = methodMapping[result.methodName]; - args = result.arguments; - } else { - newMethodName = 'mockReturnValue'; - } - } - break; - case 'resolveTo': - newMethodName = 'mockResolvedValue'; - break; - case 'rejectWith': - newMethodName = 'mockRejectedValue'; - break; - case 'returnValues': { - reporter.reportTransformation( - sourceFile, - node, - 'Transformed `.and.returnValues()` to chained `.mockReturnValueOnce()` calls.', - ); - const returnValues = node.arguments; - if (returnValues.length === 0) { - // No values, so it's a no-op. Just transform the spyOn call. - return transformSpies(spyCall, refactorCtx); - } - // spy.and.returnValues(a, b) -> spy.mockReturnValueOnce(a).mockReturnValueOnce(b) - let chainedCall: ts.Expression = spyCall; - for (const value of returnValues) { - const mockCall = ts.factory.createCallExpression( - createPropertyAccess(chainedCall, 'mockReturnValueOnce'), - undefined, - [value], - ); - chainedCall = mockCall; - } +function transformSpyStrategy(node: ts.CallExpression, refactorCtx: RefactorContext): ts.Node { + const { sourceFile, reporter } = refactorCtx; + if (!ts.isPropertyAccessExpression(node.expression)) { + return node; + } - return chainedCall; - } - case 'callFake': - newMethodName = 'mockImplementation'; - break; - case 'callThrough': - reporter.reportTransformation( - sourceFile, - node, - 'Removed redundant `.and.callThrough()` call.', - ); + const pae = node.expression; + let spyCall: ts.Expression | undefined; - return transformSpies(spyCall, refactorCtx); // .and.callThrough() is redundant, just transform spyOn. - case 'stub': { - reporter.reportTransformation( - sourceFile, - node, - 'Transformed `.and.stub()` to `.mockImplementation()`.', - ); - const newExpression = createPropertyAccess(spyCall, 'mockImplementation'); - const arrowFn = ts.factory.createArrowFunction( - undefined, - undefined, - [], - undefined, - ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), - ts.factory.createBlock([], /* multiline */ true), - ); + if ( + ts.isPropertyAccessExpression(pae.expression) && + ts.isIdentifier(pae.expression.name) && + pae.expression.name.text === 'and' + ) { + spyCall = pae.expression.expression; + } else if ( + ts.isElementAccessExpression(pae.expression) && + ts.isStringLiteralLike(pae.expression.argumentExpression) && + pae.expression.argumentExpression.text === 'and' + ) { + spyCall = pae.expression.expression; + } - return ts.factory.createCallExpression(newExpression, undefined, [arrowFn]); + if (spyCall) { + let newMethodName: string | undefined; + let args = node.arguments; + + if (ts.isIdentifier(pae.name)) { + const strategyName = pae.name.text; + switch (strategyName) { + case 'returnValue': + { + const firstArg = args[0]; + const result = firstArg ? getPromiseResolveRejectMethod(firstArg) : null; + if (result) { + const methodMapping = { + 'resolve': 'mockResolvedValue', + 'reject': 'mockRejectedValue', + }; + newMethodName = methodMapping[result.methodName]; + args = result.arguments; + } else { + newMethodName = 'mockReturnValue'; + } } - case 'throwError': { - reporter.reportTransformation( - sourceFile, - node, - 'Transformed `.and.throwError()` to `.mockImplementation()`.', - ); - const errorArg = node.arguments[0]; - const throwStatement = ts.factory.createThrowStatement( - ts.isNewExpression(errorArg) - ? errorArg - : ts.factory.createNewExpression( - ts.factory.createIdentifier('Error'), - undefined, - node.arguments, - ), - ); - const arrowFunction = ts.factory.createArrowFunction( - undefined, - undefined, - [], + break; + case 'resolveTo': + newMethodName = 'mockResolvedValue'; + break; + case 'rejectWith': + newMethodName = 'mockRejectedValue'; + break; + case 'returnValues': { + reporter.reportTransformation( + sourceFile, + node, + 'Transformed `.and.returnValues()` to chained `.mockReturnValueOnce()` calls.', + ); + const returnValues = node.arguments; + if (returnValues.length === 0) { + // No values, so it's a no-op. Just transform the spyOn call. + return transformSpies(spyCall, refactorCtx); + } + // spy.and.returnValues(a, b) -> spy.mockReturnValueOnce(a).mockReturnValueOnce(b) + let chainedCall: ts.Expression = spyCall; + for (const value of returnValues) { + const mockCall = ts.factory.createCallExpression( + createPropertyAccess(chainedCall, 'mockReturnValueOnce'), undefined, - ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), - ts.factory.createBlock([throwStatement], true), + [value], ); - const newExpression = createPropertyAccess(spyCall, 'mockImplementation'); - - return ts.factory.createCallExpression(newExpression, undefined, [arrowFunction]); + chainedCall = mockCall; } - case 'identity': { - reporter.reportTransformation( - sourceFile, - node, - 'Transformed `.and.identity()` to `.getMockName()`.', - ); - const newExpression = createPropertyAccess(spyCall, 'getMockName'); - return ts.factory.createCallExpression(newExpression, undefined, undefined); - } - default: { - const category = 'unsupported-spy-strategy'; - reporter.recordTodo(category, sourceFile, node); - addTodoComment(node, category, { name: strategyName }); - break; - } + return chainedCall; } + case 'callFake': + newMethodName = 'mockImplementation'; + break; + case 'callThrough': + reporter.reportTransformation( + sourceFile, + node, + 'Removed redundant `.and.callThrough()` call.', + ); + + return transformSpies(spyCall, refactorCtx); // .and.callThrough() is redundant, just transform spyOn. + case 'stub': { + reporter.reportTransformation( + sourceFile, + node, + 'Transformed `.and.stub()` to `.mockImplementation()`.', + ); + const newExpression = createPropertyAccess(spyCall, 'mockImplementation'); + const arrowFn = ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock([], /* multiline */ true), + ); - if (newMethodName) { + return ts.factory.createCallExpression(newExpression, undefined, [arrowFn]); + } + case 'throwError': { reporter.reportTransformation( sourceFile, node, - `Transformed spy strategy \`.and.${strategyName}()\` to \`.${newMethodName}()\`.`, + 'Transformed `.and.throwError()` to `.mockImplementation()`.', + ); + const errorArg = node.arguments[0]; + const throwStatement = ts.factory.createThrowStatement( + errorArg && ts.isNewExpression(errorArg) + ? errorArg + : ts.factory.createNewExpression( + ts.factory.createIdentifier('Error'), + undefined, + errorArg ? [errorArg] : [], + ), ); + const arrowFunction = ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock([throwStatement], true), + ); + const newExpression = createPropertyAccess(spyCall, 'mockImplementation'); - const newExpression = ts.factory.updatePropertyAccessExpression( - pae, - spyCall, - ts.factory.createIdentifier(newMethodName), + return ts.factory.createCallExpression(newExpression, undefined, [arrowFunction]); + } + case 'identity': { + reporter.reportTransformation( + sourceFile, + node, + 'Transformed `.and.identity()` to `.getMockName()`.', ); + const newExpression = createPropertyAccess(spyCall, 'getMockName'); - return ts.factory.updateCallExpression(node, newExpression, node.typeArguments, args); + return ts.factory.createCallExpression(newExpression, undefined, undefined); + } + default: { + const category = 'unsupported-spy-strategy'; + reporter.recordTodo(category, sourceFile, node); + addTodoComment(node, category, { name: strategyName }); + break; } } + + if (newMethodName) { + reporter.reportTransformation( + sourceFile, + node, + `Transformed spy strategy \`.and.${strategyName}()\` to \`.${newMethodName}()\`.`, + ); + + const newExpression = ts.factory.updatePropertyAccessExpression( + pae, + spyCall, + ts.factory.createIdentifier(newMethodName), + ); + + return ts.factory.updateCallExpression(node, newExpression, node.typeArguments, args); + } } } + return node; +} + +function transformSpyOnAllFunctions( + node: ts.CallExpression, + refactorCtx: RefactorContext, +): ts.Node { + const { sourceFile, reporter } = refactorCtx; if (getJasmineMethodName(node) === 'spyOnAllFunctions') { reporter.reportTransformation( sourceFile, @@ -219,6 +289,24 @@ export function transformSpies(node: ts.Node, refactorCtx: RefactorContext): ts. return node; } +export function transformSpies(node: ts.Node, refactorCtx: RefactorContext): ts.Node { + if (!ts.isCallExpression(node)) { + return node; + } + + const primaryResult = transformPrimarySpy(node, refactorCtx); + if (primaryResult !== node) { + return primaryResult; + } + + const strategyResult = transformSpyStrategy(node, refactorCtx); + if (strategyResult !== node) { + return strategyResult; + } + + return transformSpyOnAllFunctions(node, refactorCtx); +} + export function transformCreateSpy(node: ts.Node, ctx: RefactorContext): ts.Node { const { reporter, sourceFile, pendingVitestValueImports } = ctx; if (!isJasmineCallExpression(node, 'createSpy')) { @@ -505,6 +593,53 @@ function transformThisFor( ); } +function transformAllCallsArgs( + node: ts.Node, + { sourceFile, reporter, pendingVitestValueImports }: RefactorContext, +): ts.Node { + if ( + !ts.isPropertyAccessExpression(node) || + !ts.isIdentifier(node.name) || + node.name.text !== 'args' + ) { + return node; + } + + const elementAccess = node.expression; + if (!ts.isElementAccessExpression(elementAccess)) { + return node; + } + + const allCall = elementAccess.expression; + if (!ts.isCallExpression(allCall) || !ts.isPropertyAccessExpression(allCall.expression)) { + return node; + } + + const allPae = allCall.expression; + if (!ts.isIdentifier(allPae.name) || allPae.name.text !== 'all') { + return node; + } + + if (!ts.isPropertyAccessExpression(allPae.expression)) { + return node; + } + + const spyIdentifier = getSpyIdentifierFromCalls(allPae.expression); + if (!spyIdentifier) { + return node; + } + + reporter.reportTransformation( + sourceFile, + node, + 'Transformed `spy.calls.all()[i].args` to `vi.mocked(spy).mock.calls[i]`.', + ); + const mockProperty = createMockedSpyMockProperty(spyIdentifier, pendingVitestValueImports); + const callsProperty = createPropertyAccess(mockProperty, 'calls'); + + return ts.factory.createElementAccessExpression(callsProperty, elementAccess.argumentExpression); +} + export function transformSpyCallInspection(node: ts.Node, refactorCtx: RefactorContext): ts.Node { const mostRecentArgsTransformed = transformMostRecentArgs(node, refactorCtx); if (mostRecentArgsTransformed !== node) { @@ -516,6 +651,11 @@ export function transformSpyCallInspection(node: ts.Node, refactorCtx: RefactorC return thisForTransformed; } + const allCallsArgsTransformed = transformAllCallsArgs(node, refactorCtx); + if (allCallsArgsTransformed !== node) { + return allCallsArgsTransformed; + } + if (!ts.isCallExpression(node) || !ts.isPropertyAccessExpression(node.expression)) { return node; } diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts index 85a0068240c7..81ae0ff02bb8 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy_spec.ts @@ -11,9 +11,10 @@ import { expectTransformation } from '../test-helpers'; describe('Jasmine to Vitest Transformer - transformSpies', () => { const testCases = [ { - description: 'should transform spyOn(object, "method") to vi.spyOn(object, "method")', + description: + 'should transform spyOn(object, "method") to vi.spyOn(object, "method").mockReturnValue(undefined)', input: `spyOn(service, 'myMethod');`, - expected: `vi.spyOn(service, 'myMethod');`, + expected: `vi.spyOn(service, 'myMethod').mockReturnValue(undefined);`, }, { description: 'should transform .and.returnValue(...) to .mockReturnValue(...)', @@ -58,9 +59,10 @@ describe('Jasmine to Vitest Transformer - transformSpies', () => { expected: `const mySpy = vi.fn(() => 'foo').mockName('mySpy');`, }, { - description: 'should transform spyOnProperty(object, "prop") to vi.spyOn(object, "prop")', + description: + 'should transform spyOnProperty(object, "prop") to vi.spyOn(object, "prop").mockReturnValue(undefined)', input: `spyOnProperty(service, 'myProp');`, - expected: `vi.spyOn(service, 'myProp');`, + expected: `vi.spyOn(service, 'myProp').mockReturnValue(undefined);`, }, { description: 'should transform .and.stub() to .mockImplementation(() => {})', @@ -117,6 +119,36 @@ describe('Jasmine to Vitest Transformer - transformSpies', () => { expected: `// TODO: vitest-migration: Unsupported spy strategy ".and.unknownStrategy()" found. Please migrate this manually. See: https://vitest.dev/api/mocked.html#mock vi.spyOn(service, 'myMethod').and.unknownStrategy();`, }, + { + description: 'should correctly identify chained spies with element access (bracket notation)', + input: `spyOn(service, 'myMethod')['and'].returnValue(42);`, + expected: `vi.spyOn(service, 'myMethod').mockReturnValue(42);`, + }, + { + description: 'should correctly identify chained spies with non-null assertion', + input: `(spyOn(service, 'myMethod')!).and.returnValue(42);`, + expected: `(vi.spyOn(service, 'myMethod')!).mockReturnValue(42);`, + }, + { + description: 'should correctly identify chained spies with type assertion', + input: `(spyOn(service, 'myMethod')).and.returnValue(42);`, + expected: `(vi.spyOn(service, 'myMethod')).mockReturnValue(42);`, + }, + { + description: 'should correctly identify chained spies with satisfies expression', + input: `(spyOn(service, 'myMethod') satisfies any).and.returnValue(42);`, + expected: `(vi.spyOn(service, 'myMethod') satisfies any).mockReturnValue(42);`, + }, + { + description: 'should handle and.returnValue() without arguments defensively', + input: `spyOn(service, 'myMethod').and.returnValue();`, + expected: `vi.spyOn(service, 'myMethod').mockReturnValue();`, + }, + { + description: 'should handle and.throwError() without arguments defensively', + input: `spyOn(service, 'myMethod').and.throwError();`, + expected: `vi.spyOn(service, 'myMethod').mockImplementation(() => { throw new Error() });`, + }, ]; testCases.forEach(({ description, input, expected }) => { @@ -270,6 +302,11 @@ describe('transformSpyCallInspection', () => { input: `const allCalls = mySpy.calls.all();`, expected: `const allCalls = vi.mocked(mySpy).mock.calls;`, }, + { + description: 'should transform spy.calls.all()[i].args', + input: `expect(mySpy.calls.all()[2].args[0]).toBeInstanceOf(RemoveShareUrlAction);`, + expected: `expect(vi.mocked(mySpy).mock.calls[2][0]).toBeInstanceOf(RemoveShareUrlAction);`, + }, { description: 'should transform spy.calls.mostRecent().args', input: `const recentArgs = mySpy.calls.mostRecent().args;`, diff --git a/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers.ts b/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers.ts index 2ece945e2951..02a9255deb3a 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers.ts @@ -70,3 +70,23 @@ export function addTodoComment( true, ); } + +/** + * Safely comments out the full text of a node line-by-line and attaches + * it to a target node. This prevents multi-line statements from breaking + * syntax when converted to single-line comments. + * @param targetNode The node to which the comments will be added. + * @param nodeToComment The original node whose text will be commented out. + */ +export function addCommentedNodeText(targetNode: ts.Node, nodeToComment: ts.Node): void { + const originalText = nodeToComment.getFullText().trim(); + const lines = originalText.split('\n'); + for (const line of lines) { + ts.addSyntheticLeadingComment( + targetNode, + ts.SyntaxKind.SingleLineCommentTrivia, + ` ${line.trim()}`, + true, + ); + } +} diff --git a/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers_spec.ts index ddfb1b8b7ad1..4f44b2664368 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers_spec.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/utils/comment-helpers_spec.ts @@ -7,7 +7,7 @@ */ import ts from 'typescript'; -import { addTodoComment } from './comment-helpers'; +import { addCommentedNodeText, addTodoComment } from './comment-helpers'; describe('addTodoComment', () => { function createTestHarness(sourceText: string) { @@ -65,4 +65,19 @@ describe('addTodoComment', () => { expect(result.trim().startsWith('// TODO')).toBe(true); expect(result).toContain('const mySpy = jasmine.createSpy()'); }); + + describe('addCommentedNodeText', () => { + it('should comment out a multiline node line-by-line', () => { + const sourceText = `expect()\n .nothing();`; + const sourceFile = ts.createSourceFile('test.ts', sourceText, ts.ScriptTarget.Latest, true); + const statement = sourceFile.statements[0]; + const replacement = ts.factory.createEmptyStatement(); + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + + addCommentedNodeText(replacement, statement); + + const result = printer.printNode(ts.EmitHint.Unspecified, replacement, sourceFile); + expect(result).toContain('// expect()\n// .nothing();'); + }); + }); }); diff --git a/packages/schematics/angular/workspace/files/__dot__vscode/mcp.json.template b/packages/schematics/angular/workspace/files/__dot__vscode/mcp.json.template deleted file mode 100644 index 956af8c62ce6..000000000000 --- a/packages/schematics/angular/workspace/files/__dot__vscode/mcp.json.template +++ /dev/null @@ -1,9 +0,0 @@ -{ - // For more information, visit: https://angular.dev/ai/mcp - "servers": { - "angular-cli": { - "command": "npx", - "args": ["-y", "@angular/cli", "mcp"] - } - } -} diff --git a/packages/schematics/angular/workspace/index_spec.ts b/packages/schematics/angular/workspace/index_spec.ts index 7f726fde8f1f..a13a7d3e1bb7 100644 --- a/packages/schematics/angular/workspace/index_spec.ts +++ b/packages/schematics/angular/workspace/index_spec.ts @@ -29,7 +29,6 @@ describe('Workspace Schematic', () => { jasmine.arrayContaining([ '/.vscode/extensions.json', '/.vscode/launch.json', - '/.vscode/mcp.json', '/.vscode/tasks.json', '/.editorconfig', '/angular.json', @@ -71,7 +70,6 @@ describe('Workspace Schematic', () => { jasmine.arrayContaining([ '/.vscode/extensions.json', '/.vscode/launch.json', - '/.vscode/mcp.json', '/.vscode/tasks.json', '/angular.json', '/.gitignore', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6694d20de137..2e3d5dee4698 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,8 +14,8 @@ importers: .: dependencies: '@angular/compiler-cli': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) + specifier: 22.0.5 + version: 22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3) typescript: specifier: 6.0.3 version: 6.0.3 @@ -26,44 +26,44 @@ importers: built: true devDependencies: '@angular/animations': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.5 + version: 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/cdk': - specifier: 22.0.0-next.7 - version: 22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.4 + version: 22.0.4(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/common': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10 + specifier: 22.0.5 + version: 22.0.5 '@angular/core': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.5 + version: 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) '@angular/forms': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/localize': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10) + specifier: 22.0.5 + version: 22.0.5(@angular/compiler-cli@22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3))(@angular/compiler@22.0.5) '@angular/material': - specifier: 22.0.0-next.7 - version: 22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133) + specifier: 22.0.4 + version: 22.0.4(6be0b281a48be0903635a651d19c7699) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904 - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#488fd3e0a6e5ad872c9c9ca1a6c43d3686146d44 + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/488fd3e0a6e5ad872c9c9ca1a6c43d3686146d44(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)) '@angular/platform-browser': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.5 + version: 22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/platform-server': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@22.0.5)(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/service-worker': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@babel/core': specifier: 7.29.0 version: 7.29.0 @@ -78,19 +78,19 @@ importers: version: 0.28.0 '@eslint/compat': specifier: 2.0.5 - version: 2.0.5(eslint@10.3.0(jiti@2.6.1)) + version: 2.0.5(eslint@10.3.0(jiti@2.7.0)) '@eslint/eslintrc': specifier: 3.3.5 version: 3.3.5 '@eslint/js': specifier: 10.0.1 - version: 10.0.1(eslint@10.3.0(jiti@2.6.1)) + version: 10.0.1(eslint@10.3.0(jiti@2.7.0)) '@rollup/plugin-alias': specifier: ^6.0.0 version: 6.0.0(rollup@4.60.2) '@rollup/plugin-commonjs': specifier: ^29.0.0 - version: 29.0.2(rollup@4.60.2) + version: 29.0.3(rollup@4.60.2) '@rollup/plugin-json': specifier: ^6.1.0 version: 6.1.0(rollup@4.60.2) @@ -102,10 +102,10 @@ importers: version: 4.60.2 '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.10.0(eslint@10.3.0(jiti@2.6.1)) + version: 5.10.0(eslint@10.3.0(jiti@2.7.0)) '@tony.ganchev/eslint-plugin-header': specifier: ~3.4.0 - version: 3.4.4(eslint@10.3.0(jiti@2.6.1)) + version: 3.4.4(eslint@10.3.0(jiti@2.7.0)) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -138,13 +138,13 @@ importers: version: 3.0.8 '@types/loader-utils': specifier: ^3.0.0 - version: 3.0.0(esbuild@0.28.0) + version: 3.0.0(esbuild@0.28.1) '@types/lodash': specifier: ^4.17.0 version: 4.17.24 '@types/node': specifier: ^22.12.0 - version: 22.19.17 + version: 22.20.0 '@types/npm-package-arg': specifier: ^6.1.0 version: 6.1.4 @@ -174,10 +174,10 @@ importers: version: 1.1.9 '@typescript-eslint/eslint-plugin': specifier: 8.59.1 - version: 8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + version: 8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': specifier: 8.59.1 - version: 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + version: 8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) ajv: specifier: 8.20.0 version: 8.20.0 @@ -185,20 +185,20 @@ importers: specifier: 6.0.3 version: 6.0.3 esbuild: - specifier: 0.28.0 - version: 0.28.0 + specifier: 0.28.1 + version: 0.28.1 esbuild-wasm: - specifier: 0.28.0 - version: 0.28.0 + specifier: 0.28.1 + version: 0.28.1 eslint: specifier: 10.3.0 - version: 10.3.0(jiti@2.6.1) + version: 10.3.0(jiti@2.7.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@10.3.0(jiti@2.6.1)) + version: 10.1.8(eslint@10.3.0(jiti@2.7.0)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0)) express: specifier: 5.2.1 version: 5.2.1 @@ -255,7 +255,7 @@ importers: version: 0.30.21 prettier: specifier: ^3.0.0 - version: 3.8.3 + version: 3.9.4 puppeteer: specifier: 24.42.0 version: 24.42.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) @@ -273,7 +273,7 @@ importers: version: 6.4.1(rollup@4.60.2)(typescript@6.0.3) rollup-plugin-sourcemaps2: specifier: 0.5.6 - version: 0.5.6(@types/node@22.19.17)(rollup@4.60.2) + version: 0.5.6(@types/node@22.20.0)(rollup@4.60.2) semver: specifier: 7.7.4 version: 7.7.4 @@ -294,10 +294,10 @@ importers: version: 6.5.2(encoding@0.1.13) verdaccio-auth-memory: specifier: ^13.0.0 - version: 13.0.0 + version: 13.0.3 zone.js: specifier: ^0.16.0 - version: 0.16.1 + version: 0.16.2 modules/testing/builder: devDependencies: @@ -326,14 +326,14 @@ importers: specifier: 29.1.1 version: 29.1.1 ng-packagr: - specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.1 + version: 22.0.1(@angular/compiler-cli@22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) rxjs: specifier: 7.8.2 version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/coverage-v8@4.1.5)(jiti@2.7.0)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0) packages/angular/build: dependencies: @@ -354,19 +354,19 @@ importers: version: 7.24.7 '@inquirer/confirm': specifier: 6.0.12 - version: 6.0.12(@types/node@24.12.2) + version: 6.0.12(@types/node@24.13.2) '@vitejs/plugin-basic-ssl': specifier: 2.3.0 - version: 2.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) + version: 2.3.0(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0)) beasties: specifier: 0.4.2 version: 0.4.2 browserslist: specifier: ^4.26.0 - version: 4.28.2 + version: 4.28.4 esbuild: - specifier: 0.28.0 - version: 0.28.0 + specifier: 0.28.1 + version: 0.28.1 https-proxy-agent: specifier: 9.0.0 version: 9.0.0 @@ -389,8 +389,8 @@ importers: specifier: 4.0.4 version: 4.0.4 piscina: - specifier: 5.1.4 - version: 5.1.4 + specifier: 5.2.0 + version: 5.2.0 rollup: specifier: 4.60.2 version: 4.60.2 @@ -407,8 +407,8 @@ importers: specifier: 0.2.16 version: 0.2.16 vite: - specifier: 7.3.2 - version: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + specifier: 7.3.5 + version: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0) watchpack: specifier: 2.5.1 version: 2.5.1 @@ -429,20 +429,20 @@ importers: specifier: 4.6.4 version: 4.6.4 ng-packagr: - specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.1 + version: 22.0.1(@angular/compiler-cli@22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) postcss: - specifier: 8.5.13 - version: 8.5.13 + specifier: 8.5.14 + version: 8.5.14 rolldown: - specifier: 1.0.0-rc.18 - version: 1.0.0-rc.18 + specifier: 1.0.0 + version: 1.0.0 rxjs: specifier: 7.8.2 version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/coverage-v8@4.1.5)(jiti@2.7.0)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0) optionalDependencies: lmdb: specifier: 3.5.4 @@ -461,10 +461,10 @@ importers: version: link:../../angular_devkit/schematics '@inquirer/prompts': specifier: 8.4.2 - version: 8.4.2(@types/node@24.12.2) + version: 8.4.2(@types/node@24.13.2) '@listr2/prompt-adapter-inquirer': specifier: 4.2.3 - version: 4.2.3(@inquirer/prompts@8.4.2(@types/node@24.12.2))(@types/node@24.12.2)(listr2@10.2.1) + version: 4.2.3(@inquirer/prompts@8.4.2(@types/node@24.13.2))(@types/node@24.13.2)(listr2@10.2.1) '@modelcontextprotocol/sdk': specifier: 1.29.0 version: 1.29.0(zod@4.4.2) @@ -490,8 +490,8 @@ importers: specifier: 13.0.2 version: 13.0.2 pacote: - specifier: 21.5.0 - version: 21.5.0 + specifier: 21.5.1 + version: 21.5.1 parse5-html-rewriting-stream: specifier: 8.0.1 version: 8.0.1 @@ -527,23 +527,23 @@ importers: specifier: workspace:* version: link:../../angular_devkit/schematics '@angular/common': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10 + specifier: 22.0.5 + version: 22.0.5 '@angular/core': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.5 + version: 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) '@angular/platform-browser': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.5 + version: 22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/platform-server': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@22.0.5)(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.5 + version: 22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular @@ -618,19 +618,19 @@ importers: version: 10.5.0(postcss@8.5.13) babel-loader: specifier: 10.1.1 - version: 10.1.1(@babel/core@7.29.0)(webpack@5.106.2(esbuild@0.28.0)) + version: 10.1.1(@babel/core@7.29.0)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) browserslist: specifier: ^4.26.0 - version: 4.28.2 + version: 4.28.4 copy-webpack-plugin: specifier: 14.0.0 - version: 14.0.0(webpack@5.106.2(esbuild@0.28.0)) + version: 14.0.0(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) css-loader: specifier: 7.1.4 - version: 7.1.4(webpack@5.106.2(esbuild@0.28.0)) + version: 7.1.4(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) esbuild-wasm: - specifier: 0.28.0 - version: 0.28.0 + specifier: 0.28.1 + version: 0.28.1 http-proxy-middleware: specifier: 3.0.5 version: 3.0.5 @@ -648,16 +648,16 @@ importers: version: 4.6.4 less-loader: specifier: 12.3.2 - version: 12.3.2(less@4.6.4)(webpack@5.106.2(esbuild@0.28.0)) + version: 12.3.2(less@4.6.4)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) license-webpack-plugin: specifier: 4.0.2 - version: 4.0.2(webpack@5.106.2(esbuild@0.28.0)) + version: 4.0.2(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) loader-utils: specifier: 3.3.1 version: 3.3.1 mini-css-extract-plugin: specifier: 2.10.2 - version: 2.10.2(webpack@5.106.2(esbuild@0.28.0)) + version: 2.10.2(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) open: specifier: 11.0.0 version: 11.0.0 @@ -668,14 +668,14 @@ importers: specifier: 4.0.4 version: 4.0.4 piscina: - specifier: 5.1.4 - version: 5.1.4 + specifier: 5.2.0 + version: 5.2.0 postcss: specifier: 8.5.13 version: 8.5.13 postcss-loader: specifier: 8.2.1 - version: 8.2.1(postcss@8.5.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)) + version: 8.2.1(postcss@8.5.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -687,13 +687,13 @@ importers: version: 1.99.0 sass-loader: specifier: 16.0.7 - version: 16.0.7(sass@1.99.0)(webpack@5.106.2(esbuild@0.28.0)) + version: 16.0.7(sass@1.99.0)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) semver: specifier: 7.7.4 version: 7.7.4 source-map-loader: specifier: 5.0.0 - version: 5.0.0(webpack@5.106.2(esbuild@0.28.0)) + version: 5.0.0(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) source-map-support: specifier: 0.5.21 version: 0.5.21 @@ -708,19 +708,19 @@ importers: version: 2.8.1 webpack: specifier: 5.106.2 - version: 5.106.2(esbuild@0.28.0) + version: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) webpack-dev-middleware: specifier: 8.0.3 - version: 8.0.3(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.0)) + version: 8.0.3(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) webpack-dev-server: specifier: 5.2.3 - version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.106.2(esbuild@0.28.0)) + version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) webpack-merge: specifier: 6.0.1 version: 6.0.1 webpack-subresource-integrity: specifier: 5.1.0 - version: 5.1.0(webpack@5.106.2(esbuild@0.28.0)) + version: 5.1.0(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) devDependencies: '@angular/ssr': specifier: workspace:* @@ -729,15 +729,15 @@ importers: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: - specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.1 + version: 22.0.1(@angular/compiler-cli@22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) undici: specifier: 8.2.0 version: 8.2.0 optionalDependencies: esbuild: - specifier: 0.28.0 - version: 0.28.0 + specifier: 0.28.1 + version: 0.28.1 packages/angular_devkit/build_webpack: dependencies: @@ -756,10 +756,10 @@ importers: version: link:../../ngtools/webpack webpack: specifier: 5.106.2 - version: 5.106.2(esbuild@0.28.0) + version: 5.106.2(esbuild@0.28.1) webpack-dev-server: specifier: 5.2.3 - version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.106.2(esbuild@0.28.0)) + version: 5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.106.2(esbuild@0.28.1)) packages/angular_devkit/core: dependencies: @@ -814,7 +814,7 @@ importers: version: link:../schematics '@inquirer/prompts': specifier: 8.4.2 - version: 8.4.2(@types/node@24.12.2) + version: 8.4.2(@types/node@24.13.2) packages/ngtools/webpack: devDependencies: @@ -822,17 +822,17 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../angular_devkit/core '@angular/compiler': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10 + specifier: 22.0.5 + version: 22.0.5 '@angular/compiler-cli': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) + specifier: 22.0.5 + version: 22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3) typescript: specifier: 6.0.3 version: 6.0.3 webpack: specifier: 5.106.2 - version: 5.106.2(esbuild@0.28.0) + version: 5.106.2(esbuild@0.28.1) packages/schematics/angular: dependencies: @@ -935,47 +935,48 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular/animations@22.0.0-next.10': - resolution: {integrity: sha512-o4YxddwSuqW/l+Mot35Se/k3H/7tarFDjppHaf7IEPmZVqRz2+6/LLfmv51RuSZmtt5L+0FIFmazFmS+3+wRNw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/animations@22.0.5': + resolution: {integrity: sha512-c4qx3l/PUQIjJCVjc/t1zgdslgrOtwNJqaH313yMYcoPB+khLi46CW/94aeOkmiYS7AGzSIS6z0ZLVoq1IFryQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} + deprecated: '@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.' peerDependencies: - '@angular/core': 22.0.0-next.10 + '@angular/core': 22.0.5 - '@angular/cdk@22.0.0-next.7': - resolution: {integrity: sha512-dAJexPGuFn6LwHNRJU2UVNcv0pL8VZzGdcaTs77dPKAR0W8V42/EhFR02SvondsYMA7kpfLLBjVdH5ckwsTCkA==} + '@angular/cdk@22.0.4': + resolution: {integrity: sha512-XaH1ff9tOn4acPh0zWbrmJznfZqZ0KZkw5+DM5BIeM9URmAOI8xdZWmVNyaUpVSmriANFjeGZS+Sfat9S6hLOg==} peerDependencies: - '@angular/common': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 - '@angular/core': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 - '@angular/platform-browser': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 + '@angular/common': ^22.0.0 || ^23.0.0 + '@angular/core': ^22.0.0 || ^23.0.0 + '@angular/platform-browser': ^22.0.0 || ^23.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/common@22.0.0-next.10': - resolution: {integrity: sha512-AqcFvnjCMjwS9wNxCWMTy+tQH1Kr6HTHgyqBgDWP01Y4NDLicJSGtU99fZ7KXsalHyZyXmYqqZqvmyeCIzweqw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/common@22.0.5': + resolution: {integrity: sha512-8HUuQms6bVjjRBF9FScYzepjhesrsPAjJh8UcHaw9YdGwMSn2eUiLZj9V1PnPV9BVu0beBcnAhX50ceeldbcTg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/core': 22.0.0-next.10 + '@angular/core': 22.0.5 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@22.0.0-next.10': - resolution: {integrity: sha512-kCV2elmGIVu+k0UydnWnGgiNEvmCe6diyXntz7Hw3Ynuap62/ZiiLcHZVJRGhuei7TIUu6qoNAKHj7jm8pQ2xw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/compiler-cli@22.0.5': + resolution: {integrity: sha512-DR9kahfd5P/xrXbX8HJu8jBkkUZNqCZuMCod4lyo4a9MTOSKs2ltNU9VEDT7Qw++hDYowr37/lLfIzrvDEFPEQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.10 + '@angular/compiler': 22.0.5 typescript: '>=6.0 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@22.0.0-next.10': - resolution: {integrity: sha512-EQKOrWGiZjZ5Jd4cV9wGxvqcS/8dfXIpo4hsvDQLvNGHQL3uVZqlCH+M6+iEahEYXO/u7QLcilDtOJ1jfwqbyQ==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/compiler@22.0.5': + resolution: {integrity: sha512-yGhbEBh2WU1kCubjBD+Eo5bwvZPR+zacDhyPao/PgopH0PiVETd4Iv1gK0ZAvg7XdImgzZfipJXKqTK4JbOFiQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} - '@angular/core@22.0.0-next.10': - resolution: {integrity: sha512-L/uE6f8U+2aqzgNTq1OQbquV090kpR/lyOsnmtP4cZSUTPPG0fnIyA2ct3ycifw4xxpxEwhOv2VYQ4EYRyWb5w==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/core@22.0.5': + resolution: {integrity: sha512-8cc6CLC1u7kNHpUZA15tak0WPHAZTF16DPslXxDdWbw/WIlDGPsNdTW8Nsaeb/G45mLvBcMwcZpOC70R6iRzmA==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/compiler': 22.0.0-next.10 + '@angular/compiler': 22.0.5 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -984,74 +985,74 @@ packages: zone.js: optional: true - '@angular/forms@22.0.0-next.10': - resolution: {integrity: sha512-3RMIm2LmJwBSzQMIpv90ZAZfkkObW0Yq1GrpyJKv1U8lIQWcNnib1e9RIFVVMhTDk5+MRzpPH8Z5lAeo8yLAeg==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/forms@22.0.5': + resolution: {integrity: sha512-kdmLo956pUMG6ZS0v9crAu16pEzBrz6i7rdfCsgI6A3lcfOWNTZLysMGHHiGGqfdP6LJR88ziHIEKrgtkCkK1A==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/common': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10 - '@angular/platform-browser': 22.0.0-next.10 + '@angular/common': 22.0.5 + '@angular/core': 22.0.5 + '@angular/platform-browser': 22.0.5 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@22.0.0-next.10': - resolution: {integrity: sha512-AuNQIl1OI1Lgje4KflwIlV7wEFQPE9WyNA8SgCR4Eief9N3TO4couzlfxUp72lq7eB13mCclScixiTZ+ys4aTA==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/localize@22.0.5': + resolution: {integrity: sha512-jpJqSCdAt1TPg8Zea+tkmqdfZF+qJhlGlQylYCrT56NLBUf0qqAl32KjxlBjZvFrUm7AqNkHN7L+E/YMcXmwzw==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.10 - '@angular/compiler-cli': 22.0.0-next.10 + '@angular/compiler': 22.0.5 + '@angular/compiler-cli': 22.0.5 - '@angular/material@22.0.0-next.7': - resolution: {integrity: sha512-yRmvcm7qrR43GTG33czQ988bCnvspZBadOpA8uci1UHsLF76T/v6U1BNVeM8bZYUofURtvLjyGDlggJmGYqRtg==} + '@angular/material@22.0.4': + resolution: {integrity: sha512-htOFlTwMtcB9J4q6yPD9jJIQVJ5LfRub+KAiD4D7UU1iaCknpNuQKRfLrZh/mEdOVACI52jHAOXS3+eTkloXcQ==} peerDependencies: - '@angular/cdk': 22.0.0-next.7 - '@angular/common': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 - '@angular/core': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 - '@angular/forms': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 - '@angular/platform-browser': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 + '@angular/cdk': 22.0.4 + '@angular/common': ^22.0.0 || ^23.0.0 + '@angular/core': ^22.0.0 || ^23.0.0 + '@angular/forms': ^22.0.0 || ^23.0.0 + '@angular/platform-browser': ^22.0.0 || ^23.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904} - version: 0.0.0-e391d56ec4a9d89b4006515b0679350f1394d19a + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/488fd3e0a6e5ad872c9c9ca1a6c43d3686146d44': + resolution: {gitHosted: true, integrity: sha512-8fakT/whwCTDosxEoYXCm8t0OqKbGxpRHjY/1EXYTdJE+qEa7yAFgnRv7zVnpxBeyAMSigjB0v2NKoGPSkBjOA==, tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/488fd3e0a6e5ad872c9c9ca1a6c43d3686146d44} + version: 0.0.0-ab850ab679f5ee8f019adca5283795ddf1581201 hasBin: true - '@angular/platform-browser@22.0.0-next.10': - resolution: {integrity: sha512-Gs4vo/2Mof1T4LCJUJuaPaQV18p0KpkrhWJ0gEVT6MFX/wjM1uuHvP25tPKYQysNzb2iaUTVcS8QwuX0HGPoJQ==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/platform-browser@22.0.5': + resolution: {integrity: sha512-Jm0YQ0NsJl3vhzziO+BEmtW5AYIyI+jVGNJHs4nFKLqSPG7DWkBfx4EykHBN5pAR4NLwwaJyFgbgNE/epZJDZQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/animations': 22.0.0-next.10 - '@angular/common': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10 + '@angular/animations': 22.0.5 + '@angular/common': 22.0.5 + '@angular/core': 22.0.5 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/platform-server@22.0.0-next.10': - resolution: {integrity: sha512-KTtW83mQfmwlyzUhf3oS+M7WzrYYB+0apkmEAw+7HuvsGbAcAFO9ltzhykPwfslwwEV6mqbkGJRFxtkpqMQGqA==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/platform-server@22.0.5': + resolution: {integrity: sha512-uajbCaIbXXL9kqi1g3kKftjLBwMg01c6ymYmlXLpDeHBKSllsBzOjWsdtFubKpG4ehr+vUh+38eH4aPVVOCICA==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/common': 22.0.0-next.10 - '@angular/compiler': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10 - '@angular/platform-browser': 22.0.0-next.10 + '@angular/common': 22.0.5 + '@angular/compiler': 22.0.5 + '@angular/core': 22.0.5 + '@angular/platform-browser': 22.0.5 rxjs: ^6.5.3 || ^7.4.0 - '@angular/router@22.0.0-next.10': - resolution: {integrity: sha512-IV28yTF+HM4SBGJGaHEwdDNr3ASLfjQhBuKSKoUy4Yf5vg87qZzbZnXIFo1jQWmbAu7lnFMMTfuLqnwHl07dAQ==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/router@22.0.5': + resolution: {integrity: sha512-1S5PCHicRQkQX4z/zjBu9VHMSoT9kOkWI0kuXuswiZtcFhK7kZbVvzrP/dBjc2YUg3AlsxS8iZY6fKFzj3/nBA==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/common': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10 - '@angular/platform-browser': 22.0.0-next.10 + '@angular/common': 22.0.5 + '@angular/core': 22.0.5 + '@angular/platform-browser': 22.0.5 rxjs: ^6.5.3 || ^7.4.0 - '@angular/service-worker@22.0.0-next.10': - resolution: {integrity: sha512-E72wxCjc/Oha0t0paXIjDUqfuak8ZMglmx7pCmZC50/84Nu1BkZ/d542nAAyVDVfiQl4wZWTBpD2DoHc7KWe+g==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/service-worker@22.0.5': + resolution: {integrity: sha512-y28ANueBYJqp7+ZVGCRT7ryMuZhRSZffshgCzgs5ZGO1MDwMSDYIvvHpETPH/B9w7dbESK9xPTQUjLrp8O8HkQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} hasBin: true peerDependencies: - '@angular/core': 22.0.0-next.10 + '@angular/core': 22.0.5 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@5.1.11': @@ -1069,38 +1070,50 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': - resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.29.3': - resolution: {integrity: sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1110,109 +1123,109 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} '@babel/helper-split-export-declaration@7.24.7': resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.28.6': - resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3': - resolution: {integrity: sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==} + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7': + resolution: {integrity: sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': - resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1223,14 +1236,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.28.6': - resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1241,8 +1254,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1259,236 +1272,236 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.6': - resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.28.6': - resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.28.6': - resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.6': - resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.28.6': - resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.28.6': - resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-explicit-resource-management@7.28.6': - resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + '@babel/plugin-transform-explicit-resource-management@7.29.7': + resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.28.6': - resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.28.6': - resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.6': - resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.0': - resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} + '@babel/plugin-transform-modules-systemjs@7.29.7': + resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': - resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.28.6': - resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.6': - resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.28.6': - resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.28.6': - resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.28.6': - resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.28.6': - resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.0': - resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + '@babel/plugin-transform-regenerator@7.29.7': + resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.28.6': - resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1499,56 +1512,56 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.28.6': - resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + '@babel/plugin-transform-spread@7.29.7': + resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.28.6': - resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.28.6': - resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1568,16 +1581,16 @@ packages: resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@bazel/bazelisk@1.28.1': @@ -1604,31 +1617,31 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@conventional-changelog/git-client@2.7.0': - resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} - engines: {node: '>=18'} + '@conventional-changelog/git-client@3.0.2': + resolution: {integrity: sha512-84xuyOzE3VGsQqSX6SBQfWOjXCFui4QD6pSMu2FhzE9pZ6HQ2SrW3pMSOWLrz/QQCfR75xexX88VBKsIuFBqWA==} + engines: {node: '>=22'} peerDependencies: - conventional-commits-filter: ^5.0.0 - conventional-commits-parser: ^6.4.0 + conventional-commits-filter: ^6.0.1 + conventional-commits-parser: ^7.0.1 peerDependenciesMeta: conventional-commits-filter: optional: true conventional-commits-parser: optional: true - '@csstools/color-helpers@6.0.2': - resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.2.0': - resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.0': - resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + '@csstools/css-color-parser@4.1.9': + resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -1640,8 +1653,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3': - resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: @@ -1675,8 +1688,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1687,8 +1700,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1699,8 +1712,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1711,8 +1724,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1723,8 +1736,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1735,8 +1748,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1747,8 +1760,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1759,8 +1772,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1771,8 +1784,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1783,8 +1796,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1795,8 +1808,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1807,8 +1820,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1819,8 +1832,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1831,8 +1844,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1843,8 +1856,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1855,8 +1868,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1867,8 +1880,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -1879,8 +1892,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -1891,8 +1904,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -1903,8 +1916,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1915,8 +1928,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1927,8 +1940,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -1939,8 +1952,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1951,8 +1964,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1963,8 +1976,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1975,8 +1988,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2029,12 +2042,12 @@ packages: resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.1': - resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -2042,72 +2055,72 @@ packages: '@noble/hashes': optional: true - '@firebase/ai@2.11.1': - resolution: {integrity: sha512-WGTF81W3WBKJY+c7xqTzO15OGAkCAs8cpADqflAI0skhTZjIkhF0qyf55rq4Ctt6jKygkv99rPfMrjAHTgXaVQ==} + '@firebase/ai@2.13.1': + resolution: {integrity: sha512-RhT/VViTPBSplhQSuEp62HhLvfsV+LowMh8ZUo5MMRDzG7oFtSget4Kmg5oHP50hDVyWQuQj6to9iPFEZk08Tw==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x '@firebase/app-types': 0.x - '@firebase/analytics-compat@0.2.27': - resolution: {integrity: sha512-ZObpYpAxL6JfgH7GnvlDD0sbzGZ0o4nijV8skatV9ZX49hJtCYbFqaEcPYptT94rgX1KUoKEderC7/fa7hybtw==} + '@firebase/analytics-compat@0.2.28': + resolution: {integrity: sha512-lIAlqUUbBu93FJMlQfslryQtBwwzdzvp23ePC6FNgymXk6Ook5v4Uvc0vdutvoIeqmyA3LfP0ZeRFK8+11kOOQ==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/analytics-types@0.8.3': - resolution: {integrity: sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==} + '@firebase/analytics-types@0.8.4': + resolution: {integrity: sha512-zQ+XTgkwH6CY/eUSHJRP7e4LxM30RCxlCmob5sy2axs25GE3Ny0XdgpDscMTHHQIGqWkxPXad4w2Mw9sCgT8zQ==} - '@firebase/analytics@0.10.21': - resolution: {integrity: sha512-j2y2q65BlgLGB5Pwjhv/Jopw2X/TBTzvAtI5z/DSp56U4wBj7LfhBfzbdCtFPges+Wz0g55GdoawXibOH5jGng==} + '@firebase/analytics@0.10.22': + resolution: {integrity: sha512-8BSaq/QRGU1+xyi8L2PTLTJU7MH9aMA72RQdIxrbhWFauOZY9OXo8f2YDN/972xA8d588tlnNVEQ2Mo69pT9Ow==} peerDependencies: '@firebase/app': 0.x - '@firebase/app-check-compat@0.4.2': - resolution: {integrity: sha512-M91NhxqbSkI0ChkJWy69blC+rPr6HEgaeRllddSaU1pQ/7IiegeCQM9pPDIgvWnwnBSzKhUHpe6ro/jhJ+cvzw==} + '@firebase/app-check-compat@0.4.5': + resolution: {integrity: sha512-JI17mVcZs34zO6ZeSCrw4U2iohqy+n6GIzkbmsA+TbVjmvFLkUKt3bs5M+qRBteQm/0IWzqSHYFzEQLzDTQebg==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/app-check-interop-types@0.3.3': - resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==} + '@firebase/app-check-interop-types@0.3.4': + resolution: {integrity: sha512-zz3i6e13B8BfWiLy8MABtTh8aGIACgKbf9UVnyHcWs+yQzJXgQcl8A46b0zfaiJHdQ+niF0ouAfcpuf+3LMPQg==} - '@firebase/app-check-types@0.5.3': - resolution: {integrity: sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==} + '@firebase/app-check-types@0.5.4': + resolution: {integrity: sha512-xV7JsIyzVr15aA7f3Pi0rB9gdBuVubs89FGA8VkRYA4g0l78poADgdfrScgf7NndSg9mm7cR7PJyY0+t22KaGw==} - '@firebase/app-check@0.11.2': - resolution: {integrity: sha512-jcXQVMHAQ5AEKzVD5C7s5fmAYeFOuN6lAJeNTgZK2B9aLnofWaJt8u1A8Idm8gpsBBYSaY3cVyeH5SWMOVPBLQ==} + '@firebase/app-check@0.12.0': + resolution: {integrity: sha512-wMeT6HLWRAuW7Cp/5UjWBGKgjPNxWNOoNf4PRIv0weljoGMZVeqbUY7wNBWTI2/31cX1NlXx8gQruDLsUShB3Q==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/app-compat@0.5.11': - resolution: {integrity: sha512-KaACDjXkK5VLpI01vEs592R7/8s5DjFdIXfKoR385ly1SmK3Tu+jMHCIB4MsiY5jsez6v7VlEX/3rJ90dVkHyA==} + '@firebase/app-compat@0.5.14': + resolution: {integrity: sha512-rgFmiofYsdS9ZG/Bht3OBxJtPD3zWE1cffShWubEm+4+qZeyzCbmtb1q6jOEjN9fB7uufe4rQmWOPXouR3758Q==} engines: {node: '>=20.0.0'} - '@firebase/app-types@0.9.4': - resolution: {integrity: sha512-crX9TA5SVYZwLPG7/R16IsH8FLlgkPXjJUVhsVpHVDSqJiq3D/NuFTM5ctxGTExXAOeIn//69tQw47CPerM8MQ==} + '@firebase/app-types@0.9.5': + resolution: {integrity: sha512-YevqTjvo7Iujsa9Dwowmd6dSoElhzmD63ZSrq6bzjvQ6POjYgNjOFHLmNIgJs48eNO093NCERibuFnxbfOvU7A==} - '@firebase/app@0.14.11': - resolution: {integrity: sha512-yxADFW35LYkP8oSGobGsYIrI42I+GPCvKTNHx4meT9Yq3C950IVz1eANoBk822I9tbKv1wyv9P4Bv1G5TpucFw==} + '@firebase/app@0.15.0': + resolution: {integrity: sha512-soIskolmGgbpi0K/MfrjtdpO1220qRCbXA4Z8Qx3lM+fVwA3q40m+OM+7zBHd2nuQCrLXb33L6Oc1aBH3Y26AQ==} engines: {node: '>=20.0.0'} - '@firebase/auth-compat@0.6.5': - resolution: {integrity: sha512-IfVsafZ3QiXbsydXTP/XMI0wVYbJLI1rkb8Qqf03/h5FnL+upbbPOb+6Yj3RpcX+Y1iP5Uh18lxTHlXfbiyAow==} + '@firebase/auth-compat@0.6.8': + resolution: {integrity: sha512-llcBREUC4iSNKZ6rvwud7Oz9Q7aAWU6KuQLa6pdu7Q+QAQsy4JLw6yFgxwtmzabsgznHmmcsX2UjHLLzqUxi3Q==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/auth-interop-types@0.2.4': - resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==} + '@firebase/auth-interop-types@0.2.5': + resolution: {integrity: sha512-1Li/YuBDBAXcKv7BzY4U28gontUmAaw53sYiqbaVOMCFb2lFKK/c3CGMUWqtwe7+TXrl3poWnTCL5umYBg85Eg==} - '@firebase/auth-types@0.13.0': - resolution: {integrity: sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==} + '@firebase/auth-types@0.13.1': + resolution: {integrity: sha512-0c1Mnid0uMDfGJHeUS4zfvBa4/CedJXotGy/n/NZJnBjwiJawt0ZYU+wH2VAVLiRCEfG2ncCkAX3yd1/2nrB7g==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/auth@1.13.0': - resolution: {integrity: sha512-mKkSLNym3UbnnZ06dAmtqzp5EpPGCANGCZDJbkoR135aoUdKG6Aizwcnp29RzsQpwH0nmy5nay17Sfbsh9oY8A==} + '@firebase/auth@1.13.3': + resolution: {integrity: sha512-bqiq4uubDN2YyQkdvSWPQeJyXAv2O76ImF41En9b6UhV5JuBVYDoHYrrrE3NzIuGkpFMKagfhMRP4Vz6t+yQSQ==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x @@ -2116,141 +2129,141 @@ packages: '@react-native-async-storage/async-storage': optional: true - '@firebase/component@0.7.2': - resolution: {integrity: sha512-iyVDGc6Vjx7Rm0cAdccLH/NG6fADsgJak/XW9IA2lPf8AjIlsemOpFGKczYyPHxm4rnKdR8z6sK4+KEC7NwmEg==} + '@firebase/component@0.7.3': + resolution: {integrity: sha512-wFofIaa2879ogD/WvkjYXJxRmfnL0scen6ORgaC3na1FNOR9ASIUANQdhqQcmWu/h77/pVHY7ch5flewa5Bcew==} engines: {node: '>=20.0.0'} - '@firebase/data-connect@0.6.0': - resolution: {integrity: sha512-OiugPRcdlhqXF97oR9CjVObILmsWU0dFUS0gXNYEe4bDfpW8pZmQ5GqhIPPtLWbT/0W2lMJJD7VILFMk+xuHPg==} + '@firebase/data-connect@0.7.1': + resolution: {integrity: sha512-2LbUU8mmSA63HknxQMmWHjpzuNLBKflvVwQc2tpoVKg0biWleNEJX031ELks0vzFs+dDjOUkCJR72RP6mQHFOg==} peerDependencies: '@firebase/app': 0.x - '@firebase/database-compat@2.1.3': - resolution: {integrity: sha512-GMyfWjD8mehjg/QpNkY/tl9G/MoeugPeg91n9D0atggxbWuKF/2KhVPHZDH+XmoP0EKYqMWYTtKxBsaBaNKLYQ==} + '@firebase/database-compat@2.1.4': + resolution: {integrity: sha512-3pK35F1MAgmqFJQlf2nhQl44vtAXQO1uaCaQOEUI9kCRtLFqi7N+QRKR7lFZPg+xIZIyubgxQaxY69YgfZRZWg==} engines: {node: '>=20.0.0'} - '@firebase/database-types@1.0.19': - resolution: {integrity: sha512-FqewjUZmV9LqFfuEnmgdcUpiOUz7qwLXxnm/H8BcMFEzQXtd1yyUDm8ex5VRad2nuTE+ahOuCjUAM/cyDncO+g==} + '@firebase/database-types@1.0.20': + resolution: {integrity: sha512-kegbOk/w8iU64pr0q6k2ItyNGjnQBMHFhwS7ohdWI4W+pc0/zhhdGXTdFj6X1oxItRjPoYOsSQmERgBkn/ihxw==} - '@firebase/database@1.1.2': - resolution: {integrity: sha512-lP96CMjMPy/+d1d9qaaHjHHdzdwvEOuyyLq9ehX89e2XMKwS1jHNzYBO+42bdSumuj5ukPbmnFtViZu8YOMT+w==} + '@firebase/database@1.1.3': + resolution: {integrity: sha512-XwWCa+E4TvNGpGwXrycLRNfdogADwFcvuhyow6wDWma9W54roaQIhe+4PM0KiLsIftBdSCGI7OKCXrdSRHbIhw==} engines: {node: '>=20.0.0'} - '@firebase/firestore-compat@0.4.8': - resolution: {integrity: sha512-WK9NJRpnosGD2nuyjdr7K+Ht7AxRYJlTF62myI4rRA7ibJOosbecvjacR5oirJ7s1BgNS6qzcBw7n4fD3a5w1w==} + '@firebase/firestore-compat@0.4.11': + resolution: {integrity: sha512-W7o1WdwWq5aABK5Up2ncSvTQs/QGLR/fy7cVpFBNqhsXtxoMtflHf2xBIG6+aoptcuGAobddq4g2Sq27wqHaYw==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/firestore-types@3.0.3': - resolution: {integrity: sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==} + '@firebase/firestore-types@3.0.4': + resolution: {integrity: sha512-jGn+JSS4X9zZsrfu7Yw66v5YRdOLD1oyQh4USR0xWl4CUqV/DA6bNIXRPpxH/cUl3iVTNiP6MN7g+EL42A4qfA==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/firestore@4.14.0': - resolution: {integrity: sha512-bZc6YOjRkMBVA16527tgzi6iN9n//xRB3Mmx/R+Gr6UAP/+xrIKOejQIcn1hh+tCzNT8jO0jI+kWox5J4tB/qQ==} + '@firebase/firestore@4.16.0': + resolution: {integrity: sha512-qdHMHMvMr0nRMuZyWNR/ArWa0YlPE3C4eAbmxTASJMYXAesKPL0Y54p70moggrNPzaK7MSIIq5RDJJyntQyIYA==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/functions-compat@0.4.3': - resolution: {integrity: sha512-BxkEwWgx1of0tKaao/r2VR6WBLk/RAiyztatiONPrPE8gkitFkOnOCxf8i9cUyA5hX5RGt5H30uNn25Q6QNEmQ==} + '@firebase/functions-compat@0.4.5': + resolution: {integrity: sha512-10qlUXGY25G5/1g9UihqksPp2po+ZqSE7LEizsrdUP7vrTmkysXxGSZCDyojSEp6mQe/ecRDdDDI+z4XRdb4wQ==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/functions-types@0.6.3': - resolution: {integrity: sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==} + '@firebase/functions-types@0.6.4': + resolution: {integrity: sha512-zV6kgqtduR4rUAdC/ilS7kmb93XD7bEZoJDlVBZqlOw2uGGGCNBQBuleww2rr0Ulr3L9o2TDjumEt68/l1f9DQ==} - '@firebase/functions@0.13.3': - resolution: {integrity: sha512-csO7ckK3SSs+NUZW1nms9EK7ckHe/1QOjiP8uAkCYa7ND18s44vjE9g3KxEeIUpyEPqZaX1EhJuFyZjHigAcYw==} + '@firebase/functions@0.13.5': + resolution: {integrity: sha512-bWCx713f4kE/uFV7gdFOLBS7lDoiZj48MRkbAqe35gkXcCeWF4QjRNO07Jhmve7EJIoQOBczL29y2r8VRuN1kw==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/installations-compat@0.2.21': - resolution: {integrity: sha512-zahIUkaVKbR8zmTeBHkdfaVl6JGWlhVoSjF7CVH33nFqD3SlPEpEEegn2GNT5iAfsVdtlCyJJ9GW4YKjq+RJKQ==} + '@firebase/installations-compat@0.2.22': + resolution: {integrity: sha512-C/zpAuTP5S9OgKSPvXRupw3hoY/JZSlA1wFjD/Sb7LIQE0FNbcMdO8Y4KXVEkjVzma/DDDDIAzxEXqKMAzc88w==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/installations-types@0.5.3': - resolution: {integrity: sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==} + '@firebase/installations-types@0.5.4': + resolution: {integrity: sha512-U2eFapdHwjb43Vx9o+Pmj4dFfvcHEK1IirEFLqMtWrTHvmdrS3gBpBD1kmJk/9HjsOtoHZxJ2Paoe79e+L1ZPg==} peerDependencies: '@firebase/app-types': 0.x - '@firebase/installations@0.6.21': - resolution: {integrity: sha512-xGFGTeICJZ5vhrmmDukeczIcFULFXybojML2+QSDFoKj5A7zbGN7KzFGSKNhDkIxpjzsYG9IleJyUebuAcmqWA==} + '@firebase/installations@0.6.22': + resolution: {integrity: sha512-ef6nn3GGQTdReCfotRMG77PJZu8CqEbiK5pEoBnM0gTu/Z9v0i/az2p3HABsa/1beQmmyh1OsOjf7P5+pgwdZw==} peerDependencies: '@firebase/app': 0.x - '@firebase/logger@0.5.0': - resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==} + '@firebase/logger@0.5.1': + resolution: {integrity: sha512-vZKLsqE1ABOy8OjQiE7cUTFn4gvaqlk88yp8N94Pk/sDpq61YqZGqmVFZTvOyflTwuYFcWirBdYGoJgbDaXKYQ==} engines: {node: '>=20.0.0'} - '@firebase/messaging-compat@0.2.25': - resolution: {integrity: sha512-eoOQqGLtRlseTdiemTN44LlHZpltK5gnhq8XVUuLgtIOG+odtDzrz2UoTpcJWSzaJQVxNLb/x9f39tHdDM4N4w==} + '@firebase/messaging-compat@0.2.27': + resolution: {integrity: sha512-JNOiu1PPgdHzEPEtoFiNxQuu0x9bm4bfETSQCpGfcTlgWkhlSK7uh7nlsjC10TQLUNgYetLmuutaYTh8aeYLVA==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/messaging-interop-types@0.2.3': - resolution: {integrity: sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==} + '@firebase/messaging-interop-types@0.2.5': + resolution: {integrity: sha512-tUEKnaAP2Y/MNIqgnriPpV6e5l13Vs/+p2yrd6NGlncPJT9O3a8muYZtdnWe+IJ4fgKLHJVC79n/asxk/N5Msw==} - '@firebase/messaging@0.12.25': - resolution: {integrity: sha512-7RhDwoDHlOK1/ou0/LeubxmjcngsTjDdrY/ssg2vwAVpUuVAhQzQvuCAOYxcX5wNC1zCgQ54AP1vdngBwbCmOQ==} + '@firebase/messaging@0.13.0': + resolution: {integrity: sha512-GZoo0uGRvEbszo83xcgbjJp4FpkmBEr4l8Z4hi8gl+P1Spn/MTK3HapanMzSX4yUHuTEiF5hasWRxOaz+o5sxQ==} peerDependencies: '@firebase/app': 0.x - '@firebase/performance-compat@0.2.24': - resolution: {integrity: sha512-YRlejH8wLt7ThWao+HXoKUHUrZKGYq+otxkPS+8nuE5PeN1cBXX7NAJl9ueuUkBwMIrnKdnDqL/voHXxDAAt3g==} + '@firebase/performance-compat@0.2.25': + resolution: {integrity: sha512-q6NjTXpIPoFuUmCmMN/maCdTgzT6aExs9xZo+PxfVLj6uLVGvpyAD6XWjmcrb7jChsFBYbq7E5dyNDF7Zhy9kA==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/performance-types@0.2.3': - resolution: {integrity: sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==} + '@firebase/performance-types@0.2.4': + resolution: {integrity: sha512-kJSEk7b0uhpcPRyL4SQ/GPujLqk52XNKcXlnsKDbWGAb9vugcLvOU3u6zfEdwd+d8hWJb5S5ZizV1JFFI0nkKg==} - '@firebase/performance@0.7.11': - resolution: {integrity: sha512-V3uAhrz7IYJuji+OgT3qYTGKxpek/TViXti9OSsUJ4AexZ3jQjYH5Yrn7JvBxk8MGiSLsC872hh+BxQiPZsm7g==} + '@firebase/performance@0.7.12': + resolution: {integrity: sha512-fe7nV8teUU3OBHlMUZ9Lw4gLhCW2k4m5Uc3pfWGV+fl8uwJQBGp9Q3lqsJ+HSrFu3Q2pJyLAgrClPGSKyDeYgQ==} peerDependencies: '@firebase/app': 0.x - '@firebase/remote-config-compat@0.2.23': - resolution: {integrity: sha512-4+KqRRHEUUmKT6tFmnpWATOsaFfmSuBs1jXH8JzVtMLEYqq/WS9IDM92OdefFDSrAA2xGd0WN004z8mKeIIscw==} + '@firebase/remote-config-compat@0.2.26': + resolution: {integrity: sha512-uC57Tc7GYYOCnMgLkGIVf999XlaYaPDONoa54c93YTKDctlvCZI89z0zQ2RbhGR8Zf+QuCbQHs/99vqoE84a7g==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/remote-config-types@0.5.0': - resolution: {integrity: sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==} + '@firebase/remote-config-types@0.5.1': + resolution: {integrity: sha512-cX/1LT6KQwkXzck2eSzeKnuvXZCyr8qaPpDcikoJs7jmI+oBOXixpDLeDtWj1U6GNMkIoXrEDNoyT2Ypcyp5/A==} - '@firebase/remote-config@0.8.2': - resolution: {integrity: sha512-5EXqOThV4upjK9D38d/qOSVwOqRhemlaOFk9vCkMNNALeIlwr+4pLjtLNo4qoY8etQmU/1q4aIATE9N8PFqg0g==} + '@firebase/remote-config@0.8.5': + resolution: {integrity: sha512-zb+7CDGFP2wYVF1LXQoYIFdoESIQM3p0+uiW1welw8+zvDxAL50K75PKTXXtunJADUrksTVpV7mD0pn54vzJRA==} peerDependencies: '@firebase/app': 0.x - '@firebase/storage-compat@0.4.2': - resolution: {integrity: sha512-R+aB38wxCH5zjIO/xu9KznI7fgiPuZAG98uVm1NcidHyyupGgIDLKigGmRGBZMnxibe/m2oxNKoZpfEbUX2aQQ==} + '@firebase/storage-compat@0.4.3': + resolution: {integrity: sha512-gruVqjtUGX8tEoeNbaWXZm0Zfcfcb7fvmDmBxV8yPAbWvExRnZYLO2+qw9idxNE7BvPXt5csyjSYHy//dAizxw==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/storage-types@0.8.3': - resolution: {integrity: sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==} + '@firebase/storage-types@0.8.4': + resolution: {integrity: sha512-BT7cwxJOx8SWwlQfrlC+bD/Sk3Cw+1odCi8UZNFNWTVZoPsBnA5W+mqtZzVnvsdJpXCFGSGQ7R7vOR6dtM/BRA==} peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/storage@0.14.2': - resolution: {integrity: sha512-o/culaTeJ8GRpKXRJov21rux/n9dRaSOWLebyatFP2sqEdCxQPjVA1H9Z2fzYwQxMIU0JVmC7SPPmU11v7L6vQ==} + '@firebase/storage@0.14.3': + resolution: {integrity: sha512-YX4/YL6P6/fufSSeGnVhjWddcIXbFq2cWIhMKFTZo1E/Rtcl2mJj/BYUQTwJfcE1Tl8un1FOya4L05jcSLN/Eg==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/util@1.15.0': - resolution: {integrity: sha512-AmWf3cHAOMbrCPG4xdPKQaj5iHnyYfyLKZxwz+Xf55bqKbpAmcYifB4jQinT2W9XhDRHISOoPyBOariJpCG6FA==} + '@firebase/util@1.15.1': + resolution: {integrity: sha512-LUdM4Wg7YM9Pq/49nGYySJA0CSQEKnGffFzWV8+6gXN7mGxn+FL1IqvFbuZUtAQcfZgHYDwCE1wwlK7rB7gl2g==} engines: {node: '>=20.0.0'} - '@firebase/webchannel-wrapper@1.0.5': - resolution: {integrity: sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==} + '@firebase/webchannel-wrapper@1.0.6': + resolution: {integrity: sha512-Vr/Mqu79dMwGRAyGbJ4uN4+BtXB3/mRTdzetD1daWNeG8QaWuzhhbG77GltO5c0yYmYls8i250iX73624GJd7Q==} '@gar/promise-retry@1.0.3': resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} @@ -2259,36 +2272,36 @@ packages: '@glideapps/ts-necessities@2.2.3': resolution: {integrity: sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==} - '@google-cloud/common@6.0.0': - resolution: {integrity: sha512-IXh04DlkLMxWgYLIUYuHHKXKOUwPDzDgke1ykkkJPe48cGIS9kkL2U/o0pm4ankHLlvzLF/ma1eO86n/bkumIA==} + '@google-cloud/common@6.0.1': + resolution: {integrity: sha512-1uvKzbmAWUdchIYRsg0f4rUmezOamWuVBSWAPAhnYoUE5OiPEx6v6JOxFIdr3MsrqV+6fyLV3EI1vMPlHoeRvw==} engines: {node: '>=18'} - '@google-cloud/precise-date@5.0.0': - resolution: {integrity: sha512-9h0Gvw92EvPdE8AK8AgZPbMnH5ftDyPtKm7/KUfcJVaPEPjwGDsJd1QV0H8esBDV4II41R/2lDWH1epBqIoKUw==} + '@google-cloud/precise-date@5.0.1': + resolution: {integrity: sha512-9HlRbOcDb8b2tSsOvljPD/Rm+Jn9KxMVB6sLf85CBnoIYdCFTNO1FIizQ13P75itXpSXsLuMlg1XK5opHKVzjg==} engines: {node: '>=18'} '@google-cloud/projectify@4.0.0': resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} engines: {node: '>=14.0.0'} - '@google-cloud/projectify@5.0.0': - resolution: {integrity: sha512-XXQLaIcLrOAMWvRrzz+mlUGtN6vlVNja3XQbMqRi/V7XJTAVwib3VcKd7oRwyZPkp7rBVlHGcaqdyGRrcnkhlA==} + '@google-cloud/projectify@5.0.1': + resolution: {integrity: sha512-yAIqOAlDwx1nPmmA0WICFMSGttVuWX97HpphN71JQ7G+tD/Q6lHbiCTcMJ9r2+PwX6sIwK3ahO4FdSNt5pwhFg==} engines: {node: '>=18'} '@google-cloud/promisify@4.1.0': resolution: {integrity: sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==} engines: {node: '>=18'} - '@google-cloud/promisify@5.0.0': - resolution: {integrity: sha512-N8qS6dlORGHwk7WjGXKOSsLjIjNINCPicsOX6gyyLiYk7mq3MtII96NZ9N2ahwA2vnkLmZODOIH9rlNniYWvCQ==} + '@google-cloud/promisify@5.0.1': + resolution: {integrity: sha512-Ste6NGraHq30ge3Sdq7m+pZE6lRUlkt2YgsEdq/vcoEgdbdZ/7h37Z1dMvivjhlbgrcmYRvlLF9FgI7tXm5wjg==} engines: {node: '>=18'} '@google-cloud/spanner@8.0.0': resolution: {integrity: sha512-IJn+8A3QZJfe7FUtWqHVNo3xJs7KFpurCWGWCiCz3oEh+BkRymKZ1QxfAbU2yGMDzTytLGQ2IV6T2r3cuo75/w==} engines: {node: '>=18'} - '@google/genai@1.50.1': - resolution: {integrity: sha512-YbkX7H9+1Pt8wOt7DDREy8XSoiL6fRDzZQRyaVBarFf8MR3zHGqVdvM4cLbDXqPhxqvegZShgfxb8kw9C7YhAQ==} + '@google/genai@2.10.0': + resolution: {integrity: sha512-e4cFxj3tiuMtsgOT4G9c1hXyGJhg7/Buj7VVeBacRY3fRtkRZZ59Q3nuVp2xbq8BGQXLXCDB253qMhklMOeUDg==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.25.2 @@ -2296,12 +2309,12 @@ packages: '@modelcontextprotocol/sdk': optional: true - '@grpc/grpc-js@1.14.3': - resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} + '@grpc/grpc-js@1.14.4': + resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} engines: {node: '>=12.10.0'} - '@grpc/grpc-js@1.9.15': - resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} + '@grpc/grpc-js@1.9.16': + resolution: {integrity: sha512-wE4Ut/olIzfKqp631XrG+wbF0v1vWFN4YL9FyXC2LJiG33DsV7PLzURjrCvY/6je2ntdRkeLpPDluzSRGaVltQ==} engines: {node: ^8.13.0 || >=10.10.0} '@grpc/proto-loader@0.7.15': @@ -2309,8 +2322,8 @@ packages: engines: {node: '>=6'} hasBin: true - '@grpc/proto-loader@0.8.0': - resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} engines: {node: '>=6'} hasBin: true @@ -2343,13 +2356,13 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/ansi@2.0.5': - resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/checkbox@5.1.4': - resolution: {integrity: sha512-w6KF8ZYRvqHhROkOTHXYC3qIV/KYEu5o12oLqQySvch61vrYtRxNSHTONSdJqWiFJPlCUQAHT5OgOIyuTr+MHQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/checkbox@5.2.1': + resolution: {integrity: sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -2365,67 +2378,76 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.9': - resolution: {integrity: sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/editor@5.1.1': - resolution: {integrity: sha512-6y11LgmNpmn5D2aB5FgnCfBUBK8ZstwLCalyJmORcJZ/WrhOjm16mu6eSqIx8DnErxDqSLr+Jkp+GP8/Nwd5tA==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/expand@5.0.13': - resolution: {integrity: sha512-dF2zvrFo9LshkcB23/O1il13kBkBltWIXzut1evfbuBLXMiGIuC45c+ZQ0uukjCDsvI8OWqun4FRYMnzFCQa3g==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/editor@5.2.2': + resolution: {integrity: sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/external-editor@3.0.0': - resolution: {integrity: sha512-lDSwMgg+M5rq6JKBYaJwSX6T9e/HK2qqZ1oxmOwn4AQoJE5D+7TumsxLGC02PWS//rkIVqbZv3XA3ejsc9FYvg==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/expand@5.1.1': + resolution: {integrity: sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/figures@2.0.5': - resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/external-editor@3.0.3': + resolution: {integrity: sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/input@5.0.12': - resolution: {integrity: sha512-uiMFBl4LqFzJClh80Q3f9hbOFJ6kgkDWI4LjAeBuyO6EanVVMF69AgOvpi1qdqjDSjDN6578B6nky9ceEpI+1Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/input@5.1.2': + resolution: {integrity: sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/number@4.0.12': - resolution: {integrity: sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/number@4.1.1': + resolution: {integrity: sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/password@5.0.12': - resolution: {integrity: sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/password@5.1.1': + resolution: {integrity: sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -2441,36 +2463,45 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.2.8': - resolution: {integrity: sha512-Su7FQvp5buZmCymN3PPoYv31ZQQX4ve2j02k7piGgKAWgE+AQRB5YoYVveGXcl3TZ9ldgRMSxj56YfDFmmaqLg==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/prompts@8.5.2': + resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/search@4.1.8': - resolution: {integrity: sha512-fGiHKGD6DyPIYUWxoXnQTeXeyYqSOUrasDMABBmMHUalH/LxkuzY0xVRtimXAt1sUeeyYkVuKQx1bebMuN11Kw==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/rawlist@5.3.1': + resolution: {integrity: sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/select@5.1.4': - resolution: {integrity: sha512-2kWcGKPMLAXAWRp1AH1SLsQmX+j0QjeljyXMUji9WMZC8nRDO0b7qquIGr6143E7KMLt3VAIGNXzwa/6PXQs4Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/search@4.2.1': + resolution: {integrity: sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/type@4.0.5': - resolution: {integrity: sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/select@5.2.1': + resolution: {integrity: sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -2550,50 +2581,50 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/fs-core@4.57.2': - resolution: {integrity: sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==} + '@jsonjoy.com/fs-core@4.57.8': + resolution: {integrity: sha512-YzVbwggV9452VCeHgo0bjsTaUt1O7JE0XpEsPar93nn/+RAwXk0mb1Y+f5EDJ3TRtRCFe+Ck5RuojdfB4jeHVw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-fsa@4.57.2': - resolution: {integrity: sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==} + '@jsonjoy.com/fs-fsa@4.57.8': + resolution: {integrity: sha512-vmClyvCQMxgqz7uamDiGtRfp4MjzOznk3pcQjCxlIwJcw7TWeyr+bF30hI0x8NxdtNOGMg1pHM74VDIXOeyjuw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-builtins@4.57.2': - resolution: {integrity: sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==} + '@jsonjoy.com/fs-node-builtins@4.57.8': + resolution: {integrity: sha512-mxXSXw8zZwRVakcjLqR2I/psy4gURFSASZS10kKJ2kJw05GC2nXGroGrWVHxwgkxXgQLsFQnB74QaLzsxzdL/w==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-to-fsa@4.57.2': - resolution: {integrity: sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==} + '@jsonjoy.com/fs-node-to-fsa@4.57.8': + resolution: {integrity: sha512-AWZcT/4+H+iDl4XCukbXrarvwEgOrf/prFI5/7eg4ix9FxqVsZysIDJd1Kjd+AjlCeHKHJOaRqjLd5HiGSCJEw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-utils@4.57.2': - resolution: {integrity: sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==} + '@jsonjoy.com/fs-node-utils@4.57.8': + resolution: {integrity: sha512-E/bJ7sQAb4pu9nbeJhbULU3WnqWrswte4N9Js/oHt7aHB746S8/XBqKlcbrqIgnD3095XluovNEZuu5ONT230g==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node@4.57.2': - resolution: {integrity: sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==} + '@jsonjoy.com/fs-node@4.57.8': + resolution: {integrity: sha512-IPEOlDYSnTDYpjQlQg2F8h+eqxKQN3sdbroI0WrteRiQZ462HzVpBo9ZZX485njz4nAacoe3fd4iDiIhk+k5Hg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-print@4.57.2': - resolution: {integrity: sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==} + '@jsonjoy.com/fs-print@4.57.8': + resolution: {integrity: sha512-DfzhOBpmvNu5P/KSe4NNQaOnvNliTdcf0qrh/4EReErF/XUQXYkd0vZl/OiJCm/qjEEo8DWRstliw2/JNS84dA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-snapshot@4.57.2': - resolution: {integrity: sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==} + '@jsonjoy.com/fs-snapshot@4.57.8': + resolution: {integrity: sha512-L+eqKaWOHLDaiMv1dh/EWQ4hA+o6xAhWSumTo3Teg7OM18jU/KE13/e8Mfal+eAZ/pSl4wIhKHcDiwapJzC8Wg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -2689,38 +2720,38 @@ packages: '@cfworker/json-schema': optional: true - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} cpu: [arm64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} cpu: [x64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} cpu: [arm64] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} cpu: [arm] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} cpu: [x64] os: [linux] - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} cpu: [x64] os: [win32] - '@mswjs/interceptors@0.41.8': - resolution: {integrity: sha512-pRLMNKTSGRoLq+KnEB/7OY5vijw1XmcheAAOiv6pj7W1FG32kAGqj1C/RK/cqxRGr1Fh+zBi8sDur8kj3EQv6A==} + '@mswjs/interceptors@0.41.9': + resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} engines: {node: '>=18'} '@napi-rs/nice-android-arm-eabi@1.1.1': @@ -2836,8 +2867,8 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -2858,8 +2889,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@npmcli/agent@4.0.0': - resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + '@npmcli/agent@4.0.2': + resolution: {integrity: sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==} engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/fs@5.0.0': @@ -2963,8 +2994,8 @@ packages: resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} engines: {node: '>= 20'} - '@octokit/request@10.0.8': - resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} + '@octokit/request@10.0.11': + resolution: {integrity: sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==} engines: {node: '>= 20'} '@octokit/rest@22.0.1': @@ -2987,24 +3018,24 @@ packages: resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@2.7.1': - resolution: {integrity: sha512-OPFBYuXEn1E4ja3Y6eeA7O+ZnLBNcXTV5Cgsn1VaqBZ6hC5FnpZPLBNme1LJY8ZtF4aOujPKFoeWN4ik487KuQ==} + '@opentelemetry/context-async-hooks@2.9.0': + resolution: {integrity: sha512-OQ0vzvbZBiUhjqLnUaoNfYmP8553Crr3aggB4y0ZUi815mZ7idpdJXQmoKdeBKJelYttoBlLSSHubmyw3wvX4w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.7.1': - resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} + '@opentelemetry/core@2.9.0': + resolution: {integrity: sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.40.0': - resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} + '@opentelemetry/semantic-conventions@1.41.1': + resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} engines: {node: '>=14'} - '@oxc-project/types@0.128.0': - resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -3094,35 +3125,35 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} - '@peculiar/asn1-cms@2.7.0': - resolution: {integrity: sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==} + '@peculiar/asn1-cms@2.8.0': + resolution: {integrity: sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==} - '@peculiar/asn1-csr@2.7.0': - resolution: {integrity: sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==} + '@peculiar/asn1-csr@2.8.0': + resolution: {integrity: sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==} - '@peculiar/asn1-ecc@2.7.0': - resolution: {integrity: sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==} + '@peculiar/asn1-ecc@2.8.0': + resolution: {integrity: sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==} - '@peculiar/asn1-pfx@2.7.0': - resolution: {integrity: sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==} + '@peculiar/asn1-pfx@2.8.0': + resolution: {integrity: sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==} - '@peculiar/asn1-pkcs8@2.7.0': - resolution: {integrity: sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==} + '@peculiar/asn1-pkcs8@2.8.0': + resolution: {integrity: sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==} - '@peculiar/asn1-pkcs9@2.7.0': - resolution: {integrity: sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==} + '@peculiar/asn1-pkcs9@2.8.0': + resolution: {integrity: sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==} - '@peculiar/asn1-rsa@2.7.0': - resolution: {integrity: sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==} + '@peculiar/asn1-rsa@2.8.0': + resolution: {integrity: sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==} - '@peculiar/asn1-schema@2.7.0': - resolution: {integrity: sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==} + '@peculiar/asn1-schema@2.8.0': + resolution: {integrity: sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==} - '@peculiar/asn1-x509-attr@2.7.0': - resolution: {integrity: sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==} + '@peculiar/asn1-x509-attr@2.8.0': + resolution: {integrity: sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==} - '@peculiar/asn1-x509@2.7.0': - resolution: {integrity: sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==} + '@peculiar/asn1-x509@2.8.0': + resolution: {integrity: sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==} '@peculiar/utils@2.0.3': resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} @@ -3167,129 +3198,126 @@ packages: '@protobufjs/codegen@2.0.5': resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} '@protobufjs/float@1.0.2': resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - '@protobufjs/inquire@1.1.1': - resolution: {integrity: sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==} - '@protobufjs/path@1.1.2': resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} '@protobufjs/pool@1.1.0': resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@protobufjs/utf8@1.1.1': - resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} '@puppeteer/browsers@2.13.0': resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} engines: {node: '>=18'} hasBin: true - '@rolldown/binding-android-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.18': - resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': - resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': - resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': - resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.18': - resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -3300,8 +3328,8 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@29.0.2': - resolution: {integrity: sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==} + '@rollup/plugin-commonjs@29.0.3': + resolution: {integrity: sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -3336,6 +3364,15 @@ packages: rollup: optional: true + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.60.2': resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} cpu: [arm] @@ -3486,8 +3523,8 @@ packages: resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/core@3.2.0': - resolution: {integrity: sha512-kxHrDQ9YgfrWUSXU0cjsQGv8JykOFZQ9ErNKbFPWzk3Hgpwu8x2hHrQ9IdA8yl+j9RTLTC3sAF3Tdq1IQCP4oA==} + '@sigstore/core@3.2.1': + resolution: {integrity: sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==} engines: {node: ^20.17.0 || >=22.9.0} '@sigstore/protobuf-specs@0.5.1': @@ -3502,17 +3539,17 @@ packages: resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==} engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/verify@3.1.0': - resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==} + '@sigstore/verify@3.1.1': + resolution: {integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==} engines: {node: ^20.17.0 || >=22.9.0} - '@simple-libs/child-process-utils@1.0.2': - resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} - engines: {node: '>=18'} + '@simple-libs/child-process-utils@2.0.0': + resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==} + engines: {node: '>=22'} - '@simple-libs/stream-utils@1.2.0': - resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} - engines: {node: '>=18'} + '@simple-libs/stream-utils@2.0.0': + resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} + engines: {node: '>=22'} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -3550,8 +3587,8 @@ packages: resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} engines: {node: ^20.17.0 || >=22.9.0} - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3613,6 +3650,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/events@3.0.3': resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} @@ -3676,11 +3716,11 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@22.19.17': - resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + '@types/node@22.20.0': + resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} - '@types/node@24.12.2': - resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + '@types/node@24.13.2': + resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} '@types/npm-package-arg@6.1.4': resolution: {integrity: sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q==} @@ -3706,8 +3746,8 @@ packages: '@types/pumpify@1.4.5': resolution: {integrity: sha512-BGVAQyK5yJdfIII230fVYGY47V63hUNAhryuuS3b4lEN2LNwxUXFKsEf8QLDCjmZuimlj23BHppJgcrGvNtqKg==} - '@types/qs@6.15.0': - resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} + '@types/qs@6.15.1': + resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3817,6 +3857,10 @@ packages: resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.62.1': + resolution: {integrity: sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.59.1': resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3842,10 +3886,6 @@ packages: resolution: {integrity: sha512-SbmDMJpora293B+TDYfxJL5LEaFh7gdh0MmkPJCBkmGlRPmynTfHcQzVzAll3+IMYFkrf1zZtq/qlgorjaoFoQ==} engines: {node: '>=18'} - '@verdaccio/core@8.0.0': - resolution: {integrity: sha512-bfJjO1AsLhmjpAG7eABmiA5U3ntGfcMCp4sqjejkkaXfNdl9lwqr5nXFT4NRS460StcsblUNhE1veZbepsxu2Q==} - engines: {node: '>=18'} - '@verdaccio/core@8.0.0-next-8.21': resolution: {integrity: sha512-n3Y8cqf84cwXxUUdTTfEJc8fV55PONPKijCt2YaC0jilb5qp1ieB3d4brqTOdCdXuwkmnG2uLCiGpUd/RuSW0Q==} engines: {node: '>=18'} @@ -3854,6 +3894,10 @@ packages: resolution: {integrity: sha512-R8rDEa2mPjfHhEK2tWTMFnrfvyNmTd5ZrNz9X5/EiFVJPr/+oo9cTZkDXzY9+KREJUUIUFili4qynmBt0lw8nw==} engines: {node: '>=18'} + '@verdaccio/core@8.1.2': + resolution: {integrity: sha512-VtpBz9R61GTFUxPiQmBhCOffQZRJZMA2EXO/FzbaoNczm/Xt2KkDJq0PPwV5qmRGeouDRxEKUQ+caJGVN0W7Ww==} + engines: {node: '>=18'} + '@verdaccio/file-locking@10.3.1': resolution: {integrity: sha512-oqYLfv3Yg3mAgw9qhASBpjD50osj2AX4IwbkUtyuhhKGyoFU9eZdrbeW6tpnqUnj6yBMtAPm2eGD4BwQuX400g==} engines: {node: '>=12'} @@ -4054,8 +4098,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -4205,8 +4249,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@1.0.0: - resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} + ast-v8-to-istanbul@1.0.4: + resolution: {integrity: sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==} async-each-series@0.1.1: resolution: {integrity: sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==} @@ -4294,16 +4338,16 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - bare-events@2.8.2: - resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} peerDependencies: bare-abort-controller: '*' peerDependenciesMeta: bare-abort-controller: optional: true - bare-fs@4.7.1: - resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} + bare-fs@4.7.3: + resolution: {integrity: sha512-xRgplks8SvcKkdlv2M6Z2LZmRsmqd+x0nXXGXeMEjwdibj1HSDrlnqBRLeYdMvsgCox7Bq0e+DHwfczOfsn6IA==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -4311,15 +4355,15 @@ packages: bare-buffer: optional: true - bare-os@3.9.1: - resolution: {integrity: sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==} + bare-os@3.9.3: + resolution: {integrity: sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ==} engines: {bare: '>=1.14.0'} - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + bare-path@3.0.1: + resolution: {integrity: sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==} - bare-stream@2.13.1: - resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -4332,8 +4376,8 @@ packages: bare-events: optional: true - bare-url@2.4.2: - resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==} + bare-url@2.4.5: + resolution: {integrity: sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4342,8 +4386,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + baseline-browser-mapping@2.10.42: + resolution: {integrity: sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==} engines: {node: '>=6.0.0'} hasBin: true @@ -4387,24 +4431,24 @@ packages: resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} - bonjour-service@1.3.0: - resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + bonjour-service@1.4.2: + resolution: {integrity: sha512-lMskhnsW70yWHr4PhPeh2rvaIkLSaDpp+nmtbXBZaNKTXwxL73QOkW6HhbzqTImXjevn9TreGT4GACGBCGP9nQ==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - brace-expansion@2.1.0: - resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -4429,8 +4473,8 @@ packages: browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.28.4: + resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4493,8 +4537,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001791: - resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} + caniuse-lite@1.0.30001802: + resolution: {integrity: sha512-vmv8ub2xwTNmljSKf82mtCk5JH7hC+YgzLj3P5zotvA0tPQ9016tdNNOG8WRca1IxOnhSsivB+J0z5FeE5LOUw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4511,8 +4555,8 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} checkpoint-stream@0.1.2: resolution: {integrity: sha512-eYXIcydL3mPjjEVLxHdi1ISgTwmxGJZ8vyJ3lYVvFTDRyTOZMTbKZdRJqiA7Gi1rPcwOyyzcrZmGLL8ff7e69w==} @@ -4660,13 +4704,17 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - conventional-commits-filter@5.0.0: - resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} engines: {node: '>=18'} - conventional-commits-parser@6.4.0: - resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} - engines: {node: '>=18'} + conventional-commits-filter@6.0.1: + resolution: {integrity: sha512-cs+LadpH7Kpw0M3k8wurk+sOVVDAENA0iK4OBOrkL94j5lEVYRJ4j3zd2bhY9qgzyrPqthdcYT3axzRN7AliMg==} + engines: {node: '>=22'} + + conventional-commits-parser@7.0.1: + resolution: {integrity: sha512-6VtskFpPsNkGVk/TY2RnV/MEdKfvCPBtQZN9x8jh9+k5RWBQ+tiaWn5UFCzTr0Dd88iKx7xghxbjBRp5uIzp3g==} + engines: {node: '>=22'} hasBin: true convert-source-map@1.9.0: @@ -4709,8 +4757,8 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} - cosmiconfig@9.0.1: - resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -4971,13 +5019,13 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@5.0.2: - resolution: {integrity: sha512-IpbUaI/CAW86l3f+T8zN0iggSc0LmMZLcIW5eRVStLVNCoTXkE0YlncbbH50fp8Cl6zHIky0sW2uUbhBqGw0Jw==} + ejs@6.0.1: + resolution: {integrity: sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA==} engines: {node: '>=0.12.18'} hasBin: true - electron-to-chromium@1.5.349: - resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} + electron-to-chromium@1.5.387: + resolution: {integrity: sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5006,19 +5054,19 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - engine.io-client@6.6.4: - resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + engine.io-client@6.6.6: + resolution: {integrity: sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==} engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.7: - resolution: {integrity: sha512-DgOngfDKM2EviOH3Mr9m7ks1q8roetLy/IMmYthAYzbpInMbYc/GS+fWFA3rl1gvwKVsQrVV61fo5emD1y3OJQ==} + engine.io@6.6.9: + resolution: {integrity: sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + enhanced-resolve@5.24.1: + resolution: {integrity: sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==} engines: {node: '>=10.13.0'} ent@2.2.2: @@ -5057,6 +5105,10 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -5069,11 +5121,11 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-module-lexer@2.3.0: + resolution: {integrity: sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: @@ -5084,12 +5136,12 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} - esbuild-wasm@0.28.0: - resolution: {integrity: sha512-5TRVKExcEmeMkccIZMzUq+Az6X2RoMAJyfl6SMMO1dMVhmvt0I2mx7gAb6zYi42n4d1ETcatFXazGKzA+aW7fg==} + esbuild-wasm@0.28.1: + resolution: {integrity: sha512-p/GD4E8oYRjg3kjdKrnMb0s4PzXgJF42e0MF4H0+ACyK/kIlFRp3e0fzOleIG+wBBm6MM3XQrbpe7soEA+vJIA==} engines: {node: '>=18'} hasBin: true @@ -5098,8 +5150,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true @@ -5128,8 +5180,8 @@ packages: eslint-import-resolver-node@0.3.10: resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -5252,16 +5304,16 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.8: - resolution: {integrity: sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==} + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} engines: {node: '>=18.0.0'} eventsource@3.0.7: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} exponential-backoff@3.1.3: @@ -5270,8 +5322,8 @@ packages: express-rate-limit@5.5.1: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} - express-rate-limit@8.4.1: - resolution: {integrity: sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==} + express-rate-limit@8.5.2: + resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -5280,6 +5332,10 @@ packages: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} + express@4.22.2: + resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} + engines: {node: '>= 0.10.0'} + express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} @@ -5296,9 +5352,6 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - fast-content-type-parse@3.0.0: - resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5321,11 +5374,11 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.3: + resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} - fast-wrap-ansi@0.2.0: - resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -5386,8 +5439,8 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - firebase@12.12.1: - resolution: {integrity: sha512-ee7xA+bTJLfjB9BP/8FQr3EkxmpAAGc1lNc5QkWgTDpUw24HYXFPm7FEWRdLtGnygxIdYpFmepSc5VjkI6NHhw==} + firebase@12.15.0: + resolution: {integrity: sha512-p0YTLcRSTiBXMx9sGr4ZNSfLjc/RVBEw4C/TXjVMtw65+6E1Pbm47UY3F4/AqRoDobEcNX3gsbPGy7jPjxbgSQ==} flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} @@ -5400,8 +5453,8 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - folder-hash@4.1.2: - resolution: {integrity: sha512-rjdiHw3ShVonhMZZXvD/I28boUkbJFT/RBsg5MbQQd8e61PhevIwFwmL218/AscBEsW/blH4BC4A+kFeIqHVfw==} + folder-hash@4.1.3: + resolution: {integrity: sha512-94fj+fXj1XHT8zGumUy/VlyFARc/yrslKJ2+vjrP/U6ftTdL7u68+gQhvSBjz9wrwTuty6BpZ7JsbEK5OU9RNw==} engines: {node: '>=10.10.0'} hasBin: true @@ -5428,8 +5481,8 @@ packages: form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} formdata-polyfill@4.0.10: @@ -5473,21 +5526,29 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gaxios@7.1.4: - resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} + gaxios@7.1.3: + resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + engines: {node: '>=18'} + + gaxios@7.1.5: + resolution: {integrity: sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg==} engines: {node: '>=18'} gcp-metadata@8.1.2: resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} engines: {node: '>=18'} + gcp-metadata@8.1.3: + resolution: {integrity: sha512-ziTrzUhhpL9Zk5k0HHzgP/KIpWDJT0VMBC/ynt/QIBvTW+UUcSivQRl6VlwTf/EilDxtSWklHoRsKy1c4k+59w==} + engines: {node: '>=18'} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -5500,8 +5561,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -5528,9 +5589,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} @@ -5580,12 +5638,16 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - google-auth-library@10.6.2: - resolution: {integrity: sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==} + google-auth-library@10.5.0: + resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} engines: {node: '>=18'} - google-gax@5.0.6: - resolution: {integrity: sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==} + google-auth-library@10.9.0: + resolution: {integrity: sha512-xtvUqvINPhTaBm7nXqlYPcrMHJPm1lCNdSovxnKKhTm+4JsvQ+KGVYJViLoH9Yxu8w+T0Qv5HubzYT9BLrppJg==} + engines: {node: '>=18'} + + google-gax@5.0.7: + resolution: {integrity: sha512-EhiqaWWJ+9h7sCcKJTsoo6tMcjokVHhWsbSuWCnZJT4vIBP3y4mAoFLnt9SzgkVZeq24ZsFaArr06nnYYku2yA==} engines: {node: '>=18'} google-logging-utils@1.1.3: @@ -5603,14 +5665,14 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphql-tag@2.12.6: - resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + graphql-tag@2.12.7: + resolution: {integrity: sha512-xnE/NFzy+0eIesvAsREJZ284zTl/wYuBAvpsFSDhRGRdRHdnE90M21Q3xAWyYInb0J756c6x0pIQ62+vtvOs1Q==} engines: {node: '>=10'} peerDependencies: - graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - graphql@16.13.2: - resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} + graphql@16.14.2: + resolution: {integrity: sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} grpc-gcp@1.0.1: @@ -5619,6 +5681,10 @@ packages: peerDependencies: protobufjs: '*' + gtoken@8.0.0: + resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} + engines: {node: '>=18'} + gunzip-maybe@1.4.2: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true @@ -5654,12 +5720,12 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} - hono@4.12.16: - resolution: {integrity: sha512-jN0ZewiNAWSe5khM3EyCmBb250+b40wWbwNILNfEvq84VREWwOIkuUsFONk/3i3nqkz7Oe1PcpM2mwQEK2L9Kg==} + hono@4.12.27: + resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} engines: {node: '>=16.9.0'} hosted-git-info@9.0.3: @@ -5707,8 +5773,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + http-proxy-middleware@2.0.10: + resolution: {integrity: sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 @@ -5764,8 +5830,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} icss-utils@5.1.0: @@ -5801,8 +5867,8 @@ packages: resolution: {integrity: sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==} engines: {node: '>=0.10.0'} - immutable@5.1.5: - resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} + immutable@5.1.9: + resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -5830,10 +5896,6 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - ip-address@10.2.0: resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} @@ -5873,8 +5935,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -5893,6 +5955,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -5945,8 +6011,8 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.3.1: - resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} + is-network-error@1.3.2: + resolution: {integrity: sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==} engines: {node: '>=16'} is-node-process@1.2.0: @@ -6109,6 +6175,9 @@ packages: jasmine-core@6.2.0: resolution: {integrity: sha512-b16WZG/pFEFj8qRW1ss7nDuNGYz9ji8BDGj7fJNrROauk5rj/diO3KPOuyIpcgUChdC+c0PfQ8iUk4nHE+EN4w==} + jasmine-core@6.3.0: + resolution: {integrity: sha512-eMm5qBovNjNoGOcgE/W207+wrcK5zrQv0Rg/rWGboUJUmZp0dFCpHTyjpuDAfCwRCqg7f9U2q2jtv/aUuzdCQg==} + jasmine-reporters@2.5.2: resolution: {integrity: sha512-qdewRUuFOSiWhiyWZX8Yx3YNQ9JG51ntBEO4ekLQRpktxFTwUHy24a86zD/Oi2BRTKksEdfWQZcQFqzjqIkPig==} @@ -6119,19 +6188,23 @@ packages: resolution: {integrity: sha512-dvYt7bidcu0JvvSbiUnSDW7UQQiflUwDr6C+5wzoZ0J7RY9u+UcoSIzyhMPj6fnU/tC7KinJ5QrjwD2Y9p4T4w==} hasBin: true + jasmine@6.3.0: + resolution: {integrity: sha512-u6L7yYtrtS1JALlp7f4k7Wz7o7ZKXauSKKkXc0L3qUkKrdaxYvNiMHhHp5gtTuVZZXVihXRxS7bWwDBX1wJ7EQ==} + hasBin: true + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true jose@6.2.3: resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} - js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-base64@3.8.0: + resolution: {integrity: sha512-65kvbemyZhj+ExQt1PEFyBEjL5vAHysu1lJdW1AwhhChkO8ZBPizYk/m9GVrpbS2Je1hF+UYZ+6KywqtZV8mHw==} js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -6143,6 +6216,10 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -6265,8 +6342,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - launch-editor@2.13.2: - resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} less-loader@12.3.2: resolution: {integrity: sha512-uLV5c702ff2jBvO7qewpkLRzkh/I9QW07ur2NKkv8TVTrtX2lrKjEbEU/LLXAn7cgpCIBbkfyUm4qYXCQs5/+w==} @@ -6396,8 +6473,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6410,8 +6487,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.5.2: - resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -6421,8 +6498,8 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-fetch-happen@15.0.5: - resolution: {integrity: sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==} + make-fetch-happen@15.0.6: + resolution: {integrity: sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==} engines: {node: ^20.17.0 || >=22.9.0} math-intrinsics@1.1.0: @@ -6440,14 +6517,14 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - memfs@4.57.2: - resolution: {integrity: sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==} + memfs@4.57.8: + resolution: {integrity: sha512-bApYhn8BLpFAnAQmFfEl/NPN+8qx5Ar3V4Qt3ek23mVwBEElzV7c6XoPkb/PCG8ZFpowCEpHcPwMFTwHS7tSMA==} peerDependencies: tslib: '2' - meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -6602,12 +6679,12 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} hasBin: true - msgpackr@1.11.12: - resolution: {integrity: sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==} + msgpackr@1.12.1: + resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} @@ -6621,8 +6698,8 @@ packages: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -6653,12 +6730,12 @@ packages: resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} engines: {node: '>= 0.4.0'} - ng-packagr@22.0.0-next.3: - resolution: {integrity: sha512-M4h0PxrWLJSlJ8TCaH5Y5ZDBeRJvSQTe9FlsyMVMSjo/1fPYG16a/qkMbv/EYO0+LCrooRS+DdRjKx13b6P15A==} - engines: {node: ^22.22.0 || >=24.13.1} + ng-packagr@22.0.1: + resolution: {integrity: sha512-gL03L/OBNWz4nqTo8l5u6f3hySYzAVwx3aVZs6X7UGQv+cT+HUozr2XquAvvl/beray0AgCAfydGELDAJAFyKg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler-cli': ^22.0.0-next.3 + '@angular/compiler-cli': ^22.0.0 || ^22.1.0-next.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 typescript: '>=6.0 <6.1' @@ -6666,8 +6743,8 @@ packages: tailwindcss: optional: true - nock@14.0.13: - resolution: {integrity: sha512-SCPsQmGVNY8h1rfS3aU0MzOGYY+wKIFukHEsoSIwPRCYocZkya7MFIlWIEYPWQZj+Gaksg6EyUaY255ZDqpQuA==} + nock@14.0.16: + resolution: {integrity: sha512-8r4KEc6nT1D/fdLD/R1BO1CPaVEL8o40u/guFRJlXabN7vr3RmMqyjsY5Krt0nMwhsOAwXQ/mtN5vy5Jh3aErg==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} node-addon-api@6.1.0: @@ -6681,8 +6758,8 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} node-fetch-native@1.6.7: @@ -6718,13 +6795,14 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-gyp@12.3.0: - resolution: {integrity: sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==} + node-gyp@12.4.0: + resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} + engines: {node: '>=18'} nopt@9.0.0: resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} @@ -6809,8 +6887,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} @@ -6881,8 +6960,8 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + p-map@7.0.5: + resolution: {integrity: sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==} engines: {node: '>=18'} p-queue@6.6.2: @@ -6912,8 +6991,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - pacote@21.5.0: - resolution: {integrity: sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ==} + pacote@21.5.1: + resolution: {integrity: sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true @@ -7024,8 +7103,8 @@ packages: resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} hasBin: true - piscina@5.1.4: - resolution: {integrity: sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==} + piscina@5.2.0: + resolution: {integrity: sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==} engines: {node: '>=20.x'} pkce-challenge@5.0.1: @@ -7098,8 +7177,8 @@ packages: peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -7109,6 +7188,10 @@ packages: resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} @@ -7117,8 +7200,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + prettier@3.9.4: + resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} engines: {node: '>=14'} hasBin: true @@ -7151,8 +7234,8 @@ packages: resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==} engines: {node: '>=18'} - protobufjs@7.5.6: - resolution: {integrity: sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==} + protobufjs@7.6.5: + resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -7209,8 +7292,8 @@ packages: resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} - qs@6.15.1: - resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -7230,6 +7313,10 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + raw-body@2.5.3: resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} @@ -7238,6 +7325,9 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} + re2js@0.4.3: + resolution: {integrity: sha512-EuNmh7jurhHEE8Ge/lBo9JuMLb3qf866Xjjfyovw3wPc7+hlqDkZq4LwhrCQMEI+ARWfrKrHozEndzlpNT0WDg==} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -7297,8 +7387,8 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.1: - resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true require-directory@2.1.1: @@ -7319,9 +7409,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve-url-loader@5.0.0: resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} engines: {node: '>=12'} @@ -7331,8 +7418,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} engines: {node: '>= 0.4'} hasBin: true @@ -7347,8 +7434,8 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - retry-request@8.0.2: - resolution: {integrity: sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==} + retry-request@8.0.3: + resolution: {integrity: sha512-qqoc4kkGgP9cmQDWELlOpAmfgJOg0Yi7MT82ZjiPWu451ayju4itwomjM4/dBEliify8C1b3tSaeCOldugtwPQ==} engines: {node: '>=18'} retry@0.13.1: @@ -7371,8 +7458,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@1.0.0-rc.18: - resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7507,6 +7594,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.2: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} @@ -7515,8 +7607,8 @@ packages: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - serialize-javascript@7.0.5: - resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} + serialize-javascript@7.0.7: + resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} engines: {node: '>=20.0.0'} serve-index@1.9.2: @@ -7561,8 +7653,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + shell-quote@1.9.0: + resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} engines: {node: '>= 0.4'} side-channel-list@1.0.1: @@ -7577,8 +7669,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -7591,8 +7683,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sigstore@4.1.0: - resolution: {integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==} + sigstore@4.1.1: + resolution: {integrity: sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==} engines: {node: ^20.17.0 || >=22.9.0} slice-ansi@7.1.2: @@ -7607,8 +7699,8 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-adapter@2.5.6: - resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} + socket.io-adapter@2.5.8: + resolution: {integrity: sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==} socket.io-client@4.8.3: resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} @@ -7629,8 +7721,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.8: - resolution: {integrity: sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==} + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@3.8.1: @@ -7756,8 +7848,8 @@ packages: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} - streamx@2.25.0: - resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -7778,12 +7870,12 @@ packages: resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} engines: {node: '>=20'} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -7838,8 +7930,8 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-fs@3.1.2: - resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} + tar-fs@3.1.3: + resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -7847,30 +7939,57 @@ packages: tar-stream@3.2.0: resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} - tar@7.5.13: - resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} + tar@7.5.19: + resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} engines: {node: '>=18'} - teeny-request@10.1.2: - resolution: {integrity: sha512-Xj0ZAQ0CeuQn6UxCDPLbFRlgcSTUEyO3+wiepr2grjIjyL/lMMs1Z4OwXn8kLvn/V1OuaEP0UY7Na6UDNNsYrQ==} + teeny-request@10.1.3: + resolution: {integrity: sha512-5yDliI1uWkYPo7W+Zvrxg6YmoWuj5iC5EydewqrRTvc68nyMTZhlPPlLg6cptUGfbQAb+N9XDPDPzF6N081lug==} engines: {node: '>=18'} teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - terser-webpack-plugin@5.5.0: - resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} engines: {node: '>= 10.13.0'} peerDependencies: + '@minify-html/node': '*' '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' uglify-js: '*' webpack: ^5.1.0 peerDependenciesMeta: + '@minify-html/node': + optional: true '@swc/core': optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true esbuild: optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true uglify-js: optional: true @@ -7888,8 +8007,8 @@ packages: peerDependencies: tslib: ^2 - thread-stream@3.1.0: - resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + thread-stream@3.2.0: + resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -7909,8 +8028,8 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.1.2: - resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} tinyglobby@0.2.16: @@ -7924,28 +8043,28 @@ packages: tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tldts-core@7.0.30: - resolution: {integrity: sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==} + tldts-core@7.4.6: + resolution: {integrity: sha512-TkQNGJIhlEphpHCjKodMTSe23egUZr/g+flI2qkLgiJ/maAzSgXypSLRTNH3nCmqgayEmtcJBiLcfODSAr1xoA==} tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tldts@7.0.30: - resolution: {integrity: sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==} + tldts@7.4.6: + resolution: {integrity: sha512-rbP0Gyx8b3Ae9yO//CU2wbSnQNoQ66m1nJdSbSHmnwKwzkkz/u8mERYU8T2rmlmy+bJvRNn84yNCW8gYqox44Q==} hasBin: true - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} + toad-cache@3.7.4: + resolution: {integrity: sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==} + engines: {node: '>=20'} toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} @@ -7987,8 +8106,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.23.0: + resolution: {integrity: sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==} engines: {node: '>=18.0.0'} hasBin: true @@ -8021,9 +8140,9 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -8037,8 +8156,8 @@ packages: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} typed-assert@1.0.9: @@ -8075,15 +8194,15 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@6.25.0: - resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} + undici@6.27.0: + resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} engines: {node: '>=18.17'} - undici@7.25.0: - resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} undici@8.2.0: @@ -8176,8 +8295,8 @@ packages: resolution: {integrity: sha512-ckn4xxNEkK5lflwb8a6xs2j6rVe//9sEH4rJHBqh2RelKYnFkxHbnN06gsdV2KtqSKDD9F4NE2UDA9SSs8E90w==} engines: {node: '>=18'} - verdaccio-auth-memory@13.0.0: - resolution: {integrity: sha512-83nPBvWTR14XSsz9Yx5ICl4jtSE+/1PecUstYa9d2PJEzcCwWizlUCUq0xGOXA0rGaCHim5h9C/t6rzyNoQsFw==} + verdaccio-auth-memory@13.0.3: + resolution: {integrity: sha512-EXzDLxTfpm7/B0TEAUKHgi/ygWqjNAyQ+O2rGAF9WONMZY99LVPmf7IpGoKMWCarf2L+nuKVxJ9hbyQeFbyysQ==} engines: {node: '>=18'} verdaccio-htpasswd@13.0.0-next-8.37: @@ -8193,8 +8312,8 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - vite@7.3.2: - resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -8343,8 +8462,8 @@ packages: resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} engines: {node: '>=18.0.0'} - webpack-sources@3.4.1: - resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} + webpack-sources@3.5.0: + resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} engines: {node: '>=10.13.0'} webpack-subresource-integrity@5.1.0: @@ -8367,8 +8486,8 @@ packages: webpack-cli: optional: true - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + websocket-driver@0.7.5: + resolution: {integrity: sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==} engines: {node: '>=0.8.0'} websocket-extensions@0.1.4: @@ -8398,8 +8517,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -8416,6 +8535,11 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true + which@7.0.0: + resolution: {integrity: sha512-RancgH2dmbLdHl6LRhEqvklWMgl/Hdnun0Y90KhBOLkMefg8Qa7/Zel8Sm+8HEcP6DEjzsWzpkuBQEZok58isA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -8450,20 +8574,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -8515,13 +8627,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} - engines: {node: '>= 14.6'} - hasBin: true - - yaml@2.8.4: - resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -8537,12 +8644,12 @@ packages: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} engines: {node: '>=10'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} yargs@18.0.0: @@ -8571,8 +8678,8 @@ packages: zod@4.4.2: resolution: {integrity: sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==} - zone.js@0.16.1: - resolution: {integrity: sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==} + zone.js@0.16.2: + resolution: {integrity: sha512-Eky7p2Z1Ig3NnbfodSPoARCjKBSTFMnE/ACsP1L/XJEfY4SdOFce19BsUCWVwL6K5ABZFy5J3bjcMWffX+YM3Q==} snapshots: @@ -8588,7 +8695,7 @@ snapshots: '@actions/http-client@4.0.1': dependencies: tunnel: 0.0.6 - undici: 6.25.0 + undici: 6.27.0 '@actions/io@3.0.2': {} @@ -8681,30 +8788,30 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))': dependencies: - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 - '@angular/cdk@22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/cdk@22.0.4(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) parse5: 8.0.1 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3)': + '@angular/compiler-cli@22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3)': dependencies: - '@angular/compiler': 22.0.0-next.10 - '@babel/core': 7.29.0 + '@angular/compiler': 22.0.5 + '@babel/core': 7.29.7 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 convert-source-map: 1.9.0 @@ -8717,57 +8824,57 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@22.0.0-next.10': + '@angular/compiler@22.0.5': dependencies: tslib: 2.8.1 - '@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)': + '@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 22.0.0-next.10 - zone.js: 0.16.1 + '@angular/compiler': 22.0.5 + zone.js: 0.16.2 - '@angular/forms@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/forms@22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 zod: 4.4.2 - '@angular/localize@22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10)': + '@angular/localize@22.0.5(@angular/compiler-cli@22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3))(@angular/compiler@22.0.5)': dependencies: - '@angular/compiler': 22.0.0-next.10 - '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) - '@babel/core': 7.29.0 + '@angular/compiler': 22.0.5 + '@angular/compiler-cli': 22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3) + '@babel/core': 7.29.7 '@types/babel__core': 7.20.5 tinyglobby: 0.2.16 yargs: 18.0.0 transitivePeerDependencies: - supports-color - '@angular/material@22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133)': + '@angular/material@22.0.4(6be0b281a48be0903635a651d19c7699)': dependencies: - '@angular/cdk': 22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/cdk': 22.0.4(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + '@angular/common': 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/forms': 22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + '@angular/platform-browser': 22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/488fd3e0a6e5ad872c9c9ca1a6c43d3686146d44(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))': dependencies: '@actions/core': 3.0.1 - '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) + '@conventional-changelog/git-client': 3.0.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.0.1) '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) - '@inquirer/prompts': 8.4.2(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@google/genai': 2.10.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) + '@inquirer/prompts': 8.5.2(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) '@octokit/auth-app': 8.2.0 '@octokit/core': 7.0.6 '@octokit/graphql': 9.0.3 @@ -8784,7 +8891,7 @@ snapshots: '@types/events': 3.0.3 '@types/folder-hash': 4.0.4 '@types/jasmine': 6.0.0 - '@types/node': 24.12.2 + '@types/node': 24.13.2 '@types/semver': 7.7.1 '@types/which': 3.0.4 '@types/yargs': 17.0.35 @@ -8792,71 +8899,71 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 bufferutil: 4.1.0 cli-progress: 3.12.0 - conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.4.0 - ejs: 5.0.2 + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.0.1 + ejs: 6.0.1 encoding: 0.1.13 fast-glob: 3.3.3 - firebase: 12.12.1 - folder-hash: 4.1.2(supports-color@10.2.2) - jasmine: 6.2.0 - jasmine-core: 6.2.0 + firebase: 12.15.0 + folder-hash: 4.1.3(supports-color@10.2.2) + jasmine: 6.3.0 + jasmine-core: 6.3.0 jasmine-reporters: 2.5.2 jsonc-parser: 3.3.1 minimatch: 10.2.5 multimatch: 8.0.0 - nock: 14.0.13 - semver: 7.7.4 + nock: 14.0.16 + semver: 7.8.5 supports-color: 10.2.2 - tsx: 4.21.0 + tsx: 4.23.0 typed-graphqlify: 3.1.6 typescript: 6.0.3 utf-8-validate: 6.0.6 - which: 6.0.1 - yaml: 2.8.3 + which: 7.0.0 + yaml: 2.9.0 yargs: 18.0.0 zod: 4.4.2 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' - '@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/animations': 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) - '@angular/platform-server@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/platform-server@22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@22.0.5)(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/compiler': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/compiler': 22.0.5 + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) rxjs: 7.8.2 tslib: 2.8.1 xhr2: 0.2.1 - '@angular/router@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/router@22.0.5(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.5(@angular/animations@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/service-worker@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/service-worker@22.0.5(@angular/core@22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.5(@angular/compiler@22.0.5)(rxjs@7.8.2)(zone.js@0.16.2) rxjs: 7.8.2 tslib: 2.8.1 '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -8872,25 +8979,45 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.3': {} + '@babel/compat-data@7.29.7': {} '@babel/core@7.29.0': dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@10.2.2) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@10.2.2) @@ -8902,178 +9029,199 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.29.3 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.2 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.0)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-annotate-as-pure': 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 debug: 4.4.3(supports-color@10.2.2) lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.28.5': + '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helper-wrap-function@7.28.6': + '@babel/helper-wrap-function@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helpers@7.29.2': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 - '@babel/parser@7.29.3': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -9081,309 +9229,309 @@ snapshots: dependencies: '@babel/core': 7.29.0 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/template': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) @@ -9391,125 +9539,125 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.29.7 '@babel/preset-env@7.29.3(@babel/core@7.29.0)': dependencies: - '@babel/compat-data': 7.29.3 + '@babel/compat-data': 7.29.7 '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.3(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.0) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.0) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.0) '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) @@ -9522,34 +9670,34 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.7 esutils: 2.0.3 '@babel/runtime@7.29.2': {} - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@bazel/bazelisk@1.28.1': {} @@ -9565,26 +9713,26 @@ snapshots: '@colors/colors@1.5.0': {} - '@conventional-changelog/git-client@2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': + '@conventional-changelog/git-client@3.0.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.0.1)': dependencies: - '@simple-libs/child-process-utils': 1.0.2 - '@simple-libs/stream-utils': 1.2.0 + '@simple-libs/child-process-utils': 2.0.0 + '@simple-libs/stream-utils': 2.0.0 semver: 7.7.4 optionalDependencies: - conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.4.0 + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.0.1 - '@csstools/color-helpers@6.0.2': {} + '@csstools/color-helpers@6.1.0': {} - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/color-helpers': 6.1.0 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -9592,7 +9740,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -9606,7 +9754,7 @@ snapshots: combined-stream: 1.0.8 extend: 3.0.2 forever-agent: 0.6.1 - form-data: 4.0.5 + form-data: 4.0.6 http-signature: 1.4.0 is-typedarray: 1.0.0 isstream: 0.1.2 @@ -9640,171 +9788,171 @@ snapshots: '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/aix-ppc64@0.28.0': + '@esbuild/aix-ppc64@0.28.1': optional: true '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm64@0.28.0': + '@esbuild/android-arm64@0.28.1': optional: true '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-arm@0.28.0': + '@esbuild/android-arm@0.28.1': optional: true '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/android-x64@0.28.0': + '@esbuild/android-x64@0.28.1': optional: true '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.28.0': + '@esbuild/darwin-arm64@0.28.1': optional: true '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/darwin-x64@0.28.0': + '@esbuild/darwin-x64@0.28.1': optional: true '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.28.0': + '@esbuild/freebsd-arm64@0.28.1': optional: true '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.28.0': + '@esbuild/freebsd-x64@0.28.1': optional: true '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm64@0.28.0': + '@esbuild/linux-arm64@0.28.1': optional: true '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-arm@0.28.0': + '@esbuild/linux-arm@0.28.1': optional: true '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-ia32@0.28.0': + '@esbuild/linux-ia32@0.28.1': optional: true '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-loong64@0.28.0': + '@esbuild/linux-loong64@0.28.1': optional: true '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-mips64el@0.28.0': + '@esbuild/linux-mips64el@0.28.1': optional: true '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-ppc64@0.28.0': + '@esbuild/linux-ppc64@0.28.1': optional: true '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.28.0': + '@esbuild/linux-riscv64@0.28.1': optional: true '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-s390x@0.28.0': + '@esbuild/linux-s390x@0.28.1': optional: true '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/linux-x64@0.28.0': + '@esbuild/linux-x64@0.28.1': optional: true '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-arm64@0.28.0': + '@esbuild/netbsd-arm64@0.28.1': optional: true '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.28.0': + '@esbuild/netbsd-x64@0.28.1': optional: true '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-arm64@0.28.0': + '@esbuild/openbsd-arm64@0.28.1': optional: true '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.28.0': + '@esbuild/openbsd-x64@0.28.1': optional: true '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/openharmony-arm64@0.28.0': + '@esbuild/openharmony-arm64@0.28.1': optional: true '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/sunos-x64@0.28.0': + '@esbuild/sunos-x64@0.28.1': optional: true '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-arm64@0.28.0': + '@esbuild/win32-arm64@0.28.1': optional: true '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-ia32@0.28.0': + '@esbuild/win32-ia32@0.28.1': optional: true '@esbuild/win32-x64@0.27.7': optional: true - '@esbuild/win32-x64@0.28.0': + '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.7.0))': dependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.5(eslint@10.3.0(jiti@2.6.1))': + '@eslint/compat@2.0.5(eslint@10.3.0(jiti@2.7.0))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@eslint/config-array@0.23.5': dependencies: @@ -9830,384 +9978,385 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.1': + '@eslint/plugin-kit@0.7.2': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 - '@exodus/bytes@1.15.0': {} + '@exodus/bytes@1.15.1': {} - '@firebase/ai@2.11.1(@firebase/app-types@0.9.4)(@firebase/app@0.14.11)': + '@firebase/ai@2.13.1(@firebase/app-types@0.9.5)(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/app-check-interop-types': 0.3.3 - '@firebase/app-types': 0.9.4 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/app-check-interop-types': 0.3.4 + '@firebase/app-types': 0.9.5 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/analytics-compat@0.2.27(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11)': + '@firebase/analytics-compat@0.2.28(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0)': dependencies: - '@firebase/analytics': 0.10.21(@firebase/app@0.14.11) - '@firebase/analytics-types': 0.8.3 - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/util': 1.15.0 + '@firebase/analytics': 0.10.22(@firebase/app@0.15.0) + '@firebase/analytics-types': 0.8.4 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/analytics-types@0.8.3': {} + '@firebase/analytics-types@0.8.4': {} - '@firebase/analytics@0.10.21(@firebase/app@0.14.11)': + '@firebase/analytics@0.10.22(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/installations': 0.6.21(@firebase/app@0.14.11) - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/installations': 0.6.22(@firebase/app@0.15.0) + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/app-check-compat@0.4.2(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11)': + '@firebase/app-check-compat@0.4.5(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-check': 0.11.2(@firebase/app@0.14.11) - '@firebase/app-check-types': 0.5.3 - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app-check': 0.12.0(@firebase/app@0.15.0) + '@firebase/app-check-types': 0.5.4 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-check-interop-types@0.3.3': {} + '@firebase/app-check-interop-types@0.3.4': {} - '@firebase/app-check-types@0.5.3': {} + '@firebase/app-check-types@0.5.4': {} - '@firebase/app-check@0.11.2(@firebase/app@0.14.11)': + '@firebase/app-check@0.12.0(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/app-compat@0.5.11': + '@firebase/app-compat@0.5.14': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/app-types@0.9.4': + '@firebase/app-types@0.9.5': dependencies: - '@firebase/logger': 0.5.0 + '@firebase/logger': 0.5.1 - '@firebase/app@0.14.11': + '@firebase/app@0.15.0': dependencies: - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 idb: 7.1.1 tslib: 2.8.1 - '@firebase/auth-compat@0.6.5(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11)': + '@firebase/auth-compat@0.6.8(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/auth': 1.13.0(@firebase/app@0.14.11) - '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.4)(@firebase/util@1.15.0) - '@firebase/component': 0.7.2 - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/auth': 1.13.3(@firebase/app@0.15.0) + '@firebase/auth-types': 0.13.1(@firebase/app-types@0.9.5)(@firebase/util@1.15.1) + '@firebase/component': 0.7.3 + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@react-native-async-storage/async-storage' - '@firebase/auth-interop-types@0.2.4': {} + '@firebase/auth-interop-types@0.2.5': {} - '@firebase/auth-types@0.13.0(@firebase/app-types@0.9.4)(@firebase/util@1.15.0)': + '@firebase/auth-types@0.13.1(@firebase/app-types@0.9.5)(@firebase/util@1.15.1)': dependencies: - '@firebase/app-types': 0.9.4 - '@firebase/util': 1.15.0 + '@firebase/app-types': 0.9.5 + '@firebase/util': 1.15.1 - '@firebase/auth@1.13.0(@firebase/app@0.14.11)': + '@firebase/auth@1.13.3(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/component@0.7.2': + '@firebase/component@0.7.3': dependencies: - '@firebase/util': 1.15.0 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/data-connect@0.6.0(@firebase/app@0.14.11)': + '@firebase/data-connect@0.7.1(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/auth-interop-types': 0.2.5 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/database-compat@2.1.3': + '@firebase/database-compat@2.1.4': dependencies: - '@firebase/component': 0.7.2 - '@firebase/database': 1.1.2 - '@firebase/database-types': 1.0.19 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/component': 0.7.3 + '@firebase/database': 1.1.3 + '@firebase/database-types': 1.0.20 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/database-types@1.0.19': + '@firebase/database-types@1.0.20': dependencies: - '@firebase/app-types': 0.9.4 - '@firebase/util': 1.15.0 + '@firebase/app-types': 0.9.5 + '@firebase/util': 1.15.1 - '@firebase/database@1.1.2': + '@firebase/database@1.1.3': dependencies: - '@firebase/app-check-interop-types': 0.3.3 - '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app-check-interop-types': 0.3.4 + '@firebase/auth-interop-types': 0.2.5 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 faye-websocket: 0.11.4 tslib: 2.8.1 - '@firebase/firestore-compat@0.4.8(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11)': + '@firebase/firestore-compat@0.4.11(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/firestore': 4.14.0(@firebase/app@0.14.11) - '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.4)(@firebase/util@1.15.0) - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/firestore': 4.16.0(@firebase/app@0.15.0) + '@firebase/firestore-types': 3.0.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.1) + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/firestore-types@3.0.3(@firebase/app-types@0.9.4)(@firebase/util@1.15.0)': + '@firebase/firestore-types@3.0.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.1)': dependencies: - '@firebase/app-types': 0.9.4 - '@firebase/util': 1.15.0 + '@firebase/app-types': 0.9.5 + '@firebase/util': 1.15.1 - '@firebase/firestore@4.14.0(@firebase/app@0.14.11)': + '@firebase/firestore@4.16.0(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 - '@firebase/webchannel-wrapper': 1.0.5 - '@grpc/grpc-js': 1.9.15 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 + '@firebase/webchannel-wrapper': 1.0.6 + '@grpc/grpc-js': 1.9.16 '@grpc/proto-loader': 0.7.15 + re2js: 0.4.3 tslib: 2.8.1 - '@firebase/functions-compat@0.4.3(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11)': + '@firebase/functions-compat@0.4.5(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/functions': 0.13.3(@firebase/app@0.14.11) - '@firebase/functions-types': 0.6.3 - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/functions': 0.13.5(@firebase/app@0.15.0) + '@firebase/functions-types': 0.6.4 + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/functions-types@0.6.3': {} + '@firebase/functions-types@0.6.4': {} - '@firebase/functions@0.13.3(@firebase/app@0.14.11)': + '@firebase/functions@0.13.5(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/app-check-interop-types': 0.3.3 - '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.2 - '@firebase/messaging-interop-types': 0.2.3 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/app-check-interop-types': 0.3.4 + '@firebase/auth-interop-types': 0.2.5 + '@firebase/component': 0.7.3 + '@firebase/messaging-interop-types': 0.2.5 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/installations-compat@0.2.21(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11)': + '@firebase/installations-compat@0.2.22(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/installations': 0.6.21(@firebase/app@0.14.11) - '@firebase/installations-types': 0.5.3(@firebase/app-types@0.9.4) - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/installations': 0.6.22(@firebase/app@0.15.0) + '@firebase/installations-types': 0.5.4(@firebase/app-types@0.9.5) + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/installations-types@0.5.3(@firebase/app-types@0.9.4)': + '@firebase/installations-types@0.5.4(@firebase/app-types@0.9.5)': dependencies: - '@firebase/app-types': 0.9.4 + '@firebase/app-types': 0.9.5 - '@firebase/installations@0.6.21(@firebase/app@0.14.11)': + '@firebase/installations@0.6.22(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/util': 1.15.1 idb: 7.1.1 tslib: 2.8.1 - '@firebase/logger@0.5.0': + '@firebase/logger@0.5.1': dependencies: tslib: 2.8.1 - '@firebase/messaging-compat@0.2.25(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11)': + '@firebase/messaging-compat@0.2.27(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/messaging': 0.12.25(@firebase/app@0.14.11) - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/messaging': 0.13.0(@firebase/app@0.15.0) + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/messaging-interop-types@0.2.3': {} + '@firebase/messaging-interop-types@0.2.5': {} - '@firebase/messaging@0.12.25(@firebase/app@0.14.11)': + '@firebase/messaging@0.13.0(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/installations': 0.6.21(@firebase/app@0.14.11) - '@firebase/messaging-interop-types': 0.2.3 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/installations': 0.6.22(@firebase/app@0.15.0) + '@firebase/messaging-interop-types': 0.2.5 + '@firebase/util': 1.15.1 idb: 7.1.1 tslib: 2.8.1 - '@firebase/performance-compat@0.2.24(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11)': + '@firebase/performance-compat@0.2.25(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/performance': 0.7.11(@firebase/app@0.14.11) - '@firebase/performance-types': 0.2.3 - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/performance': 0.7.12(@firebase/app@0.15.0) + '@firebase/performance-types': 0.2.4 + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/performance-types@0.2.3': {} + '@firebase/performance-types@0.2.4': {} - '@firebase/performance@0.7.11(@firebase/app@0.14.11)': + '@firebase/performance@0.7.12(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/installations': 0.6.21(@firebase/app@0.14.11) - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/installations': 0.6.22(@firebase/app@0.15.0) + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 web-vitals: 4.2.4 - '@firebase/remote-config-compat@0.2.23(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11)': + '@firebase/remote-config-compat@0.2.26(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/logger': 0.5.0 - '@firebase/remote-config': 0.8.2(@firebase/app@0.14.11) - '@firebase/remote-config-types': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/logger': 0.5.1 + '@firebase/remote-config': 0.8.5(@firebase/app@0.15.0) + '@firebase/remote-config-types': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/remote-config-types@0.5.0': {} + '@firebase/remote-config-types@0.5.1': {} - '@firebase/remote-config@0.8.2(@firebase/app@0.14.11)': + '@firebase/remote-config@0.8.5(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/installations': 0.6.21(@firebase/app@0.14.11) - '@firebase/logger': 0.5.0 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/installations': 0.6.22(@firebase/app@0.15.0) + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/storage-compat@0.4.2(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11)': + '@firebase/storage-compat@0.4.3(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0)': dependencies: - '@firebase/app-compat': 0.5.11 - '@firebase/component': 0.7.2 - '@firebase/storage': 0.14.2(@firebase/app@0.14.11) - '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.4)(@firebase/util@1.15.0) - '@firebase/util': 1.15.0 + '@firebase/app-compat': 0.5.14 + '@firebase/component': 0.7.3 + '@firebase/storage': 0.14.3(@firebase/app@0.15.0) + '@firebase/storage-types': 0.8.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.1) + '@firebase/util': 1.15.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/storage-types@0.8.3(@firebase/app-types@0.9.4)(@firebase/util@1.15.0)': + '@firebase/storage-types@0.8.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.1)': dependencies: - '@firebase/app-types': 0.9.4 - '@firebase/util': 1.15.0 + '@firebase/app-types': 0.9.5 + '@firebase/util': 1.15.1 - '@firebase/storage@0.14.2(@firebase/app@0.14.11)': + '@firebase/storage@0.14.3(@firebase/app@0.15.0)': dependencies: - '@firebase/app': 0.14.11 - '@firebase/component': 0.7.2 - '@firebase/util': 1.15.0 + '@firebase/app': 0.15.0 + '@firebase/component': 0.7.3 + '@firebase/util': 1.15.1 tslib: 2.8.1 - '@firebase/util@1.15.0': + '@firebase/util@1.15.1': dependencies: tslib: 2.8.1 - '@firebase/webchannel-wrapper@1.0.5': {} + '@firebase/webchannel-wrapper@1.0.6': {} '@gar/promise-retry@1.0.3': {} '@glideapps/ts-necessities@2.2.3': {} - '@google-cloud/common@6.0.0(supports-color@10.2.2)': + '@google-cloud/common@6.0.1(supports-color@10.2.2)': dependencies: '@google-cloud/projectify': 4.0.0 '@google-cloud/promisify': 4.1.0 arrify: 2.0.1 duplexify: 4.1.3 extend: 3.0.2 - google-auth-library: 10.6.2(supports-color@10.2.2) + google-auth-library: 10.9.0(supports-color@10.2.2) html-entities: 2.6.0 - retry-request: 8.0.2(supports-color@10.2.2) - teeny-request: 10.1.2(supports-color@10.2.2) + retry-request: 8.0.3(supports-color@10.2.2) + teeny-request: 10.1.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color - '@google-cloud/precise-date@5.0.0': {} + '@google-cloud/precise-date@5.0.1': {} '@google-cloud/projectify@4.0.0': {} - '@google-cloud/projectify@5.0.0': {} + '@google-cloud/projectify@5.0.1': {} '@google-cloud/promisify@4.1.0': {} - '@google-cloud/promisify@5.0.0': {} + '@google-cloud/promisify@5.0.1': {} '@google-cloud/spanner@8.0.0(supports-color@10.2.2)': dependencies: - '@google-cloud/common': 6.0.0(supports-color@10.2.2) - '@google-cloud/precise-date': 5.0.0 - '@google-cloud/projectify': 5.0.0 - '@google-cloud/promisify': 5.0.0 + '@google-cloud/common': 6.0.1(supports-color@10.2.2) + '@google-cloud/precise-date': 5.0.1 + '@google-cloud/projectify': 5.0.1 + '@google-cloud/promisify': 5.0.1 '@grpc/proto-loader': 0.7.15 '@opentelemetry/api': 1.9.1 - '@opentelemetry/context-async-hooks': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/context-async-hooks': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 '@types/big.js': 6.2.2 '@types/stack-trace': 0.0.33 big.js: 7.0.1 @@ -10215,29 +10364,29 @@ snapshots: duplexify: 4.1.3 events-intercept: 2.0.0 extend: 3.0.2 - google-auth-library: 10.6.2(supports-color@10.2.2) - google-gax: 5.0.6(supports-color@10.2.2) - grpc-gcp: 1.0.1(protobufjs@7.5.6) + google-auth-library: 10.9.0(supports-color@10.2.2) + google-gax: 5.0.7(supports-color@10.2.2) + grpc-gcp: 1.0.1(protobufjs@7.6.5) is: 3.3.2 lodash.snakecase: 4.1.1 merge-stream: 2.0.0 p-queue: 6.6.2 - protobufjs: 7.5.6 - retry-request: 8.0.2(supports-color@10.2.2) + protobufjs: 7.6.5 + retry-request: 8.0.3(supports-color@10.2.2) split-array-stream: 2.0.0 stack-trace: 0.0.10 stream-events: 1.0.5 - teeny-request: 10.1.2(supports-color@10.2.2) + teeny-request: 10.1.3(supports-color@10.2.2) through2: 4.0.2 transitivePeerDependencies: - supports-color - '@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': + '@google/genai@2.10.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': dependencies: - google-auth-library: 10.6.2(supports-color@10.2.2) + google-auth-library: 10.9.0(supports-color@10.2.2) p-retry: 4.6.2 - protobufjs: 7.5.6 - ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + protobufjs: 7.6.5 + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.2) transitivePeerDependencies: @@ -10245,36 +10394,36 @@ snapshots: - supports-color - utf-8-validate - '@grpc/grpc-js@1.14.3': + '@grpc/grpc-js@1.14.4': dependencies: - '@grpc/proto-loader': 0.8.0 + '@grpc/proto-loader': 0.8.1 '@js-sdsl/ordered-map': 4.4.2 - '@grpc/grpc-js@1.9.15': + '@grpc/grpc-js@1.9.16': dependencies: '@grpc/proto-loader': 0.7.15 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@grpc/proto-loader@0.7.15': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.6 - yargs: 17.7.2 + protobufjs: 7.6.5 + yargs: 17.7.3 - '@grpc/proto-loader@0.8.0': + '@grpc/proto-loader@0.8.1': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.6 - yargs: 17.7.2 + protobufjs: 7.6.5 + yargs: 17.7.3 '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@1.19.14(hono@4.12.16)': + '@hono/node-server@1.19.14(hono@4.12.27)': dependencies: - hono: 4.12.16 + hono: 4.12.27 '@humanfs/core@0.19.2': dependencies: @@ -10292,124 +10441,146 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/ansi@2.0.5': {} + '@inquirer/ansi@2.0.7': {} - '@inquirer/checkbox@5.1.4(@types/node@24.12.2)': + '@inquirer/checkbox@5.2.1(@types/node@24.13.2)': dependencies: - '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/confirm@6.0.12(@types/node@24.12.2)': + '@inquirer/confirm@6.0.12(@types/node@24.13.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/core@11.1.9(@types/node@24.12.2)': + '@inquirer/confirm@6.1.1(@types/node@24.13.2)': dependencies: - '@inquirer/ansi': 2.0.5 - '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) + optionalDependencies: + '@types/node': 24.13.2 + + '@inquirer/core@11.2.1(@types/node@24.13.2)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@24.13.2) cli-width: 4.1.0 - fast-wrap-ansi: 0.2.0 + fast-wrap-ansi: 0.2.2 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/editor@5.1.1(@types/node@24.12.2)': + '@inquirer/editor@5.2.2(@types/node@24.13.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/external-editor': 3.0.0(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/external-editor': 3.0.3(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/expand@5.0.13(@types/node@24.12.2)': + '@inquirer/expand@5.1.1(@types/node@24.13.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/external-editor@3.0.0(@types/node@24.12.2)': + '@inquirer/external-editor@3.0.3(@types/node@24.13.2)': dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 + chardet: 2.2.0 + iconv-lite: 0.7.3 optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/figures@2.0.5': {} + '@inquirer/figures@2.0.7': {} - '@inquirer/input@5.0.12(@types/node@24.12.2)': + '@inquirer/input@5.1.2(@types/node@24.13.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/number@4.0.12(@types/node@24.12.2)': + '@inquirer/number@4.1.1(@types/node@24.13.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/password@5.0.12(@types/node@24.12.2)': + '@inquirer/password@5.1.1(@types/node@24.13.2)': dependencies: - '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) + optionalDependencies: + '@types/node': 24.13.2 + + '@inquirer/prompts@8.4.2(@types/node@24.13.2)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@24.13.2) + '@inquirer/confirm': 6.0.12(@types/node@24.13.2) + '@inquirer/editor': 5.2.2(@types/node@24.13.2) + '@inquirer/expand': 5.1.1(@types/node@24.13.2) + '@inquirer/input': 5.1.2(@types/node@24.13.2) + '@inquirer/number': 4.1.1(@types/node@24.13.2) + '@inquirer/password': 5.1.1(@types/node@24.13.2) + '@inquirer/rawlist': 5.3.1(@types/node@24.13.2) + '@inquirer/search': 4.2.1(@types/node@24.13.2) + '@inquirer/select': 5.2.1(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 - - '@inquirer/prompts@8.4.2(@types/node@24.12.2)': - dependencies: - '@inquirer/checkbox': 5.1.4(@types/node@24.12.2) - '@inquirer/confirm': 6.0.12(@types/node@24.12.2) - '@inquirer/editor': 5.1.1(@types/node@24.12.2) - '@inquirer/expand': 5.0.13(@types/node@24.12.2) - '@inquirer/input': 5.0.12(@types/node@24.12.2) - '@inquirer/number': 4.0.12(@types/node@24.12.2) - '@inquirer/password': 5.0.12(@types/node@24.12.2) - '@inquirer/rawlist': 5.2.8(@types/node@24.12.2) - '@inquirer/search': 4.1.8(@types/node@24.12.2) - '@inquirer/select': 5.1.4(@types/node@24.12.2) + '@types/node': 24.13.2 + + '@inquirer/prompts@8.5.2(@types/node@24.13.2)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@24.13.2) + '@inquirer/confirm': 6.1.1(@types/node@24.13.2) + '@inquirer/editor': 5.2.2(@types/node@24.13.2) + '@inquirer/expand': 5.1.1(@types/node@24.13.2) + '@inquirer/input': 5.1.2(@types/node@24.13.2) + '@inquirer/number': 4.1.1(@types/node@24.13.2) + '@inquirer/password': 5.1.1(@types/node@24.13.2) + '@inquirer/rawlist': 5.3.1(@types/node@24.13.2) + '@inquirer/search': 4.2.1(@types/node@24.13.2) + '@inquirer/select': 5.2.1(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/rawlist@5.2.8(@types/node@24.12.2)': + '@inquirer/rawlist@5.3.1(@types/node@24.13.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/search@4.1.8(@types/node@24.12.2)': + '@inquirer/search@4.2.1(@types/node@24.13.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/select@5.1.4(@types/node@24.12.2)': + '@inquirer/select@5.2.1(@types/node@24.13.2)': dependencies: - '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.9(@types/node@24.12.2) - '@inquirer/figures': 2.0.5 - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@24.13.2) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@24.13.2) optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 - '@inquirer/type@4.0.5(@types/node@24.12.2)': + '@inquirer/type@4.0.7(@types/node@24.13.2)': optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 '@isaacs/cliui@8.0.2': dependencies: @@ -10478,58 +10649,58 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-core@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-core@4.57.8(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.8(tslib@2.8.1) thingies: 2.6.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-fsa@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-fsa@4.57.8(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.8(tslib@2.8.1) thingies: 2.6.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-builtins@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node-builtins@4.57.8(tslib@2.8.1)': dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-node-to-fsa@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node-to-fsa@4.57.8(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.8(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-utils@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node-utils@4.57.8(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.8(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-node@4.57.8(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.8(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) thingies: 2.6.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-print@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-print@4.57.8(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.8(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-snapshot@4.57.2(tslib@2.8.1)': + '@jsonjoy.com/fs-snapshot@4.57.8(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.8(tslib@2.8.1) '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 @@ -10583,10 +10754,10 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@listr2/prompt-adapter-inquirer@4.2.3(@inquirer/prompts@8.4.2(@types/node@24.12.2))(@types/node@24.12.2)(listr2@10.2.1)': + '@listr2/prompt-adapter-inquirer@4.2.3(@inquirer/prompts@8.4.2(@types/node@24.13.2))(@types/node@24.13.2)(listr2@10.2.1)': dependencies: - '@inquirer/prompts': 8.4.2(@types/node@24.12.2) - '@inquirer/type': 4.0.5(@types/node@24.12.2) + '@inquirer/prompts': 8.4.2(@types/node@24.13.2) + '@inquirer/type': 4.0.7(@types/node@24.13.2) listr2: 10.2.1 transitivePeerDependencies: - '@types/node' @@ -10614,17 +10785,17 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.16) + '@hono/node-server': 1.19.14(hono@4.12.27) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.8 + eventsource-parser: 3.1.0 express: 5.2.1 - express-rate-limit: 8.4.1(express@5.2.1) - hono: 4.12.16 + express-rate-limit: 8.5.2(express@5.2.1) + hono: 4.12.27 jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -10634,25 +10805,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': optional: true - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': optional: true - '@mswjs/interceptors@0.41.8': + '@mswjs/interceptors@0.41.9': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -10733,11 +10904,11 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.3 optional: true '@noble/hashes@1.4.0': {} @@ -10754,12 +10925,12 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@npmcli/agent@4.0.0': + '@npmcli/agent@4.0.2': dependencies: agent-base: 7.1.4 http-proxy-agent: 7.0.2(supports-color@10.2.2) https-proxy-agent: 7.0.6(supports-color@10.2.2) - lru-cache: 11.3.5 + lru-cache: 11.5.1 socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -10773,7 +10944,7 @@ snapshots: '@gar/promise-retry': 1.0.3 '@npmcli/promise-spawn': 9.0.1 ini: 6.0.0 - lru-cache: 11.3.5 + lru-cache: 11.5.1 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 semver: 7.7.4 @@ -10807,17 +10978,17 @@ snapshots: '@npmcli/node-gyp': 5.0.0 '@npmcli/package-json': 7.0.5 '@npmcli/promise-spawn': 9.0.1 - node-gyp: 12.3.0 + node-gyp: 12.4.0 proc-log: 6.1.0 '@octokit/auth-app@8.2.0': dependencies: '@octokit/auth-oauth-app': 9.0.3 '@octokit/auth-oauth-user': 6.0.2 - '@octokit/request': 10.0.8 + '@octokit/request': 10.0.11 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 - toad-cache: 3.7.0 + toad-cache: 3.7.4 universal-github-app-jwt: 2.2.2 universal-user-agent: 7.0.3 @@ -10825,14 +10996,14 @@ snapshots: dependencies: '@octokit/auth-oauth-device': 8.0.3 '@octokit/auth-oauth-user': 6.0.2 - '@octokit/request': 10.0.8 + '@octokit/request': 10.0.11 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 '@octokit/auth-oauth-device@8.0.3': dependencies: '@octokit/oauth-methods': 6.0.2 - '@octokit/request': 10.0.8 + '@octokit/request': 10.0.11 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 @@ -10840,7 +11011,7 @@ snapshots: dependencies: '@octokit/auth-oauth-device': 8.0.3 '@octokit/oauth-methods': 6.0.2 - '@octokit/request': 10.0.8 + '@octokit/request': 10.0.11 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 @@ -10850,7 +11021,7 @@ snapshots: dependencies: '@octokit/auth-token': 6.0.0 '@octokit/graphql': 9.0.3 - '@octokit/request': 10.0.8 + '@octokit/request': 10.0.11 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 before-after-hook: 4.0.0 @@ -10863,12 +11034,12 @@ snapshots: '@octokit/graphql-schema@15.26.1': dependencies: - graphql: 16.13.2 - graphql-tag: 2.12.6(graphql@16.13.2) + graphql: 16.14.2 + graphql-tag: 2.12.7(graphql@16.14.2) '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 10.0.8 + '@octokit/request': 10.0.11 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 @@ -10877,7 +11048,7 @@ snapshots: '@octokit/oauth-methods@6.0.2': dependencies: '@octokit/oauth-authorization-url': 8.0.0 - '@octokit/request': 10.0.8 + '@octokit/request': 10.0.11 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 @@ -10901,12 +11072,12 @@ snapshots: dependencies: '@octokit/types': 16.0.0 - '@octokit/request@10.0.8': + '@octokit/request@10.0.11': dependencies: '@octokit/endpoint': 11.0.3 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 - fast-content-type-parse: 3.0.0 + content-type: 2.0.0 json-with-bigint: 3.5.8 universal-user-agent: 7.0.3 @@ -10932,18 +11103,18 @@ snapshots: '@opentelemetry/api@1.9.1': {} - '@opentelemetry/context-async-hooks@2.7.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/context-async-hooks@2.9.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.40.0 + '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/semantic-conventions@1.40.0': {} + '@opentelemetry/semantic-conventions@1.41.1': {} - '@oxc-project/types@0.128.0': {} + '@oxc-project/types@0.129.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -11006,78 +11177,78 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true - '@peculiar/asn1-cms@2.7.0': + '@peculiar/asn1-cms@2.8.0': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 - '@peculiar/asn1-x509-attr': 2.7.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-x509-attr': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-csr@2.7.0': + '@peculiar/asn1-csr@2.8.0': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.7.0': + '@peculiar/asn1-ecc@2.8.0': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.7.0': + '@peculiar/asn1-pfx@2.8.0': dependencies: - '@peculiar/asn1-cms': 2.7.0 - '@peculiar/asn1-pkcs8': 2.7.0 - '@peculiar/asn1-rsa': 2.7.0 - '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-cms': 2.8.0 + '@peculiar/asn1-pkcs8': 2.8.0 + '@peculiar/asn1-rsa': 2.8.0 + '@peculiar/asn1-schema': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.7.0': + '@peculiar/asn1-pkcs8@2.8.0': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.7.0': + '@peculiar/asn1-pkcs9@2.8.0': dependencies: - '@peculiar/asn1-cms': 2.7.0 - '@peculiar/asn1-pfx': 2.7.0 - '@peculiar/asn1-pkcs8': 2.7.0 - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 - '@peculiar/asn1-x509-attr': 2.7.0 + '@peculiar/asn1-cms': 2.8.0 + '@peculiar/asn1-pfx': 2.8.0 + '@peculiar/asn1-pkcs8': 2.8.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-x509-attr': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.7.0': + '@peculiar/asn1-rsa@2.8.0': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-schema@2.7.0': + '@peculiar/asn1-schema@2.8.0': dependencies: '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.7.0': + '@peculiar/asn1-x509-attr@2.8.0': dependencies: - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509@2.7.0': + '@peculiar/asn1-x509@2.8.0': dependencies: - '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-schema': 2.8.0 '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 @@ -11088,13 +11259,13 @@ snapshots: '@peculiar/x509@1.14.3': dependencies: - '@peculiar/asn1-cms': 2.7.0 - '@peculiar/asn1-csr': 2.7.0 - '@peculiar/asn1-ecc': 2.7.0 - '@peculiar/asn1-pkcs9': 2.7.0 - '@peculiar/asn1-rsa': 2.7.0 - '@peculiar/asn1-schema': 2.7.0 - '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-cms': 2.8.0 + '@peculiar/asn1-csr': 2.8.0 + '@peculiar/asn1-ecc': 2.8.0 + '@peculiar/asn1-pkcs9': 2.8.0 + '@peculiar/asn1-rsa': 2.8.0 + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-x509': 2.8.0 pvtsutils: 1.3.6 reflect-metadata: 0.2.2 tslib: 2.8.1 @@ -11131,22 +11302,19 @@ snapshots: '@protobufjs/codegen@2.0.5': {} - '@protobufjs/eventemitter@1.1.0': {} + '@protobufjs/eventemitter@1.1.1': {} - '@protobufjs/fetch@1.1.0': + '@protobufjs/fetch@1.1.1': dependencies: '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.1 '@protobufjs/float@1.0.2': {} - '@protobufjs/inquire@1.1.1': {} - '@protobufjs/path@1.1.2': {} '@protobufjs/pool@1.1.0': {} - '@protobufjs/utf8@1.1.1': {} + '@protobufjs/utf8@1.1.2': {} '@puppeteer/browsers@2.13.0': dependencies: @@ -11155,72 +11323,72 @@ snapshots: progress: 2.0.3 proxy-agent: 6.5.0 semver: 7.7.4 - tar-fs: 3.1.2 - yargs: 17.7.2 + tar-fs: 3.1.3 + yargs: 17.7.3 transitivePeerDependencies: - bare-abort-controller - bare-buffer - react-native-b4a - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.18': + '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.18': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/pluginutils@1.0.0-rc.18': {} + '@rolldown/pluginutils@1.0.0': {} '@rollup/plugin-alias@6.0.0(rollup@4.60.2)': optionalDependencies: rollup: 4.60.2 - '@rollup/plugin-commonjs@29.0.2(rollup@4.60.2)': + '@rollup/plugin-commonjs@29.0.3(rollup@4.60.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.4.0(rollup@4.60.2) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.4) @@ -11232,13 +11400,13 @@ snapshots: '@rollup/plugin-json@6.1.0(rollup@4.60.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.4.0(rollup@4.60.2) optionalDependencies: rollup: 4.60.2 '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.4.0(rollup@4.60.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 @@ -11248,7 +11416,15 @@ snapshots: '@rollup/pluginutils@5.3.0(rollup@4.60.2)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.2 + + '@rollup/pluginutils@5.4.0(rollup@4.60.2)': + dependencies: + '@types/estree': 1.0.9 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: @@ -11341,7 +11517,7 @@ snapshots: dependencies: '@sigstore/protobuf-specs': 0.5.1 - '@sigstore/core@3.2.0': {} + '@sigstore/core@3.2.1': {} '@sigstore/protobuf-specs@0.5.1': {} @@ -11349,9 +11525,9 @@ snapshots: dependencies: '@gar/promise-retry': 1.0.3 '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.2.0 + '@sigstore/core': 3.2.1 '@sigstore/protobuf-specs': 0.5.1 - make-fetch-happen: 15.0.5 + make-fetch-happen: 15.0.6 proc-log: 6.1.0 transitivePeerDependencies: - supports-color @@ -11363,17 +11539,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@sigstore/verify@3.1.0': + '@sigstore/verify@3.1.1': dependencies: '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.2.0 + '@sigstore/core': 3.2.1 '@sigstore/protobuf-specs': 0.5.1 - '@simple-libs/child-process-utils@1.0.2': + '@simple-libs/child-process-utils@2.0.0': dependencies: - '@simple-libs/stream-utils': 1.2.0 + '@simple-libs/stream-utils': 2.0.0 - '@simple-libs/stream-utils@1.2.0': {} + '@simple-libs/stream-utils@2.0.0': {} '@sindresorhus/is@4.6.0': {} @@ -11381,11 +11557,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.3.0(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.3.0(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) - '@typescript-eslint/types': 8.59.1 - eslint: 10.3.0(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) + '@typescript-eslint/types': 8.62.1 + eslint: 10.3.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -11395,9 +11571,9 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tony.ganchev/eslint-plugin-header@3.4.4(eslint@10.3.0(jiti@2.6.1))': + '@tony.ganchev/eslint-plugin-header@3.4.4(eslint@10.3.0(jiti@2.7.0))': dependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -11408,47 +11584,47 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 10.2.5 - '@tybys/wasm-util@0.10.2': + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@types/big.js@6.2.2': {} '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/browser-sync@2.29.1': dependencies: '@types/micromatch': 2.3.35 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/serve-static': 2.2.0 chokidar: 3.6.0 @@ -11459,56 +11635,58 @@ snapshots: '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/cors@2.8.19': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/deep-eql@4.0.2': {} '@types/duplexify@3.6.5': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/ejs@3.1.5': {} '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/events@3.0.3': {} '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 22.19.17 - '@types/qs': 6.15.0 + '@types/node': 22.20.0 + '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 22.19.17 - '@types/qs': 6.15.0 + '@types/node': 22.20.0 + '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -11516,7 +11694,7 @@ snapshots: dependencies: '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 4.19.8 - '@types/qs': 6.15.0 + '@types/qs': 6.15.1 '@types/serve-static': 1.15.10 '@types/express@5.0.6': @@ -11529,13 +11707,13 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/ini@4.1.1': {} @@ -11551,20 +11729,29 @@ snapshots: '@types/karma@6.3.9': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 log4js: 6.9.1 transitivePeerDependencies: - supports-color '@types/less@3.0.8': {} - '@types/loader-utils@3.0.0(esbuild@0.28.0)': + '@types/loader-utils@3.0.0(esbuild@0.28.1)': dependencies: - '@types/node': 22.19.17 - webpack: 5.106.2(esbuild@0.28.0) + '@types/node': 22.20.0 + webpack: 5.106.2(esbuild@0.28.1) transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - uglify-js - webpack-cli @@ -11578,22 +11765,22 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.19.17 - form-data: 4.0.5 + '@types/node': 22.20.0 + form-data: 4.0.6 - '@types/node@22.19.17': + '@types/node@22.20.0': dependencies: undici-types: 6.21.0 - '@types/node@24.12.2': + '@types/node@24.13.2': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 '@types/npm-package-arg@6.1.4': {} '@types/npm-registry-fetch@8.0.9': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/node-fetch': 2.6.13 '@types/npm-package-arg': 6.1.4 '@types/npmlog': 7.0.0 @@ -11601,11 +11788,11 @@ snapshots: '@types/npmlog@7.0.0': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/pacote@11.1.8': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/npm-registry-fetch': 8.0.9 '@types/npmlog': 7.0.0 '@types/ssri': 7.1.5 @@ -11616,14 +11803,14 @@ snapshots: '@types/progress@2.0.7': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/pumpify@1.4.5': dependencies: '@types/duplexify': 3.6.5 - '@types/node': 22.19.17 + '@types/node': 22.20.0 - '@types/qs@6.15.0': {} + '@types/qs@6.15.1': {} '@types/range-parser@1.2.7': {} @@ -11631,7 +11818,7 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/retry@0.12.0': {} @@ -11642,11 +11829,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/serve-index@1.9.4': dependencies: @@ -11655,38 +11842,38 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/send': 0.17.6 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/ssri@7.1.5': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/stack-trace@0.0.33': {} '@types/tar-stream@3.1.4': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/watchpack@2.4.5': dependencies: '@types/graceful-fs': 4.1.9 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/which@3.0.4': {} '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/yargs-parser@21.0.3': {} @@ -11698,18 +11885,18 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 optional: true - '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/type-utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.1 - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -11717,14 +11904,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.59.1 '@typescript-eslint/types': 8.59.1 '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.1 debug: 4.4.3(supports-color@10.2.2) - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -11747,13 +11934,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.59.1 '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3(supports-color@10.2.2) - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -11761,6 +11948,8 @@ snapshots: '@typescript-eslint/types@8.59.1': {} + '@typescript-eslint/types@8.62.1': {} + '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': dependencies: '@typescript-eslint/project-service': 8.59.1(typescript@6.0.3) @@ -11776,13 +11965,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.59.1 '@typescript-eslint/types': 8.59.1 '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -11813,15 +12002,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@verdaccio/core@8.0.0': - dependencies: - ajv: 8.18.0 - http-errors: 2.0.1 - http-status-codes: 2.3.0 - minimatch: 7.4.9 - process-warning: 1.0.0 - semver: 7.7.4 - '@verdaccio/core@8.0.0-next-8.21': dependencies: ajv: 8.17.1 @@ -11840,6 +12020,15 @@ snapshots: process-warning: 1.0.0 semver: 7.7.4 + '@verdaccio/core@8.1.2': + dependencies: + ajv: 8.18.0 + http-errors: 2.0.1 + http-status-codes: 2.3.0 + minimatch: 7.4.9 + process-warning: 1.0.0 + semver: 7.7.4 + '@verdaccio/file-locking@10.3.1': dependencies: lockfile: 1.0.4 @@ -11970,23 +12159,23 @@ snapshots: lodash: 4.18.1 minimatch: 7.4.9 - '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0))': dependencies: - vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0) '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.5 - ast-v8-to-istanbul: 1.0.0 + ast-v8-to-istanbul: 1.0.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 - magicast: 0.5.2 - obug: 2.1.1 + magicast: 0.5.3 + obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/coverage-v8@4.1.5)(jiti@2.7.0)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0) '@vitest/expect@4.1.5': dependencies: @@ -11997,13 +12186,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))': + '@vitest/mocker@4.1.5(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.5': dependencies: @@ -12134,15 +12323,15 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-import-phases@1.0.4(acorn@8.16.0): + acorn-import-phases@1.0.4(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} adjust-sourcemap-loader@4.0.0: dependencies: @@ -12182,21 +12371,21 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -12259,7 +12448,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 @@ -12273,7 +12462,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: @@ -12320,7 +12509,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@1.0.0: + ast-v8-to-istanbul@1.0.4: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -12342,8 +12531,8 @@ snapshots: autoprefixer@10.5.0(postcss@8.5.13): dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001791 + browserslist: 4.28.4 + caniuse-lite: 1.0.30001802 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.13 @@ -12359,16 +12548,16 @@ snapshots: b4a@1.8.1: {} - babel-loader@10.1.1(@babel/core@7.29.0)(webpack@5.106.2(esbuild@0.28.0)): + babel-loader@10.1.1(@babel/core@7.29.0)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: '@babel/core': 7.29.0 find-up: 5.0.0 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: - '@babel/compat-data': 7.29.3 + '@babel/compat-data': 7.29.7 '@babel/core': 7.29.0 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) semver: 6.3.1 @@ -12402,43 +12591,44 @@ snapshots: balanced-match@4.0.4: {} - bare-events@2.8.2: {} + bare-events@2.9.1: {} - bare-fs@4.7.1: + bare-fs@4.7.3: dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.13.1(bare-events@2.8.2) - bare-url: 2.4.2 + bare-events: 2.9.1 + bare-path: 3.0.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.5 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.9.1: {} + bare-os@3.9.3: {} - bare-path@3.0.0: + bare-path@3.0.1: dependencies: - bare-os: 3.9.1 + bare-os: 3.9.3 - bare-stream@2.13.1(bare-events@2.8.2): + bare-stream@2.13.3(bare-events@2.9.1): dependencies: - streamx: 2.25.0 + b4a: 1.8.1 + streamx: 2.28.0 teex: 1.0.1 optionalDependencies: - bare-events: 2.8.2 + bare-events: 2.9.1 transitivePeerDependencies: - react-native-b4a - bare-url@2.4.2: + bare-url@2.4.5: dependencies: - bare-path: 3.0.0 + bare-path: 3.0.1 base64-js@1.5.1: {} base64id@2.0.0: {} - baseline-browser-mapping@2.10.27: {} + baseline-browser-mapping@2.10.42: {} basic-ftp@5.3.1: {} @@ -12458,9 +12648,9 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.13 + postcss: 8.5.14 postcss-media-query-parser: 0.2.3 - postcss-safe-parser: 7.0.1(postcss@8.5.13) + postcss-safe-parser: 7.0.1(postcss@8.5.14) before-after-hook@4.0.0: {} @@ -12486,44 +12676,44 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.15.1 + qs: 6.15.3 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: - supports-color - body-parser@2.2.2: + body-parser@2.3.0: dependencies: bytes: 3.1.2 - content-type: 1.0.5 + content-type: 2.0.0 debug: 4.4.3(supports-color@10.2.2) http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 on-finished: 2.4.1 - qs: 6.15.1 + qs: 6.15.3 raw-body: 3.0.2 - type-is: 2.0.1 + type-is: 2.1.0 transitivePeerDependencies: - supports-color - bonjour-service@1.3.0: + bonjour-service@1.4.2: dependencies: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 boolbase@1.0.0: {} - brace-expansion@1.1.14: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.0: + brace-expansion@2.1.1: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.7: dependencies: balanced-match: 4.0.4 @@ -12582,7 +12772,7 @@ snapshots: server-destroy: 1.0.1 socket.io: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) ua-parser-js: 1.0.41 - yargs: 17.7.2 + yargs: 17.7.3 transitivePeerDependencies: - bufferutil - debug @@ -12593,13 +12783,13 @@ snapshots: dependencies: pako: 0.2.9 - browserslist@4.28.2: + browserslist@4.28.4: dependencies: - baseline-browser-mapping: 2.10.27 - caniuse-lite: 1.0.30001791 - electron-to-chromium: 1.5.349 - node-releases: 2.0.38 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.10.42 + caniuse-lite: 1.0.30001802 + electron-to-chromium: 1.5.387 + node-releases: 2.0.50 + update-browserslist-db: 1.2.3(browserslist@4.28.4) bs-recipes@1.3.4: {} @@ -12631,12 +12821,12 @@ snapshots: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 glob: 13.0.6 - lru-cache: 11.3.5 + lru-cache: 11.5.1 minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 - p-map: 7.0.4 + p-map: 7.0.5 ssri: 13.0.1 cacheable-lookup@6.1.0: {} @@ -12670,7 +12860,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001791: {} + caniuse-lite@1.0.30001802: {} caseless@0.12.0: {} @@ -12683,7 +12873,7 @@ snapshots: chalk@5.6.2: {} - chardet@2.1.1: {} + chardet@2.2.0: {} checkpoint-stream@0.1.2: dependencies: @@ -12846,12 +13036,14 @@ snapshots: content-type@1.0.5: {} - conventional-commits-filter@5.0.0: {} + content-type@2.0.0: {} - conventional-commits-parser@6.4.0: + conventional-commits-filter@6.0.1: {} + + conventional-commits-parser@7.0.1: dependencies: - '@simple-libs/stream-utils': 1.2.0 - meow: 13.2.0 + '@simple-libs/stream-utils': 2.0.0 + meow: 14.1.0 convert-source-map@1.9.0: {} @@ -12867,18 +13059,18 @@ snapshots: dependencies: is-what: 4.1.16 - copy-webpack-plugin@14.0.0(webpack@5.106.2(esbuild@0.28.0)): + copy-webpack-plugin@14.0.0(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 - serialize-javascript: 7.0.5 + serialize-javascript: 7.0.7 tinyglobby: 0.2.16 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) core-js-compat@3.49.0: dependencies: - browserslist: 4.28.2 + browserslist: 4.28.4 core-util-is@1.0.2: {} @@ -12889,11 +13081,11 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.1(typescript@6.0.3): + cosmiconfig@9.0.2(typescript@6.0.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.0 parse-json: 5.2.0 optionalDependencies: typescript: 6.0.3 @@ -12910,18 +13102,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-loader@7.1.4(webpack@5.106.2(esbuild@0.28.0)): + css-loader@7.1.4(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: - icss-utils: 5.1.0(postcss@8.5.13) - postcss: 8.5.13 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.13) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.13) - postcss-modules-scope: 3.2.1(postcss@8.5.13) - postcss-modules-values: 4.0.0(postcss@8.5.13) + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.14) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.14) + postcss-modules-scope: 3.2.1(postcss@8.5.14) + postcss-modules-values: 4.0.0(postcss@8.5.14) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) css-select@6.0.0: dependencies: @@ -13139,9 +13331,9 @@ snapshots: ee-first@1.1.1: {} - ejs@5.0.2: {} + ejs@6.0.1: {} - electron-to-chromium@1.5.349: {} + electron-to-chromium@1.5.387: {} emoji-regex@10.6.0: {} @@ -13163,12 +13355,12 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.6.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): + engine.io-client@6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@10.2.2) engine.io-parser: 5.2.3 - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) xmlhttprequest-ssl: 2.1.2 transitivePeerDependencies: - bufferutil @@ -13177,10 +13369,10 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.7(bufferutil@4.1.0)(utf-8-validate@6.0.6): + engine.io@6.6.9(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@types/cors': 2.8.19 - '@types/node': 22.19.17 + '@types/node': 22.20.0 '@types/ws': 8.18.1 accepts: 1.3.8 base64id: 2.0.0 @@ -13188,13 +13380,13 @@ snapshots: cors: 2.8.6 debug: 4.4.3(supports-color@10.2.2) engine.io-parser: 5.2.3 - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - enhanced-resolve@5.21.0: + enhanced-resolve@5.24.1: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -13227,6 +13419,13 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -13239,10 +13438,10 @@ snapshots: data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -13251,7 +13450,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -13274,23 +13473,23 @@ snapshots: safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 + typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@2.1.0: {} + es-module-lexer@2.3.0: {} - es-object-atoms@1.1.1: + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -13299,19 +13498,22 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 - es-to-primitive@1.3.0: + es-to-primitive@1.3.4: dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-wasm@0.28.0: {} + esbuild-wasm@0.28.1: {} esbuild@0.27.7: optionalDependencies: @@ -13342,34 +13544,34 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 - esbuild@0.28.0: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 escalade@3.2.0: {} @@ -13385,29 +13587,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.7.0)): dependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 2.0.0-next.6 + is-core-module: 2.16.2 + resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) - eslint: 10.3.0(jiti@2.6.1) + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.3.0(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13416,21 +13618,21 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)) - hasown: 2.0.3 - is-core-module: 2.16.1 + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.7.0)) + hasown: 2.0.4 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.9 + string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -13444,7 +13646,7 @@ snapshots: eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -13454,18 +13656,18 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.3.0(jiti@2.6.1): + eslint@10.3.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) @@ -13487,20 +13689,20 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 5.0.1 esprima@4.0.1: {} @@ -13521,7 +13723,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -13537,28 +13739,28 @@ snapshots: events-universal@1.0.1: dependencies: - bare-events: 2.8.2 + bare-events: 2.9.1 transitivePeerDependencies: - bare-abort-controller events@3.3.0: {} - eventsource-parser@3.0.8: {} + eventsource-parser@3.1.0: {} eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.8 + eventsource-parser: 3.1.0 - expect-type@1.3.0: {} + expect-type@1.4.0: {} exponential-backoff@3.1.3: {} express-rate-limit@5.5.1: {} - express-rate-limit@8.4.1(express@5.2.1): + express-rate-limit@8.5.2(express@5.2.1): dependencies: express: 5.2.1 - ip-address: 10.1.0 + ip-address: 10.2.0 express@4.22.1: dependencies: @@ -13596,10 +13798,46 @@ snapshots: transitivePeerDependencies: - supports-color + express@4.22.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.5 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.1 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.13 + proxy-addr: 2.0.7 + qs: 6.15.3 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.2 + serve-static: 1.16.3 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.2 + body-parser: 2.3.0 content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 @@ -13618,13 +13856,13 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.1 - range-parser: 1.2.1 + qs: 6.15.3 + range-parser: 1.3.0 router: 2.2.0 send: 1.2.1 serve-static: 2.2.1 statuses: 2.0.2 - type-is: 2.0.1 + type-is: 2.1.0 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -13643,8 +13881,6 @@ snapshots: extsprintf@1.3.0: {} - fast-content-type-parse@3.0.0: {} - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -13667,9 +13903,9 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.0: {} + fast-uri@3.1.3: {} - fast-wrap-ansi@0.2.0: + fast-wrap-ansi@0.2.2: dependencies: fast-string-width: 3.0.2 @@ -13679,7 +13915,7 @@ snapshots: faye-websocket@0.11.4: dependencies: - websocket-driver: 0.7.4 + websocket-driver: 0.7.5 fd-slicer@1.1.0: dependencies: @@ -13761,36 +13997,36 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - firebase@12.12.1: - dependencies: - '@firebase/ai': 2.11.1(@firebase/app-types@0.9.4)(@firebase/app@0.14.11) - '@firebase/analytics': 0.10.21(@firebase/app@0.14.11) - '@firebase/analytics-compat': 0.2.27(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11) - '@firebase/app': 0.14.11 - '@firebase/app-check': 0.11.2(@firebase/app@0.14.11) - '@firebase/app-check-compat': 0.4.2(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11) - '@firebase/app-compat': 0.5.11 - '@firebase/app-types': 0.9.4 - '@firebase/auth': 1.13.0(@firebase/app@0.14.11) - '@firebase/auth-compat': 0.6.5(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11) - '@firebase/data-connect': 0.6.0(@firebase/app@0.14.11) - '@firebase/database': 1.1.2 - '@firebase/database-compat': 2.1.3 - '@firebase/firestore': 4.14.0(@firebase/app@0.14.11) - '@firebase/firestore-compat': 0.4.8(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11) - '@firebase/functions': 0.13.3(@firebase/app@0.14.11) - '@firebase/functions-compat': 0.4.3(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11) - '@firebase/installations': 0.6.21(@firebase/app@0.14.11) - '@firebase/installations-compat': 0.2.21(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11) - '@firebase/messaging': 0.12.25(@firebase/app@0.14.11) - '@firebase/messaging-compat': 0.2.25(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11) - '@firebase/performance': 0.7.11(@firebase/app@0.14.11) - '@firebase/performance-compat': 0.2.24(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11) - '@firebase/remote-config': 0.8.2(@firebase/app@0.14.11) - '@firebase/remote-config-compat': 0.2.23(@firebase/app-compat@0.5.11)(@firebase/app@0.14.11) - '@firebase/storage': 0.14.2(@firebase/app@0.14.11) - '@firebase/storage-compat': 0.4.2(@firebase/app-compat@0.5.11)(@firebase/app-types@0.9.4)(@firebase/app@0.14.11) - '@firebase/util': 1.15.0 + firebase@12.15.0: + dependencies: + '@firebase/ai': 2.13.1(@firebase/app-types@0.9.5)(@firebase/app@0.15.0) + '@firebase/analytics': 0.10.22(@firebase/app@0.15.0) + '@firebase/analytics-compat': 0.2.28(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0) + '@firebase/app': 0.15.0 + '@firebase/app-check': 0.12.0(@firebase/app@0.15.0) + '@firebase/app-check-compat': 0.4.5(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0) + '@firebase/app-compat': 0.5.14 + '@firebase/app-types': 0.9.5 + '@firebase/auth': 1.13.3(@firebase/app@0.15.0) + '@firebase/auth-compat': 0.6.8(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0) + '@firebase/data-connect': 0.7.1(@firebase/app@0.15.0) + '@firebase/database': 1.1.3 + '@firebase/database-compat': 2.1.4 + '@firebase/firestore': 4.16.0(@firebase/app@0.15.0) + '@firebase/firestore-compat': 0.4.11(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0) + '@firebase/functions': 0.13.5(@firebase/app@0.15.0) + '@firebase/functions-compat': 0.4.5(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0) + '@firebase/installations': 0.6.22(@firebase/app@0.15.0) + '@firebase/installations-compat': 0.2.22(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0) + '@firebase/messaging': 0.13.0(@firebase/app@0.15.0) + '@firebase/messaging-compat': 0.2.27(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0) + '@firebase/performance': 0.7.12(@firebase/app@0.15.0) + '@firebase/performance-compat': 0.2.25(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0) + '@firebase/remote-config': 0.8.5(@firebase/app@0.15.0) + '@firebase/remote-config-compat': 0.2.26(@firebase/app-compat@0.5.14)(@firebase/app@0.15.0) + '@firebase/storage': 0.14.3(@firebase/app@0.15.0) + '@firebase/storage-compat': 0.4.3(@firebase/app-compat@0.5.14)(@firebase/app-types@0.9.5)(@firebase/app@0.15.0) + '@firebase/util': 1.15.1 transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -13803,7 +14039,7 @@ snapshots: flatted@3.4.2: {} - folder-hash@4.1.2(supports-color@10.2.2): + folder-hash@4.1.3(supports-color@10.2.2): dependencies: debug: 4.4.0(supports-color@10.2.2) minimatch: 7.4.9 @@ -13827,12 +14063,12 @@ snapshots: form-data-encoder@1.7.2: {} - form-data@4.0.5: + form-data@4.0.6: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.3 + hasown: 2.0.4 mime-types: 2.1.35 formdata-polyfill@4.0.10: @@ -13870,18 +14106,30 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 - hasown: 2.0.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functions-have-names@1.2.3: {} - gaxios@7.1.4(supports-color@10.2.2): + gaxios@7.1.3(supports-color@10.2.2): + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + node-fetch: 3.3.2 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + + gaxios@7.1.5(supports-color@10.2.2): dependencies: extend: 3.0.2 https-proxy-agent: 7.0.6(supports-color@10.2.2) @@ -13891,7 +14139,15 @@ snapshots: gcp-metadata@8.1.2(supports-color@10.2.2): dependencies: - gaxios: 7.1.4(supports-color@10.2.2) + gaxios: 7.1.5(supports-color@10.2.2) + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + + gcp-metadata@8.1.3(supports-color@10.2.2): + dependencies: + gaxios: 7.1.3(supports-color@10.2.2) google-logging-utils: 1.1.3 json-bigint: 1.0.0 transitivePeerDependencies: @@ -13903,19 +14159,19 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} + get-east-asian-width@1.6.0: {} get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-npm-tarball-url@2.1.0: {} @@ -13923,7 +14179,7 @@ snapshots: get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-stream@5.2.0: dependencies: @@ -13937,10 +14193,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.14.0: - dependencies: - resolve-pkg-maps: 1.0.0 - get-uri@6.0.5: dependencies: basic-ftp: 5.3.1 @@ -14000,29 +14252,41 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - google-auth-library@10.6.2(supports-color@10.2.2): + google-auth-library@10.5.0(supports-color@10.2.2): + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.5(supports-color@10.2.2) + gcp-metadata: 8.1.3(supports-color@10.2.2) + google-logging-utils: 1.1.3 + gtoken: 8.0.0(supports-color@10.2.2) + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + + google-auth-library@10.9.0(supports-color@10.2.2): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 7.1.4(supports-color@10.2.2) + gaxios: 7.1.5(supports-color@10.2.2) gcp-metadata: 8.1.2(supports-color@10.2.2) google-logging-utils: 1.1.3 jws: 4.0.1 transitivePeerDependencies: - supports-color - google-gax@5.0.6(supports-color@10.2.2): + google-gax@5.0.7(supports-color@10.2.2): dependencies: - '@grpc/grpc-js': 1.14.3 - '@grpc/proto-loader': 0.8.0 + '@grpc/grpc-js': 1.14.4 + '@grpc/proto-loader': 0.8.1 duplexify: 4.1.3 - google-auth-library: 10.6.2(supports-color@10.2.2) + google-auth-library: 10.5.0(supports-color@10.2.2) google-logging-utils: 1.1.3 node-fetch: 3.3.2 object-hash: 3.0.0 proto3-json-serializer: 3.0.4 - protobufjs: 7.5.6 - retry-request: 8.0.2(supports-color@10.2.2) + protobufjs: 7.6.5 + retry-request: 8.0.3(supports-color@10.2.2) rimraf: 5.0.10 transitivePeerDependencies: - supports-color @@ -14048,17 +14312,24 @@ snapshots: graceful-fs@4.2.11: {} - graphql-tag@2.12.6(graphql@16.13.2): + graphql-tag@2.12.7(graphql@16.14.2): dependencies: - graphql: 16.13.2 + graphql: 16.14.2 tslib: 2.8.1 - graphql@16.13.2: {} + graphql@16.14.2: {} - grpc-gcp@1.0.1(protobufjs@7.5.6): + grpc-gcp@1.0.1(protobufjs@7.6.5): dependencies: - '@grpc/grpc-js': 1.14.3 - protobufjs: 7.5.6 + '@grpc/grpc-js': 1.14.4 + protobufjs: 7.6.5 + + gtoken@8.0.0(supports-color@10.2.2): + dependencies: + gaxios: 7.1.5(supports-color@10.2.2) + jws: 4.0.1 + transitivePeerDependencies: + - supports-color gunzip-maybe@1.4.2: dependencies: @@ -14098,15 +14369,15 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.3: + hasown@2.0.4: dependencies: function-bind: 1.1.2 - hono@4.12.16: {} + hono@4.12.27: {} hosted-git-info@9.0.3: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.5.1 hpack.js@2.1.6: dependencies: @@ -14117,7 +14388,7 @@ snapshots: html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 transitivePeerDependencies: - '@noble/hashes' @@ -14169,7 +14440,7 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.9(@types/express@4.17.25): + http-proxy-middleware@2.0.10(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 http-proxy: 1.18.1(debug@4.4.3) @@ -14246,13 +14517,13 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.2: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.13): + icss-utils@5.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.13 + postcss: 8.5.14 idb@7.1.1: {} @@ -14271,7 +14542,7 @@ snapshots: immutable@3.8.3: {} - immutable@5.1.5: {} + immutable@5.1.9: {} import-fresh@3.3.1: dependencies: @@ -14296,10 +14567,8 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 - side-channel: 1.1.0 - - ip-address@10.1.0: {} + hasown: 2.0.4 + side-channel: 1.1.1 ip-address@10.2.0: {} @@ -14338,9 +14607,9 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -14357,6 +14626,10 @@ snapshots: is-docker@3.0.0: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -14367,7 +14640,7 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 is-generator-function@1.1.2: dependencies: @@ -14397,7 +14670,7 @@ snapshots: is-negative-zero@2.0.3: {} - is-network-error@1.3.1: {} + is-network-error@1.3.2: {} is-node-process@1.2.0: {} @@ -14428,14 +14701,14 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 is-regex@1.2.1: dependencies: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 is-set@2.0.3: {} @@ -14458,7 +14731,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 is-typedarray@1.0.0: {} @@ -14506,7 +14779,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.3 + '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -14516,7 +14789,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.3 + '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 @@ -14552,6 +14825,8 @@ snapshots: jasmine-core@6.2.0: {} + jasmine-core@6.3.0: {} + jasmine-reporters@2.5.2: dependencies: '@xmldom/xmldom': 0.8.13 @@ -14567,17 +14842,23 @@ snapshots: glob: 13.0.6 jasmine-core: 6.2.0 + jasmine@6.3.0: + dependencies: + '@jasminejs/reporters': 1.0.0 + glob: 13.0.6 + jasmine-core: 6.3.0 + jest-worker@27.5.1: dependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@2.6.1: {} + jiti@2.7.0: {} jose@6.2.3: {} - js-base64@3.7.8: {} + js-base64@3.8.0: {} js-tokens@10.0.0: {} @@ -14587,6 +14868,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} jsdom@29.1.1: @@ -14594,19 +14879,19 @@ snapshots: '@asamuzakjp/css-color': 5.1.11 '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - '@exodus/bytes': 1.15.0 + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 css-tree: 3.2.1 data-urls: 7.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.5 + lru-cache: 11.5.1 parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.25.0 + undici: 7.28.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -14739,13 +15024,13 @@ snapshots: minimatch: 3.1.5 mkdirp: 0.5.6 qjobs: 1.2.0 - range-parser: 1.2.1 + range-parser: 1.3.0 rimraf: 3.0.2 socket.io: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) source-map: 0.6.1 - tmp: 0.2.5 + tmp: 0.2.7 ua-parser-js: 0.7.41 - yargs: 16.2.0 + yargs: 16.2.2 transitivePeerDependencies: - bufferutil - debug @@ -14758,16 +15043,16 @@ snapshots: kind-of@6.0.3: {} - launch-editor@2.13.2: + launch-editor@2.14.1: dependencies: picocolors: 1.1.1 - shell-quote: 1.8.3 + shell-quote: 1.9.0 - less-loader@12.3.2(less@4.6.4)(webpack@5.106.2(esbuild@0.28.0)): + less-loader@12.3.2(less@4.6.4)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: less: 4.6.4 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) less@4.6.4: dependencies: @@ -14787,11 +15072,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.106.2(esbuild@0.28.0)): + license-webpack-plugin@4.0.2(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: - webpack-sources: 3.4.1 + webpack-sources: 3.5.0 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) limiter@1.1.5: {} @@ -14808,7 +15093,7 @@ snapshots: lmdb@3.5.4: dependencies: '@harperfast/extended-iterable': 1.0.3 - msgpackr: 1.11.12 + msgpackr: 1.12.1 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 ordered-binary: 1.6.1 @@ -14904,7 +15189,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.5.1: {} lru-cache@5.1.1: dependencies: @@ -14916,10 +15201,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.5.2: + magicast@0.5.3: dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 make-dir@2.1.0: @@ -14932,10 +15217,10 @@ snapshots: dependencies: semver: 7.7.4 - make-fetch-happen@15.0.5: + make-fetch-happen@15.0.6: dependencies: '@gar/promise-retry': 1.0.3 - '@npmcli/agent': 4.0.0 + '@npmcli/agent': 4.0.2 '@npmcli/redact': 4.0.0 cacache: 20.0.4 http-cache-semantics: 4.2.0 @@ -14957,16 +15242,16 @@ snapshots: media-typer@1.1.0: {} - memfs@4.57.2(tslib@2.8.1): + memfs@4.57.8(tslib@2.8.1): dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.8(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.8(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) @@ -14974,7 +15259,7 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - meow@13.2.0: {} + meow@14.1.0: {} merge-descriptors@1.0.3: {} @@ -15015,33 +15300,33 @@ snapshots: mimic-response@3.1.0: {} - mini-css-extract-plugin@2.10.2(webpack@5.106.2(esbuild@0.28.0)): + mini-css-extract-plugin@2.10.2(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: schema-utils: 4.3.3 tapable: 2.3.3 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) minimalistic-assert@1.0.1: {} minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.7 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.15 minimatch@7.4.6: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 minimatch@7.4.9: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 minimatch@9.0.9: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 minimist@1.2.8: {} @@ -15055,7 +15340,7 @@ snapshots: minipass-sized: 2.0.0 minizlib: 3.1.0 optionalDependencies: - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 minipass-flush@1.0.7: dependencies: @@ -15095,21 +15380,21 @@ snapshots: ms@2.1.3: {} - msgpackr-extract@3.0.3: + msgpackr-extract@3.0.4: dependencies: node-gyp-build-optional-packages: 5.2.2 optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 optional: true - msgpackr@1.11.12: + msgpackr@1.12.1: optionalDependencies: - msgpackr-extract: 3.0.3 + msgpackr-extract: 3.0.4 optional: true multicast-dns@7.2.5: @@ -15125,7 +15410,7 @@ snapshots: mute-stream@3.0.0: {} - nanoid@3.3.12: {} + nanoid@3.3.15: {} natural-compare@1.4.0: {} @@ -15145,25 +15430,25 @@ snapshots: netmask@2.1.1: {} - ng-packagr@22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3): + ng-packagr@22.0.1(@angular/compiler-cli@22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) + '@angular/compiler-cli': 22.0.5(@angular/compiler@22.0.5)(typescript@6.0.3) '@rollup/plugin-json': 6.1.0(rollup@4.60.2) '@rollup/wasm-node': 4.60.2 ajv: 8.20.0 - browserslist: 4.28.2 + browserslist: 4.28.4 chokidar: 5.0.0 commander: 14.0.3 dependency-graph: 1.0.0 - esbuild: 0.28.0 + esbuild: 0.28.1 find-cache-directory: 6.0.0 injection-js: 2.6.1 jsonc-parser: 3.3.1 less: 4.6.4 ora: 9.4.0 - piscina: 5.1.4 - postcss: 8.5.13 + piscina: 5.2.0 + postcss: 8.5.14 rollup-plugin-dts: 6.4.1(rollup@4.60.2)(typescript@6.0.3) rxjs: 7.8.2 sass: 1.99.0 @@ -15173,9 +15458,9 @@ snapshots: optionalDependencies: rollup: 4.60.2 - nock@14.0.13: + nock@14.0.16: dependencies: - '@mswjs/interceptors': 0.41.8 + '@mswjs/interceptors': 0.41.9 json-stringify-safe: 5.0.1 propagate: 2.0.1 @@ -15187,7 +15472,7 @@ snapshots: node-domexception@1.0.0: {} - node-exports-info@1.6.0: + node-exports-info@1.6.2: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 @@ -15221,7 +15506,7 @@ snapshots: node-gyp-build@4.8.4: {} - node-gyp@12.3.0: + node-gyp@12.4.0: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.3 @@ -15229,12 +15514,12 @@ snapshots: nopt: 9.0.0 proc-log: 6.1.0 semver: 7.7.4 - tar: 7.5.13 + tar: 7.5.19 tinyglobby: 0.2.16 - undici: 6.25.0 + undici: 6.27.0 which: 6.0.1 - node-releases@2.0.38: {} + node-releases@2.0.50: {} nopt@9.0.0: dependencies: @@ -15277,7 +15562,7 @@ snapshots: dependencies: '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 - make-fetch-happen: 15.0.5 + make-fetch-happen: 15.0.6 minipass: 7.1.3 minipass-fetch: 5.0.2 minizlib: 3.1.0 @@ -15303,7 +15588,7 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -15312,14 +15597,14 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.fromentries@2.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.groupby@1.0.3: dependencies: @@ -15332,11 +15617,11 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 obuf@1.1.2: {} - obug@2.1.1: {} + obug@2.1.3: {} on-exit-leak-free@2.1.2: {} @@ -15421,7 +15706,7 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@7.0.4: {} + p-map@7.0.5: {} p-queue@6.6.2: dependencies: @@ -15436,7 +15721,7 @@ snapshots: p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 - is-network-error: 1.3.1 + is-network-error: 1.3.2 retry: 0.13.1 p-timeout@3.2.0: @@ -15463,7 +15748,7 @@ snapshots: package-json-from-dist@1.0.1: {} - pacote@21.5.0: + pacote@21.5.1: dependencies: '@gar/promise-retry': 1.0.3 '@npmcli/git': 7.0.2 @@ -15479,9 +15764,9 @@ snapshots: npm-pick-manifest: 11.0.3 npm-registry-fetch: 19.1.1 proc-log: 6.1.0 - sigstore: 4.1.0 + sigstore: 4.1.1 ssri: 13.0.1 - tar: 7.5.13 + tar: 7.5.19 transitivePeerDependencies: - supports-color @@ -15495,7 +15780,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -15533,7 +15818,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.5.1 minipass: 7.1.3 path-to-regexp@0.1.13: {} @@ -15588,9 +15873,9 @@ snapshots: real-require: 0.2.0 safe-stable-stringify: 2.5.0 sonic-boom: 4.2.1 - thread-stream: 3.1.0 + thread-stream: 3.2.0 - piscina@5.1.4: + piscina@5.2.0: optionalDependencies: '@napi-rs/nice': 1.1.1 @@ -15618,45 +15903,45 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.1(postcss@8.5.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)): + postcss-loader@8.2.1(postcss@8.5.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: - cosmiconfig: 9.0.1(typescript@6.0.3) - jiti: 2.6.1 + cosmiconfig: 9.0.2(typescript@6.0.3) + jiti: 2.7.0 postcss: 8.5.13 semver: 7.7.4 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) transitivePeerDependencies: - typescript postcss-media-query-parser@0.2.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.13): + postcss-modules-extract-imports@3.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.13 + postcss: 8.5.14 - postcss-modules-local-by-default@4.2.0(postcss@8.5.13): + postcss-modules-local-by-default@4.2.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.13) - postcss: 8.5.13 - postcss-selector-parser: 7.1.1 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 + postcss-selector-parser: 7.1.4 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.13): + postcss-modules-scope@3.2.1(postcss@8.5.14): dependencies: - postcss: 8.5.13 - postcss-selector-parser: 7.1.1 + postcss: 8.5.14 + postcss-selector-parser: 7.1.4 - postcss-modules-values@4.0.0(postcss@8.5.13): + postcss-modules-values@4.0.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.13) - postcss: 8.5.13 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 - postcss-safe-parser@7.0.1(postcss@8.5.13): + postcss-safe-parser@7.0.1(postcss@8.5.14): dependencies: - postcss: 8.5.13 + postcss: 8.5.14 - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -15665,7 +15950,13 @@ snapshots: postcss@8.5.13: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.14: + dependencies: + nanoid: 3.3.15 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -15673,7 +15964,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.8.3: {} + prettier@3.9.4: {} proc-log@6.1.0: {} @@ -15691,21 +15982,20 @@ snapshots: proto3-json-serializer@3.0.4: dependencies: - protobufjs: 7.5.6 + protobufjs: 7.6.5 - protobufjs@7.5.6: + protobufjs@7.6.5: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 '@protobufjs/codegen': 2.0.5 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.1 '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.1 - '@types/node': 22.19.17 + '@protobufjs/utf8': 1.1.2 + '@types/node': 22.20.0 long: 5.3.2 proxy-addr@2.0.7: @@ -15759,7 +16049,7 @@ snapshots: devtools-protocol: 0.0.1595872 typed-query-selector: 2.12.2 webdriver-bidi-protocol: 0.4.1 - ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -15772,7 +16062,7 @@ snapshots: dependencies: '@puppeteer/browsers': 2.13.0 chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) - cosmiconfig: 9.0.1(typescript@6.0.3) + cosmiconfig: 9.0.2(typescript@6.0.3) devtools-protocol: 0.0.1595872 puppeteer-core: 24.42.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) typed-query-selector: 2.12.2 @@ -15795,11 +16085,12 @@ snapshots: qs@6.14.2: dependencies: - side-channel: 1.1.0 + side-channel: 1.1.1 - qs@6.15.1: + qs@6.15.3: dependencies: - side-channel: 1.1.0 + es-define-property: 1.0.1 + side-channel: 1.1.1 queue-microtask@1.2.3: {} @@ -15814,7 +16105,7 @@ snapshots: collection-utils: 1.0.1 cross-fetch: 4.1.0(encoding@0.1.13) is-url: 1.2.4 - js-base64: 3.7.8 + js-base64: 3.8.0 lodash: 4.18.1 pako: 1.0.11 pluralize: 8.0.0 @@ -15822,12 +16113,14 @@ snapshots: unicode-properties: 1.4.1 urijs: 1.19.11 wordwrap: 1.0.0 - yaml: 2.8.4 + yaml: 2.9.0 transitivePeerDependencies: - encoding range-parser@1.2.1: {} + range-parser@1.3.0: {} + raw-body@2.5.3: dependencies: bytes: 3.1.2 @@ -15839,9 +16132,11 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 unpipe: 1.0.0 + re2js@0.4.3: {} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -15892,7 +16187,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -15919,13 +16214,13 @@ snapshots: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.13.1 + regjsparser: 0.13.2 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.13.1: + regjsparser@0.13.2: dependencies: jsesc: 3.1.0 @@ -15939,28 +16234,26 @@ snapshots: resolve-from@4.0.0: {} - resolve-pkg-maps@1.0.0: {} - resolve-url-loader@5.0.0: dependencies: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.5.13 + postcss: 8.5.14 source-map: 0.6.1 resolve@1.22.12: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.6: + resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 - node-exports-info: 1.6.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -15981,10 +16274,10 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry-request@8.0.2(supports-color@10.2.2): + retry-request@8.0.3(supports-color@10.2.2): dependencies: extend: 3.0.2 - teeny-request: 10.1.2(supports-color@10.2.2) + teeny-request: 10.1.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -16002,26 +16295,26 @@ snapshots: dependencies: glob: 10.5.0 - rolldown@1.0.0-rc.18: + rolldown@1.0.0: dependencies: - '@oxc-project/types': 0.128.0 - '@rolldown/pluginutils': 1.0.0-rc.18 + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-x64': 1.0.0-rc.18 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 rollup-license-plugin@3.2.1: dependencies: @@ -16039,14 +16332,14 @@ snapshots: rollup: 4.60.2 typescript: 6.0.3 optionalDependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 - rollup-plugin-sourcemaps2@0.5.6(@types/node@22.19.17)(rollup@4.60.2): + rollup-plugin-sourcemaps2@0.5.6(@types/node@22.20.0)(rollup@4.60.2): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.2) rollup: 4.60.2 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.20.0 rollup@4.60.2: dependencies: @@ -16128,17 +16421,17 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2(esbuild@0.28.0)): + sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.99.0 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) sass@1.99.0: dependencies: chokidar: 4.0.3 - immutable: 5.1.5 + immutable: 5.1.9 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.6 @@ -16173,6 +16466,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: {} + send@0.19.2: dependencies: debug: 2.6.9 @@ -16202,12 +16497,12 @@ snapshots: mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 - range-parser: 1.2.1 + range-parser: 1.3.0 statuses: 2.0.2 transitivePeerDependencies: - supports-color - serialize-javascript@7.0.5: {} + serialize-javascript@7.0.7: {} serve-index@1.9.2: dependencies: @@ -16261,7 +16556,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 setprototypeof@1.2.0: {} @@ -16275,7 +16570,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} + shell-quote@1.9.0: {} side-channel-list@1.0.1: dependencies: @@ -16297,7 +16592,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -16311,14 +16606,14 @@ snapshots: signal-exit@4.1.0: {} - sigstore@4.1.0: + sigstore@4.1.1: dependencies: '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.2.0 + '@sigstore/core': 3.2.1 '@sigstore/protobuf-specs': 0.5.1 '@sigstore/sign': 4.1.1 '@sigstore/tuf': 4.0.2 - '@sigstore/verify': 3.1.0 + '@sigstore/verify': 3.1.1 transitivePeerDependencies: - supports-color @@ -16334,10 +16629,10 @@ snapshots: smart-buffer@4.2.0: {} - socket.io-adapter@2.5.6(bufferutil@4.1.0)(utf-8-validate@6.0.6): + socket.io-adapter@2.5.8(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: debug: 4.4.3(supports-color@10.2.2) - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color @@ -16347,7 +16642,7 @@ snapshots: dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@10.2.2) - engine.io-client: 6.6.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) + engine.io-client: 6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6) socket.io-parser: 4.2.6 transitivePeerDependencies: - bufferutil @@ -16367,8 +16662,8 @@ snapshots: base64id: 2.0.0 cors: 2.8.6 debug: 4.4.3(supports-color@10.2.2) - engine.io: 6.6.7(bufferutil@4.1.0)(utf-8-validate@6.0.6) - socket.io-adapter: 2.5.6(bufferutil@4.1.0)(utf-8-validate@6.0.6) + engine.io: 6.6.9(bufferutil@4.1.0)(utf-8-validate@6.0.6) + socket.io-adapter: 2.5.8(bufferutil@4.1.0)(utf-8-validate@6.0.6) socket.io-parser: 4.2.6 transitivePeerDependencies: - bufferutil @@ -16379,17 +16674,17 @@ snapshots: dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 - websocket-driver: 0.7.4 + websocket-driver: 0.7.5 socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) - socks: 2.8.8 + socks: 2.8.9 transitivePeerDependencies: - supports-color - socks@2.8.8: + socks@2.8.9: dependencies: ip-address: 10.2.0 smart-buffer: 4.2.0 @@ -16404,11 +16699,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.106.2(esbuild@0.28.0)): + source-map-loader@5.0.0(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) source-map-support@0.5.21: dependencies: @@ -16533,7 +16828,7 @@ snapshots: transitivePeerDependencies: - supports-color - streamx@2.25.0: + streamx@2.28.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -16559,36 +16854,37 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 string-width@8.2.1: dependencies: - get-east-asian-width: 1.5.0 + get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string_decoder@1.1.1: dependencies: @@ -16628,13 +16924,13 @@ snapshots: tapable@2.3.3: {} - tar-fs@3.1.2: + tar-fs@3.1.3: dependencies: pump: 3.0.4 tar-stream: 3.2.0 optionalDependencies: - bare-fs: 4.7.1 - bare-path: 3.0.0 + bare-fs: 4.7.3 + bare-path: 3.0.1 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -16644,7 +16940,7 @@ snapshots: dependencies: b4a: 1.8.1 fast-fifo: 1.3.2 - streamx: 2.25.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -16652,15 +16948,15 @@ snapshots: tar-stream@3.2.0: dependencies: b4a: 1.8.1 - bare-fs: 4.7.1 + bare-fs: 4.7.3 fast-fifo: 1.3.2 - streamx: 2.25.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer - react-native-b4a - tar@7.5.13: + tar@7.5.19: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -16668,7 +16964,7 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - teeny-request@10.1.2(supports-color@10.2.2): + teeny-request@10.1.3(supports-color@10.2.2): dependencies: http-proxy-agent: 7.0.2(supports-color@10.2.2) https-proxy-agent: 7.0.6(supports-color@10.2.2) @@ -16679,25 +16975,36 @@ snapshots: teex@1.0.1: dependencies: - streamx: 2.25.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - terser-webpack-plugin@5.5.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)): + terser-webpack-plugin@5.6.1(esbuild@0.28.1)(postcss@8.5.13)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.2 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) optionalDependencies: - esbuild: 0.28.0 + esbuild: 0.28.1 + postcss: 8.5.13 + + terser-webpack-plugin@5.6.1(esbuild@0.28.1)(webpack@5.106.2(esbuild@0.28.1)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.46.2 + webpack: 5.106.2(esbuild@0.28.1) + optionalDependencies: + esbuild: 0.28.1 terser@5.46.2: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -16711,7 +17018,7 @@ snapshots: dependencies: tslib: 2.8.1 - thread-stream@3.1.0: + thread-stream@3.2.0: dependencies: real-require: 0.2.0 @@ -16732,7 +17039,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.1.2: {} + tinyexec@1.2.4: {} tinyglobby@0.2.16: dependencies: @@ -16743,23 +17050,23 @@ snapshots: tldts-core@6.1.86: {} - tldts-core@7.0.30: {} + tldts-core@7.4.6: {} tldts@6.1.86: dependencies: tldts-core: 6.1.86 - tldts@7.0.30: + tldts@7.4.6: dependencies: - tldts-core: 7.0.30 + tldts-core: 7.4.6 - tmp@0.2.5: {} + tmp@0.2.7: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toad-cache@3.7.0: {} + toad-cache@3.7.4: {} toidentifier@1.0.1: {} @@ -16769,7 +17076,7 @@ snapshots: tough-cookie@6.0.1: dependencies: - tldts: 7.0.30 + tldts: 7.4.6 tr46@0.0.3: {} @@ -16796,10 +17103,9 @@ snapshots: tslib@2.8.1: {} - tsx@4.21.0: + tsx@4.23.0: dependencies: - esbuild: 0.27.7 - get-tsconfig: 4.14.0 + esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 @@ -16811,7 +17117,7 @@ snapshots: dependencies: '@tufjs/models': 4.1.0 debug: 4.4.3(supports-color@10.2.2) - make-fetch-happen: 15.0.5 + make-fetch-happen: 15.0.6 transitivePeerDependencies: - supports-color @@ -16834,9 +17140,9 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - type-is@2.0.1: + type-is@2.1.0: dependencies: - content-type: 1.0.5 + content-type: 2.0.0 media-typer: 1.1.0 mime-types: 3.0.2 @@ -16864,7 +17170,7 @@ snapshots: is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.7: + typed-array-length@1.0.8: dependencies: call-bind: 1.0.9 for-each: 0.3.5 @@ -16897,11 +17203,11 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.18.2: {} - undici@6.25.0: {} + undici@6.27.0: {} - undici@7.25.0: {} + undici@7.28.0: {} undici@8.2.0: {} @@ -16944,9 +17250,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.2.3(browserslist@4.28.4): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -16983,9 +17289,9 @@ snapshots: - encoding - supports-color - verdaccio-auth-memory@13.0.0: + verdaccio-auth-memory@13.0.3: dependencies: - '@verdaccio/core': 8.0.0 + '@verdaccio/core': 8.1.2 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -17047,49 +17353,49 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4): + vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.13 + postcss: 8.5.14 rollup: 4.60.2 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 24.12.2 + '@types/node': 24.13.2 fsevents: 2.3.3 - jiti: 2.6.1 + jiti: 2.7.0 less: 4.6.4 sass: 1.99.0 terser: 5.46.2 - tsx: 4.21.0 - yaml: 2.8.4 + tsx: 4.23.0 + yaml: 2.9.0 - vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4): + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/coverage-v8@4.1.5)(jiti@2.7.0)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) + '@vitest/mocker': 4.1.5(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 '@vitest/spy': 4.1.5 '@vitest/utils': 4.1.5 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 + es-module-lexer: 2.3.0 + expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.3 pathe: 2.0.3 picomatch: 4.0.4 std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.1.2 + tinyexec: 1.2.4 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.23.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@types/node': 24.12.2 + '@types/node': 24.13.2 '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) jsdom: 29.1.1 transitivePeerDependencies: @@ -17133,32 +17439,45 @@ snapshots: webidl-conversions@8.0.1: {} - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.0)): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: colorette: 2.0.20 - memfs: 4.57.2(tslib@2.8.1) + memfs: 4.57.8(tslib@2.8.1) mime-types: 3.0.2 on-finished: 2.4.1 - range-parser: 1.2.1 + range-parser: 1.3.0 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) transitivePeerDependencies: - tslib - webpack-dev-middleware@8.0.3(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.0)): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.1)): dependencies: - memfs: 4.57.2(tslib@2.8.1) + colorette: 2.0.20 + memfs: 4.57.8(tslib@2.8.1) mime-types: 3.0.2 on-finished: 2.4.1 - range-parser: 1.2.1 + range-parser: 1.3.0 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1) transitivePeerDependencies: - tslib - webpack-dev-server@5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.106.2(esbuild@0.28.0)): + webpack-dev-middleware@8.0.3(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): + dependencies: + memfs: 4.57.8(tslib@2.8.1) + mime-types: 3.0.2 + on-finished: 2.4.1 + range-parser: 1.3.0 + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) + transitivePeerDependencies: + - tslib + + webpack-dev-server@5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -17169,16 +17488,55 @@ snapshots: '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 + bonjour-service: 1.4.2 chokidar: 3.6.0 colorette: 2.0.20 compression: 1.8.1 connect-history-api-fallback: 2.0.0 - express: 4.22.1 + express: 4.22.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.10(@types/express@4.17.25) + ipaddr.js: 2.4.0 + launch-editor: 2.14.1 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 + selfsigned: 5.5.0 + serve-index: 1.9.2 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - tslib + - utf-8-validate + + webpack-dev-server@5.2.3(bufferutil@4.1.0)(tslib@2.8.1)(utf-8-validate@6.0.6)(webpack@5.106.2(esbuild@0.28.1)): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.8 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.10 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.4.2 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.1 + connect-history-api-fallback: 2.0.0 + express: 4.22.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.25) + http-proxy-middleware: 2.0.10(@types/express@4.17.25) ipaddr.js: 2.4.0 - launch-editor: 2.13.2 + launch-editor: 2.14.1 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 @@ -17186,10 +17544,10 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.0)) - ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.1)) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1) transitivePeerDependencies: - bufferutil - debug @@ -17203,27 +17561,27 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@3.4.1: {} + webpack-sources@3.5.0: {} - webpack-subresource-integrity@5.1.0(webpack@5.106.2(esbuild@0.28.0)): + webpack-subresource-integrity@5.1.0(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)): dependencies: typed-assert: 1.0.9 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.1)(postcss@8.5.13) - webpack@5.106.2(esbuild@0.28.0): + webpack@5.106.2(esbuild@0.28.1): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.2 + acorn: 8.17.0 + acorn-import-phases: 1.0.4(acorn@8.17.0) + browserslist: 4.28.4 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.21.0 - es-module-lexer: 2.1.0 + enhanced-resolve: 5.24.1 + es-module-lexer: 2.3.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -17233,15 +17591,64 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.5.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)) + terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.106.2(esbuild@0.28.1)) watchpack: 2.5.1 - webpack-sources: 3.4.1 + webpack-sources: 3.5.0 transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - uglify-js - websocket-driver@0.7.4: + webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.17.0 + acorn-import-phases: 1.0.4(acorn@8.17.0) + browserslist: 4.28.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.24.1 + es-module-lexer: 2.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + loader-runner: 4.3.2 + mime-db: 1.54.0 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(postcss@8.5.13)(webpack@5.106.2(esbuild@0.28.1)(postcss@8.5.13)) + watchpack: 2.5.1 + webpack-sources: 3.5.0 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + websocket-driver@0.7.5: dependencies: http-parser-js: 0.5.10 safe-buffer: 5.2.1 @@ -17253,7 +17660,7 @@ snapshots: whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -17275,7 +17682,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -17286,7 +17693,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 which-collection@1.0.2: dependencies: @@ -17295,7 +17702,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -17317,6 +17724,10 @@ snapshots: dependencies: isexe: 4.0.0 + which@7.0.0: + dependencies: + isexe: 4.0.0 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -17354,12 +17765,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 6.0.6 - - ws@8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 utf-8-validate: 6.0.6 @@ -17391,9 +17797,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.3: {} - - yaml@2.8.4: {} + yaml@2.9.0: {} yargs-parser@20.2.9: {} @@ -17401,7 +17805,7 @@ snapshots: yargs-parser@22.0.0: {} - yargs@16.2.0: + yargs@16.2.2: dependencies: cliui: 7.0.4 escalade: 3.2.0 @@ -17411,7 +17815,7 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yargs@17.7.2: + yargs@17.7.3: dependencies: cliui: 8.0.1 escalade: 3.2.0 @@ -17447,4 +17851,4 @@ snapshots: zod@4.4.2: {} - zone.js@0.16.1: {} + zone.js@0.16.2: {} diff --git a/tests/e2e/assets/19.0-project/package.json b/tests/e2e/assets/19.0-project/package.json deleted file mode 100644 index 7b65d66807a2..000000000000 --- a/tests/e2e/assets/19.0-project/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "nineteen-project", - "version": "0.0.0", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test" - }, - "private": true, - "dependencies": { - "@angular/common": "^19.2.0", - "@angular/compiler": "^19.2.0", - "@angular/core": "^19.2.0", - "@angular/forms": "^19.2.0", - "@angular/platform-browser": "^19.2.0", - "@angular/platform-browser-dynamic": "^19.2.0", - "@angular/router": "^19.2.0", - "rxjs": "~7.8.0", - "tslib": "^2.3.0", - "zone.js": "~0.15.0" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^19.2.13", - "@angular/cli": "^19.2.13", - "@angular/compiler-cli": "^19.2.0", - "@types/jasmine": "~5.1.0", - "jasmine-core": "~5.6.0", - "karma": "~6.4.0", - "karma-chrome-launcher": "~3.2.0", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.1.0", - "typescript": "~5.7.2" - } -} diff --git a/tests/e2e/assets/19.0-project/src/app/app.component.spec.ts b/tests/e2e/assets/19.0-project/src/app/app.component.spec.ts deleted file mode 100644 index e390fd7bd137..000000000000 --- a/tests/e2e/assets/19.0-project/src/app/app.component.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [AppComponent], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have the 'nineteen-project' title`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('nineteen-project'); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain('Hello, nineteen-project'); - }); -}); diff --git a/tests/e2e/assets/19.0-project/src/app/app.component.ts b/tests/e2e/assets/19.0-project/src/app/app.component.ts deleted file mode 100644 index 620c8a058372..000000000000 --- a/tests/e2e/assets/19.0-project/src/app/app.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; -import { RouterOutlet } from '@angular/router'; - -@Component({ - selector: 'app-root', - imports: [RouterOutlet], - templateUrl: './app.component.html', - styleUrl: './app.component.css', -}) -export class AppComponent { - title = 'nineteen-project'; -} diff --git a/tests/e2e/assets/19.0-project/src/app/app.config.ts b/tests/e2e/assets/19.0-project/src/app/app.config.ts deleted file mode 100644 index 7afc797fbab7..000000000000 --- a/tests/e2e/assets/19.0-project/src/app/app.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; -import { provideRouter } from '@angular/router'; - -import { routes } from './app.routes'; - -export const appConfig: ApplicationConfig = { - providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)], -}; diff --git a/tests/e2e/assets/19.0-project/src/index.html b/tests/e2e/assets/19.0-project/src/index.html deleted file mode 100644 index f374b0fe3d5e..000000000000 --- a/tests/e2e/assets/19.0-project/src/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - NineteenProject - - - - - - - - diff --git a/tests/e2e/assets/19.0-project/src/main.ts b/tests/e2e/assets/19.0-project/src/main.ts deleted file mode 100644 index 17447a5dce2c..000000000000 --- a/tests/e2e/assets/19.0-project/src/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; -import { AppComponent } from './app/app.component'; - -bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)); diff --git a/tests/e2e/assets/19.0-project/.editorconfig b/tests/e2e/assets/20.0-project/.editorconfig similarity index 100% rename from tests/e2e/assets/19.0-project/.editorconfig rename to tests/e2e/assets/20.0-project/.editorconfig diff --git a/tests/e2e/assets/19.0-project/.gitignore b/tests/e2e/assets/20.0-project/.gitignore similarity index 97% rename from tests/e2e/assets/19.0-project/.gitignore rename to tests/e2e/assets/20.0-project/.gitignore index cc7b141350ff..b1d225e26e57 100644 --- a/tests/e2e/assets/19.0-project/.gitignore +++ b/tests/e2e/assets/20.0-project/.gitignore @@ -36,6 +36,7 @@ yarn-error.log /libpeerconnection.log testem.log /typings +__screenshots__/ # System files .DS_Store diff --git a/tests/e2e/assets/20.0-project/.vscode/extensions.json b/tests/e2e/assets/20.0-project/.vscode/extensions.json new file mode 100644 index 000000000000..77b374577de8 --- /dev/null +++ b/tests/e2e/assets/20.0-project/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/tests/e2e/assets/20.0-project/.vscode/launch.json b/tests/e2e/assets/20.0-project/.vscode/launch.json new file mode 100644 index 000000000000..925af837050a --- /dev/null +++ b/tests/e2e/assets/20.0-project/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/tests/e2e/assets/20.0-project/.vscode/tasks.json b/tests/e2e/assets/20.0-project/.vscode/tasks.json new file mode 100644 index 000000000000..a298b5bd8796 --- /dev/null +++ b/tests/e2e/assets/20.0-project/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + } + ] +} diff --git a/tests/e2e/assets/19.0-project/README.md b/tests/e2e/assets/20.0-project/README.md similarity index 96% rename from tests/e2e/assets/19.0-project/README.md rename to tests/e2e/assets/20.0-project/README.md index 80d80f5a3f1f..1f4d992edb5b 100644 --- a/tests/e2e/assets/19.0-project/README.md +++ b/tests/e2e/assets/20.0-project/README.md @@ -1,6 +1,6 @@ -# NineteenProject +# TwentyProject -This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.13. +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.27. ## Development server diff --git a/tests/e2e/assets/19.0-project/angular.json b/tests/e2e/assets/20.0-project/angular.json similarity index 70% rename from tests/e2e/assets/19.0-project/angular.json rename to tests/e2e/assets/20.0-project/angular.json index b435223e9930..6c24b184adf2 100644 --- a/tests/e2e/assets/19.0-project/angular.json +++ b/tests/e2e/assets/20.0-project/angular.json @@ -3,7 +3,7 @@ "version": 1, "newProjectRoot": "projects", "projects": { - "nineteen-project": { + "twenty-project": { "projectType": "application", "schematics": {}, "root": "", @@ -11,12 +11,13 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:application", + "builder": "@angular/build:application", "options": { - "outputPath": "dist/nineteen-project", - "index": "src/index.html", + "outputPath": "dist/twenty-project", "browser": "src/main.ts", - "polyfills": ["zone.js"], + "polyfills": [ + "zone.js" + ], "tsConfig": "tsconfig.app.json", "assets": [ { @@ -24,8 +25,9 @@ "input": "public" } ], - "styles": ["src/styles.css"], - "scripts": [] + "styles": [ + "src/styles.css" + ] }, "configurations": { "production": { @@ -52,24 +54,27 @@ "defaultConfiguration": "production" }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", + "builder": "@angular/build:dev-server", "configurations": { "production": { - "buildTarget": "nineteen-project:build:production" + "buildTarget": "twenty-project:build:production" }, "development": { - "buildTarget": "nineteen-project:build:development" + "buildTarget": "twenty-project:build:development" } }, "defaultConfiguration": "development" }, "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n" + "builder": "@angular/build:extract-i18n" }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular/build:karma", "options": { - "polyfills": ["zone.js", "zone.js/testing"], + "polyfills": [ + "zone.js", + "zone.js/testing" + ], "tsConfig": "tsconfig.spec.json", "assets": [ { @@ -77,8 +82,9 @@ "input": "public" } ], - "styles": ["src/styles.css"], - "scripts": [] + "styles": [ + "src/styles.css" + ] } } } diff --git a/tests/e2e/assets/20.0-project/package.json b/tests/e2e/assets/20.0-project/package.json new file mode 100644 index 000000000000..dbbe2cd1478a --- /dev/null +++ b/tests/e2e/assets/20.0-project/package.json @@ -0,0 +1,48 @@ +{ + "name": "twenty-project", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "prettier": { + "printWidth": 100, + "singleQuote": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] + }, + "private": true, + "dependencies": { + "@angular/common": "^20.3.0", + "@angular/compiler": "^20.3.0", + "@angular/core": "^20.3.0", + "@angular/forms": "^20.3.0", + "@angular/platform-browser": "^20.3.0", + "@angular/router": "^20.3.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@angular/build": "^20.3.27", + "@angular/cli": "^20.3.27", + "@angular/compiler-cli": "^20.3.0", + "@types/jasmine": "~5.1.0", + "jasmine-core": "~5.9.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.9.2" + } +} \ No newline at end of file diff --git a/tests/e2e/assets/19.0-project/public/favicon.ico b/tests/e2e/assets/20.0-project/public/favicon.ico similarity index 100% rename from tests/e2e/assets/19.0-project/public/favicon.ico rename to tests/e2e/assets/20.0-project/public/favicon.ico diff --git a/tests/e2e/assets/20.0-project/src/app/app.config.ts b/tests/e2e/assets/20.0-project/src/app/app.config.ts new file mode 100644 index 000000000000..d953f4c41b31 --- /dev/null +++ b/tests/e2e/assets/20.0-project/src/app/app.config.ts @@ -0,0 +1,12 @@ +import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +import { routes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(routes) + ] +}; diff --git a/tests/e2e/assets/19.0-project/src/app/app.component.css b/tests/e2e/assets/20.0-project/src/app/app.css similarity index 100% rename from tests/e2e/assets/19.0-project/src/app/app.component.css rename to tests/e2e/assets/20.0-project/src/app/app.css diff --git a/tests/e2e/assets/19.0-project/src/app/app.component.html b/tests/e2e/assets/20.0-project/src/app/app.html similarity index 91% rename from tests/e2e/assets/19.0-project/src/app/app.component.html rename to tests/e2e/assets/20.0-project/src/app/app.html index f8135391366c..752837241913 100644 --- a/tests/e2e/assets/19.0-project/src/app/app.component.html +++ b/tests/e2e/assets/20.0-project/src/app/app.html @@ -36,18 +36,9 @@ --pill-accent: var(--bright-blue); - font-family: - 'Inter', - -apple-system, - BlinkMacSystemFont, - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji', - 'Segoe UI Symbol'; + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol"; box-sizing: border-box; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; @@ -60,18 +51,9 @@ line-height: 100%; letter-spacing: -0.125rem; margin: 0; - font-family: - 'Inter Tight', - -apple-system, - BlinkMacSystemFont, - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji', - 'Segoe UI Symbol'; + font-family: "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol"; } p { @@ -142,6 +124,7 @@ line-height: 1.4rem; letter-spacing: -0.00875rem; text-decoration: none; + white-space: nowrap; } .pill:hover { @@ -152,11 +135,15 @@ --pill-accent: var(--bright-blue); } .pill-group .pill:nth-child(6n + 2) { + --pill-accent: var(--electric-violet); + } + .pill-group .pill:nth-child(6n + 3) { --pill-accent: var(--french-violet); } - .pill-group .pill:nth-child(6n + 3), + .pill-group .pill:nth-child(6n + 4), - .pill-group .pill:nth-child(6n + 5) { + .pill-group .pill:nth-child(6n + 5), + .pill-group .pill:nth-child(6n + 6) { --pill-accent: var(--hot-red); } @@ -227,7 +214,14 @@ - + @@ -236,26 +230,26 @@ -

Hello, {{ title }}

+

Hello, {{ title() }}

Congratulations! Your app is running. 🎉

- @for ( - item of [ - { title: 'Explore the Docs', link: 'https://angular.dev' }, - { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' }, - { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' }, - { - title: 'Angular Language Service', - link: 'https://angular.dev/tools/language-service', - }, - { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' }, - ]; - track item.title - ) { - + @for (item of [ + { title: 'Explore the Docs', link: 'https://angular.dev' }, + { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' }, + { title: 'Prompt and best practices for AI', link: 'https://angular.dev/ai/develop-with-ai'}, + { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' }, + { title: 'Angular Language Service', link: 'https://angular.dev/tools/language-service' }, + { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' }, + ]; track item.title) { + {{ item.title }} Hello, {{ title }} /> - + Hello, {{ title }} + diff --git a/tests/e2e/assets/19.0-project/src/app/app.routes.ts b/tests/e2e/assets/20.0-project/src/app/app.routes.ts similarity index 100% rename from tests/e2e/assets/19.0-project/src/app/app.routes.ts rename to tests/e2e/assets/20.0-project/src/app/app.routes.ts diff --git a/tests/e2e/assets/20.0-project/src/app/app.spec.ts b/tests/e2e/assets/20.0-project/src/app/app.spec.ts new file mode 100644 index 000000000000..e2efaa52a155 --- /dev/null +++ b/tests/e2e/assets/20.0-project/src/app/app.spec.ts @@ -0,0 +1,23 @@ +import { TestBed } from '@angular/core/testing'; +import { App } from './app'; + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(App); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('Hello, twenty-project'); + }); +}); diff --git a/tests/e2e/assets/20.0-project/src/app/app.ts b/tests/e2e/assets/20.0-project/src/app/app.ts new file mode 100644 index 000000000000..41950ee52c8b --- /dev/null +++ b/tests/e2e/assets/20.0-project/src/app/app.ts @@ -0,0 +1,12 @@ +import { Component, signal } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + selector: 'app-root', + imports: [RouterOutlet], + templateUrl: './app.html', + styleUrl: './app.css' +}) +export class App { + protected readonly title = signal('twenty-project'); +} diff --git a/tests/e2e/assets/20.0-project/src/index.html b/tests/e2e/assets/20.0-project/src/index.html new file mode 100644 index 000000000000..72285bc13676 --- /dev/null +++ b/tests/e2e/assets/20.0-project/src/index.html @@ -0,0 +1,13 @@ + + + + + TwentyProject + + + + + + + + diff --git a/tests/e2e/assets/20.0-project/src/main.ts b/tests/e2e/assets/20.0-project/src/main.ts new file mode 100644 index 000000000000..5df75f9c838e --- /dev/null +++ b/tests/e2e/assets/20.0-project/src/main.ts @@ -0,0 +1,6 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; + +bootstrapApplication(App, appConfig) + .catch((err) => console.error(err)); diff --git a/tests/e2e/assets/19.0-project/src/styles.css b/tests/e2e/assets/20.0-project/src/styles.css similarity index 100% rename from tests/e2e/assets/19.0-project/src/styles.css rename to tests/e2e/assets/20.0-project/src/styles.css diff --git a/tests/e2e/assets/19.0-project/tsconfig.app.json b/tests/e2e/assets/20.0-project/tsconfig.app.json similarity index 81% rename from tests/e2e/assets/19.0-project/tsconfig.app.json rename to tests/e2e/assets/20.0-project/tsconfig.app.json index 8886e903f8d0..264f459bf876 100644 --- a/tests/e2e/assets/19.0-project/tsconfig.app.json +++ b/tests/e2e/assets/20.0-project/tsconfig.app.json @@ -6,6 +6,10 @@ "outDir": "./out-tsc/app", "types": [] }, - "files": ["src/main.ts"], - "include": ["src/**/*.d.ts"] + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts" + ] } diff --git a/tests/e2e/assets/19.0-project/tsconfig.json b/tests/e2e/assets/20.0-project/tsconfig.json similarity index 79% rename from tests/e2e/assets/19.0-project/tsconfig.json rename to tests/e2e/assets/20.0-project/tsconfig.json index 5525117c6744..e4955f26b14b 100644 --- a/tests/e2e/assets/19.0-project/tsconfig.json +++ b/tests/e2e/assets/20.0-project/tsconfig.json @@ -3,7 +3,6 @@ { "compileOnSave": false, "compilerOptions": { - "outDir": "./dist/out-tsc", "strict": true, "noImplicitOverride": true, "noPropertyAccessFromIndexSignature": true, @@ -11,17 +10,25 @@ "noFallthroughCasesInSwitch": true, "skipLibCheck": true, "isolatedModules": true, - "esModuleInterop": true, "experimentalDecorators": true, - "moduleResolution": "bundler", "importHelpers": true, "target": "ES2022", - "module": "ES2022" + "module": "preserve" }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true, "strictInputAccessModifiers": true, + "typeCheckHostBindings": true, "strictTemplates": true - } + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] } diff --git a/tests/e2e/assets/19.0-project/tsconfig.spec.json b/tests/e2e/assets/20.0-project/tsconfig.spec.json similarity index 76% rename from tests/e2e/assets/19.0-project/tsconfig.spec.json rename to tests/e2e/assets/20.0-project/tsconfig.spec.json index e00e30e6d4fb..940b30a5fcc8 100644 --- a/tests/e2e/assets/19.0-project/tsconfig.spec.json +++ b/tests/e2e/assets/20.0-project/tsconfig.spec.json @@ -4,7 +4,12 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", - "types": ["jasmine"] + "types": [ + "jasmine" + ] }, - "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] + "include": [ + "src/**/*.d.ts", + "src/**/*.spec.ts" + ] } diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 4940441713ff..d4e1fd4a3b19 100644 --- a/tests/e2e/ng-snapshot/package.json +++ b/tests/e2e/ng-snapshot/package.json @@ -2,21 +2,21 @@ "description": "snapshot versions of Angular for e2e testing", "private": true, "dependencies": { - "@angular/animations": "github:angular/animations-builds#75b67fb20e34c1690a19a732b3106e8f7f454fc6", - "@angular/cdk": "github:angular/cdk-builds#c72d7297744f01f13435202e10764c11fb0fbb98", - "@angular/common": "github:angular/common-builds#504daec05383ce402fdae16ae19a46f8d155d256", - "@angular/compiler": "github:angular/compiler-builds#4e3014c69a825409e6a2c827ceb0f89dd8f9405a", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#88464c173ccd1562c3bdfa22cfc725de2f75f255", - "@angular/core": "github:angular/core-builds#d91229659aa8ac4e3964fdf7cbfaa27a50c95f54", - "@angular/forms": "github:angular/forms-builds#6aba91146ca0274ab19a0fece82cbee84320dfb1", - "@angular/language-service": "github:angular/language-service-builds#76ebde7592c9feaa7bc872d68a1739b21feeaba9", - "@angular/localize": "github:angular/localize-builds#0de5d9668a484206dd63cf46e66808c98880e4eb", - "@angular/material": "github:angular/material-builds#26d021024aa905c5d42a4cd9b67f757a71ed7e3c", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#35cb51e92f3e8990842eae2e1bded148c0c6b0af", - "@angular/platform-browser": "github:angular/platform-browser-builds#bde6d33678b0ebbecc1a913d10d78fde8b29e863", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#60a4602660f1d5531ea88aaf725c2dac5b5e5ca5", - "@angular/platform-server": "github:angular/platform-server-builds#40d7868dc10c1cf638a3e2ba900f56940e61fca3", - "@angular/router": "github:angular/router-builds#300fe35fbdab61f9032627faddc9e2bbe645e1bf", - "@angular/service-worker": "github:angular/service-worker-builds#87dd428569f12a519f7e89679173a25fca2e2779" + "@angular/animations": "github:angular/animations-builds#bd3a434a99ebf09a8098d666c42e5646fb4c5711", + "@angular/cdk": "github:angular/cdk-builds#06248e11a309a454b9ac30f6e18e4e12c96f25af", + "@angular/common": "github:angular/common-builds#b7c6a8e28891dfa7ebf9e90c4b9019d913fe2842", + "@angular/compiler": "github:angular/compiler-builds#6fe948250ed116feefde4e98726df86f0c12dc46", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#de167999390564fa242f07272d9cca6e366a66ce", + "@angular/core": "github:angular/core-builds#e53fa344a5f670d06ec7f3eb1c35401a455e8841", + "@angular/forms": "github:angular/forms-builds#490e7e730b910d5e901bb55dd03e1c34fa7c90c9", + "@angular/language-service": "github:angular/language-service-builds#0b75c030531ab1dad9629f02ccbfabf24247cd2d", + "@angular/localize": "github:angular/localize-builds#5355950bc589ff115be5a11b9408fafea5147ea9", + "@angular/material": "github:angular/material-builds#942bd4bf832c27e0aa4435b55750a77555af7bc9", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#6d5fa3504b4685cb443ff1ea12bf6294f876da05", + "@angular/platform-browser": "github:angular/platform-browser-builds#71a1247ccaddfe722f3450dde189834ab842e895", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#2880d0153aa6bdd6a6398b0ec7bf0641a12aba1c", + "@angular/platform-server": "github:angular/platform-server-builds#48726fc18cc19ce910db6d176f4f92ddffff1ce4", + "@angular/router": "github:angular/router-builds#33d10905e36758a671d68bb1828cba4493f7bf51", + "@angular/service-worker": "github:angular/service-worker-builds#011f7afb9f86ba189a398650783dd93e716e85fe" } } diff --git a/tests/e2e/tests/build/chunk-optimizer-env.ts b/tests/e2e/tests/build/chunk-optimizer-env.ts index a7814ee7ac5c..5453b2e042d2 100644 --- a/tests/e2e/tests/build/chunk-optimizer-env.ts +++ b/tests/e2e/tests/build/chunk-optimizer-env.ts @@ -23,16 +23,12 @@ export default async function () { ...process.env, NG_BUILD_OPTIMIZE_CHUNKS: 'true', }); - const files1Opt = await readdir('dist/test-project/browser'); - const jsFiles1Opt = files1Opt.filter((f) => f.endsWith('.js')); // Build with forced off await execWithEnv('ng', ['build', '--output-hashing=none'], { ...process.env, NG_BUILD_OPTIMIZE_CHUNKS: 'false', }); - const files1Unopt = await readdir('dist/test-project/browser'); - const jsFiles1Unopt = files1Unopt.filter((f) => f.endsWith('.js')); // We just verify it runs without error. // With 1 chunk it might not be able to optimize further, so counts might be equal. diff --git a/tests/e2e/tests/commands/add/add-registry-stripped-schematics.ts b/tests/e2e/tests/commands/add/add-registry-stripped-schematics.ts new file mode 100644 index 000000000000..c6356dc8d92c --- /dev/null +++ b/tests/e2e/tests/commands/add/add-registry-stripped-schematics.ts @@ -0,0 +1,121 @@ +import { join } from 'node:path'; +import { promises as fs } from 'node:fs'; +import { getGlobalVariable } from '../../../utils/env'; +import { expectFileToExist, expectFileNotToExist, rimraf } from '../../../utils/fs'; +import { getActivePackageManager } from '../../../utils/packages'; +import { ng, silentNpm } from '../../../utils/process'; +import { mktempd } from '../../../utils/utils'; + +export default async function () { + const testRegistry = getGlobalVariable('package-registry'); + const tmpRoot = getGlobalVariable('tmp-root'); + + // 1. Create a temp directory for the custom package + const pkgDir = await mktempd('registry-stripped-pkg-', tmpRoot); + + try { + // 2. Write the package files + const packageJson = { + name: '@angular-devkit/ng-add-registry-stripped', + version: '1.0.0', + schematics: './collection.json', + 'ng-add': { + save: false, + }, + }; + + const collectionJson = { + schematics: { + 'ng-add': { + factory: './index.js', + description: 'Add test empty file to your application.', + }, + }, + }; + + const indexJs = ` + exports.default = function() { + return function(tree) { + tree.create('schematic-executed-successfully.txt', 'Registry Stripped schematic works!'); + return tree; + }; + }; + `; + + await fs.writeFile(join(pkgDir, 'package.json'), JSON.stringify(packageJson, null, 2)); + await fs.writeFile(join(pkgDir, 'collection.json'), JSON.stringify(collectionJson, null, 2)); + await fs.writeFile(join(pkgDir, 'index.js'), indexJs); + + // Write a temporary .npmrc with a fake authentication token so that npm publish succeeds + // without needing real credentials or throwing ENEEDAUTH. + const npmrcContent = ` +${testRegistry.replace(/^https?:/, '')}/:_authToken=fake-secret +registry=${testRegistry} +`; + await fs.writeFile(join(pkgDir, '.npmrc'), npmrcContent); + + // 3. Pack the package + const packResult = await silentNpm(['pack'], { cwd: pkgDir }); + const tarballName = packResult.stdout.trim().split('\n').pop() || ''; + + // 4. Publish the package to the local verdaccio registry + // Verdaccio has publish: $all for @angular-devkit/* so this will succeed + await silentNpm(['publish'], { cwd: pkgDir }); + + // 5. Strip "schematics" and "ng-add" from Verdaccio's metadata on disk + const verdaccioDbPath = join( + tmpRoot, + 'registry', + 'storage', + '@angular-devkit', + 'ng-add-registry-stripped', + 'package.json', + ); + + const verdaccioDb = JSON.parse(await fs.readFile(verdaccioDbPath, 'utf-8')); + + // Strip from the top-level versions list + if (verdaccioDb.versions) { + for (const versionKey of Object.keys(verdaccioDb.versions)) { + delete verdaccioDb.versions[versionKey].schematics; + delete verdaccioDb.versions[versionKey]['ng-add']; + } + } + + // Write back the modified metadata + await fs.writeFile(verdaccioDbPath, JSON.stringify(verdaccioDb, null, 2), 'utf-8'); + + // 6. Execute `ng add` on the registry-stripped package + // Ensure file doesn't already exist + await expectFileNotToExist('schematic-executed-successfully.txt'); + + await ng('add', '@angular-devkit/ng-add-registry-stripped', '--skip-confirmation'); + + // 7. Assertions + // A. The schematic executed successfully + await expectFileToExist('schematic-executed-successfully.txt'); + + // B. The dependency was pruned from package.json since save: false + const rootPackageJson = JSON.parse(await fs.readFile('package.json', 'utf-8')); + const hasDep = + (rootPackageJson.dependencies && + rootPackageJson.dependencies['@angular-devkit/ng-add-registry-stripped']) || + (rootPackageJson.devDependencies && + rootPackageJson.devDependencies['@angular-devkit/ng-add-registry-stripped']); + + if (hasDep) { + throw new Error( + 'Package @angular-devkit/ng-add-registry-stripped was not cleaned up from package.json dependencies!', + ); + } + + // C. The dependency was pruned from node_modules physical folder + // Bun intentionally does not prune unreferenced packages from node_modules automatically. + if (getActivePackageManager() !== 'bun') { + await expectFileNotToExist('node_modules/@angular-devkit/ng-add-registry-stripped'); + } + } finally { + // Cleanup temp package source folder + await rimraf(pkgDir); + } +} diff --git a/tests/e2e/tests/commands/add/registry-option.ts b/tests/e2e/tests/commands/add/registry-option.ts index dc336cdd5b30..1343cebf4dd1 100644 --- a/tests/e2e/tests/commands/add/registry-option.ts +++ b/tests/e2e/tests/commands/add/registry-option.ts @@ -1,11 +1,37 @@ import { getGlobalVariable } from '../../../utils/env'; import { expectFileToExist } from '../../../utils/fs'; -import { ng } from '../../../utils/process'; +import { execAndCaptureError, ng } from '../../../utils/process'; import { expectToFail } from '../../../utils/utils'; export default async function () { const testRegistry = getGlobalVariable('package-registry'); + // Validate that a non-URL registry string fails with a validation error + const error = await execAndCaptureError('ng', [ + 'add', + '--registry=not-a-valid-url', + '@angular/pwa', + '--skip-confirmation', + ]); + if (!error.message.includes('Option --registry must be a valid URL.')) { + throw new Error( + `Expected registry validation error, but got different error: ${error.message}`, + ); + } + + // Validate that an empty registry string fails with a validation error + const errorEmpty = await execAndCaptureError('ng', [ + 'add', + '--registry=', + '@angular/pwa', + '--skip-confirmation', + ]); + if (!errorEmpty.message.includes('Option --registry must be a valid URL.')) { + throw new Error( + `Expected registry validation error for empty string, but got: ${errorEmpty.message}`, + ); + } + // Set an invalid registry process.env['NPM_CONFIG_REGISTRY'] = 'http://127.0.0.1:9999'; diff --git a/tests/e2e/tests/commands/add/secure-registry.ts b/tests/e2e/tests/commands/add/secure-registry.ts index 4a640607f8be..e585444b02e4 100644 --- a/tests/e2e/tests/commands/add/secure-registry.ts +++ b/tests/e2e/tests/commands/add/secure-registry.ts @@ -1,5 +1,5 @@ -import { expectFileNotToExist, expectFileToExist, rimraf } from '../../../utils/fs'; -import { getActivePackageManager, installWorkspacePackages } from '../../../utils/packages'; +import { expectFileNotToExist, expectFileToExist } from '../../../utils/fs'; +import { installWorkspacePackages } from '../../../utils/packages'; import { git, ng } from '../../../utils/process'; import { createNpmConfigForAuthentication } from '../../../utils/registry'; import { expectToFail } from '../../../utils/utils'; @@ -9,37 +9,17 @@ export default async function () { try { // The environment variable has priority over the .npmrc delete process.env['NPM_CONFIG_REGISTRY']; - const packageManager = getActivePackageManager(); - const supportsUnscopedAuth = packageManager === 'yarn'; const command = ['add', '@angular/pwa', '--skip-confirmation']; - // Works with unscoped registry authentication details - if (supportsUnscopedAuth) { - // Some package managers such as Bun and NPM do not support unscoped auth. - await createNpmConfigForAuthentication(false); - - await expectFileNotToExist('public/manifest.webmanifest'); - - await ng(...command); - await expectFileToExist('public/manifest.webmanifest'); - await git('clean', '-dxf'); - } - // Works with scoped registry authentication details await expectFileNotToExist('public/manifest.webmanifest'); - await createNpmConfigForAuthentication(true); + await createNpmConfigForAuthentication(); await ng(...command); await expectFileToExist('public/manifest.webmanifest'); await git('clean', '-dxf'); // Invalid authentication token - if (supportsUnscopedAuth) { - // Some package managers such as Bun and NPM do not support unscoped auth. - await createNpmConfigForAuthentication(false, true); - await expectToFail(() => ng(...command)); - } - await createNpmConfigForAuthentication(true, true); await expectToFail(() => ng(...command)); } finally { diff --git a/tests/e2e/tests/commands/serve/assets.ts b/tests/e2e/tests/commands/serve/assets.ts index 83fcb42aa8f2..dba1abea37cb 100644 --- a/tests/e2e/tests/commands/serve/assets.ts +++ b/tests/e2e/tests/commands/serve/assets.ts @@ -1,59 +1,31 @@ import assert from 'node:assert'; -import { randomUUID } from 'node:crypto'; -import { mkdir, rm, writeFile } from 'node:fs/promises'; -import { ngServe, updateJsonFile } from '../../../utils/project'; +import { ngServe } from '../../../utils/project'; import { getGlobalVariable } from '../../../utils/env'; export default async function () { - const outsideDirectoryName = `../outside-${randomUUID()}`; + const port = await ngServe(); - await updateJsonFile('angular.json', (json) => { - // Ensure assets located outside the workspace root work with the dev server - json.projects['test-project'].architect.build.options.assets.push({ - 'input': outsideDirectoryName, - 'glob': '**/*', - 'output': './outside', - }); - }); - - await mkdir(outsideDirectoryName); - try { - await writeFile(`${outsideDirectoryName}/some-asset.xyz`, 'XYZ'); - - const port = await ngServe(); - - let response = await fetch(`http://localhost:${port}/favicon.ico`); - assert.strictEqual(response.status, 200, 'favicon.ico response should be ok'); - - response = await fetch(`http://localhost:${port}/outside/some-asset.xyz`); - assert.strictEqual(response.status, 200, 'outside/some-asset.xyz response should be ok'); - assert.strictEqual(await response.text(), 'XYZ', 'outside/some-asset.xyz content is wrong'); + let response = await fetch(`http://localhost:${port}/favicon.ico`); + assert.strictEqual(response.status, 200, 'favicon.ico response should be ok'); - // A non-existent HTML file request with accept header should fallback to the index HTML - response = await fetch(`http://localhost:${port}/does-not-exist.html`, { - headers: { accept: 'text/html' }, - }); - assert.strictEqual( - response.status, - 200, - 'non-existent file response should fallback and be ok', - ); - assert.match( - await response.text(), - / { + const result = await exec( + MCP_INSPECTOR_COMMAND_NAME, + '--cli', + 'npx', + '--no', + '@angular/cli', + 'mcp', + ...args, + ); + + return result; +} + +export default async function () { + await silentNpm( + 'install', + '--ignore-scripts', + '-g', + `${MCP_INSPECTOR_PACKAGE_NAME}@${MCP_INSPECTOR_PACKAGE_VERSION}`, + ); + + try { + // 1. Ensure `run_target` is registered by default (now stable) + const { stdout: stdoutDefault } = await runInspector('--method', 'tools/list'); + assert.match(stdoutDefault, /"run_target"/); + + // 2. Ensure `run_target` is also registered when using the deprecated experimental-tool flag + const { stdout: stdoutEnabled } = await runInspector( + '-E', + 'run_target', + '--method', + 'tools/list', + ); + assert.match(stdoutEnabled, /"run_target"/); + + // 3. Call run_target with build target + const { stdout: stdoutCall } = await runInspector( + '--method', + 'tools/call', + '--tool-name', + 'run_target', + '--tool-arg', + 'target=build', + ); + assert.match(stdoutCall, /"status":\s*"success"/); + // Webpack-based browser builder does not print output paths to stdout logs. + // Only esbuild-based application builders output 'Output location: ...' and support outputPath extraction. + const esbuild = getGlobalVariable('argv')['esbuild']; + if (esbuild) { + assert.match(stdoutCall, /"outputPath":\s*"dist\/.+"/); + } else { + assert.doesNotMatch(stdoutCall, /"outputPath"/); + } + + // 4. Call run_target with test target (only for esbuild/Vite test runner, as webpack-based Karma fails on this bazel CI headless runner) + if (esbuild) { + const { stdout: stdoutTestCall } = await runInspector( + '--method', + 'tools/call', + '--tool-name', + 'run_target', + '--tool-arg', + 'target=test', + ); + assert.match(stdoutTestCall, /"status":\s*"success"/); + } + } finally { + // 5. Clean up global installation + await silentNpm('uninstall', '-g', MCP_INSPECTOR_PACKAGE_NAME); + } +} diff --git a/tests/e2e/tests/update/update-multiple-versions.ts b/tests/e2e/tests/update/update-multiple-versions.ts index 6fecb7b15b58..c9070b1a090b 100644 --- a/tests/e2e/tests/update/update-multiple-versions.ts +++ b/tests/e2e/tests/update/update-multiple-versions.ts @@ -7,7 +7,7 @@ import { expectToFail } from '../../utils/utils'; export default async function () { let restoreRegistry: (() => Promise) | undefined; try { - restoreRegistry = await createProjectFromAsset('19.0-project', true); + restoreRegistry = await createProjectFromAsset('20.0-project', true); await setRegistry(true); const extraArgs = ['--force']; diff --git a/tests/e2e/tests/update/update-pnpm-workspace.ts b/tests/e2e/tests/update/update-pnpm-workspace.ts new file mode 100644 index 000000000000..29aff7bff42a --- /dev/null +++ b/tests/e2e/tests/update/update-pnpm-workspace.ts @@ -0,0 +1,33 @@ +import { createProjectFromAsset } from '../../utils/assets'; +import { readFile, writeFile } from '../../utils/fs'; +import { getActivePackageManager } from '../../utils/packages'; +import { ng } from '../../utils/process'; + +export default async function () { + if (getActivePackageManager() !== 'pnpm') { + return; + } + + let restoreRegistry: (() => Promise) | undefined; + + try { + // Setup project from older asset using the public registry + restoreRegistry = await createProjectFromAsset('20.0-project', true); + + // Create pnpm-workspace.yaml inside the project directory + await writeFile('pnpm-workspace.yaml', "packages:\n - '.'\n"); + + // Run ng update on @angular/cli to trigger the update from version 20 to the next major version + await ng('update', '@angular/cli@21', '@angular/core@21'); + + // Verify that the pnpm lockfile does not contain references to the temporary package directory + const lockfileContent = await readFile('pnpm-lock.yaml'); + if (lockfileContent.includes('angular-cli-tmp-packages-')) { + throw new Error( + 'pnpm-lock.yaml contains reference to temporary package directory, isolation failed!', + ); + } + } finally { + await restoreRegistry?.(); + } +} diff --git a/tests/e2e/tests/update/update-secure-registry.ts b/tests/e2e/tests/update/update-secure-registry.ts index b52d311a622f..3c0a9d468e44 100644 --- a/tests/e2e/tests/update/update-secure-registry.ts +++ b/tests/e2e/tests/update/update-secure-registry.ts @@ -6,9 +6,6 @@ import { getActivePackageManager } from '../../utils/packages'; import assert from 'node:assert'; export default async function () { - const packageManager = getActivePackageManager(); - const supportsUnscopedAuth = packageManager === 'yarn'; - // The environment variable has priority over the .npmrc delete process.env['NPM_CONFIG_REGISTRY']; const worksMessage = 'We analyzed your package.json'; @@ -20,15 +17,7 @@ export default async function () { // Valid authentication token - if (supportsUnscopedAuth) { - await createNpmConfigForAuthentication(false); - const { stdout: stdout1 } = await ng('update', ...extraArgs); - if (!stdout1.includes(worksMessage)) { - throw new Error(`Expected stdout to contain "${worksMessage}"`); - } - } - - await createNpmConfigForAuthentication(true); + await createNpmConfigForAuthentication(); const { stdout: stdout2 } = await ng('update', ...extraArgs); if (!stdout2.includes(worksMessage)) { throw new Error(`Expected stdout to contain "${worksMessage}"`); @@ -36,11 +25,6 @@ export default async function () { // Invalid authentication token - if (supportsUnscopedAuth) { - await createNpmConfigForAuthentication(false, true); - await expectToFail(() => ng('update', ...extraArgs)); - } - await createNpmConfigForAuthentication(true, true); await expectToFail(() => ng('update', ...extraArgs)); diff --git a/tests/e2e/tests/update/update.ts b/tests/e2e/tests/update/update.ts index ae941762d6ca..fd8663503ecc 100644 --- a/tests/e2e/tests/update/update.ts +++ b/tests/e2e/tests/update/update.ts @@ -12,10 +12,10 @@ export default async function () { try { // We need to use the public registry because in the local NPM server we don't have // older versions @angular/cli packages which would cause `npm install` during `ng update` to fail. - restoreRegistry = await createProjectFromAsset('19.0-project', true); + restoreRegistry = await createProjectFromAsset('20.0-project', true); // CLI project version - const cliMajorProjectVersion = 19; + const cliMajorProjectVersion = 20; // If using npm, enable legacy peer deps mode to avoid defects in npm 7+'s peer dependency resolution // Example error where 11.2.14 satisfies the SemVer range ^11.0.0 but still fails: @@ -72,8 +72,8 @@ export default async function () { await ng('update', '@angular/cli', ...extraUpdateArgs); // Setup testing to use CI Chrome. - await useCIChrome('nineteen-project', './'); - await useCIDefaults('nineteen-project'); + await useCIChrome('twenty-project', './'); + await useCIDefaults('twenty-project'); // Run CLI commands. await ng('generate', 'component', 'my-comp'); @@ -81,14 +81,14 @@ export default async function () { await executeBrowserTest({ configuration: 'production', - expectedTitleText: 'Hello, nineteen-project', + expectedTitleText: 'Hello, twenty-project', }); await executeBrowserTest({ configuration: 'development', - expectedTitleText: 'Hello, nineteen-project', + expectedTitleText: 'Hello, twenty-project', }); // Verify project now creates bundles await noSilentNg('build', '--configuration=production'); - await expectFileMatchToExist('dist/nineteen-project/browser', /main-[a-zA-Z0-9]{8}\.js/); + await expectFileMatchToExist('dist/twenty-project/browser', /main-[a-zA-Z0-9]{8}\.js/); } diff --git a/tests/e2e/utils/registry.ts b/tests/e2e/utils/registry.ts index fd557c116120..d8d75b566fb9 100644 --- a/tests/e2e/utils/registry.ts +++ b/tests/e2e/utils/registry.ts @@ -63,7 +63,7 @@ export async function createNpmConfigForAuthentication( * _auth="dGVzdGluZzpzM2NyZXQ="` * ``` */ - scopedAuthentication: boolean, + scopedAuthentication = true, /** When true, an incorrect token is used. Use this to validate authentication failures. */ invalidToken = false, ): Promise { diff --git a/tools/package_json_release_filter.jq b/tools/package_json_release_filter.jq index 8fdae0df46c5..4e7c3c639c67 100644 --- a/tools/package_json_release_filter.jq +++ b/tools/package_json_release_filter.jq @@ -16,7 +16,7 @@ # Get the fields from root package.json that should override the project # package.json, i.e., every field except the following | ($root - | del(.bin, .description, .dependencies, .name, .main, .peerDependencies, .optionalDependencies, .typings, .version, .private, .workspaces, .resolutions, .scripts, .["ng-update"], .pnpm, .dependenciesMeta) + | del(.bin, .description, .dependencies, .name, .main, .peerDependencies, .optionalDependencies, .typings, .version, .private, .workspaces, .resolutions, .scripts, .["ng-update"], .pnpm, .dependenciesMeta, .packageManager) ) as $root_overrides # Use the project package.json as a base and override other fields from root