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/.gemini/config.yaml b/.gemini/config.yaml index 9f4eb5f02da3..795367b13a53 100644 --- a/.gemini/config.yaml +++ b/.gemini/config.yaml @@ -8,4 +8,6 @@ code_review: summary: false code_review: true include_drafts: false -ignore_patterns: [] +ignore_patterns: + - pnpm-lock.yaml + - CHANGELOG.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae2d8adb6cd4..57b31cb9c2f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,7 +78,7 @@ jobs: strategy: fail-fast: false matrix: - node: [22, 24] + node: [22, 24, 26] subset: [esbuild, webpack] shard: [0, 1, 2, 3, 4, 5] runs-on: ubuntu-latest diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5280d3d8ba7f..bce5febd9368 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -23,12 +23,12 @@ jobs: with: persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 + uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4 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@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4 with: category: '/language:javascript-typescript' diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 68249d536041..90bc19a07e68 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -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@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4.35.4 with: sarif_file: results.sarif diff --git a/.ng-dev/release.mjs b/.ng-dev/release.mjs index 4d4a4fc4b927..19e111f22f80 100644 --- a/.ng-dev/release.mjs +++ b/.ng-dev/release.mjs @@ -8,7 +8,25 @@ import { releasePackages } from '../scripts/packages.mts'; */ export const release = { representativeNpmPackage: '@angular/cli', - npmPackages: releasePackages.map(({ name, experimental }) => ({ name, experimental })), + npmPackages: releasePackages.map(({ name, experimental }) => { + if ( + name === '@angular-devkit/build-angular' || + name === '@angular-devkit/build-webpack' || + name === '@ngtools/webpack' + ) { + return { + name, + experimental, + deprecated: { + version: '>=22.0.0-rc.0', + message: + 'Angular\'s Webpack support is deprecated. Use the esbuild and Vite-based "@angular/build" package instead.', + }, + }; + } + + return { name, experimental }; + }), buildPackages: async () => { // The `performNpmReleaseBuild` function is loaded at runtime to avoid loading additional // files and dependencies unless a build is required. diff --git a/CHANGELOG.md b/CHANGELOG.md index 33c1713ff2e8..f9625adfaa54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,242 @@ + + +# 22.0.0-rc.0 (2026-05-13) + +## 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. + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------- | +| [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 | +| [c9f408153](https://github.com/angular/angular-cli/commit/c9f4081533f6f114846b88a152a9d5dc7363d680) | feat | set up fake timers in beforeEach instead of beforeAll | +| [8d0805dd1](https://github.com/angular/angular-cli/commit/8d0805dd1750cb16af620811dc01b40e46ad030e) | feat | update TSConfig globals during karma to vitest migration | +| [aed407db8](https://github.com/angular/angular-cli/commit/aed407db8be6bc7591fb82f10c79586cbd072a8a) | fix | defer karma config deletion in Karma to Vitest migration | +| [7fb59eaa6](https://github.com/angular/angular-cli/commit/7fb59eaa65a8d7e880b6f44d715b2aeaff9301ca) | fix | use service decorator in ng generate | + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | +| [58c0978f6](https://github.com/angular/angular-cli/commit/58c0978f658ee5fa7232abd8e2eb7f146e4eb6bb) | feat | add support for Node.js 26.0.0 | +| [ff88f491d](https://github.com/angular/angular-cli/commit/ff88f491da38493d6e06f3e4ac080d171c630ccd) | fix | restrict MCP workspace access to allowed client roots during resolution | +| [a5e1e48db](https://github.com/angular/angular-cli/commit/a5e1e48db759e9ffcaa89f04504f5f93a1afdda4) | fix | update odd-numbered Node.js version warning condition for future releases | + +### @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 | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------- | +| [58c7c7a9d](https://github.com/angular/angular-cli/commit/58c7c7a9d80fc6af5cf8b82a6d87f1d3cf3808c6) | feat | subresource integrity validation for dynamically loaded modules | +| [edfa782d5](https://github.com/angular/angular-cli/commit/edfa782d52fd971aebead8b96b6ca470a3f5123e) | fix | use dynamic TestComponentRenderer for Vitest | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------- | +| [ea95e1a87](https://github.com/angular/angular-cli/commit/ea95e1a87ebfb5b452a6b6ffa7838ca1fe094100) | fix | remove stateful flag from URL_PARAMETER_REGEXP | +| [f85343925](https://github.com/angular/angular-cli/commit/f8534392552f4896ee9449939cdc705010331e3d) | fix | support all X-Forwarded-\* headers when trustProxyHeaders is true | +| [50b16a65b](https://github.com/angular/angular-cli/commit/50b16a65b1be1f9c2ec11d578240a8884518d517) | refactor | deprecate CommonEngine APIs | + +### @ngtools/webpack + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------- | +| [547ca515b](https://github.com/angular/angular-cli/commit/547ca515b707c283489a3f088d86fc84807d830d) | refactor | deprecate @ngtools/webpack loader and plugin | + + + + +# 21.2.11 (2026-05-13) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------- | +| [bbd63b7a5](https://github.com/angular/angular-cli/commit/bbd63b7a5a1049bc56b9ddf6edf6563a1f2d9ace) | fix | robustly parse npm manifest from array | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------- | +| [eafe1a719](https://github.com/angular/angular-cli/commit/eafe1a719fd3fecd5263e0a8371200b4b1ff4bb9) | fix | allow all hosts in common engine rendering options to prevent validation errors | +| [7a116a80d](https://github.com/angular/angular-cli/commit/7a116a80d7e6db341fd003737285d1a9db10ba6c) | fix | remove stateful flag from URL_PARAMETER_REGEXP | + + + + + +# 20.3.26 (2026-05-13) + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------- | +| [7cc1871ee](https://github.com/angular/angular-cli/commit/7cc1871ee50d123853ddf6bd89857b354d647462) | fix | allow all hosts in common engine rendering options to prevent validation errors | + + + + + +# 19.2.26 (2026-05-13) + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------- | +| [842fee029](https://github.com/angular/angular-cli/commit/842fee0291b787b63fdabcaaac5680b05d395075) | fix | allow all hosts in common engine rendering options to prevent validation errors | + + + + + +# 21.2.10 (2026-05-06) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------------------- | +| [bb8611913](https://github.com/angular/angular-cli/commit/bb861191328fc2d25bd5ee99b0c8edc5e49d3a7d) | fix | restrict MCP workspace access to allowed client roots during resolution | + + + + + +# 19.2.25 (2026-04-30) + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [49ae0ad2d](https://github.com/angular/angular-cli/commit/49ae0ad2d452ab7d7510297919125fe00081fa49) | fix | upgrade postcss to 8.5.12 | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------- | +| [2d53feca5](https://github.com/angular/angular-cli/commit/2d53feca58730def7e2fb79f9cabfd1c32b9351d) | fix | update esbuild to `0.28.0` | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------------- | +| [02ce8bf26](https://github.com/angular/angular-cli/commit/02ce8bf2695e71c1684e231151b4ab5ccba94869) | fix | introduce trustProxyHeaders option to safely validate and sanitize proxy headers | + + + + + +# 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) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------- | +| [233deef01](https://github.com/angular/angular-cli/commit/233deef01288c6aa39a048d6bd66a1f09595dc15) | fix | fix broken img ref in ai-tutor | +| [7cea9885c](https://github.com/angular/angular-cli/commit/7cea9885c64a747b391b74e6434cdf005c843766) | fix | introduce initial package manager workspace awareness | +| [5b1a5b743](https://github.com/angular/angular-cli/commit/5b1a5b7434323eb383df1f53c389fe9dc948a785) | fix | remove standalone true ref in ai tutor | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------------- | +| [e7abeb5c7](https://github.com/angular/angular-cli/commit/e7abeb5c74024daf125070c9b4f7f8d2426bab66) | fix | add missing imports for focus and skip APIs in refactor-jasmine-vitest | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------------- | +| [94023f62c](https://github.com/angular/angular-cli/commit/94023f62c5b51a669ff3187cc062057f82c79c52) | fix | introduce trustProxyHeaders option to safely validate and sanitize proxy headers | +| [5ffe5c309](https://github.com/angular/angular-cli/commit/5ffe5c309a92e7fd42f1059171924c5942f35c36) | fix | add support for configuring trusted proxy headers via environment variable | +| [930ada9b7](https://github.com/angular/angular-cli/commit/930ada9b73c5172d57830ce42a5a336ae9483a54) | fix | decode route segments when building and matching route tree | +| [0dc8a440c](https://github.com/angular/angular-cli/commit/0dc8a440ca9e4242edb69ba5a8147fef1dddc4f0) | fix | use router to normalize URLs for comparison | + + + + + +# 20.3.25 (2026-04-29) + +### @angular-devkit/build-angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------- | +| [5e01ef40e](https://github.com/angular/angular-cli/commit/5e01ef40eb87deda79d18654fc696b64d18bf889) | fix | upgrade postcss to 8.5.12 | + +### @angular/ssr + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------------- | +| [6686848d9](https://github.com/angular/angular-cli/commit/6686848d946ca157f9b92b84db377e912266395e) | fix | introduce trustProxyHeaders option to safely validate and sanitize proxy headers | + + + # 22.0.0-next.6 (2026-04-22) @@ -17812,4 +18051,4 @@ Renovate Bot, Charles Lyding, Alan Agius, Doug Parker, Bruno Baia, Amadou Sall, --- -**Note: For release notes prior to this CHANGELOG see [release notes](https://github.com/angular/angular-cli/releases).** +**Note: For release notes prior to this CHANGELOG see [release notes](https://github.com/angular/angular-cli/releases).** \ No newline at end of file diff --git a/MODULE.bazel b/MODULE.bazel index c0c3d9aa4e4c..b00ae16b2981 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,30 +10,30 @@ 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_pkg", version = "1.2.0") -bazel_dep(name = "rules_cc", version = "0.2.17") +bazel_dep(name = "rules_cc", version = "0.2.18") bazel_dep(name = "jq.bzl", version = "0.6.1") -bazel_dep(name = "bazel_lib", version = "3.2.2") +bazel_dep(name = "bazel_lib", version = "3.3.1") bazel_dep(name = "bazel_skylib", version = "1.9.0") bazel_dep(name = "aspect_rules_esbuild", version = "0.25.1") bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4") bazel_dep(name = "rules_angular") git_override( module_name = "rules_angular", - commit = "03dade2ea0ea355e13ca88c550eaa633191b16ec", + commit = "045f98407a299ffaeeeafa275d8490d4507513f8", remote = "https://github.com/angular/rules_angular.git", ) bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "e04d90adad1a125b29fbc4d97f425798768a8cb1", + commit = "6ef1cf3158022456bf1f7031de79b7e44fe479b2", remote = "https://github.com/angular/dev-infra.git", ) bazel_dep(name = "rules_browsers") git_override( module_name = "rules_browsers", - commit = "4de93bbfdbee2cea5162ac8070eb15846b15133d", + commit = "bf27ea46fdbb0209526ca821f1500d4337eb8299", remote = "https://github.com/angular/rules_browsers.git", ) @@ -91,6 +91,21 @@ node_dev.toolchain( }, node_version = "24.13.1", ) + +# Node.js 26 +node_dev.toolchain( + name = "node26", + 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_version = "26.0.0", +) use_repo( node_dev, "node22_darwin_amd64", @@ -105,13 +120,19 @@ use_repo( "node24_linux_arm64", "node24_toolchains", "node24_windows_amd64", + "node26_darwin_amd64", + "node26_darwin_arm64", + "node26_linux_amd64", + "node26_linux_arm64", + "node26_toolchains", + "node26_windows_amd64", ) pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm") pnpm.pnpm( name = "pnpm", - pnpm_version = "10.33.0", - pnpm_version_integrity = "sha512-EFaLtKavtYyes2MNqQzJUWQXq+vT+rvmc58K55VyjaFJHp21pUTHatjrdXD1xLs9bGN7LLQb/c20f6gjyGSTGQ==", + pnpm_version = "10.33.4", + pnpm_version_integrity = "sha512-HGezs1my1AgRm6HtKJ80uPw8aHNBK+xv0mT73IJInlEPy+y5zp0i2ufzt2Jp2EQQRgFL3KU7mXnNelYa1jG4AA==", ) use_repo(pnpm, "pnpm") @@ -168,8 +189,8 @@ rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext") rules_ts_ext.deps( name = "angular_cli_npm_typescript", # Obtained by: npm info typescript@6.0.2 dist.integrity - ts_integrity = "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", - ts_version = "6.0.2", + ts_integrity = "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + ts_version = "6.0.3", ) use_repo(rules_ts_ext, **{"npm_typescript": "angular_cli_npm_typescript"}) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index c8cd87aacc28..f86336fd1c17 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -24,9 +24,11 @@ "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_js/3.1.1/MODULE.bazel": "b83cf3ee44837345f1c926d70b96453deb5e244de43d08dcd7acad8d381c275a", + "https://bcr.bazel.build/modules/aspect_rules_js/3.1.1/source.json": "2806c2d7ce5993f68b74df5f3e2de45d4b2a5798afedd459d88e37c75562da97", "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_rules_ts/3.8.9/MODULE.bazel": "bd5f9ebf517cfcd377eaa7ce1cb16035d167f00774b77789909590c53bc6f20c", + "https://bcr.bazel.build/modules/aspect_rules_ts/3.8.9/source.json": "59e66656561571ed82ccff56c75c43d0bc79f0065ca8d17be2752d4f648d40c9", "https://bcr.bazel.build/modules/aspect_tools_telemetry/0.2.6/MODULE.bazel": "cafb8781ad591bc57cc765dca5fefab08cf9f65af363d162b79d49205c7f8af7", "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", @@ -44,13 +46,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.41.0/source.json": "8fd525b31b0883c47e0593443cdd10219b94a7556b3195fc02d75c86c66cfe30", + "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.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.2.2/source.json": "9e84e115c20e14652c5c21401ae85ff4daa8702e265b5c0b3bf89353f17aa212", + "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_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", @@ -62,6 +66,7 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6", "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", "https://bcr.bazel.build/modules/bazel_skylib/1.9.0/MODULE.bazel": "72997b29dfd95c3fa0d0c48322d05590418edef451f8db8db5509c57875fb4b7", @@ -84,7 +89,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", @@ -93,7 +99,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", @@ -121,8 +128,8 @@ "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.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/MODULE.bazel": "1849602c86cb60da8613d2de887f9566a6d354a6df6d7009f9d04a14402f9a84", - "https://bcr.bazel.build/modules/rules_cc/0.2.17/source.json": "3832f45d145354049137c0090df04629d9c2b5493dc5c2bf46f1834040133a07", + "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.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", @@ -192,8 +199,8 @@ "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.4/source.json": "20143442376c03426f6135292ba02d825cb75308aa47e6bf42dd4cc5a435c2ff", "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", @@ -212,7 +219,7 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "QxNkTCcD6yURsbqznKyC/WCjCyhHZbEipGXl2UQjjzY=", + "bzlTransitiveDigest": "KFD6po3VH3bzbbFpfJYeoHrmWxJCThGGGTCGM9Url10=", "usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -427,8 +434,8 @@ }, "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { - "bzlTransitiveDigest": "dhTbv9E6UfT1WJmmu3ORRPO6AKFJvgBjBxu+BO+u1RY=", - "usagesDigest": "mnWOxbm/kIwuW9HmcBRVBhHU3ThlGE832G0JAy/sn+4=", + "bzlTransitiveDigest": "oXZdaO5AFNj463wHR4NRAWU9XCc9wkl3rcZxqQoNWHQ=", + "usagesDigest": "QQqokxpCVnBJntX7dhxnf/c13LeWUQxDTUnILYCp4Jc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -436,8 +443,8 @@ "angular_cli_npm_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "6.0.2", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] @@ -446,8 +453,8 @@ "rules_angular_npm_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "6.0.2", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] @@ -456,8 +463,8 @@ "npm_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "6.0.2", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] @@ -466,8 +473,8 @@ "npm_rules_browsers_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "6.0.2", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] @@ -491,7 +498,7 @@ "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "general": { "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", - "usagesDigest": "0S2z9G3E1NIz6vCXk9IbRcO5LIckEcYVMSzRj2sEML8=", + "usagesDigest": "y/K1vMLYhlZhrdyg3UqaV3wb1hAy8ECSy2ibeBFcFZ0=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -500,8 +507,8 @@ "repoRuleId": "@@aspect_tools_telemetry+//:extension.bzl%tel_repository", "attributes": { "deps": { - "aspect_rules_js": "3.0.3", - "aspect_rules_ts": "3.8.8", + "aspect_rules_js": "3.1.1", + "aspect_rules_ts": "3.8.9", "aspect_rules_esbuild": "0.25.1", "aspect_rules_jasmine": "2.0.4", "aspect_tools_telemetry": "0.3.3" @@ -525,7 +532,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" @@ -797,7 +804,7 @@ }, "@@rules_fuzzing+//fuzzing/private:extensions.bzl%non_module_dependencies": { "general": { - "bzlTransitiveDigest": "4LouzhF/yT117s7peGnNs9ROomiJXC6Zl5R0oI21jho=", + "bzlTransitiveDigest": "CYUiFDCnL2VGx3uotIu/VuGabgObnZra2zzRUJCX0sU=", "usagesDigest": "wy6ISK6UOcBEjj/mvJ/S3WeXoO67X+1llb9yPyFtPgc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -880,7 +887,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,7 +952,7 @@ "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "oZFClfRhTTwsYzpxVPkOpOt/r0+OzEfEV37au0jFZ0s=", - "usagesDigest": "fkkDOc1plpzAkO5pn2xJ/0LSXLJElOvwmi3xfrz7cxY=", + "usagesDigest": "1vNEgfiNUxoLsAqSjuJplr7ufUJPhlDmiGBSws/ow1s=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -2179,6 +2186,416 @@ "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": [] @@ -2186,7 +2603,7 @@ }, "@@rules_python+//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "WViZ5k1A9F8R5wfEe2ArLMFS1g9UmgfbS8Q/7q1/z7o=", + "bzlTransitiveDigest": "1CieYf7PBGYmx4QxddIeJFyAiJ2OB1ah39h4F4rtjxo=", "usagesDigest": "AK1R124YPWwAs8z1CQYyjYuci8RO5Ofot+EP5ZCNQDc=", "recordedFileInputs": { "@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", @@ -4925,7 +5342,7 @@ "@@yq.bzl+//yq:extensions.bzl%yq": { "general": { "bzlTransitiveDigest": "UfFMy8CWK4/dVo/tfaSAIYUiDGNAPes5eRllx9O9Q9Q=", - "usagesDigest": "xPeGU4HF2Tm+YRYp+urLJFiY6+9GledFMMrn4sTXP8M=", + "usagesDigest": "dCsOLXpanQn0FVrzeJazd2Hl9ZrUyH9czkX7lgm8LCM=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/constants.bzl b/constants.bzl index 89d6eb63421c..afa5dafa48a8 100644 --- a/constants.bzl +++ b/constants.bzl @@ -1,5 +1,5 @@ # Engine versions to stamp in a release package.json -RELEASE_ENGINES_NODE = "^22.22.0 || >=24.13.1" +RELEASE_ENGINES_NODE = "^22.22.0 || ^24.13.1 || >=26.0.0" RELEASE_ENGINES_NPM = "^6.11.0 || ^7.5.6 || >=8.0.0" RELEASE_ENGINES_YARN = ">= 1.13.0" @@ -13,7 +13,7 @@ NG_PACKAGR_PEER_DEP = "^22.0.0-next.0" # default browser set used to determine what downleveling is necessary. # # See: https://web.dev/baseline -BASELINE_DATE = "2025-10-20" +BASELINE_DATE = "2026-05-07" SNAPSHOT_REPOS = { "@angular/cli": "angular/cli-builds", diff --git a/eslint.config.mjs b/eslint.config.mjs index 08a993804c32..cc9c57c0535c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -213,6 +213,7 @@ export default [ '@typescript-eslint/prefer-promise-reject-errors': 'off', '@typescript-eslint/only-throw-error': 'off', '@typescript-eslint/no-unsafe-function-type': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', }, }, { diff --git a/goldens/circular-deps/packages.json b/goldens/circular-deps/packages.json index 4321adf60eaa..fe51488c7066 100644 --- a/goldens/circular-deps/packages.json +++ b/goldens/circular-deps/packages.json @@ -1,30 +1 @@ -[ - [ - "packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts", - "packages/angular/build/src/tools/esbuild/bundler-context.ts", - "packages/angular/build/src/tools/esbuild/utils.ts", - "packages/angular/build/src/tools/esbuild/bundler-execution-result.ts" - ], - [ - "packages/angular/build/src/tools/esbuild/bundler-context.ts", - "packages/angular/build/src/tools/esbuild/utils.ts" - ], - [ - "packages/angular/build/src/tools/esbuild/bundler-context.ts", - "packages/angular/build/src/tools/esbuild/utils.ts", - "packages/angular/build/src/tools/esbuild/bundler-execution-result.ts" - ], - [ - "packages/angular/build/src/tools/esbuild/bundler-context.ts", - "packages/angular/build/src/tools/esbuild/utils.ts", - "packages/angular/build/src/utils/server-rendering/manifest.ts" - ], - [ - "packages/angular/build/src/tools/esbuild/bundler-execution-result.ts", - "packages/angular/build/src/tools/esbuild/utils.ts" - ], - [ - "packages/angular/build/src/tools/esbuild/utils.ts", - "packages/angular/build/src/utils/server-rendering/manifest.ts" - ] -] +[] diff --git a/goldens/public-api/angular/build/index.api.md b/goldens/public-api/angular/build/index.api.md index 3ca6e8d98d12..df3f8fe8c777 100644 --- a/goldens/public-api/angular/build/index.api.md +++ b/goldens/public-api/angular/build/index.api.md @@ -8,7 +8,7 @@ import { BuilderContext } from '@angular-devkit/architect'; import { BuilderOutput } from '@angular-devkit/architect'; import type { ConfigOptions } from 'karma'; import type http from 'node:http'; -import { OutputFile } from 'esbuild'; +import type { OutputFile } from 'esbuild'; import type { Plugin as Plugin_2 } from 'esbuild'; // @public (undocumented) diff --git a/goldens/public-api/angular/ssr/node/index.api.md b/goldens/public-api/angular/ssr/node/index.api.md index 2c1c5f4bf86a..06b61ab1fdcb 100644 --- a/goldens/public-api/angular/ssr/node/index.api.md +++ b/goldens/public-api/angular/ssr/node/index.api.md @@ -23,13 +23,13 @@ export class AngularNodeAppEngine { export interface AngularNodeAppEngineOptions extends AngularAppEngineOptions { } -// @public +// @public @deprecated export class CommonEngine { constructor(options?: CommonEngineOptions | undefined); render(opts: CommonEngineRenderOptions): Promise; } -// @public (undocumented) +// @public @deprecated (undocumented) export interface CommonEngineOptions { allowedHosts?: readonly string[]; bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); @@ -37,7 +37,7 @@ export interface CommonEngineOptions { providers?: StaticProvider[]; } -// @public (undocumented) +// @public @deprecated (undocumented) export interface CommonEngineRenderOptions { bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); // (undocumented) diff --git a/goldens/public-api/angular_devkit/build_webpack/index.api.md b/goldens/public-api/angular_devkit/build_webpack/index.api.md index 0d60187627d5..abe0725a36fe 100644 --- a/goldens/public-api/angular_devkit/build_webpack/index.api.md +++ b/goldens/public-api/angular_devkit/build_webpack/index.api.md @@ -40,14 +40,14 @@ export interface EmittedFiles { name?: string; } -// @public (undocumented) +// @public @deprecated (undocumented) export function runWebpack(config: webpack.Configuration, context: BuilderContext, options?: { logging?: WebpackLoggingCallback; webpackFactory?: WebpackFactory; shouldProvideStats?: boolean; }): Observable; -// @public (undocumented) +// @public @deprecated (undocumented) export function runWebpackDevServer(config: webpack.Configuration, context: BuilderContext, options?: { shouldProvideStats?: boolean; devServerConfig?: WebpackDevServer.Configuration; diff --git a/goldens/public-api/angular_devkit/core/index.api.md b/goldens/public-api/angular_devkit/core/index.api.md index 6692eccbf218..d86a826c566f 100644 --- a/goldens/public-api/angular_devkit/core/index.api.md +++ b/goldens/public-api/angular_devkit/core/index.api.md @@ -243,7 +243,7 @@ type FileBuffer = ArrayBuffer; // @public (undocumented) type FileBufferLike = ArrayBufferLike; -// @public (undocumented) +// @public @deprecated (undocumented) function fileBufferToString(fileBuffer: FileBuffer): string; // @public (undocumented) @@ -1012,7 +1012,7 @@ declare namespace strings { } export { strings } -// @public (undocumented) +// @public @deprecated (undocumented) function stringToFileBuffer(str: string): FileBuffer; // @public (undocumented) 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/goldens/public-api/ngtools/webpack/index.api.md b/goldens/public-api/ngtools/webpack/index.api.md index 13ddc85cabd8..a2c25e8c74f5 100644 --- a/goldens/public-api/ngtools/webpack/index.api.md +++ b/goldens/public-api/ngtools/webpack/index.api.md @@ -8,14 +8,14 @@ import type { Compiler } from 'webpack'; import type { CompilerOptions } from '@angular/compiler-cli'; import type { LoaderContext } from 'webpack'; -// @public (undocumented) +// @public @deprecated (undocumented) function angularWebpackLoader(this: LoaderContext, content: string, map: string): void; export default angularWebpackLoader; -// @public (undocumented) +// @public @deprecated (undocumented) export const AngularWebpackLoaderPath: string; -// @public (undocumented) +// @public @deprecated (undocumented) export class AngularWebpackPlugin { constructor(options?: Partial); // (undocumented) @@ -24,7 +24,7 @@ export class AngularWebpackPlugin { get options(): AngularWebpackPluginOptions; } -// @public (undocumented) +// @public @deprecated (undocumented) export interface AngularWebpackPluginOptions { // (undocumented) compilerOptions?: CompilerOptions; @@ -48,7 +48,7 @@ export interface AngularWebpackPluginOptions { tsconfig: string; } -// @public (undocumented) +// @public @deprecated (undocumented) export const imageDomains: Set; // (No @packageDocumentation comment for this package) diff --git a/modules/testing/builder/package.json b/modules/testing/builder/package.json index 9ffae1c74f5f..9e67f25c024f 100644 --- a/modules/testing/builder/package.json +++ b/modules/testing/builder/package.json @@ -4,12 +4,12 @@ "@angular-devkit/build-angular": "workspace:*", "@angular-devkit/core": "workspace:*", "@angular/ssr": "workspace:*", - "@vitest/coverage-v8": "4.1.4", + "@vitest/coverage-v8": "4.1.5", "browser-sync": "3.0.4", "istanbul-lib-instrument": "6.0.3", - "jsdom": "29.0.2", - "ng-packagr": "22.0.0-next.3", + "jsdom": "29.1.1", + "ng-packagr": "22.0.0-next.4", "rxjs": "7.8.2", - "vitest": "4.1.4" + "vitest": "4.1.5" } } diff --git a/package.json b/package.json index 5678b9639536..f5d0b4f836c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "22.0.0-next.6", + "version": "22.1.0-next.0", "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.0", + "packageManager": "pnpm@10.33.4", "engines": { - "node": "^22.22.0 || >=24.13.1", + "node": "^22.22.0 || ^24.13.1 || >=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.0" + "pnpm": "10.33.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.8", - "typescript": "6.0.2" + "@angular/compiler-cli": "22.0.0-next.12", + "typescript": "6.0.3" }, "devDependencies": { - "@angular/animations": "22.0.0-next.8", - "@angular/cdk": "22.0.0-next.5", - "@angular/common": "22.0.0-next.8", - "@angular/compiler": "22.0.0-next.8", - "@angular/core": "22.0.0-next.8", - "@angular/forms": "22.0.0-next.8", - "@angular/localize": "22.0.0-next.8", - "@angular/material": "22.0.0-next.5", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#40e97052a6e9a06c880b7f2d6de9bfa70a326a52", - "@angular/platform-browser": "22.0.0-next.8", - "@angular/platform-server": "22.0.0-next.8", - "@angular/router": "22.0.0-next.8", - "@angular/service-worker": "22.0.0-next.8", + "@angular/animations": "22.0.0-next.12", + "@angular/cdk": "22.0.0-next.8", + "@angular/common": "22.0.0-next.12", + "@angular/compiler": "22.0.0-next.12", + "@angular/core": "22.0.0-next.12", + "@angular/forms": "22.0.0-next.12", + "@angular/localize": "22.0.0-next.12", + "@angular/material": "22.0.0-next.8", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2c36222db3f44751284cc93b3806dbe1baee583a", + "@angular/platform-browser": "22.0.0-next.12", + "@angular/platform-server": "22.0.0-next.12", + "@angular/router": "22.0.0-next.12", + "@angular/service-worker": "22.0.0-next.12", "@babel/core": "7.29.0", "@bazel/bazelisk": "1.28.1", "@bazel/buildifier": "8.2.1", @@ -70,7 +70,7 @@ "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "16.0.3", - "@rollup/wasm-node": "4.60.2", + "@rollup/wasm-node": "4.60.3", "@stylistic/eslint-plugin": "^5.0.0", "@tony.ganchev/eslint-plugin-header": "~3.4.0", "@types/babel__core": "7.20.5", @@ -95,20 +95,20 @@ "@types/yargs": "^17.0.20", "@types/yargs-parser": "^21.0.0", "@types/yarnpkg__lockfile": "^1.1.5", - "@typescript-eslint/eslint-plugin": "8.58.2", - "@typescript-eslint/parser": "8.58.2", - "ajv": "8.18.0", + "@typescript-eslint/eslint-plugin": "8.59.2", + "@typescript-eslint/parser": "8.59.2", + "ajv": "8.20.0", "buffer": "6.0.3", "esbuild": "0.28.0", "esbuild-wasm": "0.28.0", - "eslint": "10.2.1", + "eslint": "10.3.0", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", "express": "5.2.1", "fast-glob": "3.3.3", - "globals": "17.5.0", + "globals": "17.6.0", "http-proxy": "^1.18.1", - "http-proxy-middleware": "3.0.5", + "http-proxy-middleware": "4.0.0", "husky": "9.1.7", "jasmine": "~6.2.0", "jasmine-core": "~6.2.0", @@ -123,16 +123,16 @@ "lodash": "^4.17.21", "magic-string": "0.30.21", "prettier": "^3.0.0", - "puppeteer": "24.41.0", + "puppeteer": "24.43.0", "quicktype-core": "23.2.6", - "rollup": "4.60.2", + "rollup": "4.60.3", "rollup-license-plugin": "~3.2.0", "rollup-plugin-dts": "6.4.1", "rollup-plugin-sourcemaps2": "0.5.6", "semver": "7.7.4", "source-map-support": "0.5.21", "tslib": "2.8.1", - "undici": "8.1.0", + "undici": "8.2.0", "unenv": "^1.10.0", "verdaccio": "6.5.2", "verdaccio-auth-memory": "^13.0.0", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index ff5008622fd3..eee9f1dba686 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -36,12 +36,12 @@ "parse5-html-rewriting-stream": "8.0.1", "picomatch": "4.0.4", "piscina": "5.1.4", - "rollup": "4.60.2", + "rollup": "4.60.3", "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.3", "watchpack": "2.5.1" }, "optionalDependencies": { @@ -51,13 +51,13 @@ "@angular-devkit/core": "workspace:*", "@angular/ssr": "workspace:*", "istanbul-lib-instrument": "6.0.3", - "jsdom": "29.0.2", + "jsdom": "29.1.1", "less": "4.6.4", - "ng-packagr": "22.0.0-next.3", - "postcss": "8.5.10", - "rolldown": "1.0.0-rc.16", + "ng-packagr": "22.0.0-next.4", + "postcss": "8.5.14", + "rolldown": "1.0.0", "rxjs": "7.8.2", - "vitest": "4.1.4" + "vitest": "4.1.5" }, "peerDependencies": { "@angular/compiler": "0.0.0-ANGULAR-FW-PEER-DEP", diff --git a/packages/angular/build/src/builders/application/build-action.ts b/packages/angular/build/src/builders/application/build-action.ts index afc59785be7d..d483d32909c0 100644 --- a/packages/angular/build/src/builders/application/build-action.ts +++ b/packages/angular/build/src/builders/application/build-action.ts @@ -9,8 +9,8 @@ import { BuilderContext } from '@angular-devkit/architect'; import { existsSync } from 'node:fs'; import path from 'node:path'; -import { BuildOutputFile, BuildOutputFileType } from '../../tools/esbuild/bundler-context'; import { ExecutionResult, RebuildState } from '../../tools/esbuild/bundler-execution-result'; +import { BuildOutputFile, BuildOutputFileType } from '../../tools/esbuild/bundler-files'; import { shutdownSassWorkerPool } from '../../tools/esbuild/stylesheets/sass-language'; import { logMessages, withNoProgress, withSpinner } from '../../tools/esbuild/utils'; import { ChangedFiles } from '../../tools/esbuild/watcher'; diff --git a/packages/angular/build/src/builders/application/chunk-optimizer.ts b/packages/angular/build/src/builders/application/chunk-optimizer.ts index 5898c95401ee..1586b48155ea 100644 --- a/packages/angular/build/src/builders/application/chunk-optimizer.ts +++ b/packages/angular/build/src/builders/application/chunk-optimizer.ts @@ -20,13 +20,13 @@ import type { Message, Metafile } from 'esbuild'; import assert from 'node:assert'; import { type Plugin, rollup } from 'rollup'; +import { BundleContextResult } from '../../tools/esbuild/bundler-context'; import { - BuildOutputFile, + type BuildOutputFile, BuildOutputFileType, - BundleContextResult, - InitialFileRecord, -} from '../../tools/esbuild/bundler-context'; -import { createOutputFile } from '../../tools/esbuild/utils'; + type InitialFileRecord, + createOutputFile, +} from '../../tools/esbuild/bundler-files'; import { useRolldownChunks } from '../../utils/environment-options'; import { assertIsError } from '../../utils/error'; import { toPosixPath } from '../../utils/path'; diff --git a/packages/angular/build/src/builders/application/execute-build.ts b/packages/angular/build/src/builders/application/execute-build.ts index 5aefadc9d904..a6984a935dc0 100644 --- a/packages/angular/build/src/builders/application/execute-build.ts +++ b/packages/angular/build/src/builders/application/execute-build.ts @@ -10,17 +10,15 @@ import { BuilderContext } from '@angular-devkit/architect'; import { createAngularCompilation } from '../../tools/angular/compilation'; import { SourceFileCache } from '../../tools/esbuild/angular/source-file-cache'; import { generateBudgetStats } from '../../tools/esbuild/budget-stats'; -import { - BuildOutputFileType, - BundleContextResult, - BundlerContext, -} from '../../tools/esbuild/bundler-context'; +import { BundleContextResult, BundlerContext } from '../../tools/esbuild/bundler-context'; import { ExecutionResult, RebuildState } from '../../tools/esbuild/bundler-execution-result'; +import { BuildOutputFileType } from '../../tools/esbuild/bundler-files'; import { checkCommonJSModules } from '../../tools/esbuild/commonjs-checker'; import { extractLicenses } from '../../tools/esbuild/license-extractor'; import { profileAsync } from '../../tools/esbuild/profiling'; import { calculateEstimatedTransferSizes, + filterMetafile, logBuildStats, transformSupportedBrowsersToTargets, } from '../../tools/esbuild/utils'; @@ -163,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( @@ -230,7 +231,7 @@ export async function executeBuild( executionResult.setExternalMetadata(implicitBrowser, implicitServer, [...explicitExternal]); } - const { metafile, initialFiles, outputFiles } = bundlingResult; + const { metafile, browserMetafile, serverMetafile, initialFiles, outputFiles } = bundlingResult; executionResult.outputFiles.push(...outputFiles); @@ -322,13 +323,34 @@ export async function executeBuild( BuildOutputFileType.Root, ); - // Write metafile if stats option is enabled + // Write metafiles if stats option is enabled, split by browser/server and initial/non-initial if (options.stats) { + const filterInitialFiles = (outputPath: string) => initialFiles.has(outputPath); + const filterNonInitialFiles = (outputPath: string) => !initialFiles.has(outputPath); + + executionResult.addOutputFile( + 'browser-stats.json', + JSON.stringify(filterMetafile(browserMetafile, filterNonInitialFiles), null, 2), + BuildOutputFileType.Root, + ); executionResult.addOutputFile( - 'stats.json', - JSON.stringify(metafile, null, 2), + 'browser-initial-stats.json', + JSON.stringify(filterMetafile(browserMetafile, filterInitialFiles), null, 2), BuildOutputFileType.Root, ); + + if (serverMetafile) { + executionResult.addOutputFile( + 'server-stats.json', + JSON.stringify(filterMetafile(serverMetafile, filterNonInitialFiles), null, 2), + BuildOutputFileType.Root, + ); + executionResult.addOutputFile( + 'server-initial-stats.json', + JSON.stringify(filterMetafile(serverMetafile, filterInitialFiles), null, 2), + BuildOutputFileType.Root, + ); + } } if (!jsonLogs && !options.quiet) { diff --git a/packages/angular/build/src/builders/application/execute-post-bundle.ts b/packages/angular/build/src/builders/application/execute-post-bundle.ts index 5171ca254d5d..aa931aaa5206 100644 --- a/packages/angular/build/src/builders/application/execute-post-bundle.ts +++ b/packages/angular/build/src/builders/application/execute-post-bundle.ts @@ -9,16 +9,16 @@ import type { Metafile } from 'esbuild'; import assert from 'node:assert'; import { - BuildOutputFile, - BuildOutputFileType, - InitialFileRecord, -} from '../../tools/esbuild/bundler-context'; -import { - BuildOutputAsset, - PrerenderedRoutesRecord, + type BuildOutputAsset, + type PrerenderedRoutesRecord, } from '../../tools/esbuild/bundler-execution-result'; +import { + type BuildOutputFile, + BuildOutputFileType, + type InitialFileRecord, + createOutputFile, +} from '../../tools/esbuild/bundler-files'; import { generateIndexHtml } from '../../tools/esbuild/index-html-generator'; -import { createOutputFile } from '../../tools/esbuild/utils'; import { maxWorkers } from '../../utils/environment-options'; import { SERVER_APP_MANIFEST_FILENAME, diff --git a/packages/angular/build/src/builders/application/i18n.ts b/packages/angular/build/src/builders/application/i18n.ts index 081be50e7a9f..c83f1a29a30a 100644 --- a/packages/angular/build/src/builders/application/i18n.ts +++ b/packages/angular/build/src/builders/application/i18n.ts @@ -9,11 +9,11 @@ import { BuilderContext } from '@angular-devkit/architect'; import type { Metafile } from 'esbuild'; import { join } from 'node:path'; -import { BuildOutputFileType, InitialFileRecord } from '../../tools/esbuild/bundler-context'; import { ExecutionResult, PrerenderedRoutesRecord, } from '../../tools/esbuild/bundler-execution-result'; +import { BuildOutputFileType, InitialFileRecord } from '../../tools/esbuild/bundler-files'; import { I18nInliner } from '../../tools/esbuild/i18n-inliner'; import { maxWorkers } from '../../utils/environment-options'; import { loadTranslations } from '../../utils/i18n-options'; diff --git a/packages/angular/build/src/builders/application/index.ts b/packages/angular/build/src/builders/application/index.ts index d4671decc145..f127ef4bdc7f 100644 --- a/packages/angular/build/src/builders/application/index.ts +++ b/packages/angular/build/src/builders/application/index.ts @@ -10,7 +10,7 @@ import { Builder, BuilderContext, BuilderOutput, createBuilder } from '@angular- import assert from 'node:assert'; import fs from 'node:fs/promises'; import path from 'node:path'; -import { BuildOutputFileType } from '../../tools/esbuild/bundler-context'; +import { BuildOutputFileType } from '../../tools/esbuild/bundler-files'; import { createJsonBuildManifest, emitFilesToDisk } from '../../tools/esbuild/utils'; import { colors as ansiColors } from '../../utils/color'; import { deleteOutputDir } from '../../utils/delete-output-dir'; diff --git a/packages/angular/build/src/builders/application/results.ts b/packages/angular/build/src/builders/application/results.ts index 3e3f0dd99315..6fa23f9f19cd 100644 --- a/packages/angular/build/src/builders/application/results.ts +++ b/packages/angular/build/src/builders/application/results.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { BuildOutputFileType } from '../../tools/esbuild/bundler-context'; +import { BuildOutputFileType } from '../../tools/esbuild/bundler-files'; export enum ResultKind { Failure, diff --git a/packages/angular/build/src/builders/application/tests/options/stats-json_spec.ts b/packages/angular/build/src/builders/application/tests/options/stats-json_spec.ts new file mode 100644 index 000000000000..73e33f573d37 --- /dev/null +++ b/packages/angular/build/src/builders/application/tests/options/stats-json_spec.ts @@ -0,0 +1,185 @@ +/** + * @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 { buildApplication } from '../../index'; +import { APPLICATION_BUILDER_INFO, BASE_OPTIONS, describeBuilder } from '../setup'; + +/** Minimal subset of an esbuild metafile used by stats assertions. */ +interface StatsMetafile { + inputs: Record; + outputs: Record }>; +} + +describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { + describe('Option: "statsJson"', () => { + describe('browser-only build', () => { + beforeEach(() => { + harness.useTarget('build', { + ...BASE_OPTIONS, + statsJson: true, + }); + }); + + it('generates browser-stats.json and browser-initial-stats.json', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + harness.expectFile('dist/browser-stats.json').toExist(); + harness.expectFile('dist/browser-initial-stats.json').toExist(); + }); + + it('does not generate server stats files when SSR is disabled', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + harness.expectFile('dist/server-stats.json').toNotExist(); + harness.expectFile('dist/server-initial-stats.json').toNotExist(); + }); + + it('does not generate the legacy stats.json file', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + harness.expectFile('dist/stats.json').toNotExist(); + }); + + it('stats files contain valid esbuild metafile structure', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + + for (const filename of ['dist/browser-stats.json', 'dist/browser-initial-stats.json']) { + const stats = JSON.parse(harness.readFile(filename)) as StatsMetafile; + expect(stats.inputs).withContext(`${filename} must have an inputs field`).toBeDefined(); + expect(stats.outputs).withContext(`${filename} must have an outputs field`).toBeDefined(); + } + }); + + it('output paths do not overlap between browser-stats.json and browser-initial-stats.json', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + + const nonInitialPaths = new Set( + Object.keys( + (JSON.parse(harness.readFile('dist/browser-stats.json')) as StatsMetafile).outputs, + ), + ); + const initialPaths = Object.keys( + (JSON.parse(harness.readFile('dist/browser-initial-stats.json')) as StatsMetafile) + .outputs, + ); + + for (const outputPath of initialPaths) { + expect(nonInitialPaths.has(outputPath)) + .withContext(`Output '${outputPath}' must not appear in both stats files`) + .toBeFalse(); + } + }); + + it('inputs in each stats file are only those referenced by included outputs', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + + for (const filename of ['dist/browser-stats.json', 'dist/browser-initial-stats.json']) { + const stats = JSON.parse(harness.readFile(filename)) as StatsMetafile; + const referencedInputs = new Set( + Object.values(stats.outputs).flatMap((output) => Object.keys(output.inputs)), + ); + + for (const inputPath of Object.keys(stats.inputs)) { + expect(referencedInputs.has(inputPath)) + .withContext( + `Input '${inputPath}' in '${filename}' is not referenced by any included output`, + ) + .toBeTrue(); + } + } + }); + }); + + describe('when statsJson is false', () => { + it('does not generate any stats files', async () => { + harness.useTarget('build', { + ...BASE_OPTIONS, + statsJson: false, + }); + + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + harness.expectFile('dist/browser-stats.json').toNotExist(); + harness.expectFile('dist/browser-initial-stats.json').toNotExist(); + harness.expectFile('dist/stats.json').toNotExist(); + }); + }); + + describe('SSR build', () => { + beforeEach(async () => { + await harness.modifyFile('src/tsconfig.app.json', (content) => { + const tsConfig = JSON.parse(content) as { files?: string[] }; + tsConfig.files ??= []; + tsConfig.files.push('main.server.ts'); + + return JSON.stringify(tsConfig); + }); + + harness.useTarget('build', { + ...BASE_OPTIONS, + statsJson: true, + server: 'src/main.server.ts', + ssr: true, + }); + }); + + it('generates all four stats files', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + harness.expectFile('dist/browser-stats.json').toExist(); + harness.expectFile('dist/browser-initial-stats.json').toExist(); + harness.expectFile('dist/server-stats.json').toExist(); + harness.expectFile('dist/server-initial-stats.json').toExist(); + }); + + it('server stats files contain valid esbuild metafile structure', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + + for (const filename of ['dist/server-stats.json', 'dist/server-initial-stats.json']) { + const stats = JSON.parse(harness.readFile(filename)) as StatsMetafile; + expect(stats.inputs).withContext(`${filename} must have an inputs field`).toBeDefined(); + expect(stats.outputs).withContext(`${filename} must have an outputs field`).toBeDefined(); + } + }); + + it('server output paths do not overlap between server-stats.json and server-initial-stats.json', async () => { + const { result } = await harness.executeOnce(); + + expect(result?.success).toBeTrue(); + + const nonInitialPaths = new Set( + Object.keys( + (JSON.parse(harness.readFile('dist/server-stats.json')) as StatsMetafile).outputs, + ), + ); + const initialPaths = Object.keys( + (JSON.parse(harness.readFile('dist/server-initial-stats.json')) as StatsMetafile).outputs, + ); + + for (const outputPath of initialPaths) { + expect(nonInitialPaths.has(outputPath)) + .withContext(`Output '${outputPath}' must not appear in both server stats files`) + .toBeFalse(); + } + }); + }); + }); +}); diff --git a/packages/angular/build/src/builders/application/tests/options/subresource-integrity_spec.ts b/packages/angular/build/src/builders/application/tests/options/subresource-integrity_spec.ts index f3ec9476b21f..5153045dba73 100644 --- a/packages/angular/build/src/builders/application/tests/options/subresource-integrity_spec.ts +++ b/packages/angular/build/src/builders/application/tests/options/subresource-integrity_spec.ts @@ -6,8 +6,25 @@ * found in the LICENSE file at https://angular.dev/license */ +import { getSystemPath } from '@angular-devkit/core'; +import { createHash } from 'node:crypto'; +import { readdirSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; import { buildApplication } from '../../index'; -import { APPLICATION_BUILDER_INFO, BASE_OPTIONS, describeBuilder, expectNoLog } from '../setup'; +import { + APPLICATION_BUILDER_INFO, + BASE_OPTIONS, + describeBuilder, + expectNoLog, + host, + lazyModuleFiles, + lazyModuleFnImport, +} from '../setup'; + +/** Resolve a path inside the harness workspace synchronously. */ +function workspacePath(...segments: string[]): string { + return join(getSystemPath(host.root()), ...segments); +} describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { describe('Option: "subresourceIntegrity"', () => { @@ -65,5 +82,84 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { .content.toMatch(/integrity="\w+-[A-Za-z0-9/+=]+"/); expectNoLog(logs, /subresource-integrity/); }); + + it(`emits an importmap with integrity for lazy chunks when 'true'`, async () => { + await harness.writeFiles(lazyModuleFiles); + await harness.writeFiles(lazyModuleFnImport); + + harness.useTarget('build', { + ...BASE_OPTIONS, + subresourceIntegrity: true, + }); + + const { result } = await harness.executeOnce(); + expect(result?.success).toBe(true); + + const indexHtml = harness.readFile('dist/browser/index.html'); + const match = indexHtml.match(/`); } + let subResourceIntegrityTag: string | undefined; let headerLinkTags: string[] = []; let bodyLinkTags: string[] = []; + + // Emit an integrity-only import map so the browser can validate lazy chunks + // resolved via dynamic `import()` (which otherwise carry no SRI metadata). + // The block is placed first inside `` so it precedes any module + // script, as required by the import-map spec. + if (sri && chunksIntegrity?.size) { + const integrity: Record = {}; + // Stable iteration order for reproducible builds. + const sortedEntries = [...chunksIntegrity.entries()].sort(([keyA], [keyB]) => + keyA.localeCompare(keyB), + ); + for (const [url, integrityHash] of sortedEntries) { + integrity[generateUrl(url, deployUrl)] = integrityHash; + } + const importMapJson = JSON.stringify({ integrity }).replace(/${importMapJson}`; + } + for (const src of stylesheets) { const attrs = [`rel="stylesheet"`, `href="${generateUrl(src, deployUrl)}"`]; @@ -212,6 +256,9 @@ export async function augmentIndexHtml( if (!baseTagExists && isString(baseHref)) { rewriter.emitStartTag(tag); rewriter.emitRaw(``); + if (subResourceIntegrityTag) { + rewriter.emitRaw(subResourceIntegrityTag); + } return; } @@ -221,6 +268,9 @@ export async function augmentIndexHtml( if (isString(baseHref)) { updateAttribute(tag, 'href', baseHref); } + if (subResourceIntegrityTag) { + rewriter.emitRaw(subResourceIntegrityTag); + } break; case 'link': if (readAttribute(tag, 'rel') === 'preconnect') { diff --git a/packages/angular/build/src/utils/index-file/augment-index-html_spec.ts b/packages/angular/build/src/utils/index-file/augment-index-html_spec.ts index 55adf8d88f0b..f2801ab3202a 100644 --- a/packages/angular/build/src/utils/index-file/augment-index-html_spec.ts +++ b/packages/angular/build/src/utils/index-file/augment-index-html_spec.ts @@ -459,6 +459,22 @@ describe('augment-index-html', () => { ); }); + it('should escape `<` characters in inline importmap JSON', async () => { + const { content } = await augmentIndexHtml({ + ...indexGeneratorOptions, + sri: true, + chunksIntegrity: new Map([['lazy([^<]+)<\/script>/); + expect(match).withContext('importmap script tag missing').not.toBeNull(); + expect(match?.[1]).toContain('lazy\\u003cchunk.js'); + expect(match?.[1]).not.toContain('lazy { const imageDomains = ['https://www.example.com', 'https://www.example2.com']; const { content, warnings } = await augmentIndexHtml({ diff --git a/packages/angular/build/src/utils/index-file/index-html-generator.ts b/packages/angular/build/src/utils/index-file/index-html-generator.ts index 52a926ef58eb..fcece48647ae 100644 --- a/packages/angular/build/src/utils/index-file/index-html-generator.ts +++ b/packages/angular/build/src/utils/index-file/index-html-generator.ts @@ -49,6 +49,13 @@ export interface IndexHtmlGeneratorOptions { imageDomains?: string[]; generateDedicatedSSRContent?: boolean; autoCsp?: AutoCspOptions; + + /** + * Integrity metadata for module URLs not directly referenced in the index + * (typically lazy-loaded chunks). Forwarded to {@link augmentIndexHtml} so + * a `` + @@ -59,9 +57,7 @@ describe('Browser Builder index HTML processing', () => { const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); - const content = virtualFs.fileBufferToString( - await lastValueFrom(host.read(normalize(fileName))), - ); + const content = new TextDecoder().decode(await lastValueFrom(host.read(normalize(fileName)))); expect(content).toBe( `` + `` + @@ -84,9 +80,7 @@ describe('Browser Builder index HTML processing', () => { const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); - const content = virtualFs.fileBufferToString( - await lastValueFrom(host.read(normalize(fileName))), - ); + const content = new TextDecoder().decode(await lastValueFrom(host.read(normalize(fileName)))); expect(content).toBe( `í ` + `` + @@ -108,9 +102,7 @@ describe('Browser Builder index HTML processing', () => { const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); - const content = virtualFs.fileBufferToString( - await lastValueFrom(host.read(normalize(fileName))), - ); + const content = new TextDecoder().decode(await lastValueFrom(host.read(normalize(fileName)))); expect(content).toBe( `<%= csrf_meta_tags %> ` + `` + @@ -159,7 +151,7 @@ describe('Browser Builder index HTML processing', () => { const outputIndexPath = join(host.root(), 'dist', 'index.html'); const content = await lastValueFrom(host.read(normalize(outputIndexPath))); - expect(virtualFs.fileBufferToString(content)).toBe( + expect(new TextDecoder().decode(content)).toBe( `<%= csrf_meta_tags %> ` + `` + `` + @@ -206,7 +198,7 @@ describe('Browser Builder index HTML processing', () => { const outputIndexPath = join(host.root(), 'dist', 'main.html'); const content = await lastValueFrom(host.read(normalize(outputIndexPath))); - expect(virtualFs.fileBufferToString(content)).toBe( + expect(new TextDecoder().decode(content)).toBe( ` ` + `` + `` + @@ -253,7 +245,7 @@ describe('Browser Builder index HTML processing', () => { const outputIndexPath = join(host.root(), 'dist', 'extra', 'main.html'); const content = await lastValueFrom(host.read(normalize(outputIndexPath))); - expect(virtualFs.fileBufferToString(content)).toBe( + expect(new TextDecoder().decode(content)).toBe( ` ` + `` + `` + diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/output-path_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/output-path_spec.ts index 2d10b0afa2da..d949ac65dc5a 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/output-path_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/output-path_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { getSystemPath, join, virtualFs } from '@angular-devkit/core'; +import { getSystemPath, join } from '@angular-devkit/core'; import * as fs from 'node:fs'; import { browserBuild, createArchitect, host } from '../../../testing/test-utils'; @@ -24,7 +24,7 @@ describe('Browser Builder output path', () => { it('deletes output path content', async () => { // Write a file to the output path to later verify it was deleted. await host - .write(join(host.root(), 'dist/file.txt'), virtualFs.stringToFileBuffer('file')) + .write(join(host.root(), 'dist/file.txt'), new TextEncoder().encode('file').buffer) .toPromise(); // Delete an app file to force a failed compilation. @@ -42,7 +42,7 @@ describe('Browser Builder output path', () => { // Write a file to the output path to later verify it was deleted. host.writeMultipleFiles({ 'src-link/a.txt': '', - 'dist/file.txt': virtualFs.stringToFileBuffer('file'), + 'dist/file.txt': new TextEncoder().encode('file').buffer, }); const distLinked = join(host.root(), 'dist', 'linked'); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/rebuild_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/rebuild_spec.ts index fbceb61d270d..46113a05275e 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/rebuild_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/rebuild_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { join, logging, normalize, virtualFs } from '@angular-devkit/core'; +import { join, logging, normalize } from '@angular-devkit/core'; import { debounceTime, take, takeWhile, tap, timeout } from 'rxjs'; import { createArchitect, @@ -104,9 +104,7 @@ describe('Browser Builder rebuilds', () => { /\$\$_E2E_GOLDEN_VALUE_3/.source, ); const fileName = './dist/main.js'; - const content = virtualFs.fileBufferToString( - host.scopedSync().read(normalize(fileName)), - ); + const content = new TextDecoder().decode(host.scopedSync().read(normalize(fileName))); if (re.test(content)) { phase = 4; @@ -311,7 +309,7 @@ describe('Browser Builder rebuilds', () => { }); it('rebuilds after errors in JIT', async () => { - const origContent = virtualFs.fileBufferToString( + const origContent = new TextDecoder().decode( host.scopedSync().read(normalize('src/app/app.component.ts')), ); host.appendToFile('./src/app/app.component.ts', `]]]]`); @@ -348,7 +346,7 @@ describe('Browser Builder rebuilds', () => { it('rebuilds after errors in AOT', async () => { // Save the original contents of `./src/app/app.component.ts`. - const origContent = virtualFs.fileBufferToString( + const origContent = new TextDecoder().decode( host.scopedSync().read(normalize('src/app/app.component.ts')), ); // Add a major static analysis error on a non-main file to the initial build. @@ -495,7 +493,7 @@ describe('Browser Builder rebuilds', () => { case 4: // Check if html changes are added to factories. expect(buildEvent.success).toBe(true); - content = virtualFs.fileBufferToString(host.scopedSync().read(normalize(fileName))); + content = new TextDecoder().decode(host.scopedSync().read(normalize(fileName))); expect(content).toContain('HTML_REBUILD_STRING'); // Change the component css. host.appendToFile('src/app/app.component.css', 'CSS_REBUILD_STRING {color: #f00;}'); @@ -504,7 +502,7 @@ describe('Browser Builder rebuilds', () => { case 5: // Check if css changes are added to factories. expect(buildEvent.success).toBe(true); - content = virtualFs.fileBufferToString(host.scopedSync().read(normalize(fileName))); + content = new TextDecoder().decode(host.scopedSync().read(normalize(fileName))); expect(content).toContain('CSS_REBUILD_STRING'); // Change the component css import. host.appendToFile( @@ -516,7 +514,7 @@ describe('Browser Builder rebuilds', () => { case 6: // Check if css import changes are added to factories. expect(buildEvent.success).toBe(true); - content = virtualFs.fileBufferToString(host.scopedSync().read(normalize(fileName))); + content = new TextDecoder().decode(host.scopedSync().read(normalize(fileName))); expect(content).toContain('CSS_DEP_REBUILD_STRING'); // Change the component itself. host.replaceInFile( @@ -529,7 +527,7 @@ describe('Browser Builder rebuilds', () => { case 7: // Check if component changes are added to factories. expect(buildEvent.success).toBe(true); - content = virtualFs.fileBufferToString(host.scopedSync().read(normalize(fileName))); + content = new TextDecoder().decode(host.scopedSync().read(normalize(fileName))); expect(content).toContain('FACTORY_REBUILD_STRING'); break; } @@ -593,7 +591,7 @@ describe('Browser Builder rebuilds', () => { .pipe( debounceTime(rebuildDebounceTime), tap(() => { - const content = virtualFs.fileBufferToString( + const content = new TextDecoder().decode( host.scopedSync().read(join(outputPath, 'main.js')), ); @@ -626,7 +624,7 @@ describe('Browser Builder rebuilds', () => { timeout(BUILD_TIMEOUT), debounceTime(rebuildDebounceTime), tap(() => { - const content = virtualFs.fileBufferToString( + const content = new TextDecoder().decode( host.scopedSync().read(join(outputPath, 'main.js')), ); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/replacements_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/replacements_spec.ts index f3d789202a6e..eebb48550748 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/replacements_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/replacements_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { logging, normalize, virtualFs } from '@angular-devkit/core'; +import { logging, normalize } from '@angular-devkit/core'; import { delay, filter, map, of, race, take, takeUntil, takeWhile, tap, timeout } from 'rxjs'; import { browserBuild, createArchitect, host } from '../../../testing/test-utils'; @@ -116,7 +116,7 @@ describe('Browser Builder file replacements', () => { expect(result.success).toBe(true, 'build should succeed'); const fileName = normalize('dist/main.js'); - const content = virtualFs.fileBufferToString(host.scopedSync().read(fileName)); + const content = new TextDecoder().decode(host.scopedSync().read(fileName)); const has42 = /meaning\s*=\s*42/.test(content); buildCount++; switch (phase) { diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/resolve-json-module_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/resolve-json-module_spec.ts index f1ca4f069c76..379dea990e5e 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/resolve-json-module_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/resolve-json-module_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { join, virtualFs } from '@angular-devkit/core'; +import { join } from '@angular-devkit/core'; import { take, tap } from 'rxjs'; import { createArchitect, host, outputPath } from '../../../testing/test-utils'; @@ -40,7 +40,7 @@ describe('Browser Builder resolve json module', () => { await run.output .pipe( tap(() => { - const content = virtualFs.fileBufferToString( + const content = new TextDecoder().decode( host.scopedSync().read(join(outputPath, 'main.js')), ); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/service-worker_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/service-worker_spec.ts index 9f00c7f73092..4cd6b6b6e7d9 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/service-worker_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/service-worker_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { join, normalize, virtualFs } from '@angular-devkit/core'; +import { join, normalize } from '@angular-devkit/core'; import { debounceTime, take, tap } from 'rxjs'; import { createArchitect, host } from '../../../testing/test-utils'; @@ -86,7 +86,7 @@ describe('Browser Builder service worker', () => { expect(host.scopedSync().exists(normalize('dist/ngsw.json'))).toBeTrue(); const ngswJson = JSON.parse( - virtualFs.fileBufferToString(host.scopedSync().read(normalize('dist/ngsw.json'))), + new TextDecoder().decode(host.scopedSync().read(normalize('dist/ngsw.json'))), ); // Verify index and assets are there. expect(ngswJson).toEqual( @@ -154,7 +154,7 @@ describe('Browser Builder service worker', () => { const ngswJsonPath = normalize('dist/ngsw.json'); expect(host.scopedSync().exists(ngswJsonPath)).toBeTrue(); const ngswJson = JSON.parse( - virtualFs.fileBufferToString(host.scopedSync().read(ngswJsonPath)), + new TextDecoder().decode(host.scopedSync().read(ngswJsonPath)), ); const hashTableEntries = Object.keys(ngswJson.hashTable); @@ -203,7 +203,7 @@ describe('Browser Builder service worker', () => { expect(host.scopedSync().exists(normalize('dist/ngsw.json'))).toBeTrue(); const ngswJson = JSON.parse( - virtualFs.fileBufferToString(host.scopedSync().read(normalize('dist/ngsw.json'))), + new TextDecoder().decode(host.scopedSync().read(normalize('dist/ngsw.json'))), ); // Verify index and assets include the base href. expect(ngswJson).toEqual( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/svg_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/svg_spec.ts index 2be5e2737d43..4fe80e923b2e 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/svg_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/svg_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { join, normalize, virtualFs } from '@angular-devkit/core'; +import { join, normalize } from '@angular-devkit/core'; import { createArchitect, host, outputPath } from '../../../testing/test-utils'; describe('Browser Builder allow svg', () => { @@ -53,9 +53,7 @@ describe('Browser Builder allow svg', () => { expect(exists).toBe(true, '"main.js" should exist'); if (exists) { - const content = virtualFs.fileBufferToString( - host.scopedSync().read(join(outputPath, 'main.js')), - ); + const content = new TextDecoder().decode(host.scopedSync().read(join(outputPath, 'main.js'))); // Verify that the svg contents are present in the main bundle, // e.g. as template instructions. diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts index 80285bf5499d..b097b7c078a0 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/tsconfig-paths_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { normalize, virtualFs } from '@angular-devkit/core'; +import { normalize } from '@angular-devkit/core'; import { browserBuild, createArchitect, host } from '../../../testing/test-utils'; describe('Browser Builder tsconfig paths', () => { @@ -24,14 +24,14 @@ describe('Browser Builder tsconfig paths', () => { host.replaceInFile('src/app/app.module.ts', './app.component', '@root/app/app.component'); const tsconfigPath = normalize('tsconfig.json'); - const tsconfig = JSON.parse(virtualFs.fileBufferToString(host.scopedSync().read(tsconfigPath))); + const tsconfig = JSON.parse(new TextDecoder().decode(host.scopedSync().read(tsconfigPath))); tsconfig.compilerOptions ??= {}; tsconfig.compilerOptions.paths = { '@root/*': ['./src/*'], }; host .scopedSync() - .write(tsconfigPath, virtualFs.stringToFileBuffer(JSON.stringify(tsconfig, null, 2))); + .write(tsconfigPath, new TextEncoder().encode(JSON.stringify(tsconfig, null, 2)).buffer); await browserBuild(architect, host, target); }); @@ -43,7 +43,7 @@ describe('Browser Builder tsconfig paths', () => { 'src/app/shared/index.ts': `export * from './meaning'`, }); const tsconfigPath = normalize('tsconfig.json'); - const tsconfig = JSON.parse(virtualFs.fileBufferToString(host.scopedSync().read(tsconfigPath))); + const tsconfig = JSON.parse(new TextDecoder().decode(host.scopedSync().read(tsconfigPath))); tsconfig.compilerOptions ??= {}; tsconfig.compilerOptions.paths = { '@shared': ['./src/app/shared'], @@ -52,7 +52,7 @@ describe('Browser Builder tsconfig paths', () => { }; host .scopedSync() - .write(tsconfigPath, virtualFs.stringToFileBuffer(JSON.stringify(tsconfig, null, 2))); + .write(tsconfigPath, new TextEncoder().encode(JSON.stringify(tsconfig, null, 2)).buffer); host.appendToFile( 'src/app/app.component.ts', diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/web-worker_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/web-worker_spec.ts index 6656a51c2444..b468b496212c 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/web-worker_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/web-worker_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { join, logging, virtualFs } from '@angular-devkit/core'; +import { join, logging } from '@angular-devkit/core'; import { debounceTime, lastValueFrom, map, switchMap, takeWhile, tap, timer } from 'rxjs'; import { browserBuild, createArchitect, host, outputPath } from '../../../testing/test-utils'; @@ -90,14 +90,14 @@ describe('Browser Builder Web Worker support', () => { await browserBuild(architect, host, target, overrides, { logger }); // Worker bundle contains worker code. - const workerContent = virtualFs.fileBufferToString( + const workerContent = new TextDecoder().decode( host.scopedSync().read(join(outputPath, 'src_app_app_worker_ts.js')), ); expect(workerContent).toContain('hello from worker'); expect(workerContent).toContain('bar'); // Main bundle references worker. - const mainContent = virtualFs.fileBufferToString( + const mainContent = new TextDecoder().decode( host.scopedSync().read(join(outputPath, 'main.js')), ); expect(mainContent).toContain('src_app_app_worker_ts'); @@ -119,7 +119,7 @@ describe('Browser Builder Web Worker support', () => { /src_app_app_worker_ts\.[0-9a-f]{16}\.js/, ) as string; expect(workerBundle).toBeTruthy('workerBundle should exist'); - const workerContent = virtualFs.fileBufferToString( + const workerContent = new TextDecoder().decode( host.scopedSync().read(join(outputPath, workerBundle)), ); expect(workerContent).toContain('hello from worker'); @@ -129,7 +129,7 @@ describe('Browser Builder Web Worker support', () => { // Main bundle should reference hashed worker bundle. const mainBundle = host.fileMatchExists(outputPath, /main\.[0-9a-f]{16}\.js/) as string; expect(mainBundle).toBeTruthy('mainBundle should exist'); - const mainContent = virtualFs.fileBufferToString( + const mainContent = new TextDecoder().decode( host.scopedSync().read(join(outputPath, mainBundle)), ); expect(mainContent).toContain('src_app_app_worker_ts'); @@ -159,7 +159,7 @@ describe('Browser Builder Web Worker support', () => { switch (phase) { case 1: // Original worker content should be there. - workerContent = virtualFs.fileBufferToString(host.scopedSync().read(workerPath)); + workerContent = new TextDecoder().decode(host.scopedSync().read(workerPath)); expect(workerContent).toContain('bar'); // Change content of worker dependency. host.writeMultipleFiles({ 'src/app/dep.ts': `export const foo = 'baz';` }); @@ -167,7 +167,7 @@ describe('Browser Builder Web Worker support', () => { break; case 2: - workerContent = virtualFs.fileBufferToString(host.scopedSync().read(workerPath)); + workerContent = new TextDecoder().decode(host.scopedSync().read(workerPath)); // Worker content should have changed. expect(workerContent).toContain('baz'); phase = 3; diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/builder.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/builder.ts index b3b5e797848f..1e03eef28ef0 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/builder.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/builder.ts @@ -57,6 +57,11 @@ export function execute( return EMPTY; } + context.logger.warn( + 'The "@angular-devkit/build-angular:dev-server" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build:dev-server" instead. For more information, see https://angular.dev/tools/cli/build-system-migration.', + ); + return defer(() => initialize(options, projectName, context, extensions?.builderSelector)).pipe( switchMap(({ builderName, normalizedOptions }) => { // Use vite-based development server for esbuild-based builds diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/specs/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/specs/works_spec.ts index e0a442ca38ae..14290fc4e5db 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/specs/works_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/specs/works_spec.ts @@ -8,7 +8,7 @@ import { Architect, BuilderRun } from '@angular-devkit/architect'; import { EmittedFiles } from '@angular-devkit/build-webpack'; -import { normalize, virtualFs } from '@angular-devkit/core'; +import { normalize } from '@angular-devkit/core'; import { createArchitect, host } from '../../../testing/test-utils'; import { DevServerBuilderOutput } from '../index'; @@ -73,7 +73,7 @@ describe('Dev Server Builder', () => { it('uses source locale when not localizing', async () => { const config = host.scopedSync().read(normalize('angular.json')); - const jsonConfig = JSON.parse(virtualFs.fileBufferToString(config)); + const jsonConfig = JSON.parse(new TextDecoder().decode(config)); const applicationProject = jsonConfig.projects.app; applicationProject.i18n = { sourceLocale: 'fr' }; diff --git a/packages/angular_devkit/build_angular/src/builders/extract-i18n/builder.ts b/packages/angular_devkit/build_angular/src/builders/extract-i18n/builder.ts index 0b08e10b40be..2dc678fe6bc3 100644 --- a/packages/angular_devkit/build_angular/src/builders/extract-i18n/builder.ts +++ b/packages/angular_devkit/build_angular/src/builders/extract-i18n/builder.ts @@ -35,6 +35,11 @@ export async function execute( return { success: false }; } + context.logger.warn( + 'The "@angular-devkit/build-angular:extract-i18n" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build:extract-i18n" instead. For more information, see https://angular.dev/tools/cli/build-system-migration.', + ); + const { projectType } = (await context.getProjectMetadata(projectName)) as { projectType?: string; }; diff --git a/packages/angular_devkit/build_angular/src/builders/extract-i18n/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/extract-i18n/works_spec.ts index 1f29fb96a581..9c08396005f0 100644 --- a/packages/angular_devkit/build_angular/src/builders/extract-i18n/works_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/extract-i18n/works_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { join, logging, normalize, virtualFs } from '@angular-devkit/core'; +import { join, logging, normalize } from '@angular-devkit/core'; import { createArchitect, extractI18nTargetSpec, host } from '../../testing/test-utils'; describe('Extract i18n Target', () => { @@ -34,7 +34,7 @@ describe('Extract i18n Target', () => { expect(exists).toBe(true); if (exists) { - const content = virtualFs.fileBufferToString(host.scopedSync().read(extractionFile)); + const content = new TextDecoder().decode(host.scopedSync().read(extractionFile)); expect(content).toContain('i18n test'); } }); @@ -85,9 +85,7 @@ describe('Extract i18n Target', () => { await run.stop(); expect(host.scopedSync().exists(extractionFile)).toBe(true); - expect(virtualFs.fileBufferToString(host.scopedSync().read(extractionFile))).toMatch( - /i18n test/, - ); + expect(new TextDecoder().decode(host.scopedSync().read(extractionFile))).toMatch(/i18n test/); }); it('supports output path', async () => { @@ -104,9 +102,7 @@ describe('Extract i18n Target', () => { await run.stop(); expect(host.scopedSync().exists(extractionFile)).toBe(true); - expect(virtualFs.fileBufferToString(host.scopedSync().read(extractionFile))).toMatch( - /i18n test/, - ); + expect(new TextDecoder().decode(host.scopedSync().read(extractionFile))).toMatch(/i18n test/); }); it('supports i18n format', async () => { @@ -121,9 +117,7 @@ describe('Extract i18n Target', () => { await run.stop(); expect(host.scopedSync().exists(extractionFile)).toBe(true); - expect(virtualFs.fileBufferToString(host.scopedSync().read(extractionFile))).toMatch( - /i18n test/, - ); + expect(new TextDecoder().decode(host.scopedSync().read(extractionFile))).toMatch(/i18n test/); }); it('issues warnings for duplicate message identifiers', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/index.ts b/packages/angular_devkit/build_angular/src/builders/karma/index.ts index 1ea20e0f5db4..6acc9e71b2ae 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/index.ts @@ -39,6 +39,11 @@ export async function* execute( karmaOptions?: (options: KarmaConfigOptions) => KarmaConfigOptions; } = {}, ): AsyncIterable { + context.logger.warn( + 'The "@angular-devkit/build-angular:karma" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build:karma" instead. For more information, see https://angular.dev/tools/cli/build-system-migration.', + ); + // Check Angular version. assertCompatibleAngularVersion(context.workspaceRoot); diff --git a/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts b/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts index 42533a33aa0d..7523e2be45af 100644 --- a/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/ng-packagr/index.ts @@ -22,6 +22,11 @@ export function execute( options: NgPackagrBuilderOptions, context: BuilderContext, ): Observable { + context.logger.warn( + 'The "@angular-devkit/build-angular:ng-packagr" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build:ng-packagr" instead. For more information, see https://angular.dev/tools/cli/build-system-migration.', + ); + return from( (async () => { // Purge old build disk cache. diff --git a/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts index 90581f9d9437..990aed869d42 100644 --- a/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ng-packagr/works_spec.ts @@ -9,14 +9,7 @@ import { Architect } from '@angular-devkit/architect'; import { WorkspaceNodeModulesArchitectHost } from '@angular-devkit/architect/node'; import { TestProjectHost, TestingArchitectHost } from '@angular-devkit/architect/testing'; -import { - getSystemPath, - join, - normalize, - schema, - virtualFs, - workspaces, -} from '@angular-devkit/core'; +import { getSystemPath, join, normalize, schema, workspaces } from '@angular-devkit/core'; import { debounceTime, map, take, tap } from 'rxjs'; describe('NgPackagr Builder', () => { @@ -67,7 +60,7 @@ describe('NgPackagr Builder', () => { await run.stop(); expect(host.scopedSync().exists(normalize('./dist/lib/fesm2022/lib.mjs'))).toBe(true); - const content = virtualFs.fileBufferToString( + const content = new TextDecoder().decode( host.scopedSync().read(normalize('./dist/lib/fesm2022/lib.mjs')), ); expect(content).toContain('lib works'); @@ -101,7 +94,7 @@ describe('NgPackagr Builder', () => { debounceTime(1000), map(() => { const fileName = './dist/lib/fesm2022/lib.mjs'; - const content = virtualFs.fileBufferToString(host.scopedSync().read(normalize(fileName))); + const content = new TextDecoder().decode(host.scopedSync().read(normalize(fileName))); return content; }), diff --git a/packages/angular_devkit/build_angular/src/builders/prerender/index.ts b/packages/angular_devkit/build_angular/src/builders/prerender/index.ts index 5fa433f26e8c..4d01c5a3cd3b 100644 --- a/packages/angular_devkit/build_angular/src/builders/prerender/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/prerender/index.ts @@ -278,6 +278,11 @@ export async function execute( options: PrerenderBuilderOptions, context: BuilderContext, ): Promise { + context.logger.warn( + 'The "@angular-devkit/build-angular:prerender" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build:application" instead. For more information, see https://angular.dev/tools/cli/build-system-migration.', + ); + const browserTarget = targetFromTargetString(options.browserTarget); const browserOptions = (await context.getTargetOptions( browserTarget, diff --git a/packages/angular_devkit/build_angular/src/builders/prerender/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/prerender/works_spec.ts index 8c55c923d02d..797d88f8e7a6 100644 --- a/packages/angular_devkit/build_angular/src/builders/prerender/works_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/prerender/works_spec.ts @@ -7,7 +7,7 @@ */ import { Architect } from '@angular-devkit/architect'; -import { join, normalize, virtualFs } from '@angular-devkit/core'; +import { join, normalize } from '@angular-devkit/core'; import { createArchitect, host } from '../../testing/test-utils'; describe('Prerender Builder', () => { @@ -94,7 +94,7 @@ describe('Prerender Builder', () => { expect(output.success).toBe(true); - const content = virtualFs.fileBufferToString( + const content = new TextDecoder().decode( host.scopedSync().read(normalize('dist/foo/index.html')), ); @@ -109,17 +109,17 @@ describe('Prerender Builder', () => { expect(output.success).toBe(true); - let content = virtualFs.fileBufferToString( + let content = new TextDecoder().decode( host.scopedSync().read(normalize('dist/foo/index.html')), ); expect(content).toContain('foo works!'); - content = virtualFs.fileBufferToString( + content = new TextDecoder().decode( host.scopedSync().read(normalize('dist/index.original.html')), ); expect(content).not.toContain(' { await host .write( join(host.root(), 'routes-file.txt'), - virtualFs.stringToFileBuffer(['/foo', '/'].join('\n')), + new TextEncoder().encode(['/foo', '/'].join('\n')).buffer, ) .toPromise(); const run = await architect.scheduleTarget(target, { @@ -140,10 +140,10 @@ describe('Prerender Builder', () => { expect(output.success).toBe(true); - const fooContent = virtualFs.fileBufferToString( + const fooContent = new TextDecoder().decode( host.scopedSync().read(normalize('dist/foo/index.html')), ); - const appContent = virtualFs.fileBufferToString( + const appContent = new TextDecoder().decode( host.scopedSync().read(normalize('dist/index.html')), ); @@ -173,10 +173,10 @@ describe('Prerender Builder', () => { }); const output = await run.result; - const fooContent = virtualFs.fileBufferToString( + const fooContent = new TextDecoder().decode( host.scopedSync().read(normalize('dist/foo/index.html')), ); - const appContent = virtualFs.fileBufferToString( + const appContent = new TextDecoder().decode( host.scopedSync().read(normalize('dist/index.html')), ); @@ -214,7 +214,7 @@ describe('Prerender Builder', () => { expect(output.success).toBe(true); - const content = virtualFs.fileBufferToString( + const content = new TextDecoder().decode( host.scopedSync().read(normalize('dist/foo/index.html')), ); diff --git a/packages/angular_devkit/build_angular/src/builders/server/index.ts b/packages/angular_devkit/build_angular/src/builders/server/index.ts index ffe7174f0c44..a489c456ec1d 100644 --- a/packages/angular_devkit/build_angular/src/builders/server/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/server/index.ts @@ -66,6 +66,11 @@ export function execute( ): Observable { const root = context.workspaceRoot; + context.logger.warn( + 'The "@angular-devkit/build-angular:server" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build:application" instead. For more information, see https://angular.dev/tools/cli/build-system-migration.', + ); + // Check Angular version. assertCompatibleAngularVersion(root); 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 e919f188e0bf..445252ff158d 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 @@ -63,6 +63,11 @@ export function execute( options: SSRDevServerBuilderOptions, context: BuilderContext, ): Observable { + context.logger.warn( + 'The "@angular-devkit/build-angular:ssr-dev-server" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build:ssr-dev-server" instead. For more information, see https://angular.dev/tools/cli/build-system-migration.', + ); + let browserSync: typeof import('browser-sync'); try { browserSync = createRequire(context.workspaceRoot + '/')('browser-sync'); diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts index 66a2f09a6422..c4f18d7167f0 100644 --- a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts +++ b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts @@ -24,6 +24,10 @@ export type DevServerBuildOutput = BuildResult & { address: string; }; +/** + * @deprecated Part of Angular's Webpack support deprecation. Use `@angular/build` APIs instead. + * Deprecated since v22. + */ export function runWebpackDevServer( config: webpack.Configuration, context: BuilderContext, @@ -136,6 +140,11 @@ const builder: Builder = createBuilder< WebpackDevServerBuilderSchema, DevServerBuildOutput >((options, context) => { + context.logger.warn( + 'The "@angular-devkit/build-webpack:webpack-dev-server" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build" instead.', + ); + const configPath = pathResolve(context.workspaceRoot, options.webpackConfig); return from(getWebpackConfig(configPath)).pipe( diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts b/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts index ce3f91fd69d4..2a97a075e78f 100644 --- a/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts +++ b/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts @@ -29,6 +29,10 @@ export type BuildResult = BuilderOutput & { outputPath: string; }; +/** + * @deprecated Part of Angular's Webpack support deprecation. Use `@angular/build` APIs instead. + * Deprecated since v22. + */ export function runWebpack( config: webpack.Configuration, context: BuilderContext, @@ -125,6 +129,11 @@ export function runWebpack( const builder: Builder = createBuilder( (options, context) => { + context.logger.warn( + 'The "@angular-devkit/build-webpack:webpack" builder is deprecated as part of Angular\'s Webpack support deprecation. ' + + 'Use "@angular/build" instead.', + ); + const configPath = pathResolve(context.workspaceRoot, options.webpackConfig); return from(getWebpackConfig(configPath)).pipe( 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/node/host_spec.ts b/packages/angular_devkit/core/node/host_spec.ts index dad72535fa25..fba147359f98 100644 --- a/packages/angular_devkit/core/node/host_spec.ts +++ b/packages/angular_devkit/core/node/host_spec.ts @@ -33,15 +33,15 @@ describe('NodeJsAsyncHost', () => { it('should get correct result for exists', async () => { const filePath = normalize('not-found'); expect(await host.exists(filePath).toPromise()).toBeFalse(); - await host.write(filePath, virtualFs.stringToFileBuffer('content')).toPromise(); + await host.write(filePath, new TextEncoder().encode('content').buffer).toPromise(); expect(await host.exists(filePath).toPromise()).toBeTrue(); }); linuxOnlyIt( 'can watch', async () => { - const content = virtualFs.stringToFileBuffer('hello world'); - const content2 = virtualFs.stringToFileBuffer('hello world 2'); + const content = new TextEncoder().encode('hello world').buffer; + const content2 = new TextEncoder().encode('hello world 2').buffer; const allEvents: virtualFs.HostWatchEvent[] = []; fs.mkdirSync(root + '/sub1'); @@ -85,8 +85,8 @@ describe('NodeJsSyncHost', () => { linuxOnlyIt( 'can watch', async () => { - const content = virtualFs.stringToFileBuffer('hello world'); - const content2 = virtualFs.stringToFileBuffer('hello world 2'); + const content = new TextEncoder().encode('hello world').buffer; + const content2 = new TextEncoder().encode('hello world 2').buffer; const allEvents: virtualFs.HostWatchEvent[] = []; fs.mkdirSync(root + '/sub1'); @@ -122,7 +122,7 @@ describe('NodeJsSyncHost', () => { host.rename(normalize('/rename/a.txt'), normalize('/rename/b/c/d/a.txt')); if (fs.existsSync(root + '/rename/b/c/d/a.txt')) { const resContent = host.read(normalize('/rename/b/c/d/a.txt')); - const content = virtualFs.fileBufferToString(resContent); + const content = new TextDecoder().decode(resContent); expect(content).toEqual('hello world'); } }, diff --git a/packages/angular_devkit/core/package.json b/packages/angular_devkit/core/package.json index fe4a5a13032a..55394a8dfcd0 100644 --- a/packages/angular_devkit/core/package.json +++ b/packages/angular_devkit/core/package.json @@ -25,7 +25,7 @@ "./*.js": "./*.js" }, "dependencies": { - "ajv": "8.18.0", + "ajv": "8.20.0", "ajv-formats": "3.0.1", "jsonc-parser": "3.3.1", "picomatch": "4.0.4", 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/angular_devkit/core/src/virtual-fs/host/alias_spec.ts b/packages/angular_devkit/core/src/virtual-fs/host/alias_spec.ts index dcf21fdb0a0e..66ae4b0137f4 100644 --- a/packages/angular_devkit/core/src/virtual-fs/host/alias_spec.ts +++ b/packages/angular_devkit/core/src/virtual-fs/host/alias_spec.ts @@ -8,12 +8,11 @@ import { normalize } from '..'; import { AliasHost } from './alias'; -import { stringToFileBuffer } from './buffer'; import { SimpleMemoryHost } from './memory'; describe('AliasHost', () => { it('works as in the example', () => { - const content = stringToFileBuffer('hello world'); + const content = new TextEncoder().encode('hello world').buffer; const host = new SimpleMemoryHost(); host.write(normalize('/some/file'), content).subscribe(); @@ -33,8 +32,8 @@ describe('AliasHost', () => { }); it('works as in the example (2)', () => { - const content = stringToFileBuffer('hello world'); - const content2 = stringToFileBuffer('hello world 2'); + const content = new TextEncoder().encode('hello world').buffer; + const content2 = new TextEncoder().encode('hello world 2').buffer; const host = new SimpleMemoryHost(); host.write(normalize('/some/folder/file'), content).subscribe(); diff --git a/packages/angular_devkit/core/src/virtual-fs/host/buffer.ts b/packages/angular_devkit/core/src/virtual-fs/host/buffer.ts index 3cb848f6b641..becaa3ecdffd 100644 --- a/packages/angular_devkit/core/src/virtual-fs/host/buffer.ts +++ b/packages/angular_devkit/core/src/virtual-fs/host/buffer.ts @@ -6,13 +6,18 @@ * found in the LICENSE file at https://angular.dev/license */ -import { TextDecoder, TextEncoder } from 'node:util'; import { FileBuffer } from './interface'; +/** + * @deprecated Use `new TextEncoder().encode(str).buffer` instead. + */ export function stringToFileBuffer(str: string): FileBuffer { return new TextEncoder().encode(str).buffer; } +/** + * @deprecated Use `new TextDecoder().decode(fileBuffer)` instead. + */ export function fileBufferToString(fileBuffer: FileBuffer): string { if (fileBuffer.toString.length === 1) { return (fileBuffer.toString as (enc: string) => string)('utf-8'); diff --git a/packages/angular_devkit/core/src/virtual-fs/host/memory_spec.ts b/packages/angular_devkit/core/src/virtual-fs/host/memory_spec.ts index b32de68871fc..fce1623737a1 100644 --- a/packages/angular_devkit/core/src/virtual-fs/host/memory_spec.ts +++ b/packages/angular_devkit/core/src/virtual-fs/host/memory_spec.ts @@ -8,7 +8,6 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { fragment, normalize } from '../path'; -import { stringToFileBuffer } from './buffer'; import { SimpleMemoryHost } from './memory'; import { SyncDelegateHost } from './sync'; @@ -16,7 +15,7 @@ describe('SimpleMemoryHost', () => { it('can watch', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - host.write(normalize('/sub/file1'), stringToFileBuffer('')); + host.write(normalize('/sub/file1'), new TextEncoder().encode('').buffer); let recursiveCalled = 0; let noRecursiveCalled = 0; @@ -28,14 +27,14 @@ describe('SimpleMemoryHost', () => { host.watch(normalize('/sub/file2'))!.subscribe(() => noRecursiveFileCalled++); host.watch(normalize('/sub/file3'))!.subscribe(() => diffFile++); - host.write(normalize('/sub/file2'), stringToFileBuffer('')); + host.write(normalize('/sub/file2'), new TextEncoder().encode('').buffer); expect(recursiveCalled).toBe(1); expect(noRecursiveCalled).toBe(0); expect(noRecursiveFileCalled).toBe(1); expect(diffFile).toBe(0); - host.write(normalize('/sub/file3'), stringToFileBuffer('')); + host.write(normalize('/sub/file3'), new TextEncoder().encode('').buffer); expect(recursiveCalled).toBe(2); expect(noRecursiveCalled).toBe(0); @@ -46,7 +45,7 @@ describe('SimpleMemoryHost', () => { it('can read', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - const buffer = stringToFileBuffer('hello'); + const buffer = new TextEncoder().encode('hello').buffer; host.write(normalize('/hello'), buffer); expect(host.read(normalize('/hello'))).toBe(buffer); @@ -55,7 +54,7 @@ describe('SimpleMemoryHost', () => { it('can delete', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - const buffer = stringToFileBuffer('hello'); + const buffer = new TextEncoder().encode('hello').buffer; expect(host.exists(normalize('/sub/file1'))).toBe(false); host.write(normalize('/sub/file1'), buffer); @@ -67,7 +66,7 @@ describe('SimpleMemoryHost', () => { it('can delete directory', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - const buffer = stringToFileBuffer('hello'); + const buffer = new TextEncoder().encode('hello').buffer; expect(host.exists(normalize('/sub/file1'))).toBe(false); host.write(normalize('/sub/file1'), buffer); @@ -83,7 +82,7 @@ describe('SimpleMemoryHost', () => { it('can rename', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - const buffer = stringToFileBuffer('hello'); + const buffer = new TextEncoder().encode('hello').buffer; expect(host.exists(normalize('/sub/file1'))).toBe(false); host.write(normalize('/sub/file1'), buffer); @@ -97,7 +96,7 @@ describe('SimpleMemoryHost', () => { it('can list', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - const buffer = stringToFileBuffer('hello'); + const buffer = new TextEncoder().encode('hello').buffer; host.write(normalize('/sub/file1'), buffer); host.write(normalize('/sub/file2'), buffer); @@ -116,7 +115,7 @@ describe('SimpleMemoryHost', () => { it('supports isFile / isDirectory', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - const buffer = stringToFileBuffer('hello'); + const buffer = new TextEncoder().encode('hello').buffer; host.write(normalize('/sub/file1'), buffer); host.write(normalize('/sub/file2'), buffer); @@ -135,8 +134,8 @@ describe('SimpleMemoryHost', () => { it('makes every path absolute', () => { const host = new SyncDelegateHost(new SimpleMemoryHost()); - const buffer = stringToFileBuffer('hello'); - const buffer2 = stringToFileBuffer('hello 2'); + const buffer = new TextEncoder().encode('hello').buffer; + const buffer2 = new TextEncoder().encode('hello 2').buffer; host.write(normalize('file1'), buffer); host.write(normalize('/sub/file2'), buffer); diff --git a/packages/angular_devkit/core/src/virtual-fs/host/pattern_spec.ts b/packages/angular_devkit/core/src/virtual-fs/host/pattern_spec.ts index 0745553e88f7..56abcff14ef2 100644 --- a/packages/angular_devkit/core/src/virtual-fs/host/pattern_spec.ts +++ b/packages/angular_devkit/core/src/virtual-fs/host/pattern_spec.ts @@ -7,14 +7,13 @@ */ import { normalize } from '..'; -import { stringToFileBuffer } from './buffer'; import { SimpleMemoryHost } from './memory'; import { PatternMatchingHost } from './pattern'; describe('PatternMatchingHost', () => { it('works for NativeScript', () => { - const content = stringToFileBuffer('hello world'); - const content2 = stringToFileBuffer('hello world 2'); + const content = new TextEncoder().encode('hello world').buffer; + const content2 = new TextEncoder().encode('hello world 2').buffer; const host = new SimpleMemoryHost(); host.write(normalize('/some/file.tns.ts'), content).subscribe(); diff --git a/packages/angular_devkit/core/src/virtual-fs/host/record_spec.ts b/packages/angular_devkit/core/src/virtual-fs/host/record_spec.ts index 3927e2a872a1..dd50be84f966 100644 --- a/packages/angular_devkit/core/src/virtual-fs/host/record_spec.ts +++ b/packages/angular_devkit/core/src/virtual-fs/host/record_spec.ts @@ -7,7 +7,6 @@ */ import { path } from '../path'; -import { stringToFileBuffer } from './buffer'; import { CordHost } from './record'; import * as test from './test'; @@ -21,7 +20,7 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/blue`, stringToFileBuffer(`hi`)).subscribe(undefined, done.fail); + host.write(path`/blue`, new TextEncoder().encode(`hi`).buffer).subscribe(undefined, done.fail); const target = new TestHost(); host.commit(target).subscribe(undefined, done.fail); @@ -41,8 +40,10 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/blue`, stringToFileBuffer(`hi`)).subscribe(undefined, done.fail); - host.write(path`/blue`, stringToFileBuffer(`hi again`)).subscribe(undefined, done.fail); + host.write(path`/blue`, new TextEncoder().encode(`hi`).buffer).subscribe(undefined, done.fail); + host + .write(path`/blue`, new TextEncoder().encode(`hi again`).buffer) + .subscribe(undefined, done.fail); const target = new TestHost(); host.commit(target).subscribe(undefined, done.fail); @@ -63,7 +64,7 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/blue`, stringToFileBuffer(`hi`)).subscribe(undefined, done.fail); + host.write(path`/blue`, new TextEncoder().encode(`hi`).buffer).subscribe(undefined, done.fail); host.delete(path`/blue`).subscribe(undefined, done.fail); const target = new TestHost(); @@ -82,7 +83,7 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/blue`, stringToFileBuffer(`hi`)).subscribe(undefined, done.fail); + host.write(path`/blue`, new TextEncoder().encode(`hi`).buffer).subscribe(undefined, done.fail); host.rename(path`/blue`, path`/red`).subscribe(undefined, done.fail); const target = new TestHost(); @@ -106,7 +107,7 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/blue`, stringToFileBuffer(`hi`)).subscribe(undefined, done.fail); + host.write(path`/blue`, new TextEncoder().encode(`hi`).buffer).subscribe(undefined, done.fail); host.rename(path`/blue`, path`/blue`).subscribe(undefined, done.fail); const target = new TestHost(); @@ -129,7 +130,7 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/blue`, stringToFileBuffer(`hi`)).subscribe(undefined, done.fail); + host.write(path`/blue`, new TextEncoder().encode(`hi`).buffer).subscribe(undefined, done.fail); host.rename(path`/blue`, path`/red`).subscribe(undefined, done.fail); host.rename(path`/red`, path`/yellow`).subscribe(undefined, done.fail); @@ -202,7 +203,9 @@ describe('CordHost', () => { const host = new CordHost(base); host.rename(path`/hello`, path`/blue`).subscribe(undefined, done.fail); - host.write(path`/hello`, stringToFileBuffer(`beautiful world`)).subscribe(undefined, done.fail); + host + .write(path`/hello`, new TextEncoder().encode(`beautiful world`).buffer) + .subscribe(undefined, done.fail); const target = base.clone(); host.commit(target).subscribe(undefined, done.fail); @@ -225,7 +228,9 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/hello`, stringToFileBuffer(`beautiful world`)).subscribe(undefined, done.fail); + host + .write(path`/hello`, new TextEncoder().encode(`beautiful world`).buffer) + .subscribe(undefined, done.fail); const target = base.clone(); host.commit(target).subscribe(undefined, done.fail); @@ -247,8 +252,12 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/hello`, stringToFileBuffer(`beautiful world`)).subscribe(undefined, done.fail); - host.write(path`/hello`, stringToFileBuffer(`again`)).subscribe(undefined, done.fail); + host + .write(path`/hello`, new TextEncoder().encode(`beautiful world`).buffer) + .subscribe(undefined, done.fail); + host + .write(path`/hello`, new TextEncoder().encode(`again`).buffer) + .subscribe(undefined, done.fail); const target = base.clone(); host.commit(target).subscribe(undefined, done.fail); @@ -270,7 +279,9 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/hello`, stringToFileBuffer(`beautiful world`)).subscribe(undefined, done.fail); + host + .write(path`/hello`, new TextEncoder().encode(`beautiful world`).buffer) + .subscribe(undefined, done.fail); host.rename(path`/hello`, path`/blue`).subscribe(undefined, done.fail); const target = base.clone(); @@ -294,7 +305,9 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/hello`, stringToFileBuffer(`beautiful world`)).subscribe(undefined, done.fail); + host + .write(path`/hello`, new TextEncoder().encode(`beautiful world`).buffer) + .subscribe(undefined, done.fail); host.delete(path`/hello`).subscribe(undefined, done.fail); const target = base.clone(); @@ -315,7 +328,9 @@ describe('CordHost', () => { const host = new CordHost(base); host.rename(path`/hello`, path`/blue`).subscribe(undefined, done.fail); - host.write(path`/blue`, stringToFileBuffer(`beautiful world`)).subscribe(undefined, done.fail); + host + .write(path`/blue`, new TextEncoder().encode(`beautiful world`).buffer) + .subscribe(undefined, done.fail); const target = base.clone(); host.commit(target).subscribe(undefined, done.fail); @@ -358,7 +373,9 @@ describe('CordHost', () => { const host = new CordHost(base); host.delete(path`/hello`).subscribe(undefined, done.fail); - host.write(path`/hello`, stringToFileBuffer(`beautiful world`)).subscribe(undefined, done.fail); + host + .write(path`/hello`, new TextEncoder().encode(`beautiful world`).buffer) + .subscribe(undefined, done.fail); const target = base.clone(); host.commit(target).subscribe(undefined, done.fail); @@ -420,7 +437,7 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/blue`, stringToFileBuffer(`hi`)).subscribe(); + host.write(path`/blue`, new TextEncoder().encode(`hi`).buffer).subscribe(); const target = new TestHost({ '/blue': 'test', @@ -441,7 +458,7 @@ describe('CordHost', () => { }); const host = new CordHost(base); - host.write(path`/hello`, stringToFileBuffer(`hi`)).subscribe(); + host.write(path`/hello`, new TextEncoder().encode(`hi`).buffer).subscribe(); const target = new TestHost({}); @@ -501,7 +518,7 @@ describe('CordHost', () => { const host = new CordHost(base); let error = false; - host.write(path`/dir`, stringToFileBuffer(`beautiful world`)).subscribe( + host.write(path`/dir`, new TextEncoder().encode(`beautiful world`).buffer).subscribe( undefined, () => (error = true), () => (error = false), diff --git a/packages/angular_devkit/core/src/virtual-fs/host/test.ts b/packages/angular_devkit/core/src/virtual-fs/host/test.ts index 7e0bd64bf2b7..4e7b083d8bdc 100644 --- a/packages/angular_devkit/core/src/virtual-fs/host/test.ts +++ b/packages/angular_devkit/core/src/virtual-fs/host/test.ts @@ -8,7 +8,6 @@ import { Observable } from 'rxjs'; import { Path, PathFragment, join, normalize } from '../path'; -import { fileBufferToString, stringToFileBuffer } from './buffer'; import { FileBuffer, HostWatchEvent, HostWatchOptions, Stats } from './interface'; import { SimpleMemoryHost, SimpleMemoryHostStats } from './memory'; import { SyncDelegateHost } from './sync'; @@ -41,7 +40,7 @@ export class TestHost extends SimpleMemoryHost { super(); for (const filePath of Object.getOwnPropertyNames(map)) { - this._write(normalize(filePath), stringToFileBuffer(map[filePath])); + this._write(normalize(filePath), new TextEncoder().encode(map[filePath]).buffer); } } @@ -138,11 +137,11 @@ export class TestHost extends SimpleMemoryHost { } $write(path: string, content: string): void { - return super._write(normalize(path), stringToFileBuffer(content)); + return super._write(normalize(path), new TextEncoder().encode(content).buffer); } $read(path: string): string { - return fileBufferToString(super._read(normalize(path))); + return new TextDecoder().decode(super._read(normalize(path))); } $list(path: string): PathFragment[] { diff --git a/packages/angular_devkit/core/src/workspace/host.ts b/packages/angular_devkit/core/src/workspace/host.ts index e43e40908381..ab973717ba3d 100644 --- a/packages/angular_devkit/core/src/workspace/host.ts +++ b/packages/angular_devkit/core/src/workspace/host.ts @@ -21,14 +21,17 @@ export interface WorkspaceHost { } export function createWorkspaceHost(host: virtualFs.Host): WorkspaceHost { + const decoder = new TextDecoder(); + const encoder = new TextEncoder(); + const workspaceHost: WorkspaceHost = { async readFile(path: string): Promise { const data = await lastValueFrom(host.read(normalize(path))); - return virtualFs.fileBufferToString(data); + return decoder.decode(data); }, async writeFile(path: string, data: string): Promise { - return lastValueFrom(host.write(normalize(path), virtualFs.stringToFileBuffer(data))); + return lastValueFrom(host.write(normalize(path), encoder.encode(data).buffer)); }, async isDirectory(path: string): Promise { try { diff --git a/packages/angular_devkit/schematics/package.json b/packages/angular_devkit/schematics/package.json index f88844a0b974..a1529867b5f4 100644 --- a/packages/angular_devkit/schematics/package.json +++ b/packages/angular_devkit/schematics/package.json @@ -16,7 +16,7 @@ "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", - "ora": "9.3.0", + "ora": "9.4.0", "rxjs": "7.8.2" } } diff --git a/packages/angular_devkit/schematics/src/sink/dryrun_spec.ts b/packages/angular_devkit/schematics/src/sink/dryrun_spec.ts index a80cfd77cf04..e3807364674c 100644 --- a/packages/angular_devkit/schematics/src/sink/dryrun_spec.ts +++ b/packages/angular_devkit/schematics/src/sink/dryrun_spec.ts @@ -64,7 +64,7 @@ describe('DryRunSink', () => { // Need to create this file on the filesystem, otherwise the commit phase will fail. const outputHost = new virtualFs.SimpleMemoryHost(); - outputHost.write(normalize('/hello'), virtualFs.stringToFileBuffer('')).subscribe(); + outputHost.write(normalize('/hello'), new Uint8Array(0).buffer).subscribe(); const sink = new DryRunSink(outputHost); const [infos] = await Promise.all([ diff --git a/packages/angular_devkit/schematics/src/sink/host_spec.ts b/packages/angular_devkit/schematics/src/sink/host_spec.ts index 55d92bea7e7f..ab1ae6dd3580 100644 --- a/packages/angular_devkit/schematics/src/sink/host_spec.ts +++ b/packages/angular_devkit/schematics/src/sink/host_spec.ts @@ -108,7 +108,7 @@ describe('FileSystemSink', () => { const sink = new HostSink(host); await sink.commit(tree).toPromise(); expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); - expect(virtualFs.fileBufferToString(host.sync.read(normalize('/file1')))).toBe('world'); + expect(new TextDecoder().decode(host.sync.read(normalize('/file1')))).toBe('world'); }); it('can rename then modify the same file', async () => { @@ -125,7 +125,7 @@ describe('FileSystemSink', () => { const sink = new HostSink(host); await sink.commit(tree).toPromise(); - expect(virtualFs.fileBufferToString(host.sync.read(normalize('/file1')))).toBe('hello'); + expect(new TextDecoder().decode(host.sync.read(normalize('/file1')))).toBe('hello'); }); }); }); diff --git a/packages/angular_devkit/schematics_cli/bin/schematics.ts b/packages/angular_devkit/schematics_cli/bin/schematics.ts index 08d72f9d01d5..8420e520dd39 100644 --- a/packages/angular_devkit/schematics_cli/bin/schematics.ts +++ b/packages/angular_devkit/schematics_cli/bin/schematics.ts @@ -8,7 +8,6 @@ */ import { JsonValue, logging, schema } from '@angular-devkit/core'; -import { ProcessOutput, createConsoleLogger } from '@angular-devkit/core/node'; import { UnsuccessfulWorkflowExecution, strings } from '@angular-devkit/schematics'; import { NodeWorkflow } from '@angular-devkit/schematics/tools'; import { existsSync } from 'node:fs'; @@ -50,8 +49,8 @@ function removeLeadingSlash(value: string): string { export interface MainOptions { args: string[]; - stdout?: ProcessOutput; - stderr?: ProcessOutput; + stdout?: NodeJS.WritableStream; + stderr?: NodeJS.WritableStream; } function _listSchematics(workflow: NodeWorkflow, collectionName: string, logger: logging.Logger) { @@ -217,6 +216,37 @@ function getPackageManagerName() { return 'npm'; } +function createLogger( + verbose: boolean, + stdout: NodeJS.WritableStream, + stderr: NodeJS.WritableStream, +): logging.Logger { + const logger = new logging.IndentLogger('schematics'); + const colorLevels: Record string> = { + info: (s) => s, + debug: (s) => s, + warn: (s, stream) => styleText(['bold', 'yellow'], s, { stream }), + error: (s, stream) => styleText(['bold', 'red'], s, { stream }), + fatal: (s, stream) => styleText(['bold', 'red'], s, { stream }), + }; + + logger.subscribe((entry) => { + if (entry.level === 'debug' && !verbose) { + return; + } + + const output = + entry.level === 'warn' || entry.level === 'fatal' || entry.level === 'error' + ? stderr + : stdout; + const color = colorLevels[entry.level]; + const message = color ? color(entry.message, output) : entry.message; + output.write(message + '\n'); + }); + + return logger; +} + export async function main({ args, stdout = process.stdout, @@ -224,14 +254,7 @@ export async function main({ }: MainOptions): Promise<0 | 1> { const { cliOptions, schematicOptions, _ } = parseOptions(args); - /** Create the DevKit Logger used through the CLI. */ - const logger = createConsoleLogger(!!cliOptions.verbose, stdout, stderr, { - info: (s) => s, - debug: (s) => s, - warn: (s) => styleText(['bold', 'yellow'], s), - error: (s) => styleText(['bold', 'red'], s), - fatal: (s) => styleText(['bold', 'red'], s), - }); + const logger = createLogger(!!cliOptions.verbose, stdout, stderr); if (cliOptions.help) { logger.info(getUsage()); diff --git a/packages/angular_devkit/schematics_cli/test/schematics_spec.ts b/packages/angular_devkit/schematics_cli/test/schematics_spec.ts index 5dcf2fc962f0..e6d54b6ddb34 100644 --- a/packages/angular_devkit/schematics_cli/test/schematics_spec.ts +++ b/packages/angular_devkit/schematics_cli/test/schematics_spec.ts @@ -6,32 +6,24 @@ * found in the LICENSE file at https://angular.dev/license */ +import { PassThrough } from 'node:stream'; +import { stripVTControlCharacters } from 'node:util'; import { main } from '../bin/schematics'; -// We only care about the write method in these mocks of NodeJS.WriteStream. -class MockWriteStream { - lines: string[] = []; - write(str: string) { - // Strip color control characters. - this.lines.push(str.replace(/[^\x20-\x7F]\[\d+m/g, '')); - - return true; - } -} - describe('schematics-cli binary', () => { - let stdout: MockWriteStream, stderr: MockWriteStream; + let stdout: PassThrough, stderr: PassThrough; beforeEach(() => { - stdout = new MockWriteStream(); - stderr = new MockWriteStream(); + stdout = new PassThrough(); + stderr = new PassThrough(); }); it('list-schematics works', async () => { const args = ['--list-schematics']; const res = await main({ args, stdout, stderr }); - expect(stdout.lines).toMatch(/blank/); - expect(stdout.lines).toMatch(/schematic/); + const output = stripVTControlCharacters(stdout.read()?.toString() || ''); + expect(output).toMatch(/blank/); + expect(output).toMatch(/schematic/); expect(res).toEqual(0); }); @@ -45,30 +37,33 @@ describe('schematics-cli binary', () => { it('dry-run works', async () => { const args = ['blank', 'foo', '--dry-run']; const res = await main({ args, stdout, stderr }); - expect(stdout.lines).toMatch(/CREATE foo\/README.md/); - expect(stdout.lines).toMatch(/CREATE foo\/.gitignore/); - expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index.ts/); - expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index_spec.ts/); - expect(stdout.lines).toMatch(/Dry run enabled./); + const output = stripVTControlCharacters(stdout.read()?.toString() || ''); + expect(output).toMatch(/CREATE foo\/README.md/); + expect(output).toMatch(/CREATE foo\/.gitignore/); + expect(output).toMatch(/CREATE foo\/src\/foo\/index.ts/); + expect(output).toMatch(/CREATE foo\/src\/foo\/index_spec.ts/); + expect(output).toMatch(/Dry run enabled./); expect(res).toEqual(0); }); it('dry-run is default when debug mode', async () => { const args = ['blank', 'foo', '--debug']; const res = await main({ args, stdout, stderr }); - expect(stdout.lines).toMatch(/Debug mode enabled./); - expect(stdout.lines).toMatch(/CREATE foo\/README.md/); - expect(stdout.lines).toMatch(/CREATE foo\/.gitignore/); - expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index.ts/); - expect(stdout.lines).toMatch(/CREATE foo\/src\/foo\/index_spec.ts/); - expect(stdout.lines).toMatch(/Dry run enabled by default in debug mode./); + const output = stripVTControlCharacters(stdout.read()?.toString() || ''); + expect(output).toMatch(/Debug mode enabled./); + expect(output).toMatch(/CREATE foo\/README.md/); + expect(output).toMatch(/CREATE foo\/.gitignore/); + expect(output).toMatch(/CREATE foo\/src\/foo\/index.ts/); + expect(output).toMatch(/CREATE foo\/src\/foo\/index_spec.ts/); + expect(output).toMatch(/Dry run enabled by default in debug mode./); expect(res).toEqual(0); }); it('error when no name is provided', async () => { const args = ['blank']; const res = await main({ args, stdout, stderr }); - expect(stderr.lines).toMatch(/Error: name option is required/); + const output = stripVTControlCharacters(stderr.read()?.toString() || ''); + expect(output).toMatch(/Error: name option is required/); expect(res).toEqual(1); }); }); diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index a3eb3fc64d29..23e30d431e49 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,9 +17,9 @@ }, "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", - "@angular/compiler": "22.0.0-next.8", - "@angular/compiler-cli": "22.0.0-next.8", - "typescript": "6.0.2", + "@angular/compiler": "22.0.0-next.12", + "@angular/compiler-cli": "22.0.0-next.12", + "typescript": "6.0.3", "webpack": "5.106.2" } } diff --git a/packages/ngtools/webpack/src/ivy/index.ts b/packages/ngtools/webpack/src/ivy/index.ts index 845d06385ff2..38442ca6c25a 100644 --- a/packages/ngtools/webpack/src/ivy/index.ts +++ b/packages/ngtools/webpack/src/ivy/index.ts @@ -9,4 +9,8 @@ export { angularWebpackLoader as default } from './loader'; export { type AngularWebpackPluginOptions, AngularWebpackPlugin, imageDomains } from './plugin'; +/** + * @deprecated Part of Angular's Webpack support deprecation. + * Deprecated since v22. + */ export const AngularWebpackLoaderPath: string = __filename; diff --git a/packages/ngtools/webpack/src/ivy/loader.ts b/packages/ngtools/webpack/src/ivy/loader.ts index 79a511fcee06..99cef81333e8 100644 --- a/packages/ngtools/webpack/src/ivy/loader.ts +++ b/packages/ngtools/webpack/src/ivy/loader.ts @@ -16,6 +16,10 @@ type SourceMap = NonNullable< const JS_FILE_REGEXP = /\.[cm]?js$/; +/** + * @deprecated Part of Angular's Webpack support deprecation. + * Deprecated since v22. + */ export function angularWebpackLoader( this: LoaderContext, content: string, diff --git a/packages/ngtools/webpack/src/ivy/plugin.ts b/packages/ngtools/webpack/src/ivy/plugin.ts index f46b1360f26a..eb6038bcb25c 100644 --- a/packages/ngtools/webpack/src/ivy/plugin.ts +++ b/packages/ngtools/webpack/src/ivy/plugin.ts @@ -39,8 +39,16 @@ import { createAotTransformers, createJitTransformers, mergeTransformers } from */ const DIAGNOSTICS_AFFECTED_THRESHOLD = 1; +/** + * @deprecated Part of Angular's Webpack support deprecation. + * Deprecated since v22. + */ export const imageDomains: Set = new Set(); +/** + * @deprecated Part of Angular's Webpack support deprecation. + * Deprecated since v22. + */ export interface AngularWebpackPluginOptions { tsconfig: string; compilerOptions?: CompilerOptions; @@ -71,6 +79,10 @@ interface FileEmitHistoryItem { hash: Uint8Array; } +/** + * @deprecated Part of Angular's Webpack support deprecation. + * Deprecated since v22. + */ export class AngularWebpackPlugin { private readonly pluginOptions: AngularWebpackPluginOptions; private compilerCliModule?: typeof import('@angular/compiler-cli'); 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 79bfa9e98a41..d39e1a16bab6 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 @@ -80,7 +80,8 @@ export function analyzeKarmaConfig(content: string): KarmaConfigAnalysis { function extractValue(node: ts.Expression): KarmaConfigValue { switch (node.kind) { case ts.SyntaxKind.StringLiteral: - return (node as ts.StringLiteral).text; + case ts.SyntaxKind.NoSubstitutionTemplateLiteral: + return (node as ts.StringLiteral | ts.NoSubstitutionTemplateLiteral).text; case ts.SyntaxKind.NumericLiteral: return Number((node as ts.NumericLiteral).text); case ts.SyntaxKind.TrueKeyword: diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer_spec.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer_spec.ts index 79af125c8690..e6af7f09d805 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer_spec.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-config-analyzer_spec.ts @@ -293,4 +293,33 @@ describe('Karma Config Analyzer', () => { expect(settings.size).toBe(0); expect(hasUnsupportedValues).toBe(true); }); + + it('should parse plain template literal strings without substitution', () => { + const karmaConf = ` + module.exports = function (config) { + config.set({ + basePath: \`some/path\`, + }); + }; + `; + const { settings, hasUnsupportedValues } = analyzeKarmaConfig(karmaConf); + + expect(settings.get('basePath') as unknown).toBe('some/path'); + expect(hasUnsupportedValues).toBe(false); + }); + + it('should flag template literals with substitution as unsupported', () => { + const karmaConf = ` + const relativePath = './coverage'; + module.exports = function (config) { + config.set({ + basePath: \`\${relativePath}/test\`, + }); + }; + `; + const { settings, hasUnsupportedValues } = analyzeKarmaConfig(karmaConf); + + expect(settings.get('basePath')).toBeUndefined(); + expect(hasUnsupportedValues).toBe(true); + }); }); diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-processor.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-processor.ts index e5a83f4f2786..43e64eb2033a 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-processor.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/karma-processor.ts @@ -119,42 +119,47 @@ function extractCoverageSettings( } } +export interface KarmaConfigProcessingResult { + analysis: KarmaConfigAnalysis; + isRemovable: boolean; +} + export async function processKarmaConfig( karmaConfig: string, options: Record, projectName: string, context: SchematicContext, tree: Tree, - removableKarmaConfigs: Map, + cache: Map, needDevkitPlugin: boolean, manualMigrationFiles: string[], ): Promise { - if (tree.exists(karmaConfig)) { + let cachedResult = cache.get(karmaConfig); + + if (!cachedResult && tree.exists(karmaConfig)) { const content = tree.readText(karmaConfig); const analysis = analyzeKarmaConfig(content); - extractReporters(analysis, options, projectName, context); - extractCoverageSettings(analysis, options, projectName, context); - - let isRemovable = removableKarmaConfigs.get(karmaConfig); - if (isRemovable === undefined) { - if (analysis.hasUnsupportedValues) { - isRemovable = false; - } else { - const diff = await compareKarmaConfigToDefault( - analysis, - projectName, - karmaConfig, - needDevkitPlugin, - ); - isRemovable = !hasDifferences(diff) && diff.isReliable; - } - removableKarmaConfigs.set(karmaConfig, isRemovable); + let isRemovable = false; + if (!analysis.hasUnsupportedValues) { + const diff = await compareKarmaConfigToDefault( + analysis, + projectName, + karmaConfig, + needDevkitPlugin, + ); + isRemovable = !hasDifferences(diff) && diff.isReliable; } - if (isRemovable) { - tree.delete(karmaConfig); - } else { + cachedResult = { analysis, isRemovable }; + cache.set(karmaConfig, cachedResult); + } + + if (cachedResult) { + extractReporters(cachedResult.analysis, options, projectName, context); + extractCoverageSettings(cachedResult.analysis, options, projectName, context); + + if (!cachedResult.isRemovable) { context.logger.warn( `Project "${projectName}" uses a custom Karma configuration file "${karmaConfig}". ` + `Tests have been migrated to use Vitest, but you may need to manually migrate custom settings ` + @@ -164,5 +169,6 @@ export async function processKarmaConfig( manualMigrationFiles.push(karmaConfig); } } + delete options['karmaConfig']; } 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 dbf169ec22e5..7d2306428b32 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts @@ -8,25 +8,28 @@ import type { json } from '@angular-devkit/core'; import { Rule, SchematicContext, Tree, chain } from '@angular-devkit/schematics'; +import { join } from 'node:path/posix'; import { isDeepStrictEqual } from 'util'; import { DependencyType, ExistingBehavior, addDependency } from '../../utility/dependency'; +import { JSONFile } from '../../utility/json-file'; import { latestVersions } from '../../utility/latest-versions'; import { TargetDefinition, allTargetOptions, updateWorkspace } from '../../utility/workspace'; import { Builders } from '../../utility/workspace-models'; import { BUILD_OPTIONS_KEYS } from './constants'; -import { processKarmaConfig } from './karma-processor'; +import { KarmaConfigProcessingResult, processKarmaConfig } from './karma-processor'; async function processTestTargetOptions( testTarget: TargetDefinition, projectName: string, context: SchematicContext, tree: Tree, - removableKarmaConfigs: Map, + removableKarmaConfigs: Map, customBuildOptions: Record>, needDevkitPlugin: boolean, manualMigrationFiles: string[], -): Promise { +): Promise<{ needsCoverage: boolean; needsIstanbul: boolean }> { let needsCoverage = false; + let needsIstanbul = false; for (const [configName, options] of allTargetOptions(testTarget, false)) { const configKey = configName || ''; if (!customBuildOptions[configKey]) { @@ -79,6 +82,20 @@ async function processTestTargetOptions( const updatedBrowsers = options['browsers']; if (Array.isArray(updatedBrowsers) && updatedBrowsers.length > 0) { + const hasNonChromium = updatedBrowsers.some((b) => { + if (typeof b !== 'string') { + return false; + } + + const normalized = b.toLowerCase(); + + return !['chrome', 'chromium', 'edge'].some((name) => normalized.includes(name)); + }); + + if (hasNonChromium) { + needsIstanbul = true; + } + context.logger.info( `Project "${projectName}" has browsers configured for tests. ` + `To run tests in a browser with Vitest, you will need to install either ` + @@ -116,14 +133,88 @@ async function processTestTargetOptions( delete options['main']; } - return needsCoverage; + return { needsCoverage, needsIstanbul }; +} + +function updateTsConfigTypes( + tree: Tree, + tsConfigsToUpdate: Set, + context: SchematicContext, +): void { + for (const tsConfigPath of tsConfigsToUpdate) { + if (tree.exists(tsConfigPath)) { + try { + const json = new JSONFile(tree, tsConfigPath); + const typesPath = ['compilerOptions', 'types']; + const existingTypes = (json.get(typesPath) as string[] | undefined) ?? []; + const newTypes = existingTypes.filter((t) => t !== 'jasmine'); + + if (!newTypes.includes('vitest/globals')) { + newTypes.push('vitest/globals'); + } + + if ( + newTypes.length !== existingTypes.length || + newTypes.some((t, i) => t !== existingTypes[i]) + ) { + json.modify(typesPath, newTypes); + } + } catch (err) { + context.logger.warn( + `Failed to automatically update types in "${tsConfigPath}". ` + + `Please manually remove "jasmine" and add "vitest/globals" to compilerOptions.types.`, + ); + } + } + } +} + +function logSummary( + context: SchematicContext, + migratedProjects: string[], + skippedNonApplications: string[], + skippedMissingAppBuilder: string[], + manualMigrationFiles: string[], +): void { + context.logger.info('\n--- Karma to Vitest Migration Summary ---'); + context.logger.info(`Projects migrated: ${migratedProjects.length}`); + if (migratedProjects.length > 0) { + context.logger.info(` - ${migratedProjects.join(', ')}`); + } + context.logger.info(`Projects skipped (non-applications): ${skippedNonApplications.length}`); + if (skippedNonApplications.length > 0) { + context.logger.info(` - ${skippedNonApplications.join(', ')}`); + } + context.logger.info( + `Projects skipped (missing application builder): ${skippedMissingAppBuilder.length}`, + ); + if (skippedMissingAppBuilder.length > 0) { + context.logger.info(` - ${skippedMissingAppBuilder.join(', ')}`); + } + + const uniqueManualFiles = [...new Set(manualMigrationFiles)]; + if (uniqueManualFiles.length > 0) { + context.logger.warn(`\nThe following Karma configuration files require manual migration:`); + for (const file of uniqueManualFiles) { + context.logger.warn(` - ${file}`); + } + } + if (migratedProjects.length > 0) { + context.logger.info( + `\nNote: To refactor your test files from Jasmine to Vitest, consider running the following command:` + + `\n ng g @schematics/angular:refactor-jasmine-vitest `, + ); + } + context.logger.info('-----------------------------------------\n'); } function updateProjects(tree: Tree, context: SchematicContext): Rule { return updateWorkspace(async (workspace) => { let needsCoverage = false; - const removableKarmaConfigs = new Map(); + let needsIstanbul = false; + const removableKarmaConfigs = new Map(); const migratedProjects: string[] = []; + const tsConfigsToUpdate = new Set(); const skippedNonApplications: string[] = []; const skippedMissingAppBuilder: string[] = []; const manualMigrationFiles: string[] = []; @@ -169,10 +260,25 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { continue; } + // Collect tsConfig paths to perform globals updates + const baseTsConfig = testTarget.options?.['tsConfig']; + if (typeof baseTsConfig === 'string') { + tsConfigsToUpdate.add(baseTsConfig); + } + if (testTarget.configurations) { + for (const config of Object.values(testTarget.configurations)) { + if (typeof config?.['tsConfig'] === 'string') { + tsConfigsToUpdate.add(config['tsConfig']); + } + } + } + // Always include fallback to the default tsconfig.spec.json path + 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 projectNeedsCoverage = await processTestTargetOptions( + const projectCoverageInfo = await processTestTargetOptions( testTarget, projectName, context, @@ -183,8 +289,11 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { manualMigrationFiles, ); - if (projectNeedsCoverage) { + if (projectCoverageInfo.needsCoverage) { needsCoverage = true; + if (projectCoverageInfo.needsIstanbul) { + needsIstanbul = true; + } } // If we have custom build options, create testing configurations @@ -235,37 +344,24 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { migratedProjects.push(projectName); } - // Log summary - context.logger.info('\n--- Karma to Vitest Migration Summary ---'); - context.logger.info(`Projects migrated: ${migratedProjects.length}`); - if (migratedProjects.length > 0) { - context.logger.info(` - ${migratedProjects.join(', ')}`); - } - context.logger.info(`Projects skipped (non-applications): ${skippedNonApplications.length}`); - if (skippedNonApplications.length > 0) { - context.logger.info(` - ${skippedNonApplications.join(', ')}`); - } - context.logger.info( - `Projects skipped (missing application builder): ${skippedMissingAppBuilder.length}`, - ); - if (skippedMissingAppBuilder.length > 0) { - context.logger.info(` - ${skippedMissingAppBuilder.join(', ')}`); - } - - const uniqueManualFiles = [...new Set(manualMigrationFiles)]; - if (uniqueManualFiles.length > 0) { - context.logger.warn(`\nThe following Karma configuration files require manual migration:`); - for (const file of uniqueManualFiles) { - context.logger.warn(` - ${file}`); + // Perform cleanup of removable karma config files + for (const [configPath, result] of removableKarmaConfigs) { + if (result.isRemovable && tree.exists(configPath)) { + tree.delete(configPath); } } - if (migratedProjects.length > 0) { - context.logger.info( - `\nNote: To refactor your test files from Jasmine to Vitest, consider running the following command:` + - `\n ng g @schematics/angular:refactor-jasmine-vitest `, - ); - } - context.logger.info('-----------------------------------------\n'); + + // Update TSConfig files to use Vitest types instead of Jasmine + updateTsConfigTypes(tree, tsConfigsToUpdate, context); + + // Log summary + logSummary( + context, + migratedProjects, + skippedNonApplications, + skippedMissingAppBuilder, + manualMigrationFiles, + ); if (migratedProjects.length > 0) { const rules = [ @@ -282,6 +378,19 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { existing: ExistingBehavior.Skip, }), ); + + if (needsIstanbul) { + rules.push( + addDependency( + '@vitest/coverage-istanbul', + latestVersions['@vitest/coverage-istanbul'], + { + type: DependencyType.Dev, + existing: ExistingBehavior.Skip, + }, + ), + ); + } } return chain(rules); diff --git a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration_spec.ts b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration_spec.ts index e206002ab665..fb6737b77d26 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration_spec.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration_spec.ts @@ -322,6 +322,7 @@ module.exports = function (config) { const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); expect(newTree.exists('karma.conf.js')).toBeFalse(); }); + it('should shift main compilation entry file directly into setupFiles array', async () => { const { projects } = tree.readJson('/angular.json') as any; projects.app.targets.test.options.main = 'src/test.ts'; @@ -333,6 +334,7 @@ module.exports = function (config) { expect(newProjects.app.targets.test.options.setupFiles).toEqual(['src/test.ts']); expect(newProjects.app.targets.test.options.main).toBeUndefined(); }); + it('should generate unique testing configuration name preventing collision overwrites', async () => { const { projects } = tree.readJson('/angular.json') as any; projects.app.targets.build.configurations = { @@ -350,6 +352,7 @@ module.exports = function (config) { ]); expect(newProjects.app.targets.test.options.buildTarget).toBe(':build:testing-2'); }); + it('should inject @vitest/coverage-v8 whenever coverage presence is detected', async () => { const { projects } = tree.readJson('/angular.json') as any; projects.app.targets.test.options.codeCoverage = true; @@ -360,4 +363,83 @@ module.exports = function (config) { expect(devDependencies['@vitest/coverage-v8']).toBe(latestVersions['@vitest/coverage-v8']); }); + + it('should successfully extract settings across multiple projects sharing the same removable karma config', async () => { + const { projects } = tree.readJson('/angular.json') as any; + projects.app.targets.test.builder = '@angular-devkit/build-angular:karma'; + + // Add a second project sharing the exact same configuration + projects.app2 = { + ...JSON.parse(JSON.stringify(projects.app)), + root: 'app2', + }; + + tree.overwrite('/angular.json', JSON.stringify({ version: 1, projects })); + + const DEFAULT_KARMA_CONFIG = ` +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: {}, + }, + jasmineHtmlReporter: { + suppressAll: true + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/app'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + browsers: ['Chrome'], + restartOnFileChange: true + }); +}; +`; + tree.create('karma.conf.js', DEFAULT_KARMA_CONFIG); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const { projects: newProjects } = newTree.readJson('/angular.json') as any; + + // Assert BOTH projects got the extraction logic mapped correctly + expect(newProjects.app.targets.test.options.reporters).toEqual(['default']); + expect(newProjects.app2.targets.test.options.reporters).toEqual(['default']); + + // Assert that the deletion deferred successfully until BOTH extracted the data + expect(newTree.exists('karma.conf.js')).toBeFalse(); + }); + + it('should automatically transition types in referenced tsconfigs from jasmine to vitest/globals', async () => { + // Create a virtual tsconfig that mimics existing state + tree.create( + 'tsconfig.spec.json', + JSON.stringify({ + compilerOptions: { + outDir: './out-tsc/spec', + types: ['jasmine', 'node'], + }, + files: ['src/test.ts'], + include: ['src/**/*.spec.ts', 'src/**/*.d.ts'], + }), + ); + + const newTree = await schematicRunner.runSchematic('migrate-karma-to-vitest', {}, tree); + const tsConfigJson = JSON.parse(newTree.readText('tsconfig.spec.json')); + + expect(tsConfigJson.compilerOptions.types).toContain('vitest/globals'); + expect(tsConfigJson.compilerOptions.types).not.toContain('jasmine'); + expect(tsConfigJson.compilerOptions.types).toContain('node'); + }); }); diff --git a/packages/schematics/angular/migrations/migration-collection.json b/packages/schematics/angular/migrations/migration-collection.json index 12f0d2b7d215..db1b95f987ef 100644 --- a/packages/schematics/angular/migrations/migration-collection.json +++ b/packages/schematics/angular/migrations/migration-collection.json @@ -4,7 +4,7 @@ "add-istanbul-instrumenter": { "version": "22.0.0", "factory": "./add-istanbul-instrumenter/migration", - "description": "Add istanbul-lib-instrument to devDependencies if Karma unit testing is used." + "description": "Add 'istanbul-lib-instrument' to 'devDependencies' if Karma unit testing is used." }, "use-application-builder": { "version": "22.0.0", @@ -20,6 +20,11 @@ "description": "Migrate projects using legacy Karma unit-test builder to the new unit-test builder with Vitest.", "optional": true }, + "trust-proxy-headers": { + "version": "22.0.0", + "factory": "./trust-proxy-headers/migration", + "description": "Add 'trustProxyHeaders' configuration to 'AngularNodeAppEngine' or 'AngularAppEngine'. For more information see: https://angular.dev/best-practices/security#configuring-trusted-proxy-headers" + }, "update-workspace-config": { "version": "22.0.0", "factory": "./update-workspace-config/migration", diff --git a/packages/schematics/angular/migrations/trust-proxy-headers/migration.ts b/packages/schematics/angular/migrations/trust-proxy-headers/migration.ts new file mode 100644 index 000000000000..9be44b03039b --- /dev/null +++ b/packages/schematics/angular/migrations/trust-proxy-headers/migration.ts @@ -0,0 +1,97 @@ +/** + * @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 { Rule } from '@angular-devkit/schematics'; +import ts from 'typescript'; +import { allTargetOptions, allWorkspaceTargets, getWorkspace } from '../../utility/workspace'; + +const TODO_COMMENT = + '// TODO: This is a security-sensitive option. Remove if not needed. ' + + 'For more information, see https://angular.dev/best-practices/security#configuring-trusted-proxy-headers'; + +export default function (): Rule { + return async (tree) => { + const workspace = await getWorkspace(tree); + const serverFiles = new Set(); + + for (const [targetName, target] of allWorkspaceTargets(workspace)) { + if (targetName !== 'build') { + continue; + } + + for (const [, options] of allTargetOptions(target)) { + if (typeof options?.['server'] === 'string') { + serverFiles.add(options['server']); + } + } + } + + for (const path of serverFiles) { + if (!tree.exists(path)) { + continue; + } + + const content = tree.readText(path); + if (content.includes(TODO_COMMENT)) { + continue; + } + + if (!content.includes('AngularAppEngine') && !content.includes('AngularNodeAppEngine')) { + continue; + } + + const sourceFile = ts.createSourceFile(path, content, ts.ScriptTarget.Latest, true); + const recorder = tree.beginUpdate(path); + + function visit(node: ts.Node) { + if ( + ts.isNewExpression(node) && + ts.isIdentifier(node.expression) && + (node.expression.text === 'AngularNodeAppEngine' || + node.expression.text === 'AngularAppEngine') + ) { + // Check arguments + if (!node.arguments || node.arguments.length === 0) { + // Case 1: No arguments passed + const insertPos = node.end - 1; // right before ) + recorder.insertRight( + insertPos, + `{\n ${TODO_COMMENT}\n ` + + `trustProxyHeaders: ['x-forwarded-host', 'x-forwarded-proto'],\n}`, + ); + } else if (node.arguments.length > 0) { + const firstArg = node.arguments[0]; + if (ts.isObjectLiteralExpression(firstArg)) { + // Check if trustProxyHeaders is already present + const hasTrustProxyHeaders = firstArg.properties.some( + (prop: ts.ObjectLiteralElementLike) => + ts.isPropertyAssignment(prop) && + (ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name)) && + prop.name.text === 'trustProxyHeaders', + ); + + if (!hasTrustProxyHeaders) { + // Insert right after the opening brace + const insertPos = firstArg.getStart() + 1; + recorder.insertRight( + insertPos, + `\n ${TODO_COMMENT}\n ` + + `trustProxyHeaders: ['x-forwarded-host', 'x-forwarded-proto'],`, + ); + } + } + } + } + ts.forEachChild(node, visit); + } + + visit(sourceFile); + tree.commitUpdate(recorder); + } + }; +} diff --git a/packages/schematics/angular/migrations/trust-proxy-headers/migration_spec.ts b/packages/schematics/angular/migrations/trust-proxy-headers/migration_spec.ts new file mode 100644 index 000000000000..3e6b7ab613ea --- /dev/null +++ b/packages/schematics/angular/migrations/trust-proxy-headers/migration_spec.ts @@ -0,0 +1,101 @@ +/** + * @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 { EmptyTree } from '@angular-devkit/schematics'; +import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing'; + +function createWorkSpaceConfig(tree: UnitTestTree) { + const angularConfig = { + version: 1, + projects: { + app: { + root: '', + sourceRoot: 'src', + projectType: 'application', + architect: { + build: { + options: { + server: '/server.ts', + }, + }, + }, + }, + }, + }; + + tree.create('/angular.json', JSON.stringify(angularConfig, undefined, 2)); +} + +describe(`Migration to add trustProxyHeaders to server.ts`, () => { + const schematicName = 'trust-proxy-headers'; + const schematicRunner = new SchematicTestRunner( + 'migrations', + require.resolve('../migration-collection.json'), + ); + const TODO_COMMENT = + '// TODO: This is a security-sensitive option. Remove if not needed. ' + + 'For more information, see https://angular.dev/best-practices/security#configuring-trusted-proxy-headers'; + + let tree: UnitTestTree; + beforeEach(() => { + tree = new UnitTestTree(new EmptyTree()); + createWorkSpaceConfig(tree); + }); + + it(`should add trustProxyHeaders to AngularNodeAppEngine with no args`, async () => { + tree.create( + '/server.ts', + `import { AngularNodeAppEngine } from '@angular/ssr/node';\nconst angularApp = new AngularNodeAppEngine();`, + ); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + const content = newTree.readText('/server.ts'); + expect(content).toContain(`const angularApp = new AngularNodeAppEngine({`); + expect(content).toContain(TODO_COMMENT); + expect(content).toContain(`trustProxyHeaders: ['x-forwarded-host', 'x-forwarded-proto'],`); + }); + + it(`should add trustProxyHeaders to AngularNodeAppEngine with existing args`, async () => { + tree.create( + '/server.ts', + `import { AngularNodeAppEngine } from '@angular/ssr/node';\n` + + `const angularApp = new AngularNodeAppEngine({\n allowedHosts: ['localhost']\n});`, + ); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + const content = newTree.readText('/server.ts'); + expect(content).toContain(`const angularApp = new AngularNodeAppEngine({`); + expect(content).toContain(TODO_COMMENT); + expect(content).toContain(`trustProxyHeaders: ['x-forwarded-host', 'x-forwarded-proto'],`); + expect(content).toContain(`allowedHosts: ['localhost']`); + }); + + it(`should add trustProxyHeaders to AngularAppEngine`, async () => { + tree.create( + '/server.ts', + `import { AngularAppEngine } from '@angular/ssr';\nconst angularApp = new AngularAppEngine();`, + ); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + const content = newTree.readText('/server.ts'); + expect(content).toContain(`const angularApp = new AngularAppEngine({`); + expect(content).toContain(TODO_COMMENT); + expect(content).toContain(`trustProxyHeaders: ['x-forwarded-host', 'x-forwarded-proto'],`); + }); + + it(`should not add trustProxyHeaders if it already exists`, async () => { + const originalContent = + `import { AngularAppEngine } from '@angular/ssr';\n` + + `const angularApp = new AngularAppEngine({\n trustProxyHeaders: true\n});`; + tree.create('/server.ts', originalContent); + + const newTree = await schematicRunner.runSchematic(schematicName, {}, tree); + const content = newTree.readText('/server.ts'); + expect(content).toBe(originalContent); + }); +}); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/index.ts b/packages/schematics/angular/refactor/jasmine-vitest/index.ts index 4ae4077a7be4..493bb0eb1800 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/index.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/index.ts @@ -122,6 +122,7 @@ export default function (options: Schema): Rule { const newContent = transformJasmineToVitest(file, content, reporter, { addImports: !!options.addImports, browserMode: !!options.browerMode, + fakeAsync: !!options.fakeAsync, }); if (content !== newContent) { diff --git a/packages/schematics/angular/refactor/jasmine-vitest/schema.json b/packages/schematics/angular/refactor/jasmine-vitest/schema.json index 4192a27367fd..5b23618cbc48 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/schema.json +++ b/packages/schematics/angular/refactor/jasmine-vitest/schema.json @@ -36,6 +36,11 @@ "description": "Whether the tests are intended to run in browser mode. If true, the `toHaveClass` assertions are left as is because Vitest browser mode has such an assertion. Otherwise they're migrated to an equivalent assertion.", "default": false }, + "fakeAsync": { + "type": "boolean", + "description": "Whether to transform `fakeAsync` tests to Vitest fake timers.", + "default": false + }, "report": { "type": "boolean", "description": "Whether to generate a summary report file (jasmine-vitest-.md) in the project root.", 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 2636a142d4b6..b84aeba57411 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 @@ -14,7 +14,7 @@ import { RefactorReporter } from './utils/refactor-reporter'; async function expectTransformation( input: string, expected: string, - options: { addImports: boolean; browserMode: boolean } = { + options: { addImports: boolean; browserMode: boolean; fakeAsync?: boolean } = { addImports: false, browserMode: false, }, @@ -534,4 +534,66 @@ describe('Jasmine to Vitest Transformer - Integration Tests', () => { await expectTransformation(jasmineCode, vitestCode); }); + + it('should not transform `fakeAsync`', async () => { + const jasmineCode = ` + import { fakeAsync, flush, flushMicrotasks, tick } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync(() => { + flush(); + flushMicrotasks(); + tick(100); + })); + }); + `; + const vitestCode = ` + import { fakeAsync, flush, flushMicrotasks, tick } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync(() => { + flush(); + flushMicrotasks(); + tick(100); + })); + }); + `; + + await expectTransformation(jasmineCode, vitestCode); + }); + + it('should transform `fakeAsync` if `fakeAsync` option is true', async () => { + const jasmineCode = ` + import { fakeAsync, flush, flushMicrotasks, tick } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync(() => { + flush(); + flushMicrotasks(); + tick(100); + })); + }); + `; + const vitestCode = ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + it('works', async () => { + await vi.runAllTimersAsync(); + await vi.advanceTimersByTimeAsync(0); + await vi.advanceTimersByTimeAsync(100); + }); + }); + `; + + await expectTransformation(jasmineCode, vitestCode, { + addImports: false, + browserMode: false, + fakeAsync: true, + }); + }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.ts b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.ts index de80052d0b2a..f652368b03f7 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.ts @@ -14,6 +14,10 @@ */ import ts from 'typescript'; +import { transformFakeAsyncFlush } from './transformers/fake-async-flush'; +import { transformFakeAsyncFlushMicrotasks } from './transformers/fake-async-flush-microtasks'; +import { transformFakeAsyncTest } from './transformers/fake-async-test'; +import { transformFakeAsyncTick } from './transformers/fake-async-tick'; import { transformDoneCallback, transformFocusedAndSkippedTests, @@ -48,7 +52,11 @@ import { transformSpyReset, } from './transformers/jasmine-spy'; import { transformJasmineTypes } from './transformers/jasmine-type'; -import { addVitestValueImport, getVitestAutoImports } from './utils/ast-helpers'; +import { + addVitestValueImport, + getVitestAutoImports, + removeImportSpecifiers, +} from './utils/ast-helpers'; import { RefactorContext } from './utils/refactor-context'; import { RefactorReporter } from './utils/refactor-reporter'; @@ -129,6 +137,10 @@ const callExpressionTransformers = [ transformToHaveBeenCalledBefore, transformToHaveClass, transformToBeNullish, + transformFakeAsyncTest, + transformFakeAsyncTick, + transformFakeAsyncFlush, + transformFakeAsyncFlushMicrotasks, // **Stage 3: Global Functions & Cleanup** // These handle global Jasmine functions and catch-alls for unsupported APIs. @@ -173,8 +185,10 @@ export function transformJasmineToVitest( filePath: string, content: string, reporter: RefactorReporter, - options: { addImports: boolean; browserMode: boolean }, + options: { addImports: boolean; browserMode: boolean; fakeAsync?: boolean }, ): string { + options.fakeAsync ??= false; + const contentWithPlaceholders = preserveBlankLines(content); const sourceFile = ts.createSourceFile( @@ -187,6 +201,7 @@ export function transformJasmineToVitest( const pendingVitestValueImports = new Set(); const pendingVitestTypeImports = new Set(); + const pendingImportSpecifierRemovals = new Map>(); const transformer: ts.TransformerFactory = (context) => { const refactorCtx: RefactorContext = { @@ -195,6 +210,7 @@ export function transformJasmineToVitest( tsContext: context, pendingVitestValueImports, pendingVitestTypeImports, + pendingImportSpecifierRemovals, }; const visitor: ts.Visitor = (node) => { @@ -211,7 +227,18 @@ export function transformJasmineToVitest( } for (const transformer of callExpressionTransformers) { - if (!(options.browserMode && transformer === transformToHaveClass)) { + if ( + !( + (options.browserMode && transformer === transformToHaveClass) || + (options.fakeAsync === false && + [ + transformFakeAsyncFlush, + transformFakeAsyncFlushMicrotasks, + transformFakeAsyncTick, + transformFakeAsyncTest, + ].includes(transformer)) + ) + ) { transformedNode = transformer(transformedNode, refactorCtx); } } @@ -249,16 +276,25 @@ export function transformJasmineToVitest( const hasPendingValueImports = pendingVitestValueImports.size > 0; const hasPendingTypeImports = pendingVitestTypeImports.size > 0; + const hasPendingImportSpecifierRemovals = pendingImportSpecifierRemovals.size > 0; if ( transformedSourceFile === sourceFile && !reporter.hasTodos && !hasPendingValueImports && - !hasPendingTypeImports + !hasPendingTypeImports && + !hasPendingImportSpecifierRemovals ) { return content; } + if (hasPendingImportSpecifierRemovals) { + transformedSourceFile = removeImportSpecifiers( + transformedSourceFile, + pendingImportSpecifierRemovals, + ); + } + if (hasPendingTypeImports || (options.addImports && hasPendingValueImports)) { const vitestImport = getVitestAutoImports( options.addImports ? pendingVitestValueImports : new Set(), 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 2eaca1f5bf15..82b76ee31782 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 @@ -150,4 +150,32 @@ describe('Jasmine to Vitest Transformer - addImports option', () => { true, ); }); + + it('should add imports for `vi` when addImports is true', async () => { + const input = ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + }); + `; + const expected = ` + import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + it('works', async () => { + expect(1).toBe(1); + }); + }); + `; + await expectTransformation(input, expected, true); + }); }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/test-helpers.ts b/packages/schematics/angular/refactor/jasmine-vitest/test-helpers.ts index 9aa6532206da..6986c4c39d0c 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/test-helpers.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/test-helpers.ts @@ -33,6 +33,7 @@ export async function expectTransformation( const transformed = transformJasmineToVitest('spec.ts', input, reporter, { addImports, browserMode: false, + fakeAsync: true, }); const formattedTransformed = await format(transformed, { parser: 'typescript' }); const formattedExpected = await format(expected, { parser: 'typescript' }); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks.ts new file mode 100644 index 000000000000..59064bce4f18 --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks.ts @@ -0,0 +1,38 @@ +/** + * @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 ts from 'typescript'; +import { isNamedImportFrom } from '../utils/ast-helpers'; +import { ANGULAR_CORE_TESTING } from '../utils/constants'; +import { RefactorContext } from '../utils/refactor-context'; +import { addImportSpecifierRemoval, createViCallExpression } from '../utils/refactor-helpers'; + +export function transformFakeAsyncFlushMicrotasks(node: ts.Node, ctx: RefactorContext): ts.Node { + if ( + !( + ts.isCallExpression(node) && + ts.isIdentifier(node.expression) && + node.expression.text === 'flushMicrotasks' && + isNamedImportFrom(ctx.sourceFile, 'flushMicrotasks', ANGULAR_CORE_TESTING) + ) + ) { + return node; + } + + ctx.reporter.reportTransformation( + ctx.sourceFile, + node, + `Transformed \`flushMicrotasks\` to \`await vi.advanceTimersByTimeAsync(0)\`.`, + ); + + addImportSpecifierRemoval(ctx, 'flushMicrotasks', ANGULAR_CORE_TESTING); + + return ts.factory.createAwaitExpression( + createViCallExpression(ctx, 'advanceTimersByTimeAsync', [ts.factory.createNumericLiteral(0)]), + ); +} diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks_spec.ts new file mode 100644 index 000000000000..16f9eb8e88e2 --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks_spec.ts @@ -0,0 +1,43 @@ +/** + * @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 { expectTransformation } from '../test-helpers'; + +describe('transformFakeAsyncFlushMicrotasks', () => { + const testCases = [ + { + description: 'should replace `flushMicrotasks` with `await vi.advanceTimersByTimeAsync(0)`', + input: ` + import { flushMicrotasks } from '@angular/core/testing'; + + flushMicrotasks(); + `, + expected: `await vi.advanceTimersByTimeAsync(0);`, + }, + { + description: + 'should not replace `flushMicrotasks` if not imported from `@angular/core/testing`', + input: ` + import { flushMicrotasks } from './my-flush-microtasks'; + + flushMicrotasks(); + `, + expected: ` + import { flushMicrotasks } from './my-flush-microtasks'; + + flushMicrotasks(); + `, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); + }); + }); +}); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush.ts new file mode 100644 index 000000000000..5235ea8e1abf --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush.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 ts from 'typescript'; +import { isNamedImportFrom } from '../utils/ast-helpers'; +import { addTodoComment } from '../utils/comment-helpers'; +import { ANGULAR_CORE_TESTING } from '../utils/constants'; +import { RefactorContext } from '../utils/refactor-context'; +import { addImportSpecifierRemoval, createViCallExpression } from '../utils/refactor-helpers'; + +export function transformFakeAsyncFlush(node: ts.Node, ctx: RefactorContext): ts.Node { + if ( + !( + ts.isCallExpression(node) && + ts.isIdentifier(node.expression) && + node.expression.text === 'flush' && + isNamedImportFrom(ctx.sourceFile, 'flush', ANGULAR_CORE_TESTING) + ) + ) { + return node; + } + + ctx.reporter.reportTransformation( + ctx.sourceFile, + node, + `Transformed \`flush\` to \`await vi.runAllTimersAsync()\`.`, + ); + + addImportSpecifierRemoval(ctx, 'flush', ANGULAR_CORE_TESTING); + + if (node.arguments.length > 0) { + ctx.reporter.recordTodo('flush-max-turns', ctx.sourceFile, node); + addTodoComment(node, 'flush-max-turns'); + } + + const awaitRunAllTimersAsync = ts.factory.createAwaitExpression( + createViCallExpression(ctx, 'runAllTimersAsync'), + ); + + if (ts.isExpressionStatement(node.parent)) { + return awaitRunAllTimersAsync; + } else { + // If `flush` is not used as its own statement, then the return value is probably used. + // Therefore, we replace it with nullish coalescing that returns 0: + // > await vi.runAllTimersAsync() ?? 0; + ctx.reporter.recordTodo('flush-return-value', ctx.sourceFile, node); + addTodoComment(node, 'flush-return-value'); + + return ts.factory.createBinaryExpression( + awaitRunAllTimersAsync, + ts.SyntaxKind.QuestionQuestionToken, + ts.factory.createNumericLiteral(0), + ); + } +} diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush_spec.ts new file mode 100644 index 000000000000..1daeda891461 --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush_spec.ts @@ -0,0 +1,108 @@ +/** + * @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 { expectTransformation } from '../test-helpers'; + +describe('transformFakeAsyncFlush', () => { + const testCases = [ + { + description: 'should replace `flush` with `await vi.runAllTimersAsync()`', + input: ` + import { flush } from '@angular/core/testing'; + + flush(); + `, + expected: `await vi.runAllTimersAsync();`, + }, + { + description: 'should add TODO comment when flush is called with maxTurns', + input: ` + import { flush } from '@angular/core/testing'; + + flush(42); + `, + expected: ` + // TODO: vitest-migration: flush(maxTurns) was called but maxTurns parameter is not migrated. Please migrate manually. + await vi.runAllTimersAsync(); + `, + }, + { + description: 'should add TODO comment when flush return value is used', + input: ` + import { flush } from '@angular/core/testing'; + + const turns = flush(); + `, + expected: ` + // TODO: vitest-migration: flush() return value is not migrated. Please migrate manually. + const turns = await vi.runAllTimersAsync() ?? 0; + `, + }, + { + description: 'should add TODO comment when flush return value is used in a return statement', + input: ` + import { flush } from '@angular/core/testing'; + + async function myFlushWrapper() { + return flush(); + } + `, + expected: ` + async function myFlushWrapper() { + // TODO: vitest-migration: flush() return value is not migrated. Please migrate manually. + return await vi.runAllTimersAsync() ?? 0; + } + `, + }, + { + description: 'should not replace `flush` if not imported from `@angular/core/testing`', + input: ` + import { flush } from './my-flush'; + + flush(); + `, + expected: ` + import { flush } from './my-flush'; + + flush(); + `, + }, + { + description: 'should keep other imported symbols from `@angular/core/testing`', + input: ` + import { TestBed, flush } from '@angular/core/testing'; + + flush(); + `, + expected: ` + import { TestBed } from '@angular/core/testing'; + + await vi.runAllTimersAsync(); + `, + }, + { + description: 'should keep imported types from `@angular/core/testing`', + input: ` + import { flush, type ComponentFixture } from '@angular/core/testing'; + + flush(); + `, + expected: ` + import { type ComponentFixture } from '@angular/core/testing'; + + await vi.runAllTimersAsync(); + `, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); + }); + }); +}); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test.ts new file mode 100644 index 000000000000..0ba618005c6e --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test.ts @@ -0,0 +1,247 @@ +/** + * @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 ts from 'typescript'; +import { isNamedImportFrom } from '../utils/ast-helpers'; +import { ANGULAR_CORE_TESTING } from '../utils/constants'; +import { RefactorContext } from '../utils/refactor-context'; +import { addImportSpecifierRemoval, createViCallExpression } from '../utils/refactor-helpers'; + +export function transformFakeAsyncTest( + node: ts.Node, + ctx: RefactorContext, + currentOutermostDescribeContext?: CurrentOutermostDescribeContext, +): ts.Node { + // Transform the outermost describe block and skip others. + if (currentOutermostDescribeContext == null && _is.describe(node)) { + return _transformDescribeCall(node, ctx); + } + + // If we encounter a `fakeAsync` call while in a `describe` block, mark it in the context. + if ( + ts.isCallExpression(node) && + ts.isIdentifier(node.expression) && + node.expression.text === 'fakeAsync' && + currentOutermostDescribeContext != null && + node.arguments.length >= 1 && + _is.arrowOrFunction(node.arguments[0]) && + isNamedImportFrom(ctx.sourceFile, 'fakeAsync', ANGULAR_CORE_TESTING) + ) { + return _transformFakeAsyncCall(node, ctx, currentOutermostDescribeContext); + } + + // If we are in a `describe` block, visit the children recursively. + if (currentOutermostDescribeContext != null) { + return ts.visitEachChild( + node, + (child) => transformFakeAsyncTest(child, ctx, currentOutermostDescribeContext), + ctx.tsContext, + ); + } + + return node; +} + +function _transformDescribeCall(node: ts.CallExpression, ctx: RefactorContext): ts.CallExpression { + const currentOutermostDescribeContext: CurrentOutermostDescribeContext = { + isUsingFakeAsync: false, + }; + + // Visit children recursively to collect transform `fakeAsync usages + // within the describe block and detect their presence through `isUsingFakeAsync`. + node = ts.visitEachChild( + node, + (child) => transformFakeAsyncTest(child, ctx, currentOutermostDescribeContext), + ctx.tsContext, + ); + + const { isUsingFakeAsync } = currentOutermostDescribeContext; + + const describeBlock = _findDescribeBlock(node); + if (!isUsingFakeAsync || describeBlock === undefined) { + return node; + } + + addImportSpecifierRemoval(ctx, 'fakeAsync', ANGULAR_CORE_TESTING); + + return ts.factory.updateCallExpression(node, node.expression, node.typeArguments, [ + node.arguments[0], + ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock([ + ..._createFakeTimersHookStatements(ctx), + ...describeBlock.statements, + ]), + ), + ...node.arguments.slice(2), + ]); +} + +function _transformFakeAsyncCall( + node: ts.CallExpression, + ctx: RefactorContext, + currentOutermostDescribeContext: CurrentOutermostDescribeContext, +): ts.CallExpression | ts.ArrowFunction { + currentOutermostDescribeContext.isUsingFakeAsync = true; + + const fakeAsyncCallback = node.arguments[0]; + if (!_is.arrowOrFunction(fakeAsyncCallback)) { + return node; + } + const callbackBody = ts.isBlock(fakeAsyncCallback.body) + ? fakeAsyncCallback.body + : ts.factory.createBlock([ts.factory.createExpressionStatement(fakeAsyncCallback.body)]); + + ctx.reporter.reportTransformation( + ctx.sourceFile, + node, + `Transformed \`fakeAsync\` to \`vi.useFakeTimers\`.`, + ); + + let statements = callbackBody.statements; + + // Append `vi.runOnlyPendingTimersAsync()` as the last statement of `beforeEach` to mimic flush behavior. + if ( + ts.isCallExpression(node.parent) && + ts.isIdentifier(node.parent.expression) && + node.parent.expression.text === 'beforeEach' && + !_isFakeAsyncFlushDisabled(node) + ) { + statements = ts.factory.createNodeArray([ + ...statements, + ts.factory.createExpressionStatement( + ts.factory.createAwaitExpression(createViCallExpression(ctx, 'runOnlyPendingTimersAsync')), + ), + ]); + } + + return ts.factory.createArrowFunction( + [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)], + fakeAsyncCallback.typeParameters, + fakeAsyncCallback.parameters, + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock(statements), + ); +} + +function _createFakeTimersHookStatements(ctx: RefactorContext): ts.Statement[] { + return [ + // > beforeEach(() => { + // > vi.useFakeTimers({ + // > advanceTimeDelta: 1, + // > shouldAdvanceTime: true + // > }); + // > }); + ts.factory.createExpressionStatement( + ts.factory.createCallExpression(ts.factory.createIdentifier('beforeEach'), undefined, [ + ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock( + [ + ts.factory.createExpressionStatement( + createViCallExpression(ctx, 'useFakeTimers', [ + ts.factory.createObjectLiteralExpression([ + ts.factory.createPropertyAssignment( + 'advanceTimeDelta', + ts.factory.createNumericLiteral(1), + ), + ts.factory.createPropertyAssignment( + 'shouldAdvanceTime', + ts.factory.createTrue(), + ), + ]), + ]), + ), + ], + true, + ), + ), + ]), + ), + + // > afterEach(() => { + // > vi.useRealTimers(); + // > }); + ts.factory.createExpressionStatement( + ts.factory.createCallExpression(ts.factory.createIdentifier('afterEach'), undefined, [ + ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock( + [ts.factory.createExpressionStatement(createViCallExpression(ctx, 'useRealTimers'))], + true, + ), + ), + ]), + ), + ]; +} + +/** + * Detects if the `flush` option is set to false in the `fakeAsync` call expression. + * e.g. `fakeAsync(() => { ... }, { flush: false })` + */ +function _isFakeAsyncFlushDisabled(fakeAsyncCallExpression: ts.CallExpression): boolean { + const options = fakeAsyncCallExpression.arguments[1]; + + return ( + options && + ts.isObjectLiteralExpression(options) && + options.properties.some( + (property) => + ts.isPropertyAssignment(property) && + property.name.getText() === 'flush' && + property.initializer.getText() === 'false', + ) + ); +} + +interface CurrentOutermostDescribeContext { + isUsingFakeAsync: boolean; +} + +function _findDescribeBlock(node: ts.CallExpression): ts.Block | undefined { + const args = node.arguments; + const describeCallback = args.length >= 2 ? args[1] : undefined; + if (describeCallback !== undefined && _is.arrowOrFunction(describeCallback)) { + return _getFunctionBlock(describeCallback); + } + + return undefined; +} + +function _getFunctionBlock(node: ts.FunctionExpression | ts.ArrowFunction): ts.Block { + return ts.isBlock(node.body) + ? node.body + : ts.factory.createBlock([ts.factory.createExpressionStatement(node.body)]); +} + +const _is = { + arrowOrFunction: (node: ts.Node): node is ts.ArrowFunction | ts.FunctionExpression => + ts.isArrowFunction(node) || ts.isFunctionExpression(node), + describe: (node: ts.Node): node is ts.CallExpression => + ts.isCallExpression(node) && + // describe + ((ts.isIdentifier(node.expression) && node.expression.text === 'describe') || + // describe.only or describe.skip + (ts.isPropertyAccessExpression(node.expression) && + ts.isIdentifier(node.expression.expression) && + node.expression.expression.text === 'describe')), +}; diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test_spec.ts new file mode 100644 index 000000000000..9a0579d2d146 --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test_spec.ts @@ -0,0 +1,373 @@ +/** + * @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 { expectTransformation } from '../test-helpers'; + +describe('transformFakeAsyncTest', () => { + const testCases = [ + { + description: 'should transform fakeAsync test to `vi.useFakeTimers()`', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + it('works', async () => { + expect(1).toBe(1); + }); + }); + `, + }, + { + description: + 'should transform fakeAsync test to `vi.useFakeTimers()` and keep its arguments but not the return type', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync((strangeArg: Strange = myStrangeDefault): void => { + expect(1).toBe(1); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + it('works', async (strangeArg: Strange = myStrangeDefault) => { + expect(1).toBe(1); + }); + }); + `, + }, + { + description: 'should transform fakeAsync test to `vi.useFakeTimers()` in outer describe', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My non-fakeAsync suite', () => { + it('works', () => { + expect(1).toBe(1); + }); + }); + + describe('My outer fakeAsync suite', () => { + + describe('My inner fakeAsync suite', () => { + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + }); + + }); + + `, + expected: ` + describe('My non-fakeAsync suite', () => { + it('works', () => { + expect(1).toBe(1); + }); + }); + + describe('My outer fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + + describe('My inner fakeAsync suite', () => { + it('works', async () => { + expect(1).toBe(1); + }); + }); + }); + `, + }, + { + description: + 'should transform fakeAsync test to `vi.useFakeTimers()` in outer describe even if it is excluded', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My non-fakeAsync suite', () => { + it('works', () => { + expect(1).toBe(1); + }); + }); + + xdescribe('My outer fakeAsync suite', () => { + + describe('My inner fakeAsync suite', () => { + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + }); + + }); + + `, + expected: ` + describe('My non-fakeAsync suite', () => { + it('works', () => { + expect(1).toBe(1); + }); + }); + + describe.skip('My outer fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + + describe('My inner fakeAsync suite', () => { + it('works', async () => { + expect(1).toBe(1); + }); + }); + }); + `, + }, + { + description: + 'should transform fakeAsync test to `vi.useFakeTimers()` in `beforeEach` and preserve flush behavior', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + + let count = 0; + beforeEach(fakeAsync(() => { + setTimeout(() => ++count, 100); + })); + + it('works', fakeAsync(() => { + expect(count).toBe(1); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + + let count = 0; + beforeEach(async () => { + setTimeout(() => ++count, 100); + await vi.runOnlyPendingTimersAsync(); + }); + + it('works', async () => { + expect(count).toBe(1); + }); + }); + `, + }, + { + description: 'should transform fakeAsync test to `vi.useFakeTimers()` in `afterEach`', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + afterEach(fakeAsync(() => { + console.log('afterEach'); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + afterEach(async () => { + console.log('afterEach'); + }); + }); + `, + }, + { + description: 'should transform fakeAsync test to `vi.useFakeTimers()` in `beforeAll`', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + beforeAll(fakeAsync(() => { + console.log('beforeAll'); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + beforeAll(async () => { + console.log('beforeAll'); + }); + }); + `, + }, + { + description: 'should transform fakeAsync test to `vi.useFakeTimers()` in `afterAll`', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + afterAll(fakeAsync(() => { + console.log('afterAll'); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + afterAll(async () => { + console.log('afterAll'); + }); + }); + `, + }, + { + description: 'should not replace `fakeAsync` if not used within a describe block', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + `, + expected: ` + import { fakeAsync } from '@angular/core/testing'; + + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + `, + }, + { + description: 'should not replace `fakeAsync` if not imported from `@angular/core/testing`', + input: ` + import { fakeAsync } from './my-fake-async'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + }); + `, + expected: ` + import { fakeAsync } from './my-fake-async'; + + describe('My fakeAsync suite', () => { + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + }); + `, + }, + { + description: 'should not append `vi.runOnlyPendingTimersAsync()` in `test` or `afterEach`', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + afterEach(fakeAsync(() => { + console.log('afterEach'); + })); + + it('works', fakeAsync(() => { + expect(1).toBe(1); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + afterEach(async () => { + console.log('afterEach'); + }); + + it('works', async () => { + expect(1).toBe(1); + }); + }); + `, + }, + { + description: + 'should not append `vi.runOnlyPendingTimersAsync()` if `flush` option is set to false', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + beforeEach(fakeAsync(() => { + console.log('beforeEach'); + }, {flush: false})); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeEach(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterEach(() => { + vi.useRealTimers(); + }); + beforeEach(async () => { + console.log('beforeEach'); + }); + }); + `, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); + }); + }); +}); diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick.ts new file mode 100644 index 000000000000..91932bad957e --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick.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 ts from 'typescript'; +import { isNamedImportFrom } from '../utils/ast-helpers'; +import { ANGULAR_CORE_TESTING } from '../utils/constants'; +import { RefactorContext } from '../utils/refactor-context'; +import { addImportSpecifierRemoval, createViCallExpression } from '../utils/refactor-helpers'; + +export function transformFakeAsyncTick(node: ts.Node, ctx: RefactorContext): ts.Node { + if ( + !( + ts.isCallExpression(node) && + ts.isIdentifier(node.expression) && + node.expression.text === 'tick' && + isNamedImportFrom(ctx.sourceFile, 'tick', ANGULAR_CORE_TESTING) + ) + ) { + return node; + } + + ctx.reporter.reportTransformation( + ctx.sourceFile, + node, + `Transformed \`tick\` to \`await vi.advanceTimersByTimeAsync()\`.`, + ); + + addImportSpecifierRemoval(ctx, 'tick', ANGULAR_CORE_TESTING); + + const durationNumericLiteral = + node.arguments.length > 0 ? node.arguments[0] : ts.factory.createNumericLiteral(0); + + return ts.factory.createAwaitExpression( + createViCallExpression(ctx, 'advanceTimersByTimeAsync', [durationNumericLiteral]), + ); +} diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick_spec.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick_spec.ts new file mode 100644 index 000000000000..b8c3b947a160 --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick_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 { expectTransformation } from '../test-helpers'; + +describe('transformFakeAsyncTick', () => { + const testCases = [ + { + description: 'should replace `tick` with `vi.advanceTimersByTimeAsync`', + input: ` + import { tick } from '@angular/core/testing'; + + tick(100); + `, + expected: `await vi.advanceTimersByTimeAsync(100);`, + }, + { + description: + 'should replace `tick` with `vi.advanceTimersByTimeAsync` even if it using a non-literal argument', + input: ` + import { tick } from '@angular/core/testing'; + + const duration = 100; + tick(duration); + `, + expected: ` + const duration = 100; + await vi.advanceTimersByTimeAsync(duration); + `, + }, + { + description: 'should replace `tick()` with `vi.advanceTimersByTimeAsync(0)`', + input: ` + import { tick } from '@angular/core/testing'; + + tick(); + `, + expected: `await vi.advanceTimersByTimeAsync(0);`, + }, + { + description: 'should not replace `tick` if not imported from `@angular/core/testing`', + input: ` + import { tick } from './my-tick'; + + tick(100); + `, + expected: ` + import { tick } from './my-tick'; + + tick(100); + `, + }, + ]; + + testCases.forEach(({ description, input, expected }) => { + it(description, async () => { + await expectTransformation(input, expected); + }); + }); +}); 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 243eea1b2878..6832e36b9273 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-misc.ts @@ -14,16 +14,15 @@ */ import ts from 'typescript'; -import { addVitestValueImport, createViCallExpression } from '../utils/ast-helpers'; +import { addVitestValueImport } from '../utils/ast-helpers'; import { getJasmineMethodName, isJasmineCallExpression } from '../utils/ast-validation'; import { addTodoComment } from '../utils/comment-helpers'; import { RefactorContext } from '../utils/refactor-context'; +import { createViCallExpression } from '../utils/refactor-helpers'; import { TodoCategory } from '../utils/todo-notes'; -export function transformTimerMocks( - node: ts.Node, - { sourceFile, reporter, pendingVitestValueImports }: RefactorContext, -): ts.Node { +export function transformTimerMocks(node: ts.Node, ctx: RefactorContext): ts.Node { + const { sourceFile, reporter, pendingVitestValueImports } = ctx; if ( !ts.isCallExpression(node) || !ts.isPropertyAccessExpression(node.expression) || @@ -85,7 +84,7 @@ export function transformTimerMocks( ]; } - return createViCallExpression(newMethodName, newArgs); + return createViCallExpression(ctx, newMethodName, newArgs); } return node; @@ -173,15 +172,16 @@ export function transformJasmineMembers(node: ts.Node, refactorCtx: RefactorCont function transformJasmineDefaultTimeoutInterval( expression: ts.ExpressionStatement, timeoutValue: ts.Expression, - { sourceFile, reporter, pendingVitestValueImports }: RefactorContext, + ctx: RefactorContext, ): ts.Node { + const { sourceFile, reporter, pendingVitestValueImports } = ctx; addVitestValueImport(pendingVitestValueImports, 'vi'); reporter.reportTransformation( sourceFile, expression, 'Transformed `jasmine.DEFAULT_TIMEOUT_INTERVAL` to `vi.setConfig()`.', ); - const setConfigCall = createViCallExpression('setConfig', [ + const setConfigCall = createViCallExpression(ctx, 'setConfig', [ ts.factory.createObjectLiteralExpression( [ts.factory.createPropertyAssignment('testTimeout', timeoutValue)], false, 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 2c9b6f8cc686..c840c374976d 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts @@ -17,12 +17,12 @@ import ts from 'typescript'; import { addVitestValueImport, createPropertyAccess, - createViCallExpression, getPromiseResolveRejectMethod, } from '../utils/ast-helpers'; import { getJasmineMethodName, isJasmineCallExpression } from '../utils/ast-validation'; 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; @@ -219,10 +219,8 @@ export function transformSpies(node: ts.Node, refactorCtx: RefactorContext): ts. return node; } -export function transformCreateSpy( - node: ts.Node, - { reporter, sourceFile, pendingVitestValueImports }: RefactorContext, -): ts.Node { +export function transformCreateSpy(node: ts.Node, ctx: RefactorContext): ts.Node { + const { reporter, sourceFile, pendingVitestValueImports } = ctx; if (!isJasmineCallExpression(node, 'createSpy')) { return node; } @@ -236,6 +234,7 @@ export function transformCreateSpy( const spyName = node.arguments[0]; const viFnCallExpression = createViCallExpression( + ctx, 'fn', node.arguments.length > 1 ? [node.arguments[1]] : [], ); @@ -251,10 +250,8 @@ export function transformCreateSpy( ); } -export function transformCreateSpyObj( - node: ts.Node, - { sourceFile, reporter, pendingVitestValueImports }: RefactorContext, -): ts.Node { +export function transformCreateSpyObj(node: ts.Node, ctx: RefactorContext): ts.Node { + const { reporter, sourceFile, pendingVitestValueImports } = ctx; if (!isJasmineCallExpression(node, 'createSpyObj')) { return node; } @@ -282,9 +279,9 @@ export function transformCreateSpyObj( } if (ts.isArrayLiteralExpression(methods)) { - properties = createSpyObjWithArray(methods, baseName); + properties = createSpyObjWithArray(ctx, methods, baseName); } else if (ts.isObjectLiteralExpression(methods)) { - properties = createSpyObjWithObject(methods, baseName); + properties = createSpyObjWithObject(ctx, methods, baseName); } else { const category = 'createSpyObj-dynamic-variable'; reporter.recordTodo(category, sourceFile, node); @@ -307,13 +304,14 @@ export function transformCreateSpyObj( } function createSpyObjWithArray( + ctx: RefactorContext, methods: ts.ArrayLiteralExpression, baseName: string | undefined, ): ts.PropertyAssignment[] { return methods.elements .map((element) => { if (ts.isStringLiteral(element)) { - const mockFn = createViCallExpression('fn'); + const mockFn = createViCallExpression(ctx, 'fn'); const methodName = element.text; let finalExpression: ts.Expression = mockFn; @@ -337,6 +335,7 @@ function createSpyObjWithArray( } function createSpyObjWithObject( + ctx: RefactorContext, methods: ts.ObjectLiteralExpression, baseName: string | undefined, ): ts.PropertyAssignment[] { @@ -345,7 +344,7 @@ function createSpyObjWithObject( if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) { const methodName = prop.name.text; const returnValue = prop.initializer; - let mockFn = createViCallExpression('fn'); + let mockFn = createViCallExpression(ctx, 'fn'); if (baseName) { mockFn = ts.factory.createCallExpression( @@ -506,6 +505,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) { @@ -517,6 +563,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..97881049c1d5 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 @@ -270,6 +270,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/ast-helpers.ts b/packages/schematics/angular/refactor/jasmine-vitest/utils/ast-helpers.ts index 8cbf089d05a8..19326338e831 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/utils/ast-helpers.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/utils/ast-helpers.ts @@ -48,32 +48,17 @@ export function getVitestAutoImports( allSpecifiers.sort((a, b) => a.name.text.localeCompare(b.name.text)); - const importClause = ts.factory.createImportClause( - isClauseTypeOnly, // Set isTypeOnly on the clause if only type imports - undefined, - ts.factory.createNamedImports(allSpecifiers), - ); - return ts.factory.createImportDeclaration( undefined, - importClause, + ts.factory.createImportClause( + isClauseTypeOnly, // Set isTypeOnly on the clause if only type imports + undefined, + ts.factory.createNamedImports(allSpecifiers), + ), ts.factory.createStringLiteral('vitest'), ); } -export function createViCallExpression( - methodName: string, - args: readonly ts.Expression[] = [], - typeArgs: ts.TypeNode[] | undefined = undefined, -): ts.CallExpression { - const callee = ts.factory.createPropertyAccessExpression( - ts.factory.createIdentifier('vi'), - methodName, - ); - - return ts.factory.createCallExpression(callee, typeArgs, args); -} - export function createExpectCallExpression( args: ts.Expression[], typeArgs: ts.TypeNode[] | undefined = undefined, @@ -121,3 +106,102 @@ export function getPromiseResolveRejectMethod(node: ts.Node): { arguments: node.arguments, }; } + +/** + * Checks if a named binding is imported from the given module in the source file. + * @param sourceFile The source file to search for imports. + * @param name The import name (e.g. 'flush', 'tick'). + * @param moduleSpecifier The module path (e.g. '@angular/core/testing'). + */ +export function isNamedImportFrom( + sourceFile: ts.SourceFile, + name: string, + moduleSpecifier: string, +): boolean { + return sourceFile.statements.some((statement) => { + if (!_isImportDeclarationWithNamedBindings(statement)) { + return false; + } + + const specifier = statement.moduleSpecifier; + const modulePath = ts.isStringLiteralLike(specifier) ? specifier.text : null; + if (modulePath !== moduleSpecifier) { + return false; + } + for (const element of statement.importClause.namedBindings.elements) { + const importedName = element.propertyName ? element.propertyName.text : element.name.text; + if (importedName === name) { + return true; + } + } + }); +} + +/** + * Removes specified import specifiers from ImportDeclarations. + * If all specifiers are removed from an import, the entire import is dropped. + */ +export function removeImportSpecifiers( + sourceFile: ts.SourceFile, + removals: Map>, +): ts.SourceFile { + const newStatements = sourceFile.statements + .map((statement) => { + if (!_isImportDeclarationWithNamedBindings(statement)) { + return statement; + } + + const specifier = statement.moduleSpecifier; + const modulePath = ts.isStringLiteralLike(specifier) ? specifier.text : null; + if (modulePath === null) { + return statement; + } + + const namesToRemove = removals.get(modulePath); + if (namesToRemove === undefined || namesToRemove.size === 0) { + return statement; + } + + const remaining = statement.importClause.namedBindings.elements.filter((el) => { + const name = el.propertyName ? el.propertyName.text : el.name.text; + + return !namesToRemove.has(name); + }); + + if (remaining.length === 0) { + return; + } + + if (remaining.length === statement.importClause.namedBindings.elements.length) { + return statement; + } + + return ts.factory.updateImportDeclaration( + statement, + statement.modifiers, + ts.factory.updateImportClause( + statement.importClause, + undefined, + statement.importClause.name, + ts.factory.createNamedImports(remaining), + ), + statement.moduleSpecifier, + statement.attributes, + ); + }) + .filter((statement) => statement !== undefined); + + return ts.factory.updateSourceFile(sourceFile, newStatements); +} + +function _isImportDeclarationWithNamedBindings( + statement: ts.Statement, +): statement is ts.ImportDeclaration & { + importClause: ts.ImportClause & { namedBindings: ts.NamedImports }; +} { + return ( + ts.isImportDeclaration(statement) && + statement.importClause?.namedBindings !== undefined && + ts.isNamedImports(statement.importClause.namedBindings) + ); +} diff --git a/packages/schematics/angular/refactor/jasmine-vitest/utils/constants.ts b/packages/schematics/angular/refactor/jasmine-vitest/utils/constants.ts new file mode 100644 index 000000000000..23407fee97da --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/utils/constants.ts @@ -0,0 +1,9 @@ +/** + * @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 + */ + +export const ANGULAR_CORE_TESTING = '@angular/core/testing'; diff --git a/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-context.ts b/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-context.ts index d2599ed16ed7..6aa7052685d3 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-context.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-context.ts @@ -28,6 +28,12 @@ export interface RefactorContext { /** A set of Vitest type imports to be added to the file. */ readonly pendingVitestTypeImports: Set; + + /** + * Map of module specifier -> names to remove from that import. + * Used when transforming identifiers that become inlined (e.g. flush -> vi.runAllTimersAsync). + */ + readonly pendingImportSpecifierRemovals: Map>; } /** diff --git a/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-helpers.ts b/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-helpers.ts new file mode 100644 index 000000000000..616c1bae6114 --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-helpers.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 ts from 'typescript'; +import { RefactorContext } from './refactor-context'; + +/** + * Marks an identifier to be removed from an import specifier. + * + * @param ctx The refactor context object. + * @param name The name of the identifier to remove from the import specifier. + * @param moduleSpecifier The module specifier to remove the identifier from. + */ +export function addImportSpecifierRemoval( + ctx: RefactorContext, + name: string, + moduleSpecifier: string, +): void { + const removals = ctx.pendingImportSpecifierRemovals.get(moduleSpecifier) ?? new Set(); + removals.add(name); + ctx.pendingImportSpecifierRemovals.set(moduleSpecifier, removals); +} + +/** + * Creates a call expression to a vitest method. + * This also adds the `vi` identifier to the context object, + * to import it later if addImports option is enabled. + * + * @param ctx The refactor context object. + * @param args The arguments to pass to the method. + * @param typeArgs The type arguments to pass to the method. + * @param methodeName The name of the vitest method to call. + * @returns The created identifier node. + */ +export function createViCallExpression( + ctx: RefactorContext, + methodName: string, + args: readonly ts.Expression[] = [], + typeArgs: ts.TypeNode[] | undefined = undefined, +): ts.CallExpression { + const vi = requireVitestIdentifier(ctx, 'vi'); + const callee = ts.factory.createPropertyAccessExpression(vi, methodName); + + return ts.factory.createCallExpression(callee, typeArgs, args); +} + +/** + * Creates an identifier for a vitest value import. + * This also adds the identifier to the context object, + * to import it later if addImports option is enabled. + * + * @param ctx The refactor context object. + * @param name The name of the vitest identifier to require. + * @returns The created identifier node. + */ +export function requireVitestIdentifier(ctx: RefactorContext, name: string): ts.Identifier { + ctx.pendingVitestValueImports.add(name); + + return ts.factory.createIdentifier(name); +} diff --git a/packages/schematics/angular/refactor/jasmine-vitest/utils/todo-notes.ts b/packages/schematics/angular/refactor/jasmine-vitest/utils/todo-notes.ts index 2a3f155a9393..598606d7bde6 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/utils/todo-notes.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/utils/todo-notes.ts @@ -178,6 +178,13 @@ export const TODO_NOTES = { 'unhandled-done-usage': { message: "The 'done' callback was used in an unhandled way. Please migrate manually.", }, + 'flush-max-turns': { + message: + 'flush(maxTurns) was called but maxTurns parameter is not migrated. Please migrate manually.', + }, + 'flush-return-value': { + message: 'flush() return value is not migrated. Please migrate manually.', + }, } as const; /** diff --git a/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template b/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template index de24346572c2..3b9a10da6ce4 100644 --- a/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template +++ b/packages/schematics/angular/service/files/__name@dasherize__.__type@dasherize__.ts.template @@ -1,8 +1,8 @@ -import { Injectable } from '@angular/core'; +import { <%= injectable ? 'Injectable' : 'Service' %> } from '@angular/core'; -@Injectable({ +<% if (injectable) { %>@Injectable({ providedIn: 'root', -}) +})<% } else { %>@Service()<% } %> export class <%= classifiedName %> { } diff --git a/packages/schematics/angular/service/index_spec.ts b/packages/schematics/angular/service/index_spec.ts index 56ae5edd2428..023b738b46c7 100644 --- a/packages/schematics/angular/service/index_spec.ts +++ b/packages/schematics/angular/service/index_spec.ts @@ -36,6 +36,7 @@ describe('Service Schematic', () => { skipPackageJson: false, }; let appTree: UnitTestTree; + beforeEach(async () => { appTree = await schematicRunner.runSchematic('workspace', workspaceOptions); appTree = await schematicRunner.runSchematic('application', appOptions, appTree); @@ -50,12 +51,23 @@ describe('Service Schematic', () => { expect(files).toContain('/projects/bar/src/app/foo/foo.ts'); }); - it('service should be tree-shakeable', async () => { + it('should use @Service decorator', async () => { const options = { ...defaultOptions }; const tree = await schematicRunner.runSchematic('service', options, appTree); const content = tree.readContent('/projects/bar/src/app/foo/foo.ts'); + expect(content).toMatch(/@Service\(\)/); + expect(content).toMatch(/import \{ Service \} from '@angular\/core'/); + }); + + it('should use @Injectable decorator when injectable flag is true', async () => { + const options = { ...defaultOptions, injectable: true }; + + const tree = await schematicRunner.runSchematic('service', options, appTree); + const content = tree.readContent('/projects/bar/src/app/foo/foo.ts'); + expect(content).toMatch(/@Injectable\(/); expect(content).toMatch(/providedIn: 'root',/); + expect(content).toMatch(/import \{ Injectable \} from '@angular\/core'/); }); it('should respect the skipTests flag', async () => { diff --git a/packages/schematics/angular/service/schema.json b/packages/schematics/angular/service/schema.json index 19afac150262..a3ebf9d3a3fe 100644 --- a/packages/schematics/angular/service/schema.json +++ b/packages/schematics/angular/service/schema.json @@ -48,6 +48,11 @@ "type": "boolean", "default": true, "description": "When true, the 'type' option will be appended to the generated class name. When false, only the file name will include the type." + }, + "injectable": { + "type": "boolean", + "default": false, + "description": "When true, generates an `@Injectable` instead of `@Service`." } }, "required": ["name", "project"] diff --git a/packages/schematics/angular/utility/latest-versions/package.json b/packages/schematics/angular/utility/latest-versions/package.json index e59890243153..4ad8149fe646 100644 --- a/packages/schematics/angular/utility/latest-versions/package.json +++ b/packages/schematics/angular/utility/latest-versions/package.json @@ -27,6 +27,7 @@ "typescript": "~6.0.2", "vitest": "^4.0.8", "@vitest/coverage-v8": "^4.0.8", + "@vitest/coverage-istanbul": "^4.0.8", "@vitest/browser-playwright": "^4.0.8", "@vitest/browser-webdriverio": "^4.0.8", "@vitest/browser-preview": "^4.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b56d10ced317..1e9341535183 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,11 +14,11 @@ importers: .: dependencies: '@angular/compiler-cli': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3) typescript: - specifier: 6.0.2 - version: 6.0.2 + specifier: 6.0.3 + version: 6.0.3 dependenciesMeta: esbuild: built: true @@ -26,44 +26,44 @@ importers: built: true devDependencies: '@angular/animations': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/cdk': - specifier: 22.0.0-next.5 - version: 22.0.0-next.5(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/common': specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + version: 22.0.0-next.8(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + '@angular/common': + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8 + specifier: 22.0.0-next.12 + version: 22.0.0-next.12 '@angular/core': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) '@angular/forms': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/localize': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/compiler-cli@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.2))(@angular/compiler@22.0.0-next.8) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3))(@angular/compiler@22.0.0-next.12) '@angular/material': - specifier: 22.0.0-next.5 - version: 22.0.0-next.5(5497bbcfb1239c9f845ffb9323badfbb) + specifier: 22.0.0-next.8 + version: 22.0.0-next.8(93ce75c341587667f5d7d40f3eefe13f) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#40e97052a6e9a06c880b7f2d6de9bfa70a326a52 - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/40e97052a6e9a06c880b7f2d6de9bfa70a326a52(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#2c36222db3f44751284cc93b3806dbe1baee583a + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2c36222db3f44751284cc93b3806dbe1baee583a(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) '@angular/platform-browser': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/platform-server': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.8)(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.12)(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/service-worker': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@babel/core': specifier: 7.29.0 version: 7.29.0 @@ -78,34 +78,34 @@ importers: version: 0.28.0 '@eslint/compat': specifier: 2.0.5 - version: 2.0.5(eslint@10.2.1(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.2.1(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) + version: 6.0.0(rollup@4.60.3) '@rollup/plugin-commonjs': specifier: ^29.0.0 - version: 29.0.2(rollup@4.60.2) + version: 29.0.2(rollup@4.60.3) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.60.2) + version: 6.1.0(rollup@4.60.3) '@rollup/plugin-node-resolve': specifier: 16.0.3 - version: 16.0.3(rollup@4.60.2) + version: 16.0.3(rollup@4.60.3) '@rollup/wasm-node': - specifier: 4.60.2 - version: 4.60.2 + specifier: 4.60.3 + version: 4.60.3 '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.10.0(eslint@10.2.1(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.3(eslint@10.2.1(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 @@ -144,7 +144,7 @@ importers: version: 4.17.24 '@types/node': specifier: ^22.12.0 - version: 22.19.17 + version: 22.19.18 '@types/npm-package-arg': specifier: ^6.1.0 version: 6.1.4 @@ -173,14 +173,14 @@ importers: specifier: ^1.1.5 version: 1.1.9 '@typescript-eslint/eslint-plugin': - specifier: 8.58.2 - version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.59.2 + version: 8.59.2(@typescript-eslint/parser@8.59.2(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.58.2 - version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.59.2 + version: 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) ajv: - specifier: 8.18.0 - version: 8.18.0 + specifier: 8.20.0 + version: 8.20.0 buffer: specifier: 6.0.3 version: 6.0.3 @@ -191,14 +191,14 @@ importers: specifier: 0.28.0 version: 0.28.0 eslint: - specifier: 10.2.1 - version: 10.2.1(jiti@2.6.1) + specifier: 10.3.0 + version: 10.3.0(jiti@2.7.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@10.2.1(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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.1(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.59.2(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 @@ -206,14 +206,14 @@ importers: specifier: 3.3.3 version: 3.3.3 globals: - specifier: 17.5.0 - version: 17.5.0 + specifier: 17.6.0 + version: 17.6.0 http-proxy: specifier: ^1.18.1 - version: 1.18.1(debug@4.4.3) + version: 1.18.1 http-proxy-middleware: - specifier: 3.0.5 - version: 3.0.5 + specifier: 4.0.0 + version: 4.0.0 husky: specifier: 9.1.7 version: 9.1.7 @@ -257,23 +257,23 @@ importers: specifier: ^3.0.0 version: 3.8.3 puppeteer: - specifier: 24.41.0 - version: 24.41.0(bufferutil@4.1.0)(typescript@6.0.2)(utf-8-validate@6.0.6) + specifier: 24.43.0 + version: 24.43.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6) quicktype-core: specifier: 23.2.6 version: 23.2.6(encoding@0.1.13) rollup: - specifier: 4.60.2 - version: 4.60.2 + specifier: 4.60.3 + version: 4.60.3 rollup-license-plugin: specifier: ~3.2.0 version: 3.2.1 rollup-plugin-dts: specifier: 6.4.1 - version: 6.4.1(rollup@4.60.2)(typescript@6.0.2) + version: 6.4.1(rollup@4.60.3)(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.19.18)(rollup@4.60.3) semver: specifier: 7.7.4 version: 7.7.4 @@ -284,8 +284,8 @@ importers: specifier: 2.8.1 version: 2.8.1 undici: - specifier: 8.1.0 - version: 8.1.0 + specifier: 8.2.0 + version: 8.2.0 unenv: specifier: ^1.10.0 version: 1.10.0 @@ -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.1 zone.js: specifier: ^0.16.0 - version: 0.16.1 + version: 0.16.2 modules/testing/builder: devDependencies: @@ -314,8 +314,8 @@ importers: specifier: workspace:* version: link:../../../packages/angular/ssr '@vitest/coverage-v8': - specifier: 4.1.4 - version: 4.1.4(vitest@4.1.4) + specifier: 4.1.5 + version: 4.1.5(vitest@4.1.5) browser-sync: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) @@ -323,17 +323,17 @@ importers: specifier: 6.0.3 version: 6.0.3 jsdom: - specifier: 29.0.2 - version: 29.0.2 + 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.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.0-next.4 + version: 22.0.0-next.4(@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.4 - version: 4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jiti@2.6.1)(jsdom@29.0.2)(less@4.6.4)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + 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.7.0)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) packages/angular/build: dependencies: @@ -357,7 +357,7 @@ importers: version: 6.0.12(@types/node@24.12.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.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.3.0(vite@7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) beasties: specifier: 0.4.2 version: 0.4.2 @@ -392,8 +392,8 @@ importers: specifier: 5.1.4 version: 5.1.4 rollup: - specifier: 4.60.2 - version: 4.60.2 + specifier: 4.60.3 + version: 4.60.3 sass: specifier: 1.99.0 version: 1.99.0 @@ -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.1)(tsx@4.21.0)(yaml@2.8.3) + specifier: 7.3.3 + version: 7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) watchpack: specifier: 2.5.1 version: 2.5.1 @@ -423,26 +423,26 @@ importers: specifier: 6.0.3 version: 6.0.3 jsdom: - specifier: 29.0.2 - version: 29.0.2 + specifier: 29.1.1 + version: 29.1.1 less: 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.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.0-next.4 + version: 22.0.0-next.4(@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) postcss: - specifier: 8.5.10 - version: 8.5.10 + specifier: 8.5.14 + version: 8.5.14 rolldown: - specifier: 1.0.0-rc.16 - version: 1.0.0-rc.16 + specifier: 1.0.0 + version: 1.0.0 rxjs: specifier: 7.8.2 version: 7.8.2 vitest: - specifier: 4.1.4 - version: 4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jiti@2.6.1)(jsdom@29.0.2)(less@4.6.4)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + 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.7.0)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) optionalDependencies: lmdb: specifier: 3.5.4 @@ -467,7 +467,7 @@ importers: version: 4.2.3(@inquirer/prompts@8.4.2(@types/node@24.12.2))(@types/node@24.12.2)(listr2@10.2.1) '@modelcontextprotocol/sdk': specifier: 1.29.0 - version: 1.29.0(zod@4.3.6) + version: 1.29.0(zod@4.4.3) '@schematics/angular': specifier: workspace:0.0.0-PLACEHOLDER version: link:../../schematics/angular @@ -475,8 +475,8 @@ importers: specifier: 1.1.0 version: 1.1.0 algoliasearch: - specifier: 5.50.2 - version: 5.50.2 + specifier: 5.52.1 + version: 5.52.1 ini: specifier: 6.0.0 version: 6.0.0 @@ -502,8 +502,8 @@ importers: specifier: 18.0.0 version: 18.0.0 zod: - specifier: 4.3.6 - version: 4.3.6 + specifier: 4.4.3 + version: 4.4.3 packages/angular/pwa: dependencies: @@ -527,23 +527,23 @@ importers: specifier: workspace:* version: link:../../angular_devkit/schematics '@angular/common': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8 + specifier: 22.0.0-next.12 + version: 22.0.0-next.12 '@angular/core': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) '@angular/platform-browser': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/platform-server': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.8)(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.12)(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular @@ -599,14 +599,14 @@ importers: specifier: 7.29.0 version: 7.29.0(@babel/core@7.29.0) '@babel/preset-env': - specifier: 7.29.2 - version: 7.29.2(@babel/core@7.29.0) + specifier: 7.29.5 + version: 7.29.5(@babel/core@7.29.0) '@babel/runtime': specifier: 7.29.2 version: 7.29.2 '@discoveryjs/json-ext': - specifier: 1.0.0 - version: 1.0.0 + specifier: 1.1.0 + version: 1.1.0 '@ngtools/webpack': specifier: workspace:0.0.0-PLACEHOLDER version: link:../../ngtools/webpack @@ -615,25 +615,25 @@ importers: version: 4.1.3 autoprefixer: specifier: 10.5.0 - version: 10.5.0(postcss@8.5.10) + version: 10.5.0(postcss@8.5.14) 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.0)(postcss@8.5.14)) browserslist: specifier: ^4.26.0 version: 4.28.2 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.0)(postcss@8.5.14)) 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.0)(postcss@8.5.14)) esbuild-wasm: specifier: 0.28.0 version: 0.28.0 http-proxy-middleware: - specifier: 3.0.5 - version: 3.0.5 + specifier: 4.0.0 + version: 4.0.0 istanbul-lib-instrument: specifier: 6.0.3 version: 6.0.3 @@ -648,22 +648,22 @@ 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.0)(postcss@8.5.14)) 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.0)(postcss@8.5.14)) 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.0)(postcss@8.5.14)) open: specifier: 11.0.0 version: 11.0.0 ora: - specifier: 9.3.0 - version: 9.3.0 + specifier: 9.4.0 + version: 9.4.0 picomatch: specifier: 4.0.4 version: 4.0.4 @@ -671,11 +671,11 @@ importers: specifier: 5.1.4 version: 5.1.4 postcss: - specifier: 8.5.10 - version: 8.5.10 + specifier: 8.5.14 + version: 8.5.14 postcss-loader: specifier: 8.2.1 - version: 8.2.1(postcss@8.5.10)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)) + version: 8.2.1(postcss@8.5.14)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.14)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -687,19 +687,19 @@ 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.0)(postcss@8.5.14)) 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.0)(postcss@8.5.14)) source-map-support: specifier: 0.5.21 version: 0.5.21 terser: - specifier: 5.46.1 - version: 5.46.1 + specifier: 5.47.1 + version: 5.47.1 tinyglobby: specifier: 0.2.16 version: 0.2.16 @@ -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.0)(postcss@8.5.14) 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.0)(postcss@8.5.14)) 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.0)(postcss@8.5.14)) 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.0)(postcss@8.5.14)) devDependencies: '@angular/ssr': specifier: workspace:* @@ -729,11 +729,11 @@ 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.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.0-next.4 + version: 22.0.0-next.4(@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) undici: - specifier: 8.1.0 - version: 8.1.0 + specifier: 8.2.0 + version: 8.2.0 optionalDependencies: esbuild: specifier: 0.28.0 @@ -764,11 +764,11 @@ importers: packages/angular_devkit/core: dependencies: ajv: - specifier: 8.18.0 - version: 8.18.0 + specifier: 8.20.0 + version: 8.20.0 ajv-formats: specifier: 3.0.1 - version: 3.0.1(ajv@8.18.0) + version: 3.0.1(ajv@8.20.0) jsonc-parser: specifier: 3.3.1 version: 3.3.1 @@ -798,8 +798,8 @@ importers: specifier: 0.30.21 version: 0.30.21 ora: - specifier: 9.3.0 - version: 9.3.0 + specifier: 9.4.0 + version: 9.4.0 rxjs: specifier: 7.8.2 version: 7.8.2 @@ -822,14 +822,14 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../angular_devkit/core '@angular/compiler': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8 + specifier: 22.0.0-next.12 + version: 22.0.0-next.12 '@angular/compiler-cli': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.2) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3) typescript: - specifier: 6.0.2 - version: 6.0.2 + specifier: 6.0.3 + version: 6.0.3 webpack: specifier: 5.106.2 version: 5.106.2(esbuild@0.28.0) @@ -858,124 +858,124 @@ importers: specifier: 3.1.4 version: 3.1.4 tar-stream: - specifier: 3.1.8 - version: 3.1.8 + specifier: 3.2.0 + version: 3.2.0 packages: - '@actions/core@3.0.0': - resolution: {integrity: sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==} + '@actions/core@3.0.1': + resolution: {integrity: sha512-a6d/Nwahm9fliVGRhdhofo40HjHQasUPusmc7vBfyky+7Z+P2A1J68zyFVaNcEclc/Se+eO595oAr5nwEIoIUA==} '@actions/exec@3.0.0': resolution: {integrity: sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==} - '@actions/http-client@4.0.0': - resolution: {integrity: sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==} + '@actions/http-client@4.0.1': + resolution: {integrity: sha512-+Nvd1ImaOZBSoPbsUtEhv+1z99H12xzncCkz0a3RuehINE81FZSe2QTj3uvAPTcJX/SCzUQHQ0D1GrPMbrPitg==} '@actions/io@3.0.2': resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} - '@algolia/abtesting@1.16.2': - resolution: {integrity: sha512-n9s6bEV6imdtIEd+BGP7WkA4pEZ5YTdgQ05JQhHwWawHg3hyjpNwC0TShGz6zWhv+jfLDGA/6FFNbySFS0P9cw==} + '@algolia/abtesting@1.18.1': + resolution: {integrity: sha512-aehCadlWOGvrT91KUIZpC0MbB8KBW9yUuvTJFd2xesR7le/IsT4nJUnjCCZ4ZqZCeTcPHPV5mo//fZ5oxcSVYw==} engines: {node: '>= 14.0.0'} - '@algolia/client-abtesting@5.50.2': - resolution: {integrity: sha512-52iq0vHy1sphgnwoZyx5PmbEt8hsh+m7jD123LmBs6qy4GK7LbYZIeKd+nSnSipN2zvKRZ2zScS6h9PW3J7SXg==} + '@algolia/client-abtesting@5.52.1': + resolution: {integrity: sha512-HmXOGBOAOJPounpBzBpuY0zDYeiCpxgHnQmuA7JO6ScukcBdGp3/XM9zJk5pJx/xNGD68mbPGXWpDxGtl6BwDQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.50.2': - resolution: {integrity: sha512-WpPIUg+cSG2aPUG0gS8Ko9DwRgbRPUZxJkolhL2aCsmSlcEEZT65dILrfg5ovcxtx0Kvr+xtBVsTMtsQWRtPDQ==} + '@algolia/client-analytics@5.52.1': + resolution: {integrity: sha512-5oo4+I8iixie9vXhCyNFCzeIr8pqA3FQ//VsLHTDvZAV4ttYOPGvYHGQq5NSalrLx5Jc3dRro/5uDOlnUMcBJg==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.50.2': - resolution: {integrity: sha512-Gj2MgtArGcsr82kIqRlo6/dCAFjrs2gLByEqyRENuT7ugrSMFuqg1vDzeBjRL1t3EJEJCFtT0PLX3gB8A6Hq4Q==} + '@algolia/client-common@5.52.1': + resolution: {integrity: sha512-qCDoZfx5MpX7XQzvQ3bC4tSEMkQWQMaF/ABtLuoze03Y/flR563CCSws02qIJ23oX7lxl92LsilZjINVyTdtLw==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.50.2': - resolution: {integrity: sha512-CUqoid5jDpmrc0oK3/xuZXFt6kwT0P9Lw7/nsM14YTr6puvmi+OUKmURpmebQF22S2vCG8L1DAoXXujxQUi/ug==} + '@algolia/client-insights@5.52.1': + resolution: {integrity: sha512-hnGs0/lsFJ2PWDxNBz7pxreXo/Xz7gxYRcfePBUjsH26ad0kU/sgnVZd9LwWBpsQv65z2jlb5dkyaB9WE9M9FQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.50.2': - resolution: {integrity: sha512-AndZWFoc0gbP5901OeQJ73BazgGgSGiBEba4ohdoJuZwHTO2Gio8Q4L1VLmytMBYcviVigB0iICToMvEJxI4ug==} + '@algolia/client-personalization@5.52.1': + resolution: {integrity: sha512-2VxxNc/uBysyKvGeBdSM5n9eIDKH8kWD7wd9/yqbJAiVwU4Yv6tU1LSJusHKrXV/aCu1KW7t9Gug9QyeEmtn/Q==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.50.2': - resolution: {integrity: sha512-NWoL+psEkz5dIzweaByVXuEB45wS8/rk0E0AhMMnaVJdVs7TcACPH2/OURm+N0xRDITkTHqCna823rd6Uqntdg==} + '@algolia/client-query-suggestions@5.52.1': + resolution: {integrity: sha512-O6mPtsw3xEfNOe6gWFpYLeAZAIljNa4Hgna3bq15PwyN7nbjTY0wXJFRbzs/0YVf75Br+SbOQUmjKxXYjDiSiQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.50.2': - resolution: {integrity: sha512-ypSboUJ3XJoQz5DeDo82hCnrRuwq3q9ZdFhVKAik9TnZh1DvLqoQsrbBjXg7C7zQOtV/Qbge/HmyoV6V5L7MhQ==} + '@algolia/client-search@5.52.1': + resolution: {integrity: sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.50.2': - resolution: {integrity: sha512-VlR2FRXLw2bCB94SQo6zxg/Qi+547aOji6Pb+dKE7h1DMCCY317St+OpjpmgzE+bT2O9ALIc0V4nVIBOd7Gy+Q==} + '@algolia/ingestion@1.52.1': + resolution: {integrity: sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.50.2': - resolution: {integrity: sha512-Cmvfp2+qopzQt8OilU97rhLhosq7ZrB6uieok3EwFUqG/aalPg6DgfCmu0yJMrYe+KMC1qRVt1MTRAUwLknUMQ==} + '@algolia/monitoring@1.52.1': + resolution: {integrity: sha512-a3SGNceHmkQfq77iG8Ka+w1pvwfZa/0lzEIgse30fL0kD+yKnd/dg0dQvSfFPAEt2f21DMcGkDSSeJlO3KdQjQ==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.50.2': - resolution: {integrity: sha512-jrkuyKoOM7dFWQ/6Y4hQAse2SC3L/RldG6GnPjMvAj65h+7Ubb51S0pKk4ofSStF0xm4LCNe0C4T6XX4nOFDiQ==} + '@algolia/recommend@5.52.1': + resolution: {integrity: sha512-z98QEguCFDpxb4S/PyrUK1igqF8tPsdbqOUUO6ON91vJ58w+Gwa6ncrI0oNXSFcrkxA5EqPKPQ2A1PBCn08TYQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.50.2': - resolution: {integrity: sha512-4107YLJqCudPiBUlwnk6oTSUVwU7ab+qL1SfQGEDYI8DZH5gsf1ekPt9JykXRKYXf2IfouFL5GiCY/PHTFIjYw==} + '@algolia/requester-browser-xhr@5.52.1': + resolution: {integrity: sha512-CI7+/0I11QeZM59Uc8whd2or0kqzFVjpaPn9Qpwll/krHcBAxk24WkAQ6WX+IwDVMfpont4YGbKwAmCre3vE8Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.50.2': - resolution: {integrity: sha512-vOrd3MQpLgmf6wXAueTuZ/cA0W4uRwIHHaxNy3h+a6YcNn6bCV/gFdZuv3F13v593zRU2k5R75NmvRWLenvMrw==} + '@algolia/requester-fetch@5.52.1': + resolution: {integrity: sha512-S6bDuw9byfOvm3T71cgdoZgrgnZq6hpdMLkx52Louh57nUAmvGQESz2aojOynQHjbTiV55smvAFbgn0qT4tJrg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.50.2': - resolution: {integrity: sha512-Mu9BFtgzGqDUy5Bcs2nMyoILIFSN13GKQaklKAFIsd0K3/9CpNyfeBc+/+Qs6mFZLlxG9qzullO7h+bjcTBuGQ==} + '@algolia/requester-node-http@5.52.1': + resolution: {integrity: sha512-tqZXM+54rWo4mk5jL5Z/flE11nPmNEdXwFBM5py9DkOmbjeCNemfVd45FyM97XdzfZ0dl9uOJC6PYn1FpkeyQg==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular/animations@22.0.0-next.8': - resolution: {integrity: sha512-B+XxQ8iyvE0/XAdprYZJBp0MaIxyampFdzj9y5xnVLYnE2mv6VTX2sy50XyVq8rsYWashGqguLQhfuxAz1SKKw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/animations@22.0.0-next.12': + resolution: {integrity: sha512-lhn6S0rlXIMccNzyCbA/1OyMzRBzVVVD/7G0hyk8MOGPyueNrla0lciabkyv9OxVVVmeQm2Fnpkx9xmCz0BP4Q==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} peerDependencies: - '@angular/core': 22.0.0-next.8 + '@angular/core': 22.0.0-next.12 - '@angular/cdk@22.0.0-next.5': - resolution: {integrity: sha512-9DyyFdtzZVKwmkVzg4cEJtpaQ2JANYYhmt9qfN7Tm1ACk1oleKsPXnX38Ojt0R7+KRSS/RmP8rAvs0gkYYmneA==} + '@angular/cdk@22.0.0-next.8': + resolution: {integrity: sha512-6H/A2ExBPz1KpxqrB2C3U2c9Dcsvq9Xgttpv2ap73h8EVyWqilxmt6lsCl8JefcovEMjnL40srHnvPJnI+Ri1g==} 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 rxjs: ^6.5.3 || ^7.4.0 - '@angular/common@22.0.0-next.8': - resolution: {integrity: sha512-BW4m+Gq2RKFlX5Qa+r0bmI0gB/9Hs27Gb9Rq2wCfNqzWTwyi3fkL6fsjcstGm90CUvlndJh67adlnnx5WlcIog==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/common@22.0.0-next.12': + resolution: {integrity: sha512-PG7r+XfHJAyI9qnHBubcSJxNDURavGxq0Qe/F+TRaCsGzmQ/ojIe3phZyea/HXr72dDVvPrdFNeBIrNCN0D3Rg==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} peerDependencies: - '@angular/core': 22.0.0-next.8 + '@angular/core': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@22.0.0-next.8': - resolution: {integrity: sha512-K7tPLXndd+Y6Hz3GO9CDbpNE8Oaf3nA+zg37Uh4ei8nurPbY85pPDl9v4VezGfc2n5gclbersRDL8ErF6oH/wA==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/compiler-cli@22.0.0-next.12': + resolution: {integrity: sha512-vrVv0hKbXZmBau4UoqfEUBJ+cVA3M4WcJj0Tn1fyNcou6jLBw3fH4MuNBafpQWGR0oDWv01lK3chVP8XkLUeYg==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.12 typescript: '>=6.0 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@22.0.0-next.8': - resolution: {integrity: sha512-IJbaCben+Up86sd152Hfe/OO+K9HRIwR5Kn4AfbcGcrOO2syb2O49cMfd2UJeu9syZd2bn2R2jeCTLAL1F7I0Q==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/compiler@22.0.0-next.12': + resolution: {integrity: sha512-/q3Zj9+bkKAE+Myoy6LEey52mX5p2rbnnNqzKFsJ45yni/c12NlDJ1M0BnU+FzI84rQmVPDrq3jkeIyTpDI2eA==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} - '@angular/core@22.0.0-next.8': - resolution: {integrity: sha512-kNSa1RuDI9u/jFsUy4mQTbLoSkzOW4CeaCbi0Bs7OPkOnnhez9ZEi1KOxJmU9hP3jme6Gc+l1Y2SlkcChYTq6w==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/core@22.0.0-next.12': + resolution: {integrity: sha512-daGYyqLzfVMUQ+LvQjItyxVFyGnzvxffiyOcTX0t21ZPp+WxR4gC/q6PMzVUD1Jf25iS6TrBo3nD/ep6GbiD0A==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} peerDependencies: - '@angular/compiler': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -984,74 +984,74 @@ packages: zone.js: optional: true - '@angular/forms@22.0.0-next.8': - resolution: {integrity: sha512-IRQljUVYTnbPGNmgm7BIz+X4WcvA2mGtEjuI4WZf/HHX/0Lq1ySuxssfJ5MqfYoU/Bga8zLoZx4jvUsHcxTFmw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/forms@22.0.0-next.12': + resolution: {integrity: sha512-DTUVS29tbm/g5P8atU/818IeIgsToPjZa/SMHfHY1VySxbJ9zpiXtWonTIANlZm1dla3ohrJ3G43PedW48nc7w==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} peerDependencies: - '@angular/common': 22.0.0-next.8 - '@angular/core': 22.0.0-next.8 - '@angular/platform-browser': 22.0.0-next.8 + '@angular/common': 22.0.0-next.12 + '@angular/core': 22.0.0-next.12 + '@angular/platform-browser': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@22.0.0-next.8': - resolution: {integrity: sha512-jgRojzy4uFy2kw6zDYTi/Sb7e4cYYyIxiwBaAh87kRiOe54qN00YmYqOv2eHZUhvEV8y6FlcNlwR2GxRVgSuzg==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/localize@22.0.0-next.12': + resolution: {integrity: sha512-KHRG2FpCYiy5pntfBvnl11ULzoS5t8nUPVJcfd7oe7RQfd+HyA/Sk56WPafE4Izu6hB8yCCQT4hq3yIgSKV5rg==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.8 - '@angular/compiler-cli': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.12 + '@angular/compiler-cli': 22.0.0-next.12 - '@angular/material@22.0.0-next.5': - resolution: {integrity: sha512-JFnec4HOijd8a/DB2icC5fkhgfhgUrU6P8Md1bmi0jpXHkXG+ZOTniggEVRQgafeFyZpSzbeV+se7PTsuVBNyA==} + '@angular/material@22.0.0-next.8': + resolution: {integrity: sha512-sQUXI2gzVv8DCryapqzYTgJNrCAh+p9ugEkUtUVORvVTyBG95pqYZ5SU9UZFkqoSR/FHGDlbD7Fry/Jyuvrm0g==} peerDependencies: - '@angular/cdk': 22.0.0-next.5 + '@angular/cdk': 22.0.0-next.8 '@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 rxjs: ^6.5.3 || ^7.4.0 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/40e97052a6e9a06c880b7f2d6de9bfa70a326a52': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/40e97052a6e9a06c880b7f2d6de9bfa70a326a52} - version: 0.0.0-8bb0c36445bb7e7ab8280ac24fc4924a3457c8d6 + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2c36222db3f44751284cc93b3806dbe1baee583a': + resolution: {gitHosted: true, integrity: sha512-dL7hHTLkH5etryOn4CsGh5Ij3H90Y4DuH7n0/c0PmkUbS9kC753TNTgS7V8UqxvxR/Y/Oybx54DAoLDsb9hBFg==, tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2c36222db3f44751284cc93b3806dbe1baee583a} + version: 0.0.0-6ef1cf3158022456bf1f7031de79b7e44fe479b2 hasBin: true - '@angular/platform-browser@22.0.0-next.8': - resolution: {integrity: sha512-u9kKi4KWU8hLBiA8r5MiYa2pdA7VQ0uxi0V0vu0UB+uJt2HN/CcrS+zGqlh6Xz2huwyQr9MnVFlEnfJdZ498uw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/platform-browser@22.0.0-next.12': + resolution: {integrity: sha512-qdCfNO25c52RGx7pRD1cdBs+Qee+WULO7zHjZ2FV4x/hj8gpGk41FuMsp2TdZAsxEqdGl7udO6e6addfpmDVlw==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} peerDependencies: - '@angular/animations': 22.0.0-next.8 - '@angular/common': 22.0.0-next.8 - '@angular/core': 22.0.0-next.8 + '@angular/animations': 22.0.0-next.12 + '@angular/common': 22.0.0-next.12 + '@angular/core': 22.0.0-next.12 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/platform-server@22.0.0-next.8': - resolution: {integrity: sha512-kfY2jnNW8RNtX9Bw0M5Wf0x1UiZDlJ6SckoHzLDeu/o+FbXiNkt6t77ACZ9LNBqUIt0pn734ElBO/suKYuNRcw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/platform-server@22.0.0-next.12': + resolution: {integrity: sha512-jRcJzqiz31alb/hWTunoo424clEpue9ygYF76adMOPE0zTVVNAFDs9Gvo4NfJbWMmXxoI2i0ibB2dtE9kE2+hQ==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} peerDependencies: - '@angular/common': 22.0.0-next.8 - '@angular/compiler': 22.0.0-next.8 - '@angular/core': 22.0.0-next.8 - '@angular/platform-browser': 22.0.0-next.8 + '@angular/common': 22.0.0-next.12 + '@angular/compiler': 22.0.0-next.12 + '@angular/core': 22.0.0-next.12 + '@angular/platform-browser': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 - '@angular/router@22.0.0-next.8': - resolution: {integrity: sha512-hSAjch0waofFF7lOVBDOXgzz5BvXrhEpeKbvcHKL58wjogBt1nSWZx5zBVcMWWOAhFBOmrKmib3qR9lIn3EPAQ==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/router@22.0.0-next.12': + resolution: {integrity: sha512-x8+P6lcJyukJcTgu6vTgGB5RLCZvNXfHTjlukPr8jMoOyMxFPjHV33g+87pmVBjDKRK5pyRnXTqkanQwnwbguA==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} peerDependencies: - '@angular/common': 22.0.0-next.8 - '@angular/core': 22.0.0-next.8 - '@angular/platform-browser': 22.0.0-next.8 + '@angular/common': 22.0.0-next.12 + '@angular/core': 22.0.0-next.12 + '@angular/platform-browser': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 - '@angular/service-worker@22.0.0-next.8': - resolution: {integrity: sha512-dqQkRBX3WFNg8wJ+5NTbXUST2k7r4kMk9X0uCxaN86ptxvvn61LIF9rBwr7FKJLeDIq47jnWzwiX3UrN766YSw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/service-worker@22.0.0-next.12': + resolution: {integrity: sha512-MbzZrbcgh1fPfS0a7ntVKidwHAU/VcfU/fMWn9P/6uOnrVjwRA/U7mN8c6Az6Qqj/8Dl/Wz49sLBV+B6vwggrA==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} hasBin: true peerDependencies: - '@angular/core': 22.0.0-next.8 + '@angular/core': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@5.1.11': @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} engines: {node: '>=6.9.0'} '@babel/core@7.29.0': @@ -1093,8 +1093,8 @@ packages: resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.28.6': - resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + '@babel/helper-create-class-features-plugin@7.29.3': + resolution: {integrity: sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1176,8 +1176,8 @@ packages: resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} engines: {node: '>=6.0.0'} hasBin: true @@ -1199,6 +1199,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3': + resolution: {integrity: sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==} + 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==} engines: {node: '>=6.9.0'} @@ -1385,8 +1391,8 @@ packages: 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.4': + resolution: {integrity: sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1547,8 +1553,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.29.2': - resolution: {integrity: sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==} + '@babel/preset-env@7.29.5': + resolution: {integrity: sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1650,15 +1656,15 @@ packages: resolution: {integrity: sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==} engines: {node: '>= 6'} - '@discoveryjs/json-ext@1.0.0': - resolution: {integrity: sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==} + '@discoveryjs/json-ext@1.1.0': + resolution: {integrity: sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==} engines: {node: '>=14.17.0'} - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -2036,8 +2042,8 @@ packages: '@noble/hashes': optional: true - '@firebase/ai@2.11.0': - resolution: {integrity: sha512-+oqOne/h5J51LezazR+VyzKe3AK455W29JXnb4jOeVvQhC7FymledN5+XE+w5vEcMhRQ6n1f62fdGs4A44X32A==} + '@firebase/ai@2.11.1': + resolution: {integrity: sha512-WGTF81W3WBKJY+c7xqTzO15OGAkCAs8cpADqflAI0skhTZjIkhF0qyf55rq4Ctt6jKygkv99rPfMrjAHTgXaVQ==} engines: {node: '>=20.0.0'} peerDependencies: '@firebase/app': 0.x @@ -2281,8 +2287,8 @@ packages: resolution: {integrity: sha512-IJn+8A3QZJfe7FUtWqHVNo3xJs7KFpurCWGWCiCz3oEh+BkRymKZ1QxfAbU2yGMDzTytLGQ2IV6T2r3cuo75/w==} engines: {node: '>=18'} - '@google/genai@1.50.1': - resolution: {integrity: sha512-YbkX7H9+1Pt8wOt7DDREy8XSoiL6fRDzZQRyaVBarFf8MR3zHGqVdvM4cLbDXqPhxqvegZShgfxb8kw9C7YhAQ==} + '@google/genai@1.52.0': + resolution: {integrity: sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.25.2 @@ -2303,8 +2309,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 @@ -2341,8 +2347,8 @@ packages: resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/checkbox@5.1.4': - resolution: {integrity: sha512-w6KF8ZYRvqHhROkOTHXYC3qIV/KYEu5o12oLqQySvch61vrYtRxNSHTONSdJqWiFJPlCUQAHT5OgOIyuTr+MHQ==} + '@inquirer/checkbox@5.1.5': + resolution: {integrity: sha512-Jmf9tgBHIEK5SAOB7swYfStqmtkZb00xOTpSQmkoGEpdxOTpJi9RS0A8bkfDPHTTItZRJrRdZrEMu25wyj0VfQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2359,8 +2365,8 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.9': - resolution: {integrity: sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==} + '@inquirer/core@11.1.10': + resolution: {integrity: sha512-a4Q5BXHQAHa9eO202sTaFCHFYVB3x5fauDuThEAdZ9gfn76pSxiKU7wWcEH0N1O0XmQvNfQNU6QXpiRxmYQx+A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2368,8 +2374,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.1.1': - resolution: {integrity: sha512-6y11LgmNpmn5D2aB5FgnCfBUBK8ZstwLCalyJmORcJZ/WrhOjm16mu6eSqIx8DnErxDqSLr+Jkp+GP8/Nwd5tA==} + '@inquirer/editor@5.1.2': + resolution: {integrity: sha512-Y3Nor7S/DhIPo+8Ym/dSY4efwKI4BsflKDwXh0jNeXJsSF3dteS/3Yf+z4wkibVZDvYMyCgknSTQlNahfunGHg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2377,8 +2383,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.0.13': - resolution: {integrity: sha512-dF2zvrFo9LshkcB23/O1il13kBkBltWIXzut1evfbuBLXMiGIuC45c+ZQ0uukjCDsvI8OWqun4FRYMnzFCQa3g==} + '@inquirer/expand@5.0.14': + resolution: {integrity: sha512-qyY9zcIX2eKYwaAUiQo9zORd61Lc3sXeM72fVbeHkYnDkqfr8/armcRbmVAIrExeJhI2puk+uomeKtWrpUVUmQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2399,17 +2405,8 @@ packages: resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/input@5.0.12': - resolution: {integrity: sha512-uiMFBl4LqFzJClh80Q3f9hbOFJ6kgkDWI4LjAeBuyO6EanVVMF69AgOvpi1qdqjDSjDN6578B6nky9ceEpI+1Q==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - - '@inquirer/number@4.0.12': - resolution: {integrity: sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==} + '@inquirer/input@5.0.13': + resolution: {integrity: sha512-0l0jCHlJnXIV8CTxwQC0C+5Ziq8WP22edWgmciW2xYvoeoSck4v5FvCS1ctKdqLLR0dUo93uAHgWHywgBSoRyw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2417,8 +2414,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.0.12': - resolution: {integrity: sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==} + '@inquirer/number@4.0.13': + resolution: {integrity: sha512-WHmkYnnJAou5gx7RgcvAfUggnHNM1zWfoh0dFPl3dxVssuqt+dK5rIbaOYQXNyOegvFnopbKupjnhw2O8gANNg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2426,8 +2423,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.4.1': - resolution: {integrity: sha512-AH5xPQ997K7e0F0vulPlteIHke2awMkFi8F0dBemrDfmvtPmHJo82mdHbONC4F/t8d1NHwrbI5cGVI+RbLWdoQ==} + '@inquirer/password@5.0.13': + resolution: {integrity: sha512-XDGu64ROHZjOOXLAANvJN7iIxWKhOSCG5VakrZ5kaScVR+snVJCFglD/hL3/677awtWcu4pXoWa280CDIYcBeg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2444,8 +2441,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.2.8': - resolution: {integrity: sha512-Su7FQvp5buZmCymN3PPoYv31ZQQX4ve2j02k7piGgKAWgE+AQRB5YoYVveGXcl3TZ9ldgRMSxj56YfDFmmaqLg==} + '@inquirer/rawlist@5.2.9': + resolution: {integrity: sha512-a1ErXEfgjfPYpyQ89dp+7n2IISjH9oQg3ygvF5adz8B7aHn4n2PjEgu1wpVTp69K3bj3lVLxP0qJ2b1clk1Whw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2453,8 +2450,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.1.8': - resolution: {integrity: sha512-fGiHKGD6DyPIYUWxoXnQTeXeyYqSOUrasDMABBmMHUalH/LxkuzY0xVRtimXAt1sUeeyYkVuKQx1bebMuN11Kw==} + '@inquirer/search@4.1.9': + resolution: {integrity: sha512-ZlbM28Q9lmLkFPNAIv+ZuY530n5Km8U1WW48oYEvDhe9yc2uL3m3t+JSdRUkQlk5fuIuskgiIVjcb7czFzQpuA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2462,8 +2459,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.1.4': - resolution: {integrity: sha512-2kWcGKPMLAXAWRp1AH1SLsQmX+j0QjeljyXMUji9WMZC8nRDO0b7qquIGr6143E7KMLt3VAIGNXzwa/6PXQs4Q==} + '@inquirer/select@5.1.5': + resolution: {integrity: sha512-6SRg6kHfK/sjLXOsuqNebuir+sjwrf/iWuRUnXgB2slzEewppI1WfzeS16XxDcOQmXBruMmmB9Cgrz7wsAxqMg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2722,8 +2719,8 @@ packages: cpu: [x64] os: [win32] - '@mswjs/interceptors@0.41.4': - resolution: {integrity: sha512-3B9EinUkrdOUGYzHRzRWSXunQ4YFGboJnyLNRwEJWEde+j8fNhPUHvrN1E3g1DU/iS/s8JQrMNVe+S7AHHVs0w==} + '@mswjs/interceptors@0.41.8': + resolution: {integrity: sha512-pRLMNKTSGRoLq+KnEB/7OY5vijw1XmcheAAOiv6pj7W1FG32kAGqj1C/RK/cqxRGr1Fh+zBi8sDur8kj3EQv6A==} engines: {node: '>=18'} '@napi-rs/nice-android-arm-eabi@1.1.1': @@ -2990,14 +2987,14 @@ packages: resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@2.7.0': - resolution: {integrity: sha512-MWXggArM+Y11mPS8VOrqxOj+YMGQSRuvhM91eSBX4xFpJa05mpkeVvM8pPux5ElkEjV5RMgrkisrlP/R83SpBQ==} + '@opentelemetry/context-async-hooks@2.7.1': + resolution: {integrity: sha512-OPFBYuXEn1E4ja3Y6eeA7O+ZnLBNcXTV5Cgsn1VaqBZ6hC5FnpZPLBNme1LJY8ZtF4aOujPKFoeWN4ik487KuQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.7.0': - resolution: {integrity: sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==} + '@opentelemetry/core@2.7.1': + resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -3006,8 +3003,8 @@ packages: resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} engines: {node: '>=14'} - '@oxc-project/types@0.126.0': - resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} + '@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==} @@ -3097,35 +3094,38 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} - '@peculiar/asn1-cms@2.6.1': - resolution: {integrity: sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==} + '@peculiar/asn1-cms@2.7.0': + resolution: {integrity: sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==} - '@peculiar/asn1-csr@2.6.1': - resolution: {integrity: sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==} + '@peculiar/asn1-csr@2.7.0': + resolution: {integrity: sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==} - '@peculiar/asn1-ecc@2.6.1': - resolution: {integrity: sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==} + '@peculiar/asn1-ecc@2.7.0': + resolution: {integrity: sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==} - '@peculiar/asn1-pfx@2.6.1': - resolution: {integrity: sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==} + '@peculiar/asn1-pfx@2.7.0': + resolution: {integrity: sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==} - '@peculiar/asn1-pkcs8@2.6.1': - resolution: {integrity: sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==} + '@peculiar/asn1-pkcs8@2.7.0': + resolution: {integrity: sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==} - '@peculiar/asn1-pkcs9@2.6.1': - resolution: {integrity: sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==} + '@peculiar/asn1-pkcs9@2.7.0': + resolution: {integrity: sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==} - '@peculiar/asn1-rsa@2.6.1': - resolution: {integrity: sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==} + '@peculiar/asn1-rsa@2.7.0': + resolution: {integrity: sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==} - '@peculiar/asn1-schema@2.6.0': - resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} + '@peculiar/asn1-schema@2.7.0': + resolution: {integrity: sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==} - '@peculiar/asn1-x509-attr@2.6.1': - resolution: {integrity: sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==} + '@peculiar/asn1-x509-attr@2.7.0': + resolution: {integrity: sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==} - '@peculiar/asn1-x509@2.6.1': - resolution: {integrity: sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==} + '@peculiar/asn1-x509@2.7.0': + resolution: {integrity: sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==} + + '@peculiar/utils@2.0.3': + resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} '@peculiar/x509@1.14.3': resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} @@ -3164,8 +3164,8 @@ packages: '@protobufjs/base64@1.1.2': resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} '@protobufjs/eventemitter@1.1.0': resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} @@ -3176,8 +3176,8 @@ packages: '@protobufjs/float@1.0.2': resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + '@protobufjs/inquire@1.1.1': + resolution: {integrity: sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==} '@protobufjs/path@1.1.2': resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} @@ -3185,111 +3185,111 @@ packages: '@protobufjs/pool@1.1.0': resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@protobufjs/utf8@1.1.1': + resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} - '@puppeteer/browsers@2.13.0': - resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} + '@puppeteer/browsers@2.13.1': + resolution: {integrity: sha512-zmS4RTK9fbrc++WlAJhxYbfz3IjDeOmkK/CwwbLmk7ydfS9e2CiEeRJHEPvjDVElO/bwXbidwGA37Bsm6LzCnQ==} engines: {node: '>=18'} hasBin: true - '@rolldown/binding-android-arm64@1.0.0-rc.16': - resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==} + '@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.16': - resolution: {integrity: sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==} + '@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.16': - resolution: {integrity: sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==} + '@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.16': - resolution: {integrity: sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==} + '@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.16': - resolution: {integrity: sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==} + '@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.16': - resolution: {integrity: sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==} + '@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.16': - resolution: {integrity: sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==} + '@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.16': - resolution: {integrity: sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==} + '@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.16': - resolution: {integrity: sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==} + '@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.16': - resolution: {integrity: sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==} + '@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.16': - resolution: {integrity: sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==} + '@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.16': - resolution: {integrity: sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==} + '@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.16': - resolution: {integrity: sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==} + '@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.16': - resolution: {integrity: sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==} + '@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.16': - resolution: {integrity: sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==} + '@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.16': - resolution: {integrity: sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==} + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -3336,146 +3336,146 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.2': - resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} + '@rollup/rollup-android-arm-eabi@4.60.3': + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.2': - resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} + '@rollup/rollup-android-arm64@4.60.3': + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.2': - resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} + '@rollup/rollup-darwin-arm64@4.60.3': + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.2': - resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} + '@rollup/rollup-darwin-x64@4.60.3': + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.2': - resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} + '@rollup/rollup-freebsd-arm64@4.60.3': + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.2': - resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} + '@rollup/rollup-freebsd-x64@4.60.3': + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': - resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.2': - resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.2': - resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} + '@rollup/rollup-linux-arm64-gnu@4.60.3': + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.2': - resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} + '@rollup/rollup-linux-arm64-musl@4.60.3': + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.2': - resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} + '@rollup/rollup-linux-loong64-gnu@4.60.3': + resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.2': - resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} + '@rollup/rollup-linux-loong64-musl@4.60.3': + resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.2': - resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.2': - resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} + '@rollup/rollup-linux-ppc64-musl@4.60.3': + resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.2': - resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.2': - resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} + '@rollup/rollup-linux-riscv64-musl@4.60.3': + resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.2': - resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} + '@rollup/rollup-linux-s390x-gnu@4.60.3': + resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.2': - resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} + '@rollup/rollup-linux-x64-gnu@4.60.3': + resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.2': - resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} + '@rollup/rollup-linux-x64-musl@4.60.3': + resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.2': - resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} + '@rollup/rollup-openbsd-x64@4.60.3': + resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.2': - resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} + '@rollup/rollup-openharmony-arm64@4.60.3': + resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.2': - resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} + '@rollup/rollup-win32-arm64-msvc@4.60.3': + resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.2': - resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} + '@rollup/rollup-win32-ia32-msvc@4.60.3': + resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.2': - resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} + '@rollup/rollup-win32-x64-gnu@4.60.3': + resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.2': - resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} + '@rollup/rollup-win32-x64-msvc@4.60.3': + resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} cpu: [x64] os: [win32] - '@rollup/wasm-node@4.60.2': - resolution: {integrity: sha512-FOfZOg752WSyKNefpSM3WrhggSTSuKuwcSfF7tdWC9PBYYg7BLwBR267uShFAI1ZyA0gNkdqK16LL9mNOPsQ1Q==} + '@rollup/wasm-node@4.60.3': + resolution: {integrity: sha512-SVhQ4TJk0BvnJKwceVsCWHtmquucfjU0eu+Bonrjb6W3zombkA/tqw1efaqT2BONX/TJniqkzumF6Sz/sXMJ2w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3534,8 +3534,8 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tony.ganchev/eslint-plugin-header@3.4.3': - resolution: {integrity: sha512-C8oGfJNGGcYl3y55JRS6Sfr9pAtjXyVN4qJllr5g3g6wrDkxcPMQ0654FsZtnQJTXA4swcwtR1cUhCBvW0WDKA==} + '@tony.ganchev/eslint-plugin-header@3.4.4': + resolution: {integrity: sha512-O3PDvjikVWECu078bLdRb2HwjVgR+wa7D0GX8gN1A8axlgEc7tordHOoEYcKRVxGcAw7bxXjwiKGXaY17qXD+Q==} peerDependencies: eslint: '>=7.7.0' @@ -3550,8 +3550,8 @@ packages: resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} engines: {node: ^20.17.0 || >=22.9.0} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3613,6 +3613,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,8 +3679,8 @@ 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.19.18': + resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} '@types/node@24.12.2': resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} @@ -3706,8 +3709,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==} @@ -3775,63 +3778,63 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@typescript-eslint/eslint-plugin@8.59.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.59.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/scope-manager@8.59.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@typescript-eslint/type-utils@8.59.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@verdaccio/auth@8.0.0-next-8.37': @@ -3842,10 +3845,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 +3853,10 @@ packages: resolution: {integrity: sha512-R8rDEa2mPjfHhEK2tWTMFnrfvyNmTd5ZrNz9X5/EiFVJPr/+oo9cTZkDXzY9+KREJUUIUFili4qynmBt0lw8nw==} engines: {node: '>=18'} + '@verdaccio/core@8.1.0': + resolution: {integrity: sha512-rGJy2dnwVwx6QvQqh1YEfyjigX/pyKjMAqO+d6uDYGoBw8Y25sMmJqwuaZx8GTvC3HigcteZBHjkOxFiBgoNLQ==} + engines: {node: '>=18'} + '@verdaccio/file-locking@10.3.1': resolution: {integrity: sha512-oqYLfv3Yg3mAgw9qhASBpjD50osj2AX4IwbkUtyuhhKGyoFU9eZdrbeW6tpnqUnj6yBMtAPm2eGD4BwQuX400g==} engines: {node: '>=12'} @@ -3927,20 +3930,20 @@ packages: peerDependencies: vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@vitest/coverage-v8@4.1.4': - resolution: {integrity: sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==} + '@vitest/coverage-v8@4.1.5': + resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} peerDependencies: - '@vitest/browser': 4.1.4 - vitest: 4.1.4 + '@vitest/browser': 4.1.5 + vitest: 4.1.5 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.4': - resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} + '@vitest/expect@4.1.5': + resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} - '@vitest/mocker@4.1.4': - resolution: {integrity: sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==} + '@vitest/mocker@4.1.5': + resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3950,20 +3953,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.4': - resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==} + '@vitest/pretty-format@4.1.5': + resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} - '@vitest/runner@4.1.4': - resolution: {integrity: sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==} + '@vitest/runner@4.1.5': + resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} - '@vitest/snapshot@4.1.4': - resolution: {integrity: sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==} + '@vitest/snapshot@4.1.5': + resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} - '@vitest/spy@4.1.4': - resolution: {integrity: sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==} + '@vitest/spy@4.1.5': + resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} - '@vitest/utils@4.1.4': - resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==} + '@vitest/utils@4.1.5': + resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -4091,8 +4094,8 @@ packages: peerDependencies: ajv: ^8.8.2 - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -4100,8 +4103,11 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - algoliasearch@5.50.2: - resolution: {integrity: sha512-Tfp26yoNWurUjfgK4GOrVJQhSNXu9tJtHfFFNosgT2YClG+vPyUjX/gbC8rG39qLncnZg8Fj34iarQWpMkqefw==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + algoliasearch@5.52.1: + resolution: {integrity: sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==} engines: {node: '>= 14.0.0'} ansi-colors@4.1.3: @@ -4186,8 +4192,8 @@ packages: asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - asn1js@3.0.7: - resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} + asn1js@3.0.10: + resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} engines: {node: '>=12.0.0'} assert-plus@1.0.0: @@ -4243,8 +4249,8 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - b4a@1.8.0: - resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} peerDependencies: react-native-b4a: '*' peerDependenciesMeta: @@ -4308,15 +4314,15 @@ packages: bare-buffer: optional: true - bare-os@3.8.7: - resolution: {integrity: sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==} + bare-os@3.9.1: + resolution: {integrity: sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.13.0: - resolution: {integrity: sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==} + bare-stream@2.13.1: + resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -4329,8 +4335,8 @@ packages: bare-events: optional: true - bare-url@2.4.1: - resolution: {integrity: sha512-fZapLWNB25gS+etK27NV9KgBNXgo2yeYHuj+OyPblQd6GYAE3JVy6aKxszMV5jhGGFwraXQKA5fldvf3lMyEqw==} + bare-url@2.4.3: + resolution: {integrity: sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4339,13 +4345,13 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.10.20: - resolution: {integrity: sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==} + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true - basic-ftp@5.3.0: - resolution: {integrity: sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w==} + basic-ftp@5.3.1: + resolution: {integrity: sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==} engines: {node: '>=10.0.0'} batch@0.6.1: @@ -4380,8 +4386,8 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + body-parser@1.20.5: + resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} body-parser@2.2.2: @@ -4400,8 +4406,8 @@ packages: brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -4490,8 +4496,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001788: - resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==} + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4908,8 +4914,8 @@ packages: engines: {node: '>= 0.8.0'} hasBin: true - devtools-protocol@0.0.1595872: - resolution: {integrity: sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==} + devtools-protocol@0.0.1608973: + resolution: {integrity: sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==} di@0.0.1: resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} @@ -4973,8 +4979,8 @@ packages: engines: {node: '>=0.12.18'} hasBin: true - electron-to-chromium@1.5.340: - resolution: {integrity: sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==} + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5010,12 +5016,12 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.6: - resolution: {integrity: sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==} + engine.io@6.6.7: + resolution: {integrity: sha512-DgOngfDKM2EviOH3Mr9m7ks1q8roetLy/IMmYthAYzbpInMbYc/GS+fWFA3rl1gvwKVsQrVV61fo5emD1y3OJQ==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} engines: {node: '>=10.13.0'} ent@2.2.2: @@ -5066,8 +5072,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -5176,8 +5182,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.1: - resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -5267,8 +5273,8 @@ packages: express-rate-limit@5.5.1: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} - express-rate-limit@8.3.2: - resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==} + express-rate-limit@8.5.1: + resolution: {integrity: sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -5318,8 +5324,8 @@ 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.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} @@ -5383,8 +5389,8 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - firebase@12.12.0: - resolution: {integrity: sha512-5Ap+pN5iEJUvBlQEZEmLuUm7Gvu6I5xv1jZ5SiSNyw4jrwlHo+4tmZv3OPPoKfN9eo1kBwyyBvi+pWHIPXwfYw==} + firebase@12.12.1: + resolution: {integrity: sha512-ee7xA+bTJLfjB9BP/8FQr3EkxmpAAGc1lNc5QkWgTDpUw24HYXFPm7FEWRdLtGnygxIdYpFmepSc5VjkI6NHhw==} flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} @@ -5497,8 +5503,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: @@ -5569,8 +5575,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@17.5.0: - resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} globalthis@1.0.4: @@ -5606,8 +5612,8 @@ packages: 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@16.13.2: - resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} + graphql@16.14.0: + resolution: {integrity: sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} grpc-gcp@1.0.1: @@ -5655,12 +5661,12 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - hono@4.12.14: - resolution: {integrity: sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==} + hono@4.12.18: + resolution: {integrity: sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==} engines: {node: '>=16.9.0'} - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + hosted-git-info@9.0.3: + resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} hpack.js@2.1.6: @@ -5713,9 +5719,9 @@ packages: '@types/express': optional: true - http-proxy-middleware@3.0.5: - resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + http-proxy-middleware@4.0.0: + resolution: {integrity: sha512-wuHwaUtmC0XzJNHqRp41zXtt5ojpHbusXGhq6781VvnjWUYPu7opmOF3eomGNujT07kEOnHWZyV9UZzKimVCKA==} + engines: {node: ^22.15.0 || ^24.0.0 || >=26.0.0} http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} @@ -5744,6 +5750,9 @@ packages: resolution: {integrity: sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==} engines: {node: '>= 20'} + httpxy@0.5.1: + resolution: {integrity: sha512-JPhqYiixe1A1I+MXDewWDZqeudBGU8Q9jCHYN8ML+779RQzLjTi78HBvWz4jMxUD6h2/vUL12g4q/mFM0OUw1A==} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -5827,16 +5836,16 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.3.0: - resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} + ipaddr.js@2.4.0: + resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} engines: {node: '>= 10'} is-array-buffer@3.0.5: @@ -5866,8 +5875,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: @@ -5938,8 +5947,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: @@ -5960,14 +5969,14 @@ packages: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -6116,12 +6125,12 @@ packages: 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.2: - resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} @@ -6139,8 +6148,8 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@29.0.2: - resolution: {integrity: sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==} + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -6305,8 +6314,8 @@ packages: resolution: {integrity: sha512-9FKQA6G1MMtqNxfxvSBNXD/axeG2QRjYbNh0/ykRL5xYcRbCm2vXq7B9bhc7nSuKdHzr8/BHIwfPuYYH1UsXXw==} hasBin: true - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -6389,8 +6398,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.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6599,8 +6608,8 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.10: - resolution: {integrity: sha512-iCZNq+HszvF+fC3anCm4nBmWEnbeIAfpDs6IStAEKhQ2YSgkjzVG2FF9XJqwwQh5bH3N9OUTUt4QwVN6MLMLtA==} + msgpackr@1.11.12: + resolution: {integrity: sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==} multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} @@ -6614,8 +6623,8 @@ packages: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -6646,9 +6655,9 @@ 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.0-next.4: + resolution: {integrity: sha512-rZorWpYgRUHJ6DVgHb+Ele+spOTH/lQu6u0HA3HL4N8a+vIipEIZ/JUPXNfAhcGd0yhj7jhuokD7akIjiL3zzg==} + engines: {node: ^22.22.0 || ^24.13.1 || >=26.0.0} hasBin: true peerDependencies: '@angular/compiler-cli': ^22.0.0-next.3 @@ -6659,8 +6668,8 @@ packages: tailwindcss: optional: true - nock@14.0.12: - resolution: {integrity: sha512-kZM3bHV0KzhHH6E2eRszHyML/w87AUzLBwupNTHohtYWP9fZYgUPmCbSKq6ITfEEmHqN4/p0MscvUipT4P5Qsg==} + nock@14.0.14: + resolution: {integrity: sha512-PKk7tex0O3RRXUZC5XDKJ9yM3rYRPS13myduT85VIIYDBnib42Fpxoe6KxRSzqB4iL2NDxkcJ2yiskZ18hGLEQ==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} node-addon-api@6.1.0: @@ -6711,13 +6720,13 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-gyp@12.2.0: - resolution: {integrity: sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==} + node-gyp@12.3.0: + resolution: {integrity: sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - node-releases@2.0.37: - resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} nopt@9.0.0: resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} @@ -6844,8 +6853,8 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@9.3.0: - resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} + ora@9.4.0: + resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} engines: {node: '>=20'} ordered-binary@1.6.1: @@ -7098,8 +7107,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.10: - resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} powershell-utils@0.1.0: @@ -7144,8 +7153,8 @@ packages: resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==} engines: {node: '>=18'} - protobufjs@7.5.5: - resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} + protobufjs@7.5.7: + resolution: {integrity: sha512-NGnrxS/nLKUo5nkbVQxlC71sB4hdfImdYIbFeSCidxtwATx0AHRPcANSLd0q5Bb2BkoSWo2iisQhGg5/r+ihbA==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -7178,12 +7187,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.41.0: - resolution: {integrity: sha512-rLIUri7E/NQ3APSEYCCozaSJx0u8Tu9wxO6BJwnvXmIgILSK3L0TombaVh3izp1njAGrO6H2ru0hcIrLF+gWLw==} + puppeteer-core@24.43.0: + resolution: {integrity: sha512-cCRNXsUlhyPoKDz6+TiSpfZpRS3mD6Y1YFKhkdr6ik6TMfuJb7fAtXq9ThUFc4sphxObDk3BuAvdxc1Y6YOnqQ==} engines: {node: '>=18'} - puppeteer@24.41.0: - resolution: {integrity: sha512-W6Fk0J3TPjjtwjXOyR/qf+YaL0H/Uq8HIgHcXG4mNM/IgbKMCH/HPyK0Fi2qbTU/QpSl9bCte2yBpGHKejTpIw==} + puppeteer@24.43.0: + resolution: {integrity: sha512-DRnMFz+J3s4lFUQcjqKl0/7h0jzlCZuUFU9lNjtKrnMl5WI1RwCaIItpHVu9empuPyUreYueN0sUW3/pnfdqsg==} engines: {node: '>=18'} hasBin: true @@ -7364,8 +7373,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@1.0.0-rc.16: - resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==} + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7390,8 +7399,8 @@ packages: '@types/node': optional: true - rollup@4.60.2: - resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} + rollup@4.60.3: + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7622,8 +7631,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@3.8.1: @@ -7767,8 +7776,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.0: - resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} engines: {node: '>=20'} string.prototype.trim@1.2.10: @@ -7827,8 +7836,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tapable@2.3.2: - resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} tar-fs@3.1.2: @@ -7837,11 +7846,11 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar-stream@3.1.8: - resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} - tar@7.5.13: - resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} + tar@7.5.15: + resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} engines: {node: '>=18'} teeny-request@10.1.2: @@ -7851,24 +7860,51 @@ packages: teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - terser-webpack-plugin@5.4.0: - resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} + terser-webpack-plugin@5.6.0: + resolution: {integrity: sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==} 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 - terser@5.46.1: - resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} + terser@5.47.1: + resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} engines: {node: '>=10'} hasBin: true @@ -7902,8 +7938,8 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} tinyglobby@0.2.16: @@ -7917,15 +7953,15 @@ packages: tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tldts-core@7.0.28: - resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} + tldts-core@7.0.30: + resolution: {integrity: sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==} tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tldts@7.0.28: - resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} + tldts@7.0.30: + resolution: {integrity: sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==} hasBin: true tmp@0.2.5: @@ -8040,13 +8076,8 @@ packages: typed-graphqlify@3.1.6: resolution: {integrity: sha512-Snlg1ZrokbkQuemOb4xjWWCJrNcOMeb2Ii0/BwMfwLCcJVNjygyqhrFkrYNvi4gDrwWFrGE0TvxxM+Slym2JMg==} - typed-query-selector@2.12.1: - resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} - - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} - engines: {node: '>=14.17'} - hasBin: true + typed-query-selector@2.12.2: + resolution: {integrity: sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==} typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} @@ -8084,8 +8115,8 @@ packages: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} - undici@8.1.0: - resolution: {integrity: sha512-E9MkTS4xXLnRPYqxH2e6Hr2/49e7WFDKczKcCaFH4VaZs2iNvHMqeIkyUAD9vM8kujy9TjVrRlQ5KkdEJxB2pw==} + undici@8.2.0: + resolution: {integrity: sha512-Z+4Hx9GE26Lh9Upwfnc8C7SsrpBPGaM/Gm6kMFtiG7c+5IvQKlXi/t+9x9DrrCh29cww5TSP9YdVaBcnLDs5fQ==} engines: {node: '>=22.19.0'} unenv@1.10.0: @@ -8155,6 +8186,7 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true validate-npm-package-name@7.0.2: @@ -8173,8 +8205,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.1: + resolution: {integrity: sha512-bZTf2AIYZPofCYybZ/XCQghMGb0p99w12D3/IMlkfkU2oVaRr0o1ixbYlyBE4Lef2P3wDWvBUrtVTQ8ctEWMWA==} engines: {node: '>=18'} verdaccio-htpasswd@13.0.0-next-8.37: @@ -8190,8 +8222,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.3: + resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -8230,20 +8262,20 @@ packages: yaml: optional: true - vitest@4.1.4: - resolution: {integrity: sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==} + vitest@4.1.5: + resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.4 - '@vitest/browser-preview': 4.1.4 - '@vitest/browser-webdriverio': 4.1.4 - '@vitest/coverage-istanbul': 4.1.4 - '@vitest/coverage-v8': 4.1.4 - '@vitest/ui': 4.1.4 + '@vitest/browser-playwright': 4.1.5 + '@vitest/browser-preview': 4.1.5 + '@vitest/browser-webdriverio': 4.1.5 + '@vitest/coverage-istanbul': 4.1.5 + '@vitest/coverage-v8': 4.1.5 + '@vitest/ui': 4.1.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -8340,8 +8372,8 @@ packages: resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} engines: {node: '>=18.0.0'} - webpack-sources@3.3.4: - resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} + webpack-sources@3.4.1: + resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} engines: {node: '>=10.13.0'} webpack-subresource-integrity@5.1.0: @@ -8413,6 +8445,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'} @@ -8512,8 +8549,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + yaml@2.8.4: + resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} engines: {node: '>= 14.6'} hasBin: true @@ -8560,158 +8597,142 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} - 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: - '@actions/core@3.0.0': + '@actions/core@3.0.1': dependencies: '@actions/exec': 3.0.0 - '@actions/http-client': 4.0.0 + '@actions/http-client': 4.0.1 '@actions/exec@3.0.0': dependencies: '@actions/io': 3.0.2 - '@actions/http-client@4.0.0': + '@actions/http-client@4.0.1': dependencies: tunnel: 0.0.6 undici: 6.25.0 '@actions/io@3.0.2': {} - '@algolia/abtesting@1.16.2': + '@algolia/abtesting@1.18.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-abtesting@5.50.2': + '@algolia/client-abtesting@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-analytics@5.50.2': + '@algolia/client-analytics@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-common@5.50.2': {} + '@algolia/client-common@5.52.1': {} - '@algolia/client-insights@5.50.2': + '@algolia/client-insights@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-personalization@5.50.2': + '@algolia/client-personalization@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-query-suggestions@5.50.2': + '@algolia/client-query-suggestions@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/client-search@5.50.2': + '@algolia/client-search@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/ingestion@1.50.2': + '@algolia/ingestion@1.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/monitoring@1.50.2': + '@algolia/monitoring@1.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/recommend@5.50.2': + '@algolia/recommend@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + '@algolia/client-common': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 - '@algolia/requester-browser-xhr@5.50.2': + '@algolia/requester-browser-xhr@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 + '@algolia/client-common': 5.52.1 - '@algolia/requester-fetch@5.50.2': + '@algolia/requester-fetch@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 + '@algolia/client-common': 5.52.1 - '@algolia/requester-node-http@5.50.2': + '@algolia/requester-node-http@5.52.1': dependencies: - '@algolia/client-common': 5.50.2 + '@algolia/client-common': 5.52.1 '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))': dependencies: - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 - '@angular/cdk@22.0.0-next.5(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/cdk@22.0.0-next.8(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.2)': - dependencies: - '@angular/compiler': 22.0.0-next.8 - '@babel/core': 7.29.0 - '@jridgewell/sourcemap-codec': 1.5.5 - chokidar: 5.0.0 - convert-source-map: 1.9.0 - reflect-metadata: 0.2.2 - semver: 7.7.4 - tslib: 2.8.1 - yargs: 18.0.0 - optionalDependencies: - typescript: 6.0.2 - transitivePeerDependencies: - - supports-color - - '@angular/compiler-cli@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.3)': + '@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3)': dependencies: - '@angular/compiler': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.12 '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -8725,31 +8746,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@22.0.0-next.8': + '@angular/compiler@22.0.0-next.12': dependencies: tslib: 2.8.1 - '@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)': + '@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.8 - zone.js: 0.16.1 + '@angular/compiler': 22.0.0-next.12 + zone.js: 0.16.2 - '@angular/forms@22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/forms@22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.3 - '@angular/localize@22.0.0-next.8(@angular/compiler-cli@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.2))(@angular/compiler@22.0.0-next.8)': + '@angular/localize@22.0.0-next.12(@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3))(@angular/compiler@22.0.0-next.12)': dependencies: - '@angular/compiler': 22.0.0-next.8 - '@angular/compiler-cli': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.2) + '@angular/compiler': 22.0.0-next.12 + '@angular/compiler-cli': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.16 @@ -8757,23 +8779,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@22.0.0-next.5(5497bbcfb1239c9f845ffb9323badfbb)': + '@angular/material@22.0.0-next.8(93ce75c341587667f5d7d40f3eefe13f)': dependencies: - '@angular/cdk': 22.0.0-next.5(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/common': 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/platform-browser': 22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/cdk': 22.0.0-next.8(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + '@angular/common': 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/forms': 22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + '@angular/platform-browser': 22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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/40e97052a6e9a06c880b7f2d6de9bfa70a326a52(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/2c36222db3f44751284cc93b3806dbe1baee583a(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': dependencies: - '@actions/core': 3.0.0 + '@actions/core': 3.0.1 '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) - '@inquirer/prompts': 8.4.1(@types/node@24.12.2) + '@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(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) '@octokit/auth-app': 8.2.0 '@octokit/core': 7.0.6 @@ -8804,7 +8826,7 @@ snapshots: ejs: 5.0.2 encoding: 0.1.13 fast-glob: 3.3.3 - firebase: 12.12.0 + firebase: 12.12.1 folder-hash: 4.1.2(supports-color@10.2.2) jasmine: 6.2.0 jasmine-core: 6.2.0 @@ -8812,50 +8834,50 @@ snapshots: jsonc-parser: 3.3.1 minimatch: 10.2.5 multimatch: 8.0.0 - nock: 14.0.12 + nock: 14.0.14 semver: 7.7.4 supports-color: 10.2.2 tsx: 4.21.0 typed-graphqlify: 3.1.6 - typescript: 6.0.2 + typescript: 6.0.3 utf-8-validate: 6.0.6 - which: 6.0.1 - yaml: 2.8.3 + which: 7.0.0 + yaml: 2.8.4 yargs: 18.0.0 - zod: 4.3.6 + zod: 4.4.3 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' - '@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))': dependencies: - '@angular/common': 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/animations': 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)) - '@angular/platform-server@22.0.0-next.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.8)(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/platform-server@22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.12)(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/compiler': 22.0.0-next.8 - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/compiler': 22.0.0-next.12 + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.8(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/router@22.0.0-next.12(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.8(@angular/animations@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 22.0.0-next.12(@angular/animations@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/service-worker@22.0.0-next.8(@angular/core@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/service-worker@22.0.0-next.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.8(@angular/compiler@22.0.0-next.8)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.2) rxjs: 7.8.2 tslib: 2.8.1 @@ -8885,7 +8907,7 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} + '@babel/compat-data@7.29.3': {} '@babel/core@7.29.0': dependencies: @@ -8894,7 +8916,7 @@ snapshots: '@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.2 + '@babel/parser': 7.29.3 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -8909,7 +8931,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -8921,13 +8943,13 @@ snapshots: '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.29.0 + '@babel/compat-data': 7.29.3 '@babel/helper-validator-option': 7.27.1 browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': + '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 @@ -9037,7 +9059,7 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.2': + '@babel/parser@7.29.3': dependencies: '@babel/types': 7.29.0 @@ -9059,6 +9081,14 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3(@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 + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -9132,7 +9162,7 @@ snapshots: '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@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 transitivePeerDependencies: - supports-color @@ -9140,7 +9170,7 @@ snapshots: '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@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 transitivePeerDependencies: - supports-color @@ -9264,7 +9294,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) @@ -9343,7 +9373,7 @@ snapshots: '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@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 transitivePeerDependencies: - supports-color @@ -9352,7 +9382,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@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 transitivePeerDependencies: - supports-color @@ -9441,9 +9471,9 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/preset-env@7.29.2(@babel/core@7.29.0)': + '@babel/preset-env@7.29.5(@babel/core@7.29.0)': dependencies: - '@babel/compat-data': 7.29.0 + '@babel/compat-data': 7.29.3 '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 @@ -9451,6 +9481,7 @@ snapshots: '@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/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) @@ -9482,7 +9513,7 @@ snapshots: '@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-systemjs': 7.29.4(@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) @@ -9529,7 +9560,7 @@ snapshots: '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -9537,7 +9568,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3(supports-color@10.2.2) @@ -9617,15 +9648,15 @@ snapshots: tunnel-agent: 0.6.0 uuid: 8.3.2 - '@discoveryjs/json-ext@1.0.0': {} + '@discoveryjs/json-ext@1.1.0': {} - '@emnapi/core@1.9.2': + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.2': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true @@ -9791,18 +9822,18 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.7.0))': dependencies: - eslint: 10.2.1(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.2.1(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.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@eslint/config-array@0.23.5': dependencies: @@ -9822,7 +9853,7 @@ snapshots: '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.14.0 + ajv: 6.15.0 debug: 4.4.3(supports-color@10.2.2) espree: 10.4.0 globals: 14.0.0 @@ -9834,9 +9865,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@10.0.1(eslint@10.2.1(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -9847,7 +9878,7 @@ snapshots: '@exodus/bytes@1.15.0': {} - '@firebase/ai@2.11.0(@firebase/app-types@0.9.4)(@firebase/app@0.14.11)': + '@firebase/ai@2.11.1(@firebase/app-types@0.9.4)(@firebase/app@0.14.11)': dependencies: '@firebase/app': 0.14.11 '@firebase/app-check-interop-types': 0.3.3 @@ -10203,8 +10234,8 @@ snapshots: '@google-cloud/promisify': 5.0.0 '@grpc/proto-loader': 0.7.15 '@opentelemetry/api': 1.9.1 - '@opentelemetry/context-async-hooks': 2.7.0(@opentelemetry/api@1.9.1) - '@opentelemetry/core': 2.7.0(@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 '@types/big.js': 6.2.2 '@types/stack-trace': 0.0.33 @@ -10215,12 +10246,12 @@ snapshots: 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.5) + grpc-gcp: 1.0.1(protobufjs@7.5.7) is: 3.3.2 lodash.snakecase: 4.1.1 merge-stream: 2.0.0 p-queue: 6.6.2 - protobufjs: 7.5.5 + protobufjs: 7.5.7 retry-request: 8.0.2(supports-color@10.2.2) split-array-stream: 2.0.0 stack-trace: 0.0.10 @@ -10230,14 +10261,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': + '@google/genai@1.52.0(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(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) p-retry: 4.6.2 - protobufjs: 7.5.5 + protobufjs: 7.5.7 ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: - '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) + '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) transitivePeerDependencies: - bufferutil - supports-color @@ -10245,34 +10276,34 @@ snapshots: '@grpc/grpc-js@1.14.3': 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': dependencies: '@grpc/proto-loader': 0.7.15 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@grpc/proto-loader@0.7.15': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.5 + protobufjs: 7.5.7 yargs: 17.7.2 - '@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.5 + protobufjs: 7.5.7 yargs: 17.7.2 '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@1.19.14(hono@4.12.14)': + '@hono/node-server@1.19.14(hono@4.12.18)': dependencies: - hono: 4.12.14 + hono: 4.12.18 '@humanfs/core@0.19.2': dependencies: @@ -10292,10 +10323,10 @@ snapshots: '@inquirer/ansi@2.0.5': {} - '@inquirer/checkbox@5.1.4(@types/node@24.12.2)': + '@inquirer/checkbox@5.1.5(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: @@ -10303,12 +10334,12 @@ snapshots: '@inquirer/confirm@6.0.12(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/core@11.1.9(@types/node@24.12.2)': + '@inquirer/core@11.1.10(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 '@inquirer/figures': 2.0.5 @@ -10320,17 +10351,17 @@ snapshots: optionalDependencies: '@types/node': 24.12.2 - '@inquirer/editor@5.1.1(@types/node@24.12.2)': + '@inquirer/editor@5.1.2(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@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) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/expand@5.0.13(@types/node@24.12.2)': + '@inquirer/expand@5.0.14(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 @@ -10344,77 +10375,62 @@ snapshots: '@inquirer/figures@2.0.5': {} - '@inquirer/input@5.0.12(@types/node@24.12.2)': + '@inquirer/input@5.0.13(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/number@4.0.12(@types/node@24.12.2)': + '@inquirer/number@4.0.13(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/password@5.0.12(@types/node@24.12.2)': + '@inquirer/password@5.0.13(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/prompts@8.4.1(@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) - 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/checkbox': 5.1.5(@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) + '@inquirer/editor': 5.1.2(@types/node@24.12.2) + '@inquirer/expand': 5.0.14(@types/node@24.12.2) + '@inquirer/input': 5.0.13(@types/node@24.12.2) + '@inquirer/number': 4.0.13(@types/node@24.12.2) + '@inquirer/password': 5.0.13(@types/node@24.12.2) + '@inquirer/rawlist': 5.2.9(@types/node@24.12.2) + '@inquirer/search': 4.1.9(@types/node@24.12.2) + '@inquirer/select': 5.1.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/rawlist@5.2.8(@types/node@24.12.2)': + '@inquirer/rawlist@5.2.9(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/search@4.1.8(@types/node@24.12.2)': + '@inquirer/search@4.1.9(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/select@5.1.4(@types/node@24.12.2)': + '@inquirer/select@5.1.5(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.9(@types/node@24.12.2) + '@inquirer/core': 11.1.10(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: @@ -10625,25 +10641,25 @@ snapshots: '@lmdb/lmdb-win32-x64@3.5.4': optional: true - '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': + '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.14) - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) + '@hono/node-server': 1.19.14(hono@4.12.18) + 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 express: 5.2.1 - express-rate-limit: 8.3.2(express@5.2.1) - hono: 4.12.14 - jose: 6.2.2 + express-rate-limit: 8.5.1(express@5.2.1) + hono: 4.12.18 + jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.2(zod@4.3.6) + zod: 4.4.3 + zod-to-json-schema: 3.25.2(zod@4.4.3) transitivePeerDependencies: - supports-color @@ -10665,7 +10681,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@mswjs/interceptors@0.41.4': + '@mswjs/interceptors@0.41.8': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -10746,11 +10762,11 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 optional: true '@noble/hashes@1.4.0': {} @@ -10772,7 +10788,7 @@ snapshots: 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.3.6 socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -10786,7 +10802,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.3.6 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 semver: 7.7.4 @@ -10803,7 +10819,7 @@ snapshots: dependencies: '@npmcli/git': 7.0.2 glob: 13.0.6 - hosted-git-info: 9.0.2 + hosted-git-info: 9.0.3 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 semver: 7.7.4 @@ -10820,10 +10836,8 @@ snapshots: '@npmcli/node-gyp': 5.0.0 '@npmcli/package-json': 7.0.5 '@npmcli/promise-spawn': 9.0.1 - node-gyp: 12.2.0 + node-gyp: 12.3.0 proc-log: 6.1.0 - transitivePeerDependencies: - - supports-color '@octokit/auth-app@8.2.0': dependencies: @@ -10878,8 +10892,8 @@ snapshots: '@octokit/graphql-schema@15.26.1': dependencies: - graphql: 16.13.2 - graphql-tag: 2.12.6(graphql@16.13.2) + graphql: 16.14.0 + graphql-tag: 2.12.6(graphql@16.14.0) '@octokit/graphql@9.0.3': dependencies: @@ -10947,18 +10961,18 @@ snapshots: '@opentelemetry/api@1.9.1': {} - '@opentelemetry/context-async-hooks@2.7.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/context-async-hooks@2.7.1(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core@2.7.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/semantic-conventions@1.40.0': {} - '@oxc-project/types@0.126.0': {} + '@oxc-project/types@0.129.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -11021,91 +11035,95 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true - '@peculiar/asn1-cms@2.6.1': + '@peculiar/asn1-cms@2.7.0': dependencies: - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 - '@peculiar/asn1-x509-attr': 2.6.1 - asn1js: 3.0.7 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + '@peculiar/asn1-x509-attr': 2.7.0 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-csr@2.6.1': + '@peculiar/asn1-csr@2.7.0': dependencies: - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.6.1': + '@peculiar/asn1-ecc@2.7.0': dependencies: - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.6.1': + '@peculiar/asn1-pfx@2.7.0': dependencies: - '@peculiar/asn1-cms': 2.6.1 - '@peculiar/asn1-pkcs8': 2.6.1 - '@peculiar/asn1-rsa': 2.6.1 - '@peculiar/asn1-schema': 2.6.0 - asn1js: 3.0.7 + '@peculiar/asn1-cms': 2.7.0 + '@peculiar/asn1-pkcs8': 2.7.0 + '@peculiar/asn1-rsa': 2.7.0 + '@peculiar/asn1-schema': 2.7.0 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.6.1': + '@peculiar/asn1-pkcs8@2.7.0': dependencies: - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.6.1': + '@peculiar/asn1-pkcs9@2.7.0': dependencies: - '@peculiar/asn1-cms': 2.6.1 - '@peculiar/asn1-pfx': 2.6.1 - '@peculiar/asn1-pkcs8': 2.6.1 - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 - '@peculiar/asn1-x509-attr': 2.6.1 - asn1js: 3.0.7 + '@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 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.6.1': + '@peculiar/asn1-rsa@2.7.0': dependencies: - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-schema@2.6.0': + '@peculiar/asn1-schema@2.7.0': dependencies: - asn1js: 3.0.7 - pvtsutils: 1.3.6 + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.6.1': + '@peculiar/asn1-x509-attr@2.7.0': dependencies: - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/asn1-x509': 2.7.0 + asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509@2.6.1': + '@peculiar/asn1-x509@2.7.0': + dependencies: + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/utils@2.0.3': dependencies: - '@peculiar/asn1-schema': 2.6.0 - asn1js: 3.0.7 - pvtsutils: 1.3.6 tslib: 2.8.1 '@peculiar/x509@1.14.3': dependencies: - '@peculiar/asn1-cms': 2.6.1 - '@peculiar/asn1-csr': 2.6.1 - '@peculiar/asn1-ecc': 2.6.1 - '@peculiar/asn1-pkcs9': 2.6.1 - '@peculiar/asn1-rsa': 2.6.1 - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.1 + '@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 pvtsutils: 1.3.6 reflect-metadata: 0.2.2 tslib: 2.8.1 @@ -11140,26 +11158,26 @@ snapshots: '@protobufjs/base64@1.1.2': {} - '@protobufjs/codegen@2.0.4': {} + '@protobufjs/codegen@2.0.5': {} '@protobufjs/eventemitter@1.1.0': {} '@protobufjs/fetch@1.1.0': dependencies: '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 + '@protobufjs/inquire': 1.1.1 '@protobufjs/float@1.0.2': {} - '@protobufjs/inquire@1.1.0': {} + '@protobufjs/inquire@1.1.1': {} '@protobufjs/path@1.1.2': {} '@protobufjs/pool@1.1.0': {} - '@protobufjs/utf8@1.1.0': {} + '@protobufjs/utf8@1.1.1': {} - '@puppeteer/browsers@2.13.0': + '@puppeteer/browsers@2.13.1': dependencies: debug: 4.4.3(supports-color@10.2.2) extract-zip: 2.0.1 @@ -11174,64 +11192,64 @@ snapshots: - react-native-b4a - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.16': + '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.16': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@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) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/pluginutils@1.0.0-rc.16': {} + '@rolldown/pluginutils@1.0.0': {} - '@rollup/plugin-alias@6.0.0(rollup@4.60.2)': + '@rollup/plugin-alias@6.0.0(rollup@4.60.3)': optionalDependencies: - rollup: 4.60.2 + rollup: 4.60.3 - '@rollup/plugin-commonjs@29.0.2(rollup@4.60.2)': + '@rollup/plugin-commonjs@29.0.2(rollup@4.60.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.4) @@ -11239,108 +11257,108 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.4 optionalDependencies: - rollup: 4.60.2 + rollup: 4.60.3 - '@rollup/plugin-json@6.1.0(rollup@4.60.2)': + '@rollup/plugin-json@6.1.0(rollup@4.60.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) optionalDependencies: - rollup: 4.60.2 + rollup: 4.60.3 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.2)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.12 optionalDependencies: - rollup: 4.60.2 + rollup: 4.60.3 - '@rollup/pluginutils@5.3.0(rollup@4.60.2)': + '@rollup/pluginutils@5.3.0(rollup@4.60.3)': 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: 4.60.3 - '@rollup/rollup-android-arm-eabi@4.60.2': + '@rollup/rollup-android-arm-eabi@4.60.3': optional: true - '@rollup/rollup-android-arm64@4.60.2': + '@rollup/rollup-android-arm64@4.60.3': optional: true - '@rollup/rollup-darwin-arm64@4.60.2': + '@rollup/rollup-darwin-arm64@4.60.3': optional: true - '@rollup/rollup-darwin-x64@4.60.2': + '@rollup/rollup-darwin-x64@4.60.3': optional: true - '@rollup/rollup-freebsd-arm64@4.60.2': + '@rollup/rollup-freebsd-arm64@4.60.3': optional: true - '@rollup/rollup-freebsd-x64@4.60.2': + '@rollup/rollup-freebsd-x64@4.60.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.2': + '@rollup/rollup-linux-arm-musleabihf@4.60.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.2': + '@rollup/rollup-linux-arm64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.2': + '@rollup/rollup-linux-arm64-musl@4.60.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.2': + '@rollup/rollup-linux-loong64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.2': + '@rollup/rollup-linux-loong64-musl@4.60.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.2': + '@rollup/rollup-linux-ppc64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.2': + '@rollup/rollup-linux-ppc64-musl@4.60.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.2': + '@rollup/rollup-linux-riscv64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.2': + '@rollup/rollup-linux-riscv64-musl@4.60.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.2': + '@rollup/rollup-linux-s390x-gnu@4.60.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.2': + '@rollup/rollup-linux-x64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-x64-musl@4.60.2': + '@rollup/rollup-linux-x64-musl@4.60.3': optional: true - '@rollup/rollup-openbsd-x64@4.60.2': + '@rollup/rollup-openbsd-x64@4.60.3': optional: true - '@rollup/rollup-openharmony-arm64@4.60.2': + '@rollup/rollup-openharmony-arm64@4.60.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.2': + '@rollup/rollup-win32-arm64-msvc@4.60.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.2': + '@rollup/rollup-win32-ia32-msvc@4.60.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.2': + '@rollup/rollup-win32-x64-gnu@4.60.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.2': + '@rollup/rollup-win32-x64-msvc@4.60.3': optional: true - '@rollup/wasm-node@4.60.2': + '@rollup/wasm-node@4.60.3': dependencies: '@types/estree': 1.0.8 optionalDependencies: @@ -11392,11 +11410,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(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.2.1(jiti@2.6.1)) - '@typescript-eslint/types': 8.58.2 - eslint: 10.2.1(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) + '@typescript-eslint/types': 8.59.2 + eslint: 10.3.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -11406,9 +11424,9 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tony.ganchev/eslint-plugin-header@3.4.3(eslint@10.2.1(jiti@2.6.1))': + '@tony.ganchev/eslint-plugin-header@3.4.4(eslint@10.3.0(jiti@2.7.0))': dependencies: - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -11419,14 +11437,14 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 10.2.5 - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -11438,7 +11456,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': @@ -11450,16 +11468,16 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/browser-sync@2.29.1': dependencies: '@types/micromatch': 2.3.35 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/serve-static': 2.2.0 chokidar: 3.6.0 @@ -11470,56 +11488,58 @@ snapshots: '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@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.19.18 '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/cors@2.8.19': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/deep-eql@4.0.2': {} '@types/duplexify@3.6.5': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@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.19.18 + '@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.19.18 + '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -11527,7 +11547,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': @@ -11540,13 +11560,13 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/ini@4.1.1': {} @@ -11562,7 +11582,7 @@ snapshots: '@types/karma@6.3.9': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 log4js: 6.9.1 transitivePeerDependencies: - supports-color @@ -11571,11 +11591,20 @@ snapshots: '@types/loader-utils@3.0.0(esbuild@0.28.0)': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 webpack: 5.106.2(esbuild@0.28.0) transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - uglify-js - webpack-cli @@ -11589,10 +11618,10 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 form-data: 4.0.5 - '@types/node@22.19.17': + '@types/node@22.19.18': dependencies: undici-types: 6.21.0 @@ -11604,7 +11633,7 @@ snapshots: '@types/npm-registry-fetch@8.0.9': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/node-fetch': 2.6.13 '@types/npm-package-arg': 6.1.4 '@types/npmlog': 7.0.0 @@ -11612,11 +11641,11 @@ snapshots: '@types/npmlog@7.0.0': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/pacote@11.1.8': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/npm-registry-fetch': 8.0.9 '@types/npmlog': 7.0.0 '@types/ssri': 7.1.5 @@ -11627,14 +11656,14 @@ snapshots: '@types/progress@2.0.7': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/pumpify@1.4.5': dependencies: '@types/duplexify': 3.6.5 - '@types/node': 22.19.17 + '@types/node': 22.19.18 - '@types/qs@6.15.0': {} + '@types/qs@6.15.1': {} '@types/range-parser@1.2.7': {} @@ -11642,7 +11671,7 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/retry@0.12.0': {} @@ -11653,11 +11682,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/serve-index@1.9.4': dependencies: @@ -11666,38 +11695,38 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@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.19.18 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/ssri@7.1.5': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/stack-trace@0.0.33': {} '@types/tar-stream@3.1.4': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/watchpack@2.4.5': dependencies: '@types/graceful-fs': 4.1.9 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/which@3.0.4': {} '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/yargs-parser@21.0.3': {} @@ -11709,98 +11738,98 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 optional: true - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.1(jiti@2.6.1) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + 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.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@10.2.2) - eslint: 10.2.1(jiti@2.6.1) - typescript: 6.0.2 + eslint: 10.3.0(jiti@2.7.0) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3(supports-color@10.2.2) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3(supports-color@10.2.2) - eslint: 10.2.1(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + eslint: 10.3.0(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/types@8.59.2': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/utils@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - eslint: 10.2.1(jiti@2.6.1) - typescript: 6.0.2 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + eslint: 10.3.0(jiti@2.7.0) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 '@verdaccio/auth@8.0.0-next-8.37': @@ -11824,15 +11853,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 @@ -11851,6 +11871,15 @@ snapshots: process-warning: 1.0.0 semver: 7.7.4 + '@verdaccio/core@8.1.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/file-locking@10.3.1': dependencies: lockfile: 1.0.4 @@ -11981,14 +12010,14 @@ 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.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4))': 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.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) - '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': + '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.4 + '@vitest/utils': 4.1.5 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -11997,46 +12026,46 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jiti@2.6.1)(jsdom@29.0.2)(less@4.6.4)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.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.47.1)(tsx@4.21.0)(yaml@2.8.4) - '@vitest/expect@4.1.4': + '@vitest/expect@4.1.5': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.4 - '@vitest/utils': 4.1.4 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.5(vite@7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4))': dependencies: - '@vitest/spy': 4.1.4 + '@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.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) - '@vitest/pretty-format@4.1.4': + '@vitest/pretty-format@4.1.5': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.4': + '@vitest/runner@4.1.5': dependencies: - '@vitest/utils': 4.1.4 + '@vitest/utils': 4.1.5 pathe: 2.0.3 - '@vitest/snapshot@4.1.4': + '@vitest/snapshot@4.1.5': dependencies: - '@vitest/pretty-format': 4.1.4 - '@vitest/utils': 4.1.4 + '@vitest/pretty-format': 4.1.5 + '@vitest/utils': 4.1.5 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.4': {} + '@vitest/spy@4.1.5': {} - '@vitest/utils@4.1.4': + '@vitest/utils@4.1.5': dependencies: - '@vitest/pretty-format': 4.1.4 + '@vitest/pretty-format': 4.1.5 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -12172,18 +12201,18 @@ snapshots: ajv-formats@2.1.1: dependencies: - ajv: 8.18.0 + ajv: 8.20.0 - ajv-formats@3.0.1(ajv@8.18.0): + ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: - ajv: 8.18.0 + ajv: 8.20.0 - ajv-keywords@5.1.0(ajv@8.18.0): + ajv-keywords@5.1.0(ajv@8.20.0): dependencies: - ajv: 8.18.0 + ajv: 8.20.0 fast-deep-equal: 3.1.3 - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -12193,33 +12222,40 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.2 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.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.50.2: - dependencies: - '@algolia/abtesting': 1.16.2 - '@algolia/client-abtesting': 5.50.2 - '@algolia/client-analytics': 5.50.2 - '@algolia/client-common': 5.50.2 - '@algolia/client-insights': 5.50.2 - '@algolia/client-personalization': 5.50.2 - '@algolia/client-query-suggestions': 5.50.2 - '@algolia/client-search': 5.50.2 - '@algolia/ingestion': 1.50.2 - '@algolia/monitoring': 1.50.2 - '@algolia/recommend': 5.50.2 - '@algolia/requester-browser-xhr': 5.50.2 - '@algolia/requester-fetch': 5.50.2 - '@algolia/requester-node-http': 5.50.2 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.52.1: + dependencies: + '@algolia/abtesting': 1.18.1 + '@algolia/client-abtesting': 5.52.1 + '@algolia/client-analytics': 5.52.1 + '@algolia/client-common': 5.52.1 + '@algolia/client-insights': 5.52.1 + '@algolia/client-personalization': 5.52.1 + '@algolia/client-query-suggestions': 5.52.1 + '@algolia/client-search': 5.52.1 + '@algolia/ingestion': 1.52.1 + '@algolia/monitoring': 1.52.1 + '@algolia/recommend': 5.52.1 + '@algolia/requester-browser-xhr': 5.52.1 + '@algolia/requester-fetch': 5.52.1 + '@algolia/requester-node-http': 5.52.1 ansi-colors@4.1.3: {} @@ -12310,7 +12346,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - asn1js@3.0.7: + asn1js@3.0.10: dependencies: pvtsutils: 1.3.6 pvutils: 1.1.5 @@ -12344,13 +12380,13 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.5.0(postcss@8.5.10): + autoprefixer@10.5.0(postcss@8.5.14): dependencies: browserslist: 4.28.2 - caniuse-lite: 1.0.30001788 + caniuse-lite: 1.0.30001792 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.10 + postcss: 8.5.14 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -12361,18 +12397,18 @@ snapshots: aws4@1.13.2: {} - b4a@1.8.0: {} + 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.0)(postcss@8.5.14)): 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.0)(postcss@8.5.14) babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: - '@babel/compat-data': 7.29.0 + '@babel/compat-data': 7.29.3 '@babel/core': 7.29.0 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) semver: 6.3.1 @@ -12412,20 +12448,20 @@ snapshots: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.13.0(bare-events@2.8.2) - bare-url: 2.4.1 + bare-stream: 2.13.1(bare-events@2.8.2) + bare-url: 2.4.3 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.8.7: {} + bare-os@3.9.1: {} bare-path@3.0.0: dependencies: - bare-os: 3.8.7 + bare-os: 3.9.1 - bare-stream@2.13.0(bare-events@2.8.2): + bare-stream@2.13.1(bare-events@2.8.2): dependencies: streamx: 2.25.0 teex: 1.0.1 @@ -12434,7 +12470,7 @@ snapshots: transitivePeerDependencies: - react-native-b4a - bare-url@2.4.1: + bare-url@2.4.3: dependencies: bare-path: 3.0.0 @@ -12442,9 +12478,9 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.10.20: {} + baseline-browser-mapping@2.10.29: {} - basic-ftp@5.3.0: {} + basic-ftp@5.3.1: {} batch@0.6.1: {} @@ -12462,9 +12498,9 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.10 + postcss: 8.5.14 postcss-media-query-parser: 0.2.3 - postcss-safe-parser: 7.0.1(postcss@8.5.10) + postcss-safe-parser: 7.0.1(postcss@8.5.14) before-after-hook@4.0.0: {} @@ -12480,7 +12516,7 @@ snapshots: binary-extensions@2.3.0: {} - body-parser@1.20.4: + body-parser@1.20.5: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -12490,7 +12526,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.2 + qs: 6.15.1 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -12527,7 +12563,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -12572,7 +12608,7 @@ snapshots: etag: 1.8.1 fresh: 0.5.2 fs-extra: 3.0.1 - http-proxy: 1.18.1(debug@4.4.3) + http-proxy: 1.18.1 immutable: 3.8.3 micromatch: 4.0.8 opn: 5.3.0 @@ -12599,10 +12635,10 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.20 - caniuse-lite: 1.0.30001788 - electron-to-chromium: 1.5.340 - node-releases: 2.0.37 + baseline-browser-mapping: 2.10.29 + caniuse-lite: 1.0.30001792 + electron-to-chromium: 1.5.353 + node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) bs-recipes@1.3.4: {} @@ -12635,7 +12671,7 @@ snapshots: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 glob: 13.0.6 - lru-cache: 11.3.5 + lru-cache: 11.3.6 minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.7 @@ -12674,7 +12710,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001788: {} + caniuse-lite@1.0.30001792: {} caseless@0.12.0: {} @@ -12721,9 +12757,9 @@ snapshots: chrome-trace-event@1.0.4: {} - chromium-bidi@14.0.0(devtools-protocol@0.0.1595872): + chromium-bidi@14.0.0(devtools-protocol@0.0.1608973): dependencies: - devtools-protocol: 0.0.1595872 + devtools-protocol: 0.0.1608973 mitt: 3.0.1 zod: 3.25.76 @@ -12740,7 +12776,7 @@ snapshots: cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 - string-width: 8.2.0 + string-width: 8.2.1 cli-width@4.1.0: {} @@ -12871,14 +12907,14 @@ 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.0)(postcss@8.5.14)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 tinyglobby: 0.2.16 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) core-js-compat@3.49.0: dependencies: @@ -12893,15 +12929,6 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.1(typescript@6.0.2): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 6.0.2 - cosmiconfig@9.0.1(typescript@6.0.3): dependencies: env-paths: 2.2.1 @@ -12923,18 +12950,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.0)(postcss@8.5.14)): dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.10) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.10) - postcss-modules-scope: 3.2.1(postcss@8.5.10) - postcss-modules-values: 4.0.0(postcss@8.5.10) + 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.0)(postcss@8.5.14) css-select@6.0.0: dependencies: @@ -13074,7 +13101,7 @@ snapshots: dev-ip@1.0.1: {} - devtools-protocol@0.0.1595872: {} + devtools-protocol@0.0.1608973: {} di@0.0.1: {} @@ -13154,7 +13181,7 @@ snapshots: ejs@5.0.2: {} - electron-to-chromium@1.5.340: {} + electron-to-chromium@1.5.353: {} emoji-regex@10.6.0: {} @@ -13190,10 +13217,10 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6): + engine.io@6.6.7(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@types/cors': 2.8.19 - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/ws': 8.18.1 accepts: 1.3.8 base64id: 2.0.0 @@ -13207,10 +13234,10 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.20.1: + enhanced-resolve@5.21.2: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.2 + tapable: 2.3.3 ent@2.2.2: dependencies: @@ -13301,7 +13328,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@2.0.0: {} + es-module-lexer@2.1.0: {} es-object-atoms@1.1.1: dependencies: @@ -13398,29 +13425,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@10.2.1(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.7.0)): dependencies: - eslint: 10.2.1(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 + is-core-module: 2.16.2 resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) - eslint: 10.2.1(jiti@2.6.1) + '@typescript-eslint/parser': 8.59.2(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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(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 @@ -13429,11 +13456,11 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.2.1(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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(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.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -13443,7 +13470,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -13457,7 +13484,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 @@ -13467,9 +13494,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.1(jiti@2.6.1): + eslint@10.3.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(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 @@ -13478,8 +13505,8 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 @@ -13500,7 +13527,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -13534,7 +13561,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -13568,16 +13595,16 @@ snapshots: express-rate-limit@5.5.1: {} - express-rate-limit@8.3.2(express@5.2.1): + express-rate-limit@8.5.1(express@5.2.1): dependencies: express: 5.2.1 - ip-address: 10.1.0 + ip-address: 10.2.0 express@4.22.1: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.4 + body-parser: 1.20.5 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.2 @@ -13680,7 +13707,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} fast-wrap-ansi@0.2.0: dependencies: @@ -13774,9 +13801,9 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - firebase@12.12.0: + firebase@12.12.1: dependencies: - '@firebase/ai': 2.11.0(@firebase/app-types@0.9.4)(@firebase/app@0.14.11) + '@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 @@ -13823,9 +13850,7 @@ snapshots: transitivePeerDependencies: - supports-color - follow-redirects@1.16.0(debug@4.4.3): - optionalDependencies: - debug: 4.4.3(supports-color@10.2.2) + follow-redirects@1.16.0: {} for-each@0.3.5: dependencies: @@ -13916,7 +13941,7 @@ 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: @@ -13956,7 +13981,7 @@ snapshots: get-uri@6.0.5: dependencies: - basic-ftp: 5.3.0 + basic-ftp: 5.3.1 data-uri-to-buffer: 6.0.2 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: @@ -14006,7 +14031,7 @@ snapshots: globals@14.0.0: {} - globals@17.5.0: {} + globals@17.6.0: {} globalthis@1.0.4: dependencies: @@ -14027,14 +14052,14 @@ snapshots: google-gax@5.0.6(supports-color@10.2.2): dependencies: '@grpc/grpc-js': 1.14.3 - '@grpc/proto-loader': 0.8.0 + '@grpc/proto-loader': 0.8.1 duplexify: 4.1.3 google-auth-library: 10.6.2(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.5 + protobufjs: 7.5.7 retry-request: 8.0.2(supports-color@10.2.2) rimraf: 5.0.10 transitivePeerDependencies: @@ -14061,17 +14086,17 @@ snapshots: graceful-fs@4.2.11: {} - graphql-tag@2.12.6(graphql@16.13.2): + graphql-tag@2.12.6(graphql@16.14.0): dependencies: - graphql: 16.13.2 + graphql: 16.14.0 tslib: 2.8.1 - graphql@16.13.2: {} + graphql@16.14.0: {} - grpc-gcp@1.0.1(protobufjs@7.5.5): + grpc-gcp@1.0.1(protobufjs@7.5.7): dependencies: '@grpc/grpc-js': 1.14.3 - protobufjs: 7.5.5 + protobufjs: 7.5.7 gunzip-maybe@1.4.2: dependencies: @@ -14115,11 +14140,11 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.12.14: {} + hono@4.12.18: {} - hosted-git-info@9.0.2: + hosted-git-info@9.0.3: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.3.6 hpack.js@2.1.6: dependencies: @@ -14185,7 +14210,7 @@ snapshots: http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 - http-proxy: 1.18.1(debug@4.4.3) + http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 @@ -14194,21 +14219,20 @@ snapshots: transitivePeerDependencies: - debug - http-proxy-middleware@3.0.5: + http-proxy-middleware@4.0.0: dependencies: - '@types/http-proxy': 1.17.17 debug: 4.4.3(supports-color@10.2.2) - http-proxy: 1.18.1(debug@4.4.3) + httpxy: 0.5.1 is-glob: 4.0.3 - is-plain-object: 5.0.0 + is-plain-obj: 4.1.0 micromatch: 4.0.8 transitivePeerDependencies: - supports-color - http-proxy@1.18.1(debug@4.4.3): + http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.16.0(debug@4.4.3) + follow-redirects: 1.16.0 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -14247,6 +14271,8 @@ snapshots: transitivePeerDependencies: - supports-color + httpxy@0.5.1: {} + husky@9.1.7: {} hyperdyperid@1.2.0: {} @@ -14263,9 +14289,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.10): + icss-utils@5.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.10 + postcss: 8.5.14 idb@7.1.1: {} @@ -14312,11 +14338,11 @@ snapshots: hasown: 2.0.3 side-channel: 1.1.0 - ip-address@10.1.0: {} + ip-address@10.2.0: {} ipaddr.js@1.9.1: {} - ipaddr.js@2.3.0: {} + ipaddr.js@2.4.0: {} is-array-buffer@3.0.5: dependencies: @@ -14349,7 +14375,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: hasown: 2.0.3 @@ -14378,7 +14404,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: @@ -14408,7 +14434,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: {} @@ -14425,12 +14451,12 @@ snapshots: is-plain-obj@3.0.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - is-plain-object@5.0.0: {} - is-potential-custom-element-name@1.0.1: {} is-promise@2.2.2: {} @@ -14439,7 +14465,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 is-regex@1.2.1: dependencies: @@ -14517,7 +14543,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -14527,7 +14553,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 @@ -14580,13 +14606,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@2.6.1: {} + jiti@2.7.0: {} - jose@6.2.2: {} + jose@6.2.3: {} js-base64@3.7.8: {} @@ -14600,7 +14626,7 @@ snapshots: jsbn@0.1.1: {} - jsdom@29.0.2: + jsdom@29.1.1: dependencies: '@asamuzakjp/css-color': 5.1.11 '@asamuzakjp/dom-selector': 7.1.1 @@ -14612,7 +14638,7 @@ snapshots: 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.3.6 parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -14734,7 +14760,7 @@ snapshots: karma@6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@colors/colors': 1.5.0 - body-parser: 1.20.4 + body-parser: 1.20.5 braces: 3.0.3 chokidar: 3.6.0 connect: 3.7.0 @@ -14742,7 +14768,7 @@ snapshots: dom-serialize: 2.2.1 glob: 7.2.3 graceful-fs: 4.2.11 - http-proxy: 1.18.1(debug@4.4.3) + http-proxy: 1.18.1 isbinaryfile: 4.0.10 lodash: 4.18.1 log4js: 6.9.1 @@ -14774,11 +14800,11 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.3 - 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.0)(postcss@8.5.14)): dependencies: less: 4.6.4 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) less@4.6.4: dependencies: @@ -14798,11 +14824,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.0)(postcss@8.5.14)): dependencies: - webpack-sources: 3.3.4 + webpack-sources: 3.4.1 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) limiter@1.1.5: {} @@ -14819,7 +14845,7 @@ snapshots: lmdb@3.5.4: dependencies: '@harperfast/extended-iterable': 1.0.3 - msgpackr: 1.11.10 + msgpackr: 1.11.12 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 ordered-binary: 1.6.1 @@ -14834,7 +14860,7 @@ snapshots: '@lmdb/lmdb-win32-x64': 3.5.4 optional: true - loader-runner@4.3.1: {} + loader-runner@4.3.2: {} loader-utils@2.0.4: dependencies: @@ -14915,7 +14941,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.3.6: {} lru-cache@5.1.1: dependencies: @@ -14929,7 +14955,7 @@ snapshots: magicast@0.5.2: dependencies: - '@babel/parser': 7.29.2 + '@babel/parser': 7.29.3 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -15026,17 +15052,17 @@ 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.0)(postcss@8.5.14)): dependencies: schema-utils: 4.3.3 - tapable: 2.3.2 - webpack: 5.106.2(esbuild@0.28.0) + tapable: 2.3.3 + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) minimalistic-assert@1.0.1: {} minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: @@ -15118,7 +15144,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.10: + msgpackr@1.11.12: optionalDependencies: msgpackr-extract: 3.0.3 optional: true @@ -15136,7 +15162,7 @@ snapshots: mute-stream@3.0.0: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -15156,13 +15182,13 @@ snapshots: netmask@2.1.1: {} - ng-packagr@22.0.0-next.3(@angular/compiler-cli@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3): + ng-packagr@22.0.0-next.4(@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.3) - '@rollup/plugin-json': 6.1.0(rollup@4.60.2) - '@rollup/wasm-node': 4.60.2 - ajv: 8.18.0 + '@angular/compiler-cli': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3) + '@rollup/plugin-json': 6.1.0(rollup@4.60.3) + '@rollup/wasm-node': 4.60.3 + ajv: 8.20.0 browserslist: 4.28.2 chokidar: 5.0.0 commander: 14.0.3 @@ -15172,21 +15198,21 @@ snapshots: injection-js: 2.6.1 jsonc-parser: 3.3.1 less: 4.6.4 - ora: 9.3.0 + ora: 9.4.0 piscina: 5.1.4 - postcss: 8.5.10 - rollup-plugin-dts: 6.4.1(rollup@4.60.2)(typescript@6.0.3) + postcss: 8.5.14 + rollup-plugin-dts: 6.4.1(rollup@4.60.3)(typescript@6.0.3) rxjs: 7.8.2 sass: 1.99.0 tinyglobby: 0.2.16 tslib: 2.8.1 typescript: 6.0.3 optionalDependencies: - rollup: 4.60.2 + rollup: 4.60.3 - nock@14.0.12: + nock@14.0.14: dependencies: - '@mswjs/interceptors': 0.41.4 + '@mswjs/interceptors': 0.41.8 json-stringify-safe: 5.0.1 propagate: 2.0.1 @@ -15232,22 +15258,20 @@ snapshots: node-gyp-build@4.8.4: {} - node-gyp@12.2.0: + node-gyp@12.3.0: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.3 graceful-fs: 4.2.11 - make-fetch-happen: 15.0.5 nopt: 9.0.0 proc-log: 6.1.0 semver: 7.7.4 - tar: 7.5.13 + tar: 7.5.15 tinyglobby: 0.2.16 + undici: 6.25.0 which: 6.0.1 - transitivePeerDependencies: - - supports-color - node-releases@2.0.37: {} + node-releases@2.0.38: {} nopt@9.0.0: dependencies: @@ -15269,7 +15293,7 @@ snapshots: npm-package-arg@13.0.2: dependencies: - hosted-git-info: 9.0.2 + hosted-git-info: 9.0.3 proc-log: 6.1.0 semver: 7.7.4 validate-npm-package-name: 7.0.2 @@ -15400,7 +15424,7 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@9.3.0: + ora@9.4.0: dependencies: chalk: 5.6.2 cli-cursor: 5.0.0 @@ -15409,7 +15433,7 @@ snapshots: is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.3.2 - string-width: 8.2.0 + string-width: 8.2.1 ordered-binary@1.6.1: optional: true @@ -15449,7 +15473,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: @@ -15494,7 +15518,7 @@ snapshots: proc-log: 6.1.0 sigstore: 4.1.0 ssri: 13.0.1 - tar: 7.5.13 + tar: 7.5.15 transitivePeerDependencies: - supports-color @@ -15546,7 +15570,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.3.6 minipass: 7.1.3 path-to-regexp@0.1.13: {} @@ -15616,7 +15640,7 @@ snapshots: pkijs@3.4.0: dependencies: '@noble/hashes': 1.4.0 - asn1js: 3.0.7 + asn1js: 3.0.10 bytestreamjs: 2.0.1 pvtsutils: 1.3.6 pvutils: 1.1.5 @@ -15631,43 +15655,43 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.1(postcss@8.5.10)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)): + postcss-loader@8.2.1(postcss@8.5.14)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.14)): dependencies: cosmiconfig: 9.0.1(typescript@6.0.3) - jiti: 2.6.1 - postcss: 8.5.10 + jiti: 2.7.0 + postcss: 8.5.14 semver: 7.7.4 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) transitivePeerDependencies: - typescript postcss-media-query-parser@0.2.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.10): + postcss-modules-extract-imports@3.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.10 + postcss: 8.5.14 - postcss-modules-local-by-default@4.2.0(postcss@8.5.10): + postcss-modules-local-by-default@4.2.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.10): + postcss-modules-scope@3.2.1(postcss@8.5.14): dependencies: - postcss: 8.5.10 + postcss: 8.5.14 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.10): + postcss-modules-values@4.0.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 - postcss-safe-parser@7.0.1(postcss@8.5.10): + postcss-safe-parser@7.0.1(postcss@8.5.14): dependencies: - postcss: 8.5.10 + postcss: 8.5.14 postcss-selector-parser@7.1.1: dependencies: @@ -15676,9 +15700,9 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.10: + postcss@8.5.14: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -15704,21 +15728,21 @@ snapshots: proto3-json-serializer@3.0.4: dependencies: - protobufjs: 7.5.5 + protobufjs: 7.5.7 - protobufjs@7.5.5: + protobufjs@7.5.7: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 + '@protobufjs/codegen': 2.0.5 '@protobufjs/eventemitter': 1.1.0 '@protobufjs/fetch': 1.1.0 '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 + '@protobufjs/inquire': 1.1.1 '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.17 + '@protobufjs/utf8': 1.1.1 + '@types/node': 22.19.18 long: 5.3.2 proxy-addr@2.0.7: @@ -15764,13 +15788,13 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.41.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + puppeteer-core@24.43.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: - '@puppeteer/browsers': 2.13.0 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) + '@puppeteer/browsers': 2.13.1 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1608973) debug: 4.4.3(supports-color@10.2.2) - devtools-protocol: 0.0.1595872 - typed-query-selector: 2.12.1 + devtools-protocol: 0.0.1608973 + 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) transitivePeerDependencies: @@ -15781,14 +15805,14 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.41.0(bufferutil@4.1.0)(typescript@6.0.2)(utf-8-validate@6.0.6): + puppeteer@24.43.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6): dependencies: - '@puppeteer/browsers': 2.13.0 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) - cosmiconfig: 9.0.1(typescript@6.0.2) - devtools-protocol: 0.0.1595872 - puppeteer-core: 24.41.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - typed-query-selector: 2.12.1 + '@puppeteer/browsers': 2.13.1 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1608973) + cosmiconfig: 9.0.1(typescript@6.0.3) + devtools-protocol: 0.0.1608973 + puppeteer-core: 24.43.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + typed-query-selector: 2.12.2 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -15835,7 +15859,7 @@ snapshots: unicode-properties: 1.4.1 urijs: 1.19.11 wordwrap: 1.0.0 - yaml: 2.8.3 + yaml: 2.8.4 transitivePeerDependencies: - encoding @@ -15959,20 +15983,20 @@ snapshots: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.5.10 + 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: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 @@ -16015,26 +16039,26 @@ snapshots: dependencies: glob: 10.5.0 - rolldown@1.0.0-rc.16: + rolldown@1.0.0: dependencies: - '@oxc-project/types': 0.126.0 - '@rolldown/pluginutils': 1.0.0-rc.16 + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.16 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.16 - '@rolldown/binding-darwin-x64': 1.0.0-rc.16 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.16 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.16 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.16 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.16 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.16 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.16 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.16 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.16 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.16 + '@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: @@ -16043,64 +16067,53 @@ snapshots: semver: 7.7.4 spdx-expression-validate: 2.0.0 - rollup-plugin-dts@6.4.1(rollup@4.60.2)(typescript@6.0.2): + rollup-plugin-dts@6.4.1(rollup@4.60.3)(typescript@6.0.3): dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 convert-source-map: 2.0.0 magic-string: 0.30.21 - rollup: 4.60.2 - typescript: 6.0.2 - optionalDependencies: - '@babel/code-frame': 7.29.0 - - rollup-plugin-dts@6.4.1(rollup@4.60.2)(typescript@6.0.3): - dependencies: - '@jridgewell/remapping': 2.3.5 - '@jridgewell/sourcemap-codec': 1.5.5 - convert-source-map: 2.0.0 - magic-string: 0.30.21 - rollup: 4.60.2 + rollup: 4.60.3 typescript: 6.0.3 optionalDependencies: '@babel/code-frame': 7.29.0 - rollup-plugin-sourcemaps2@0.5.6(@types/node@22.19.17)(rollup@4.60.2): + rollup-plugin-sourcemaps2@0.5.6(@types/node@22.19.18)(rollup@4.60.3): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) - rollup: 4.60.2 + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) + rollup: 4.60.3 optionalDependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 - rollup@4.60.2: + rollup@4.60.3: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.2 - '@rollup/rollup-android-arm64': 4.60.2 - '@rollup/rollup-darwin-arm64': 4.60.2 - '@rollup/rollup-darwin-x64': 4.60.2 - '@rollup/rollup-freebsd-arm64': 4.60.2 - '@rollup/rollup-freebsd-x64': 4.60.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 - '@rollup/rollup-linux-arm-musleabihf': 4.60.2 - '@rollup/rollup-linux-arm64-gnu': 4.60.2 - '@rollup/rollup-linux-arm64-musl': 4.60.2 - '@rollup/rollup-linux-loong64-gnu': 4.60.2 - '@rollup/rollup-linux-loong64-musl': 4.60.2 - '@rollup/rollup-linux-ppc64-gnu': 4.60.2 - '@rollup/rollup-linux-ppc64-musl': 4.60.2 - '@rollup/rollup-linux-riscv64-gnu': 4.60.2 - '@rollup/rollup-linux-riscv64-musl': 4.60.2 - '@rollup/rollup-linux-s390x-gnu': 4.60.2 - '@rollup/rollup-linux-x64-gnu': 4.60.2 - '@rollup/rollup-linux-x64-musl': 4.60.2 - '@rollup/rollup-openbsd-x64': 4.60.2 - '@rollup/rollup-openharmony-arm64': 4.60.2 - '@rollup/rollup-win32-arm64-msvc': 4.60.2 - '@rollup/rollup-win32-ia32-msvc': 4.60.2 - '@rollup/rollup-win32-x64-gnu': 4.60.2 - '@rollup/rollup-win32-x64-msvc': 4.60.2 + '@rollup/rollup-android-arm-eabi': 4.60.3 + '@rollup/rollup-android-arm64': 4.60.3 + '@rollup/rollup-darwin-arm64': 4.60.3 + '@rollup/rollup-darwin-x64': 4.60.3 + '@rollup/rollup-freebsd-arm64': 4.60.3 + '@rollup/rollup-freebsd-x64': 4.60.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 + '@rollup/rollup-linux-arm-musleabihf': 4.60.3 + '@rollup/rollup-linux-arm64-gnu': 4.60.3 + '@rollup/rollup-linux-arm64-musl': 4.60.3 + '@rollup/rollup-linux-loong64-gnu': 4.60.3 + '@rollup/rollup-linux-loong64-musl': 4.60.3 + '@rollup/rollup-linux-ppc64-gnu': 4.60.3 + '@rollup/rollup-linux-ppc64-musl': 4.60.3 + '@rollup/rollup-linux-riscv64-gnu': 4.60.3 + '@rollup/rollup-linux-riscv64-musl': 4.60.3 + '@rollup/rollup-linux-s390x-gnu': 4.60.3 + '@rollup/rollup-linux-x64-gnu': 4.60.3 + '@rollup/rollup-linux-x64-musl': 4.60.3 + '@rollup/rollup-openbsd-x64': 4.60.3 + '@rollup/rollup-openharmony-arm64': 4.60.3 + '@rollup/rollup-win32-arm64-msvc': 4.60.3 + '@rollup/rollup-win32-ia32-msvc': 4.60.3 + '@rollup/rollup-win32-x64-gnu': 4.60.3 + '@rollup/rollup-win32-x64-msvc': 4.60.3 fsevents: 2.3.3 router@2.2.0: @@ -16152,12 +16165,12 @@ 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.0)(postcss@8.5.14)): 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.0)(postcss@8.5.14) sass@1.99.0: dependencies: @@ -16177,9 +16190,9 @@ snapshots: schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.18.0 + ajv: 8.20.0 ajv-formats: 2.1.1 - ajv-keywords: 5.1.0(ajv@8.18.0) + ajv-keywords: 5.1.0(ajv@8.20.0) select-hose@2.0.0: {} @@ -16391,7 +16404,7 @@ snapshots: base64id: 2.0.0 cors: 2.8.6 debug: 4.4.3(supports-color@10.2.2) - engine.io: 6.6.6(bufferutil@4.1.0)(utf-8-validate@6.0.6) + 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) socket.io-parser: 4.2.6 transitivePeerDependencies: @@ -16409,13 +16422,13 @@ snapshots: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) - socks: 2.8.7 + socks: 2.8.9 transitivePeerDependencies: - supports-color - socks@2.8.7: + socks@2.8.9: dependencies: - ip-address: 10.1.0 + ip-address: 10.2.0 smart-buffer: 4.2.0 sonic-boom@3.8.1: @@ -16428,11 +16441,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.0)(postcss@8.5.14)): 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.0)(postcss@8.5.14) source-map-support@0.5.21: dependencies: @@ -16583,12 +16596,12 @@ 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.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: @@ -16650,12 +16663,12 @@ snapshots: symbol-tree@3.2.4: {} - tapable@2.3.2: {} + tapable@2.3.3: {} tar-fs@3.1.2: dependencies: pump: 3.0.4 - tar-stream: 3.1.8 + tar-stream: 3.2.0 optionalDependencies: bare-fs: 4.7.1 bare-path: 3.0.0 @@ -16666,16 +16679,16 @@ snapshots: tar-stream@3.1.7: dependencies: - b4a: 1.8.0 + b4a: 1.8.1 fast-fifo: 1.3.2 streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - tar-stream@3.1.8: + tar-stream@3.2.0: dependencies: - b4a: 1.8.0 + b4a: 1.8.1 bare-fs: 4.7.1 fast-fifo: 1.3.2 streamx: 2.25.0 @@ -16684,7 +16697,7 @@ snapshots: - bare-buffer - react-native-b4a - tar@7.5.13: + tar@7.5.15: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -16708,17 +16721,28 @@ snapshots: - bare-abort-controller - react-native-b4a - terser-webpack-plugin@5.4.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)): + terser-webpack-plugin@5.6.0(esbuild@0.28.0)(postcss@8.5.14)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.14)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.46.1 + terser: 5.47.1 + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) + optionalDependencies: + esbuild: 0.28.0 + postcss: 8.5.14 + + terser-webpack-plugin@5.6.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.47.1 webpack: 5.106.2(esbuild@0.28.0) optionalDependencies: esbuild: 0.28.0 - terser@5.46.1: + terser@5.47.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -16727,7 +16751,7 @@ snapshots: text-decoder@1.2.7: dependencies: - b4a: 1.8.0 + b4a: 1.8.1 transitivePeerDependencies: - react-native-b4a @@ -16756,7 +16780,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.1.1: {} + tinyexec@1.1.2: {} tinyglobby@0.2.16: dependencies: @@ -16767,15 +16791,15 @@ snapshots: tldts-core@6.1.86: {} - tldts-core@7.0.28: {} + tldts-core@7.0.30: {} tldts@6.1.86: dependencies: tldts-core: 6.1.86 - tldts@7.0.28: + tldts@7.0.30: dependencies: - tldts-core: 7.0.28 + tldts-core: 7.0.30 tmp@0.2.5: {} @@ -16793,7 +16817,7 @@ snapshots: tough-cookie@6.0.1: dependencies: - tldts: 7.0.28 + tldts: 7.0.30 tr46@0.0.3: {} @@ -16805,9 +16829,9 @@ snapshots: dependencies: tslib: 2.8.1 - ts-api-utils@2.5.0(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.2 + typescript: 6.0.3 tsconfig-paths@3.15.0: dependencies: @@ -16901,9 +16925,7 @@ snapshots: typed-graphqlify@3.1.6: {} - typed-query-selector@2.12.1: {} - - typescript@6.0.2: {} + typed-query-selector@2.12.2: {} typescript@6.0.3: {} @@ -16929,7 +16951,7 @@ snapshots: undici@7.25.0: {} - undici@8.1.0: {} + undici@8.2.0: {} unenv@1.10.0: dependencies: @@ -17009,9 +17031,9 @@ snapshots: - encoding - supports-color - verdaccio-auth-memory@13.0.0: + verdaccio-auth-memory@13.0.1: dependencies: - '@verdaccio/core': 8.0.0 + '@verdaccio/core': 8.1.0 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -17073,34 +17095,34 @@ 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.1)(tsx@4.21.0)(yaml@2.8.3): + vite@7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.10 - rollup: 4.60.2 + postcss: 8.5.14 + rollup: 4.60.3 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.2 fsevents: 2.3.3 - jiti: 2.6.1 + jiti: 2.7.0 less: 4.6.4 sass: 1.99.0 - terser: 5.46.1 + terser: 5.47.1 tsx: 4.21.0 - yaml: 2.8.3 - - vitest@4.1.4(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.4)(jiti@2.6.1)(jsdom@29.0.2)(less@4.6.4)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): - dependencies: - '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.4 - '@vitest/runner': 4.1.4 - '@vitest/snapshot': 4.1.4 - '@vitest/spy': 4.1.4 - '@vitest/utils': 4.1.4 - es-module-lexer: 2.0.0 + yaml: 2.8.4 + + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.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.47.1)(tsx@4.21.0)(yaml@2.8.4): + dependencies: + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) + '@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 magic-string: 0.30.21 obug: 2.1.1 @@ -17108,16 +17130,16 @@ snapshots: picomatch: 4.0.4 std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.1.1 + tinyexec: 1.1.2 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.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.3(@types/node@24.12.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 24.12.2 - '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) - jsdom: 29.0.2 + '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + jsdom: 29.1.1 transitivePeerDependencies: - jiti - less @@ -17159,6 +17181,19 @@ snapshots: webidl-conversions@8.0.1: {} + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.14)): + dependencies: + colorette: 2.0.20 + memfs: 4.57.2(tslib@2.8.1) + mime-types: 3.0.2 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) + transitivePeerDependencies: + - tslib + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.106.2(esbuild@0.28.0)): dependencies: colorette: 2.0.20 @@ -17172,7 +17207,7 @@ snapshots: transitivePeerDependencies: - tslib - webpack-dev-middleware@8.0.3(tslib@2.8.1)(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.0)(postcss@8.5.14)): dependencies: memfs: 4.57.2(tslib@2.8.1) mime-types: 3.0.2 @@ -17180,10 +17215,49 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) 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)(postcss@8.5.14)): + 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.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.1 + connect-history-api-fallback: 2.0.0 + express: 4.22.1 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.4.0 + launch-editor: 2.13.2 + 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.0)(postcss@8.5.14)) + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) + 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.0)): dependencies: '@types/bonjour': 3.5.13 @@ -17203,7 +17277,7 @@ snapshots: express: 4.22.1 graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.25) - ipaddr.js: 2.3.0 + ipaddr.js: 2.4.0 launch-editor: 2.13.2 open: 10.2.0 p-retry: 6.2.1 @@ -17229,17 +17303,57 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@3.3.4: {} + webpack-sources@3.4.1: {} - 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.0)(postcss@8.5.14)): dependencies: typed-assert: 1.0.9 - webpack: 5.106.2(esbuild@0.28.0) + webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.14) webpack@5.106.2(esbuild@0.28.0): 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 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.21.2 + es-module-lexer: 2.1.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.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)) + watchpack: 2.5.1 + webpack-sources: 3.4.1 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.14): + 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 @@ -17248,23 +17362,32 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.20.1 - es-module-lexer: 2.0.0 + enhanced-resolve: 5.21.2 + es-module-lexer: 2.1.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.1 + loader-runner: 4.3.2 mime-db: 1.54.0 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.2 - terser-webpack-plugin: 5.4.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)) + tapable: 2.3.3 + terser-webpack-plugin: 5.6.0(esbuild@0.28.0)(postcss@8.5.14)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.14)) watchpack: 2.5.1 - webpack-sources: 3.3.4 + webpack-sources: 3.4.1 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: @@ -17343,6 +17466,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 @@ -17357,7 +17484,7 @@ snapshots: wrap-ansi@10.0.0: dependencies: ansi-styles: 6.2.3 - string-width: 8.2.0 + string-width: 8.2.1 strip-ansi: 7.2.0 wrap-ansi@7.0.0: @@ -17417,7 +17544,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.3: {} + yaml@2.8.4: {} yargs-parser@20.2.9: {} @@ -17463,12 +17590,12 @@ snapshots: yoctocolors@2.1.2: {} - zod-to-json-schema@3.25.2(zod@4.3.6): + zod-to-json-schema@3.25.2(zod@4.4.3): dependencies: - zod: 4.3.6 + zod: 4.4.3 zod@3.25.76: {} - zod@4.3.6: {} + zod@4.4.3: {} - zone.js@0.16.1: {} + zone.js@0.16.2: {} diff --git a/renovate.json b/renovate.json index 6b91ffcea750..0299498febd8 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "baseBranchPatterns": ["main", "21.2.x"], + "baseBranchPatterns": ["main", "22.0.x"], "extends": ["github>angular/dev-infra//renovate-presets/default.json5"], "ignorePaths": ["tests/e2e/assets/**", "tests/schematics/update/packages/**"], "packageRules": [ diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 58ede0255707..494504b3f694 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#6e62fa9d18b98e2ac662fc3961e968d4122538f2", - "@angular/cdk": "github:angular/cdk-builds#c51f64859e369afa21ea55bb194e4fd5643f9f98", - "@angular/common": "github:angular/common-builds#1ce98bdcf4bcfcebd4636b0a6d6ba2641d8d2ef8", - "@angular/compiler": "github:angular/compiler-builds#460006a2c3e7e41ee5cb9847e8645c86979e60ad", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#ea298b96861ad8c96f3492270323e047aa7d3998", - "@angular/core": "github:angular/core-builds#ae254cada12aa4930978acef21e39d55e9056072", - "@angular/forms": "github:angular/forms-builds#2f974b29829b6f7b01d9a3e43f79c1717a083013", - "@angular/language-service": "github:angular/language-service-builds#53a13edc2656a8f4bdb1abfaf4eae0b62080b064", - "@angular/localize": "github:angular/localize-builds#6c7b2a778f0c1a8cccbc4e3f5650d85d5db6c39a", - "@angular/material": "github:angular/material-builds#494645134551c55a89f19e31904e9ce68e967928", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#616984f0d2e08207d337eda359bb292fa9e552f6", - "@angular/platform-browser": "github:angular/platform-browser-builds#0dbfcdced5a4dcf8900722e4a16ebbe29d9a83fd", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#49e41ddabe8411de264e44428db580ec82655b65", - "@angular/platform-server": "github:angular/platform-server-builds#3017b840d5083235ca39e5019df48361231203c6", - "@angular/router": "github:angular/router-builds#998685d770e7dc5b5d9b6fe34afacad61efed29f", - "@angular/service-worker": "github:angular/service-worker-builds#8c66b2279b5c6896827d3744a1fc583b20f90b48" + "@angular/animations": "github:angular/animations-builds#abb265e691ae2e55b4f48e8993dbb3664e742e33", + "@angular/cdk": "github:angular/cdk-builds#3a1bc44a5eb214f476db54171903bfa04eae0dcc", + "@angular/common": "github:angular/common-builds#abfaff16726d7dadef77df99f4b7f95c4c9072fb", + "@angular/compiler": "github:angular/compiler-builds#7ae6e92dff106efe260be1a93e72dc87e7a424f1", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#15e368d113e485c9d2987eb2f9f33e62833a281a", + "@angular/core": "github:angular/core-builds#4a6998bfbe93da48434e82f2cac4cc5cc3c25072", + "@angular/forms": "github:angular/forms-builds#0eec927ebec2858c144f98d6f635554efeb7ae55", + "@angular/language-service": "github:angular/language-service-builds#dd63f516cbe218858a3f37f64eba05eb64455f5f", + "@angular/localize": "github:angular/localize-builds#49b0746db000be567a8d98be96e946347db285f3", + "@angular/material": "github:angular/material-builds#5d142484f4642658f457950487c74b0c4e66e5b8", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#c4784ecad43df8991d522bc5456bfbb850177dc8", + "@angular/platform-browser": "github:angular/platform-browser-builds#6fee1304d9bbc4631510821e6cc7b2e096ef18e2", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#6c25b7bd17646214353ef102510715befb376478", + "@angular/platform-server": "github:angular/platform-server-builds#8b9bf6a2684c2f5decfb8b62bb73315858e0e9ef", + "@angular/router": "github:angular/router-builds#8007f8faf4754d848c53f89757899452900145d2", + "@angular/service-worker": "github:angular/service-worker-builds#61d491e39ccde4b320d5d1f55c880c6fd4f3372a" } } 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/build/server-rendering/server-routes-preload-links.ts b/tests/e2e/tests/build/server-rendering/server-routes-preload-links.ts index 5b2f1257d41f..4094ee4351b9 100644 --- a/tests/e2e/tests/build/server-rendering/server-routes-preload-links.ts +++ b/tests/e2e/tests/build/server-rendering/server-routes-preload-links.ts @@ -132,7 +132,7 @@ export default async function () { const res = await fetch(`http://localhost:${defaultServerPort}/`); const text = await res.text(); - const homeMatch = //; + const homeMatch = //; assert.match(text, homeMatch, `Response for '/': ${homeMatch} was not matched in content.`); const link = text.match(homeMatch)?.[1]; @@ -148,36 +148,36 @@ const RESPONSE_EXPECTS: Record< } > = { '/': { - matches: [//], + matches: [//], notMatches: [/ssg\-component/, /ssr/, /csr/, /cross-dep-/], }, '/ssg': { matches: [ - //, - //, + //, + //, ], notMatches: [/home/, /ssr/, /csr/, /ssg-one/, /ssg-two/, /cross-dep-/], }, '/ssg/one': { matches: [ - //, - //, + //, + //, ], notMatches: [/home/, /ssr/, /csr/, /ssg-two/, /ssg\-component/, /cross-dep-/], }, '/ssg/two': { matches: [ - //, - //, + //, + //, ], notMatches: [/home/, /ssr/, /csr/, /ssg-one/, /ssg\-component/, /cross-dep-/], }, '/ssr': { - matches: [//], + matches: [//], notMatches: [/home/, /ssg\-component/, /csr/], }, '/csr': { - matches: [//], + matches: [//], notMatches: [/home/, /ssg\-component/, /ssr/, /cross-dep-/], }, }; diff --git a/tests/e2e/tests/mcp/find-examples-basic.ts b/tests/e2e/tests/mcp/find-examples-basic.ts deleted file mode 100644 index b7f42045076c..000000000000 --- a/tests/e2e/tests/mcp/find-examples-basic.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { exec, ProcessOutput, silentNpm } from '../../utils/process'; -import assert from 'node:assert/strict'; - -const MCP_INSPECTOR_PACKAGE_NAME = '@modelcontextprotocol/inspector-cli'; -const MCP_INSPECTOR_PACKAGE_VERSION = '0.16.2'; -const MCP_INSPECTOR_COMMAND_NAME = 'mcp-inspector-cli'; - -async function runInspector(...args: string[]): Promise { - const result = await exec( - MCP_INSPECTOR_COMMAND_NAME, - '--cli', - 'npx', - '--no', - '@angular/cli', - 'mcp', - ...args, - ); - - return result; -} - -export default async function () { - const [nodeMajor, nodeMinor] = process.versions.node.split('.', 2).map(Number); - if (nodeMajor < 22 || (nodeMajor === 22 && nodeMinor < 16)) { - console.log('Test bypassed: find_examples tool requires Node.js 22.16 or higher.'); - - return; - } - - await silentNpm( - 'install', - '--ignore-scripts', - '-g', - `${MCP_INSPECTOR_PACKAGE_NAME}@${MCP_INSPECTOR_PACKAGE_VERSION}`, - ); - - // Ensure `get_best_practices` returns the markdown content - const { stdout: stdoutInsideWorkspace } = await runInspector( - '--method', - 'tools/call', - '--tool-name', - 'find_examples', - '--tool-arg', - 'query=if', - ); - - assert.match(stdoutInsideWorkspace, /Using the @if Built-in Control Flow Block/); -} diff --git a/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts b/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts new file mode 100644 index 000000000000..db8b91a0abbe --- /dev/null +++ b/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts @@ -0,0 +1,43 @@ +import assert from 'node:assert/strict'; +import { applyVitestBuilder } from '../../utils/vitest'; +import { ng } from '../../utils/process'; +import { installPackage } from '../../utils/packages'; +import { expectFileToExist, readFile } from '../../utils/fs'; + +export default async function (): Promise { + await applyVitestBuilder(); + await installPackage('playwright@1'); + await installPackage('@vitest/browser-playwright@4'); + await installPackage('@vitest/coverage-v8@4'); + + // Run tests with coverage in browser mode. + // We use the default passing tests generated for the project. + const { stdout } = await ng( + 'test', + '--no-watch', + '--browsers', + 'chromiumHeadless', + '--coverage', + '--coverage-reporters=json-summary', + ); + + // Verify that tests passed + assert.match(stdout, /pass/, 'Expected tests to run successfully.'); + + // Verify that coverage files are generated + const summaryPath = 'coverage/test-project/coverage-summary.json'; + await expectFileToExist(summaryPath); + + const summary = JSON.parse(await readFile(summaryPath)); + + // Find the key for app.ts (it might be an absolute path) + const appFileKey = Object.keys(summary).find((key) => key.endsWith('app.ts')); + assert.ok(appFileKey, 'Expected coverage summary to contain app.ts.'); + + const appCoverage = summary[appFileKey]; + assert.ok(appCoverage.lines.pct > 0, 'Expected lines percentage to be greater than 0.'); + + // Also verify that spec files are NOT present in the summary + const specFileKey = Object.keys(summary).find((key) => key.endsWith('.spec.ts')); + assert.ok(!specFileKey, 'Expected coverage report to not contain .spec.ts files.'); +} diff --git a/tests/e2e/tests/vitest/browser-custom-config.ts b/tests/e2e/tests/vitest/browser-custom-config.ts new file mode 100644 index 000000000000..a523f421853f --- /dev/null +++ b/tests/e2e/tests/vitest/browser-custom-config.ts @@ -0,0 +1,54 @@ +import assert from 'node:assert/strict'; +import { applyVitestBuilder } from '../../utils/vitest'; +import { ng } from '../../utils/process'; +import { installPackage } from '../../utils/packages'; +import { writeFile } from '../../utils/fs'; + +export default async function (): Promise { + await applyVitestBuilder(); + await installPackage('playwright@1'); + await installPackage('@vitest/browser-playwright@4'); + await ng('generate', 'component', 'my-comp'); + + // Create vitest-base.config.ts + await writeFile( + 'vitest-base.config.ts', + ` + import { defineConfig } from 'vitest/config'; + import { playwright } from '@vitest/browser-playwright'; + + export default defineConfig({ + test: { + browser: { + enabled: true, + provider: playwright({launchOptions: {executablePath: process.env['CHROME_BIN']}}), + instances: [ + { browser: 'chromium' }, + ], + headless: true, + }, + }, + }); + `, + ); + + // Create a spec file that asserts browser environment + await writeFile( + 'src/browser.spec.ts', + ` + describe('Browser Environment Check', () => { + it('should be running in Chromium', () => { + const ua = navigator.userAgent; + // Fail the test if it's not Chrome/Chromium + if (!ua.includes('Chrome') && !ua.includes('Chromium')) { + throw new Error('Expected to be running in Chrome/Chromium, but User Agent is: ' + ua); + } + }); + }); + `, + ); + + const { stdout } = await ng('test', '--no-watch', '--runner-config'); + + assert.match(stdout, /3 passed/, 'Expected 3 tests to pass.'); +} diff --git a/tests/e2e/tests/vitest/larger-project.ts b/tests/e2e/tests/vitest/larger-project.ts index 61b18b102c4b..90bb283f2d8a 100644 --- a/tests/e2e/tests/vitest/larger-project.ts +++ b/tests/e2e/tests/vitest/larger-project.ts @@ -2,12 +2,11 @@ import { ng } from '../../utils/process'; import { applyVitestBuilder } from '../../utils/vitest'; import assert from 'node:assert'; import { installPackage } from '../../utils/packages'; -import { exec } from '../../utils/process'; export default async function () { await applyVitestBuilder(); - const artifactCount = 100; + const artifactCount = 500; // A new project starts with 1 test file (app.spec.ts) // Each generated artifact will add one more test file. const initialTestCount = 1; diff --git a/tests/package.json b/tests/package.json index 87853142d75c..7ab64c3d5212 100644 --- a/tests/package.json +++ b/tests/package.json @@ -2,6 +2,6 @@ "devDependencies": { "@types/tar-stream": "3.1.4", "@angular-devkit/schematics": "workspace:*", - "tar-stream": "3.1.8" + "tar-stream": "3.2.0" } } diff --git a/tools/defaults.bzl b/tools/defaults.bzl index dd706151d169..dd054c9c1462 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -2,7 +2,6 @@ load("@aspect_rules_jasmine//jasmine:defs.bzl", _jasmine_test = "jasmine_test") load("@aspect_rules_js//js:defs.bzl", _js_binary = "js_binary") load("@bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin") load("@devinfra//bazel/ts_project:index.bzl", "strict_deps_test") -load("@rules_angular//src/ng_examples_db:index.bzl", _ng_examples_db = "ng_examples_db") load("@rules_angular//src/ng_package:index.bzl", _ng_package = "ng_package") load("@rules_angular//src/ts_project:index.bzl", _ts_project = "ts_project") load("//tools:substitutions.bzl", "substitutions") @@ -91,6 +90,3 @@ def jasmine_test(data = [], args = [], **kwargs): data = data + ["//:node_modules/source-map-support"], **kwargs ) - -def ng_examples_db(**kwargs): - _ng_examples_db(**kwargs) 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 diff --git a/tools/toolchain_info.bzl b/tools/toolchain_info.bzl index f4bfe56f72d3..b920c8a8f88a 100644 --- a/tools/toolchain_info.bzl +++ b/tools/toolchain_info.bzl @@ -5,6 +5,7 @@ TOOLCHAINS_NAMES = [ "node22", "node24", + "node26", ] # this is the list of toolchains that should be used and are registered with nodejs_register_toolchains in the WORKSPACE file @@ -19,6 +20,11 @@ TOOLCHAINS_VERSIONS = [ "@bazel_tools//src/conditions:darwin": "@node24_darwin_amd64//:node_toolchain", "@bazel_tools//src/conditions:windows": "@node24_windows_amd64//:node_toolchain", }), + select({ + "@bazel_tools//src/conditions:linux_x86_64": "@node26_linux_amd64//:node_toolchain", + "@bazel_tools//src/conditions:darwin": "@node26_darwin_amd64//:node_toolchain", + "@bazel_tools//src/conditions:windows": "@node26_windows_amd64//:node_toolchain", + }), ] # A default toolchain for use when only one is necessary diff --git a/tsconfig.json b/tsconfig.json index 084f85434cf9..d1cd20b4cefb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,6 @@ "strict": true, "target": "es2023", "lib": ["es2023"], - "rootDir": ".", "rootDirs": [".", "./dist-schema/bin/"], "paths": { "@angular-devkit/build-webpack": ["./packages/angular_devkit/build_webpack"],