From 054b97dd5284473e39a79724e63c53e16eda6aa6 Mon Sep 17 00:00:00 2001 From: Troy Steuwer Date: Tue, 28 Apr 2026 09:45:44 -0400 Subject: [PATCH 01/82] feat(@angular/build): split browser and server stats JSON files for easier consumption Adds separate `browser-stats.json` and `server-stats.json` output files alongside the existing `stats.json`, making it easier for consumers to work with browser-only or server-only bundle metadata. Includes unit tests for the new filtering utility and the updated stats-json builder option. --- .../src/builders/application/execute-build.ts | 30 ++- .../tests/options/stats-json_spec.ts | 185 ++++++++++++++++++ .../esbuild/angular/component-stylesheets.ts | 1 + .../src/tools/esbuild/bundler-context.ts | 19 ++ .../angular/build/src/tools/esbuild/utils.ts | 30 +++ .../build/src/tools/esbuild/utils_spec.ts | 134 +++++++++++++ 6 files changed, 395 insertions(+), 4 deletions(-) create mode 100644 packages/angular/build/src/builders/application/tests/options/stats-json_spec.ts create mode 100644 packages/angular/build/src/tools/esbuild/utils_spec.ts diff --git a/packages/angular/build/src/builders/application/execute-build.ts b/packages/angular/build/src/builders/application/execute-build.ts index 5aefadc9d904..a7b7be1f208d 100644 --- a/packages/angular/build/src/builders/application/execute-build.ts +++ b/packages/angular/build/src/builders/application/execute-build.ts @@ -21,6 +21,7 @@ import { extractLicenses } from '../../tools/esbuild/license-extractor'; import { profileAsync } from '../../tools/esbuild/profiling'; import { calculateEstimatedTransferSizes, + filterMetafile, logBuildStats, transformSupportedBrowsersToTargets, } from '../../tools/esbuild/utils'; @@ -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/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/tools/esbuild/angular/component-stylesheets.ts b/packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts index 3b8d12ec1461..b6670b3ab98a 100644 --- a/packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts +++ b/packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts @@ -278,6 +278,7 @@ export class ComponentStylesheetBundler { contents, outputFiles, metafile, + browserMetafile: metafile, referencedFiles, externalImports: result.externalImports, initialFiles: new Map(), diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts index 864ca2c6fdd9..8544c426a294 100644 --- a/packages/angular/build/src/tools/esbuild/bundler-context.ts +++ b/packages/angular/build/src/tools/esbuild/bundler-context.ts @@ -29,6 +29,8 @@ export type BundleContextResult = errors: undefined; warnings: Message[]; metafile: Metafile; + browserMetafile: Metafile; + serverMetafile?: Metafile; outputFiles: BuildOutputFile[]; initialFiles: Map; externalImports: { @@ -128,6 +130,8 @@ export class BundlerContext { let errors: Message[] | undefined; const warnings: Message[] = []; const metafile: Metafile = { inputs: {}, outputs: {} }; + const browserMetafile: Metafile = { inputs: {}, outputs: {} }; + let serverMetafile: Metafile | undefined; const initialFiles = new Map(); const externalImportsBrowser = new Set(); const externalImportsServer = new Set(); @@ -148,6 +152,17 @@ export class BundlerContext { Object.assign(metafile.outputs, result.metafile.outputs); } + // Keep browser and server metafiles isolated for separate stats output + if (result.browserMetafile) { + Object.assign(browserMetafile.inputs, result.browserMetafile.inputs); + Object.assign(browserMetafile.outputs, result.browserMetafile.outputs); + } + if (result.serverMetafile) { + serverMetafile ??= { inputs: {}, outputs: {} }; + Object.assign(serverMetafile.inputs, result.serverMetafile.inputs); + Object.assign(serverMetafile.outputs, result.serverMetafile.outputs); + } + result.initialFiles.forEach((value, key) => initialFiles.set(key, value)); outputFiles.push(...result.outputFiles); @@ -170,6 +185,8 @@ export class BundlerContext { errors, warnings, metafile, + browserMetafile, + serverMetafile, initialFiles, outputFiles, externalImports: { @@ -414,6 +431,8 @@ export class BundlerContext { [isPlatformServer ? 'server' : 'browser']: externalImports, }, externalConfiguration, + browserMetafile: isPlatformServer ? { inputs: {}, outputs: {} } : result.metafile, + serverMetafile: isPlatformServer ? result.metafile : undefined, errors: undefined, }; } diff --git a/packages/angular/build/src/tools/esbuild/utils.ts b/packages/angular/build/src/tools/esbuild/utils.ts index 2730dafae97c..a17c80df42d1 100644 --- a/packages/angular/build/src/tools/esbuild/utils.ts +++ b/packages/angular/build/src/tools/esbuild/utils.ts @@ -29,6 +29,36 @@ import { PrerenderedRoutesRecord, } from './bundler-execution-result'; +/** + * Filters a metafile to only include outputs matching a predicate, + * along with the inputs those outputs directly reference. + */ +export function filterMetafile( + metafile: Metafile, + predicate: (outputPath: string) => boolean, +): Metafile { + const filteredOutputs: Metafile['outputs'] = {}; + const referencedInputs = new Set(); + + for (const [path, output] of Object.entries(metafile.outputs)) { + if (predicate(path)) { + filteredOutputs[path] = output; + for (const inputPath of Object.keys(output.inputs)) { + referencedInputs.add(inputPath); + } + } + } + + const filteredInputs: Metafile['inputs'] = {}; + for (const [inputPath, input] of Object.entries(metafile.inputs)) { + if (referencedInputs.has(inputPath)) { + filteredInputs[inputPath] = input; + } + } + + return { inputs: filteredInputs, outputs: filteredOutputs }; +} + export function logBuildStats( metafile: Metafile, outputFiles: BuildOutputFile[], diff --git a/packages/angular/build/src/tools/esbuild/utils_spec.ts b/packages/angular/build/src/tools/esbuild/utils_spec.ts new file mode 100644 index 000000000000..702eb13d815a --- /dev/null +++ b/packages/angular/build/src/tools/esbuild/utils_spec.ts @@ -0,0 +1,134 @@ +/** + * @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 { filterMetafile } from './utils'; + +// Derive the Metafile type from filterMetafile's own signature to avoid a direct esbuild import. +type TestMetafile = Parameters[0]; + +/** + * Builds a minimal Metafile-shaped object for testing filterMetafile. + * @param outputsWithInputs Maps each output path to the input paths it references. + * @param unreferencedInputs Additional input paths that exist in the metafile but + * are not referenced by any output. + */ +function createMetafile( + outputsWithInputs: Record, + unreferencedInputs: string[] = [], +): TestMetafile { + const inputs: TestMetafile['inputs'] = {}; + const outputs: TestMetafile['outputs'] = {}; + + for (const path of unreferencedInputs) { + inputs[path] = { bytes: 0, imports: [] }; + } + + for (const [outputPath, inputPaths] of Object.entries(outputsWithInputs)) { + const outputInputs: TestMetafile['outputs'][string]['inputs'] = {}; + for (const inputPath of inputPaths) { + outputInputs[inputPath] = { bytesInOutput: 0 }; + inputs[inputPath] ??= { bytes: 0, imports: [] }; + } + outputs[outputPath] = { bytes: 0, inputs: outputInputs, imports: [], exports: [] }; + } + + return { inputs, outputs }; +} + +describe('filterMetafile', () => { + it('returns only outputs matching the predicate', () => { + const metafile = createMetafile({ + 'browser/main.js': ['src/main.ts'], + 'browser/polyfills.js': ['src/polyfills.ts'], + 'server/server.mjs': ['src/server.ts'], + }); + + const result = filterMetafile(metafile, (path) => path.startsWith('browser/')); + + expect(Object.keys(result.outputs)).toEqual( + jasmine.arrayContaining(['browser/main.js', 'browser/polyfills.js']), + ); + expect(Object.keys(result.outputs)).not.toContain('server/server.mjs'); + }); + + it('includes only inputs referenced by outputs that match the predicate', () => { + const metafile = createMetafile({ + 'browser/main.js': ['src/main.ts', 'src/app.ts'], + 'server/server.mjs': ['src/server.ts'], + }); + + const result = filterMetafile(metafile, (path) => path.startsWith('browser/')); + + expect(Object.keys(result.inputs)).toContain('src/main.ts'); + expect(Object.keys(result.inputs)).toContain('src/app.ts'); + expect(Object.keys(result.inputs)).not.toContain('src/server.ts'); + }); + + it('excludes unreferenced inputs even when they exist in the original metafile', () => { + const metafile = createMetafile({ 'browser/main.js': ['src/main.ts'] }, [ + 'src/unreferenced.ts', + ]); + + const result = filterMetafile(metafile, () => true); + + expect(Object.keys(result.inputs)).not.toContain('src/unreferenced.ts'); + }); + + it('returns empty outputs and inputs when predicate never matches', () => { + const metafile = createMetafile({ + 'browser/main.js': ['src/main.ts'], + 'browser/polyfills.js': ['src/polyfills.ts'], + }); + + const result = filterMetafile(metafile, () => false); + + expect(Object.keys(result.outputs)).toEqual([]); + expect(Object.keys(result.inputs)).toEqual([]); + }); + + it('returns all outputs and their referenced inputs when predicate always matches', () => { + const metafile = createMetafile({ + 'browser/main.js': ['src/main.ts'], + 'browser/polyfills.js': ['src/polyfills.ts'], + }); + + const result = filterMetafile(metafile, () => true); + + expect(Object.keys(result.outputs).length).toBe(2); + expect(Object.keys(result.inputs)).toEqual( + jasmine.arrayContaining(['src/main.ts', 'src/polyfills.ts']), + ); + }); + + it('deduplicates inputs referenced by multiple matching outputs', () => { + const metafile = createMetafile({ + 'browser/main.js': ['src/shared.ts', 'src/main.ts'], + 'browser/polyfills.js': ['src/shared.ts', 'src/polyfills.ts'], + }); + + const result = filterMetafile(metafile, () => true); + + const inputKeys = Object.keys(result.inputs); + const sharedOccurrences = inputKeys.filter((k) => k === 'src/shared.ts').length; + expect(sharedOccurrences).toBe(1); + }); + + it('does not mutate the original metafile', () => { + const metafile = createMetafile({ + 'browser/main.js': ['src/main.ts'], + 'server/server.mjs': ['src/server.ts'], + }); + const originalOutputCount = Object.keys(metafile.outputs).length; + const originalInputCount = Object.keys(metafile.inputs).length; + + filterMetafile(metafile, (path) => path.startsWith('browser/')); + + expect(Object.keys(metafile.outputs).length).toBe(originalOutputCount); + expect(Object.keys(metafile.inputs).length).toBe(originalInputCount); + }); +}); From 2942af765d6e9a8bf075bd03dc346dc70eb9b61d Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 28 Apr 2026 16:16:01 +0000 Subject: [PATCH 02/82] build: update cross-repo angular dependencies See associated pull request for more information. --- MODULE.bazel | 6 +- package.json | 28 +- packages/angular/ssr/package.json | 12 +- packages/ngtools/webpack/package.json | 4 +- pnpm-lock.yaml | 386 +++++++++++--------------- tests/e2e/ng-snapshot/package.json | 32 +-- 6 files changed, 204 insertions(+), 264 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index c0c3d9aa4e4c..a694184aa957 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -19,21 +19,21 @@ bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4") bazel_dep(name = "rules_angular") git_override( module_name = "rules_angular", - commit = "03dade2ea0ea355e13ca88c550eaa633191b16ec", + commit = "c6f7e15470934f7c2fe46ff5bae7d68be0230501", remote = "https://github.com/angular/rules_angular.git", ) bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "e04d90adad1a125b29fbc4d97f425798768a8cb1", + commit = "069730b7aac7a34fde6bde3dcd11776d809e373f", remote = "https://github.com/angular/dev-infra.git", ) bazel_dep(name = "rules_browsers") git_override( module_name = "rules_browsers", - commit = "4de93bbfdbee2cea5162ac8070eb15846b15133d", + commit = "af35c89a5a099c4bbc3f1a3495688cf51bd6a8da", remote = "https://github.com/angular/rules_browsers.git", ) diff --git a/package.json b/package.json index 5678b9639536..5fb74feb3f00 100644 --- a/package.json +++ b/package.json @@ -42,23 +42,23 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular/compiler-cli": "22.0.0-next.8", + "@angular/compiler-cli": "22.0.0-next.9", "typescript": "6.0.2" }, "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.9", + "@angular/cdk": "22.0.0-next.6", + "@angular/common": "22.0.0-next.9", + "@angular/compiler": "22.0.0-next.9", + "@angular/core": "22.0.0-next.9", + "@angular/forms": "22.0.0-next.9", + "@angular/localize": "22.0.0-next.9", + "@angular/material": "22.0.0-next.6", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ab3557efa43d75ac873b8a6d94683b33bf18ca0f", + "@angular/platform-browser": "22.0.0-next.9", + "@angular/platform-server": "22.0.0-next.9", + "@angular/router": "22.0.0-next.9", + "@angular/service-worker": "22.0.0-next.9", "@babel/core": "7.29.0", "@bazel/bazelisk": "1.28.1", "@bazel/buildifier": "8.2.1", diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index f8ad717ada0c..154e6c7e4175 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -29,12 +29,12 @@ }, "devDependencies": { "@angular-devkit/schematics": "workspace:*", - "@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/platform-server": "22.0.0-next.8", - "@angular/router": "22.0.0-next.8", + "@angular/common": "22.0.0-next.9", + "@angular/compiler": "22.0.0-next.9", + "@angular/core": "22.0.0-next.9", + "@angular/platform-browser": "22.0.0-next.9", + "@angular/platform-server": "22.0.0-next.9", + "@angular/router": "22.0.0-next.9", "@schematics/angular": "workspace:*", "beasties": "0.4.2" }, diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index a3eb3fc64d29..9e65660f9b2f 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", - "@angular/compiler": "22.0.0-next.8", - "@angular/compiler-cli": "22.0.0-next.8", + "@angular/compiler": "22.0.0-next.9", + "@angular/compiler-cli": "22.0.0-next.9", "typescript": "6.0.2", "webpack": "5.106.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b56d10ced317..e5449edd91f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,8 +14,8 @@ 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.9 + version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) typescript: specifier: 6.0.2 version: 6.0.2 @@ -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.9 + version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) '@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) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(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) + specifier: 22.0.0-next.9 + version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8 + specifier: 22.0.0-next.9 + version: 22.0.0-next.9 '@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.9 + version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) '@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.9 + version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9 + version: 22.0.0-next.9(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(@angular/compiler@22.0.0-next.9) '@angular/material': - specifier: 22.0.0-next.5 - version: 22.0.0-next.5(5497bbcfb1239c9f845ffb9323badfbb) + specifier: 22.0.0-next.6 + version: 22.0.0-next.6(68d7531aea4d51eda6419eb6fe82b2bb) '@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#ab3557efa43d75ac873b8a6d94683b33bf18ca0f + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ab3557efa43d75ac873b8a6d94683b33bf18ca0f(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) '@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.9 + version: 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) '@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.9 + version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.9)(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9 + version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9 + version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@babel/core': specifier: 7.29.0 version: 7.29.0 @@ -327,7 +327,7 @@ importers: version: 29.0.2 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) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) rxjs: specifier: 7.8.2 version: 7.8.2 @@ -430,7 +430,7 @@ importers: 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) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) postcss: specifier: 8.5.10 version: 8.5.10 @@ -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.9 + version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.8 - version: 22.0.0-next.8 + specifier: 22.0.0-next.9 + version: 22.0.0-next.9 '@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.9 + version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) '@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.9 + version: 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) '@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.9 + version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.9)(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9 + version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular @@ -675,7 +675,7 @@ importers: version: 8.5.10 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.10)(typescript@6.0.2)(webpack@5.106.2(esbuild@0.28.0)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -730,7 +730,7 @@ importers: 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) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) undici: specifier: 8.1.0 version: 8.1.0 @@ -822,11 +822,11 @@ 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.9 + version: 22.0.0-next.9 '@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.9 + version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) typescript: specifier: 6.0.2 version: 6.0.2 @@ -863,8 +863,8 @@ importers: 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==} @@ -935,47 +935,47 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular/animations@22.0.0-next.8': - resolution: {integrity: sha512-B+XxQ8iyvE0/XAdprYZJBp0MaIxyampFdzj9y5xnVLYnE2mv6VTX2sy50XyVq8rsYWashGqguLQhfuxAz1SKKw==} + '@angular/animations@22.0.0-next.9': + resolution: {integrity: sha512-mWWsuq7TvzVuAz0eMLqMrOdi/Z57TsyYUvlETKlZ8Ik4VXZ3ozDFUC6ysSiratr5Y0H/fA+wmLRFm+Uu2RfOqg==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/core': 22.0.0-next.8 + '@angular/core': 22.0.0-next.9 - '@angular/cdk@22.0.0-next.5': - resolution: {integrity: sha512-9DyyFdtzZVKwmkVzg4cEJtpaQ2JANYYhmt9qfN7Tm1ACk1oleKsPXnX38Ojt0R7+KRSS/RmP8rAvs0gkYYmneA==} + '@angular/cdk@22.0.0-next.6': + resolution: {integrity: sha512-gvk+QYKSA4pmT9tKZDKI3WAWtmVKC6GyZ7KL+t8/yE9heeDUQ5KYURohYfYwLkg/PHXeurKc9I+XSPKsq2N5ZQ==} 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==} + '@angular/common@22.0.0-next.9': + resolution: {integrity: sha512-cjnDWnGjMT/78EEZjQQutQPuUdKO0nfcBlEiG9cL1dliaHpwjLNzOW4TNlNQJr7hz9FSWCWAZAFJugRoZxc8vQ==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/core': 22.0.0-next.8 + '@angular/core': 22.0.0-next.9 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@22.0.0-next.8': - resolution: {integrity: sha512-K7tPLXndd+Y6Hz3GO9CDbpNE8Oaf3nA+zg37Uh4ei8nurPbY85pPDl9v4VezGfc2n5gclbersRDL8ErF6oH/wA==} + '@angular/compiler-cli@22.0.0-next.9': + resolution: {integrity: sha512-OBFNOsA18miM8U1A4lsCQz5f7THelVH+10NhoI7+YLJZreUUdK1SDlk0pF4MBs2lbYP99k2G35Pm68W1k89f0g==} engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.9 typescript: '>=6.0 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@22.0.0-next.8': - resolution: {integrity: sha512-IJbaCben+Up86sd152Hfe/OO+K9HRIwR5Kn4AfbcGcrOO2syb2O49cMfd2UJeu9syZd2bn2R2jeCTLAL1F7I0Q==} + '@angular/compiler@22.0.0-next.9': + resolution: {integrity: sha512-O7HroLbQFcl2JLJrEKCu3eob0a2w2nTZ36Bx93pzAsWxNMt6nMcIFv1y0qL5TO5eS2WOUGQXagv4+7U+m+0C4Q==} engines: {node: ^22.22.0 || >=24.13.1} - '@angular/core@22.0.0-next.8': - resolution: {integrity: sha512-kNSa1RuDI9u/jFsUy4mQTbLoSkzOW4CeaCbi0Bs7OPkOnnhez9ZEi1KOxJmU9hP3jme6Gc+l1Y2SlkcChYTq6w==} + '@angular/core@22.0.0-next.9': + resolution: {integrity: sha512-cXE3ZM13xd3d4YfrYCRiDs+EikzDm9qeutwiuZ43f3kEsfgvPkdoYtpSevaG+92752XRwyOan3Lz7TLxKp9i2w==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/compiler': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.9 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==} + '@angular/forms@22.0.0-next.9': + resolution: {integrity: sha512-5Mf5p2FWKOFYipylvpyXZ7UCFSSWO8oGwkKj4qRpojH8i7T6l8y6uym2dakYZwYvjCZdCMKQss63ldFPObQRJA==} engines: {node: ^22.22.0 || >=24.13.1} 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.9 + '@angular/core': 22.0.0-next.9 + '@angular/platform-browser': 22.0.0-next.9 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@22.0.0-next.8': - resolution: {integrity: sha512-jgRojzy4uFy2kw6zDYTi/Sb7e4cYYyIxiwBaAh87kRiOe54qN00YmYqOv2eHZUhvEV8y6FlcNlwR2GxRVgSuzg==} + '@angular/localize@22.0.0-next.9': + resolution: {integrity: sha512-vYUYC15AVpPZZ9qGEwOyT3a1EAo0Sf+Y0kZIsRNGadl5FU1txyYmTx+ZCOoHoYLk8xI8AZWFcZOQGV1t9N9G4w==} engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.8 - '@angular/compiler-cli': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.9 + '@angular/compiler-cli': 22.0.0-next.9 - '@angular/material@22.0.0-next.5': - resolution: {integrity: sha512-JFnec4HOijd8a/DB2icC5fkhgfhgUrU6P8Md1bmi0jpXHkXG+ZOTniggEVRQgafeFyZpSzbeV+se7PTsuVBNyA==} + '@angular/material@22.0.0-next.6': + resolution: {integrity: sha512-PtFU5FGJonPfoAaFcfhieB8TZrDliBqWhOXudTPQXtSaOLBoEYScRTIMqXhd4NQeN0pB0SAtczPOM1Iral7Haw==} peerDependencies: - '@angular/cdk': 22.0.0-next.5 + '@angular/cdk': 22.0.0-next.6 '@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/ab3557efa43d75ac873b8a6d94683b33bf18ca0f': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ab3557efa43d75ac873b8a6d94683b33bf18ca0f} + version: 0.0.0-a71a5d725b4f2c8f090a58c8fda7b437bdc3b89a hasBin: true - '@angular/platform-browser@22.0.0-next.8': - resolution: {integrity: sha512-u9kKi4KWU8hLBiA8r5MiYa2pdA7VQ0uxi0V0vu0UB+uJt2HN/CcrS+zGqlh6Xz2huwyQr9MnVFlEnfJdZ498uw==} + '@angular/platform-browser@22.0.0-next.9': + resolution: {integrity: sha512-YKZiwnWDsDRlyw6MmcpZIO/vb4mMFOPXyZaTNvuSR63rBx/jJ/eo1ocii5k2cW+CMu7ZwuABrWoEBSRughhwyA==} engines: {node: ^22.22.0 || >=24.13.1} 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.9 + '@angular/common': 22.0.0-next.9 + '@angular/core': 22.0.0-next.9 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/platform-server@22.0.0-next.8': - resolution: {integrity: sha512-kfY2jnNW8RNtX9Bw0M5Wf0x1UiZDlJ6SckoHzLDeu/o+FbXiNkt6t77ACZ9LNBqUIt0pn734ElBO/suKYuNRcw==} + '@angular/platform-server@22.0.0-next.9': + resolution: {integrity: sha512-nIG0wGc8jpwdy/KsFq7VWH6U7uHRbczNrldC4kmq96+btwcg1iDE7ipippaJVzlkn6CKU9AYAAYoaJsTTexG9A==} engines: {node: ^22.22.0 || >=24.13.1} 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.9 + '@angular/compiler': 22.0.0-next.9 + '@angular/core': 22.0.0-next.9 + '@angular/platform-browser': 22.0.0-next.9 rxjs: ^6.5.3 || ^7.4.0 - '@angular/router@22.0.0-next.8': - resolution: {integrity: sha512-hSAjch0waofFF7lOVBDOXgzz5BvXrhEpeKbvcHKL58wjogBt1nSWZx5zBVcMWWOAhFBOmrKmib3qR9lIn3EPAQ==} + '@angular/router@22.0.0-next.9': + resolution: {integrity: sha512-2GnVrAUHZjlXvdEE8Bvwvf8rvXIlKYRaqDE8fwPQNqDEoCWnPo+wEb8V4x0J2PfcwIsAo3nqV77FtjQxt2wvUQ==} engines: {node: ^22.22.0 || >=24.13.1} 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.9 + '@angular/core': 22.0.0-next.9 + '@angular/platform-browser': 22.0.0-next.9 rxjs: ^6.5.3 || ^7.4.0 - '@angular/service-worker@22.0.0-next.8': - resolution: {integrity: sha512-dqQkRBX3WFNg8wJ+5NTbXUST2k7r4kMk9X0uCxaN86ptxvvn61LIF9rBwr7FKJLeDIq47jnWzwiX3UrN766YSw==} + '@angular/service-worker@22.0.0-next.9': + resolution: {integrity: sha512-gf+vb4mUQ8YDRekKldbxyDWznNiqNzxWz4K0ecuLauS6yKiOmJeD467V5/UjwT5SN3I68Jw3rJNi/hO8VrepGg==} engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/core': 22.0.0-next.8 + '@angular/core': 22.0.0-next.9 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@5.1.11': @@ -2036,8 +2036,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 @@ -2426,15 +2426,6 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.4.1': - resolution: {integrity: sha512-AH5xPQ997K7e0F0vulPlteIHke2awMkFi8F0dBemrDfmvtPmHJo82mdHbONC4F/t8d1NHwrbI5cGVI+RbLWdoQ==} - engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@inquirer/prompts@8.4.2': resolution: {integrity: sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -5383,8 +5374,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==} @@ -6659,8 +6650,8 @@ packages: tailwindcss: optional: true - nock@14.0.12: - resolution: {integrity: sha512-kZM3bHV0KzhHH6E2eRszHyML/w87AUzLBwupNTHohtYWP9fZYgUPmCbSKq6ITfEEmHqN4/p0MscvUipT4P5Qsg==} + nock@14.0.13: + resolution: {integrity: sha512-SCPsQmGVNY8h1rfS3aU0MzOGYY+wKIFukHEsoSIwPRCYocZkya7MFIlWIEYPWQZj+Gaksg6EyUaY255ZDqpQuA==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} node-addon-api@6.1.0: @@ -8568,7 +8559,7 @@ packages: snapshots: - '@actions/core@3.0.0': + '@actions/core@3.0.1': dependencies: '@actions/exec': 3.0.0 '@actions/http-client': 4.0.0 @@ -8673,29 +8664,29 @@ snapshots: '@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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))': 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.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) 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.6(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) 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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(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.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) 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)': + '@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2)': dependencies: - '@angular/compiler': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.9 '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -8709,47 +8700,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler-cli@22.0.0-next.8(@angular/compiler@22.0.0-next.8)(typescript@6.0.3)': + '@angular/compiler@22.0.0-next.9': 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.3 - transitivePeerDependencies: - - supports-color - '@angular/compiler@22.0.0-next.8': - 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.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 22.0.0-next.8 + '@angular/compiler': 22.0.0-next.9 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/forms@22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@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.9(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(@angular/compiler@22.0.0-next.9)': 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.9 + '@angular/compiler-cli': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.16 @@ -8757,23 +8732,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@22.0.0-next.5(5497bbcfb1239c9f845ffb9323badfbb)': + '@angular/material@22.0.0-next.6(68d7531aea4d51eda6419eb6fe82b2bb)': 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.6(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) 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/ab3557efa43d75ac873b8a6d94683b33bf18ca0f(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))': 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) + '@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 +8779,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,7 +8787,7 @@ snapshots: jsonc-parser: 3.3.1 minimatch: 10.2.5 multimatch: 8.0.0 - nock: 14.0.12 + nock: 14.0.13 semver: 7.7.4 supports-color: 10.2.2 tsx: 4.21.0 @@ -8827,35 +8802,35 @@ snapshots: - '@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.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))': 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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) 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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) - '@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.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.9)(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/compiler': 22.0.0-next.9 + '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) 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.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) 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.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(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.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 @@ -9847,7 +9822,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 @@ -10366,21 +10341,6 @@ snapshots: 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) @@ -12902,15 +12862,6 @@ snapshots: optionalDependencies: typescript: 6.0.2 - cosmiconfig@9.0.1(typescript@6.0.3): - 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.3 - cross-fetch@4.1.0(encoding@0.1.13): dependencies: node-fetch: 2.7.0(encoding@0.1.13) @@ -13774,9 +13725,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 @@ -15156,10 +15107,10 @@ 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.3(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2): 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) + '@angular/compiler-cli': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) '@rollup/plugin-json': 6.1.0(rollup@4.60.2) '@rollup/wasm-node': 4.60.2 ajv: 8.18.0 @@ -15175,16 +15126,16 @@ snapshots: ora: 9.3.0 piscina: 5.1.4 postcss: 8.5.10 - rollup-plugin-dts: 6.4.1(rollup@4.60.2)(typescript@6.0.3) + rollup-plugin-dts: 6.4.1(rollup@4.60.2)(typescript@6.0.2) rxjs: 7.8.2 sass: 1.99.0 tinyglobby: 0.2.16 tslib: 2.8.1 - typescript: 6.0.3 + typescript: 6.0.2 optionalDependencies: rollup: 4.60.2 - nock@14.0.12: + nock@14.0.13: dependencies: '@mswjs/interceptors': 0.41.4 json-stringify-safe: 5.0.1 @@ -15631,9 +15582,9 @@ 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.10)(typescript@6.0.2)(webpack@5.106.2(esbuild@0.28.0)): dependencies: - cosmiconfig: 9.0.1(typescript@6.0.3) + cosmiconfig: 9.0.1(typescript@6.0.2) jiti: 2.6.1 postcss: 8.5.10 semver: 7.7.4 @@ -16054,17 +16005,6 @@ snapshots: 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 - 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): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.2) diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 58ede0255707..6bc4d038e905 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#87941912d94f1319546445d14d66dfc1e6433a30", + "@angular/cdk": "github:angular/cdk-builds#c2d20f36438de8c10caeea62e0c2edb17ef626ac", + "@angular/common": "github:angular/common-builds#80e58a59c42a24902a97bfbf3cd4ef513e21469c", + "@angular/compiler": "github:angular/compiler-builds#5535bf11e4cbcb643794a014434b2de4e0a69503", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#0a095f1e3b7b00046a1b5cbd0df7367e4065460a", + "@angular/core": "github:angular/core-builds#996438b8a2f91b0d5b497a3602fce8945beab5da", + "@angular/forms": "github:angular/forms-builds#df66eaa3be89ae2b0bcf7d06c10a698409a572cc", + "@angular/language-service": "github:angular/language-service-builds#37a008a0c844322096280739fe8549eae520df0a", + "@angular/localize": "github:angular/localize-builds#9440eecfd7fd8d5a52852b3e435782ebf63ad41d", + "@angular/material": "github:angular/material-builds#87c2b054da2f59cb31e6c59b4882f7a6d2c274d1", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#e119b90a1c7df721b61ea0397d886025ff432b8b", + "@angular/platform-browser": "github:angular/platform-browser-builds#4109cba229ed99b4ca561d1822cbb47e71ada952", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#fbca40c2182bba5dda1775348108513f91d0408a", + "@angular/platform-server": "github:angular/platform-server-builds#34cecf4260659867c0f10d85ebafeca66d55aeb4", + "@angular/router": "github:angular/router-builds#c081e36db049aa7df22c1c35a4bc4e2ca74b761a", + "@angular/service-worker": "github:angular/service-worker-builds#187098e67bfc26c9d677bb0eb663d76b5c2a1303" } } From adf84d3957f214a7e130cb4825e203aca1b4ef37 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 27 Apr 2026 11:00:56 -0400 Subject: [PATCH 03/82] test(@angular/build): add E2E test for Vitest browser mode with coverage This test ensures that stack traces map correctly to source files and that coverage reports are generated when running Vitest in browser mode with coverage enabled. This provides validation for the current implementation and will help verify future refactors removing the source-map-support dependency. --- .../vitest/browser-coverage-sourcemaps.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts 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..2f0e66abc3ce --- /dev/null +++ b/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts @@ -0,0 +1,31 @@ +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'); + + // Verify that tests passed + assert.match(stdout, /pass/, 'Expected tests to run successfully.'); + + // Verify that coverage files are generated + const coverageJsonPath = 'coverage/test-project/coverage-final.json'; + await expectFileToExist(coverageJsonPath); + + const coverageContent = await readFile(coverageJsonPath); + assert.match(coverageContent, /app\.ts/, 'Expected coverage report to contain app.ts.'); + assert.doesNotMatch( + coverageContent, + /\.spec\.ts/, + 'Expected coverage report to not contain .spec.ts files.', + ); +} From bfcb11195b5d995d70a51c34538b3adbe4ae3189 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 27 Apr 2026 14:48:08 -0400 Subject: [PATCH 04/82] refactor(@angular/build): remove source-map-support from Vitest runner This change removes the injection of `source-map-support` in Vitest browser tests and enables sourcemap rebasing for coverage runs as well. This allows Vitest's native remapper to handle stack traces and coverage correctly without needing the external polyfill in the browser. The E2E tests have been verified to pass with these changes. The unused `createSourcemapSupportPlugin` function has also been removed. --- .../unit-test/runners/vitest/plugins.ts | 38 +------------------ .../vitest/browser-coverage-sourcemaps.ts | 34 +++++++++++------ 2 files changed, 25 insertions(+), 47 deletions(-) diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts index 76cbe7d58d03..eb3d7d106ab4 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/plugins.ts @@ -233,16 +233,12 @@ export async function createVitestConfigPlugin( delete config.plugins; } - // Add browser source map support if coverage is enabled + // Validate browser coverage support if coverage is enabled if ( (browser || testConfig?.browser?.enabled) && (options.coverage.enabled || testConfig?.coverage?.enabled) ) { - // Validate that enabled browsers support the selected coverage provider validateBrowserCoverage(browser, testConfig?.browser, determinedProvider); - - projectPlugins.unshift(createSourcemapSupportPlugin()); - setupFiles.unshift('virtual:source-map-support'); } const projectResolver = createRequire(projectSourceRoot + '/').resolve; @@ -411,7 +407,7 @@ export function createVitestPlugins(pluginOptions: PluginOptions): VitestPlugins const map = sourceMapText ? JSON.parse(sourceMapText) : undefined; if (map) { - adjustSourcemapSources(map, !vitestConfig?.coverage?.enabled, workspaceRoot, id); + adjustSourcemapSources(map, true, workspaceRoot, id); } return { @@ -478,36 +474,6 @@ function adjustSourcemapSources( } } -function createSourcemapSupportPlugin(): VitestPlugins[0] { - return { - name: 'angular:source-map-support', - enforce: 'pre', - resolveId(source) { - if (source.includes('virtual:source-map-support')) { - return '\0source-map-support'; - } - }, - async load(id) { - if (id !== '\0source-map-support') { - return; - } - - const packageResolve = createRequire(__filename).resolve; - const supportPath = packageResolve('source-map-support/browser-source-map-support.js'); - - const content = await readFile(supportPath, 'utf-8'); - - // The `source-map-support` library currently relies on `this` being defined in the global scope. - // However, when running in an ESM environment, `this` is undefined. - // To workaround this, we patch the library to use `globalThis` instead of `this`. - return ( - content.replaceAll(/this\.(define|sourceMapSupport|base64js)/g, 'globalThis.$1') + - '\n;globalThis.sourceMapSupport.install();' - ); - }, - }; -} - interface CustomBrowserConfigOptions { enabled?: boolean; instances?: { browser: string }[]; diff --git a/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts b/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts index 2f0e66abc3ce..db8b91a0abbe 100644 --- a/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts +++ b/tests/e2e/tests/vitest/browser-coverage-sourcemaps.ts @@ -12,20 +12,32 @@ export default async function (): Promise { // 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'); + 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 coverageJsonPath = 'coverage/test-project/coverage-final.json'; - await expectFileToExist(coverageJsonPath); - - const coverageContent = await readFile(coverageJsonPath); - assert.match(coverageContent, /app\.ts/, 'Expected coverage report to contain app.ts.'); - assert.doesNotMatch( - coverageContent, - /\.spec\.ts/, - 'Expected coverage report to not contain .spec.ts files.', - ); + 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.'); } From 2bc55393beeaa48b3c7c2cf87c4db46716cf3b0b Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 28 Apr 2026 05:09:38 +0000 Subject: [PATCH 05/82] build: lock file maintenance See associated pull request for more information. --- pnpm-lock.yaml | 234 +++++++++++++++++++++++++------------------------ 1 file changed, 118 insertions(+), 116 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5449edd91f0..44ff33754d32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,7 +105,7 @@ importers: version: 5.10.0(eslint@10.2.1(jiti@2.6.1)) '@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.2.1(jiti@2.6.1)) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -869,8 +869,8 @@ packages: '@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==} @@ -2713,8 +2713,8 @@ packages: cpu: [x64] os: [win32] - '@mswjs/interceptors@0.41.4': - resolution: {integrity: sha512-3B9EinUkrdOUGYzHRzRWSXunQ4YFGboJnyLNRwEJWEde+j8fNhPUHvrN1E3g1DU/iS/s8JQrMNVe+S7AHHVs0w==} + '@mswjs/interceptors@0.41.6': + resolution: {integrity: sha512-qmDvJIjcNsZ6tXWy2G9yuCgMPTTn35GMA3dPpSLm7QJVpbQzYdw0ALy1bKoivXnEM3U93/OrK+/M719b+fg84Q==} engines: {node: '>=18'} '@napi-rs/nice-android-arm-eabi@1.1.1': @@ -3525,8 +3525,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' @@ -3808,6 +3808,10 @@ packages: resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.59.0': + resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.58.2': resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4082,8 +4086,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==} @@ -4177,8 +4181,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: @@ -4299,8 +4303,8 @@ packages: bare-buffer: optional: true - bare-os@3.8.7: - resolution: {integrity: sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==} + bare-os@3.9.0: + resolution: {integrity: sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: @@ -4320,8 +4324,8 @@ packages: bare-events: optional: true - bare-url@2.4.1: - resolution: {integrity: sha512-fZapLWNB25gS+etK27NV9KgBNXgo2yeYHuj+OyPblQd6GYAE3JVy6aKxszMV5jhGGFwraXQKA5fldvf3lMyEqw==} + bare-url@2.4.2: + resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4330,8 +4334,8 @@ 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.23: + resolution: {integrity: sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==} engines: {node: '>=6.0.0'} hasBin: true @@ -4371,8 +4375,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: @@ -4481,8 +4485,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.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4964,8 +4968,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.344: + resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5005,8 +5009,8 @@ packages: resolution: {integrity: sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + enhanced-resolve@5.21.0: + resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} engines: {node: '>=10.13.0'} ent@2.2.2: @@ -5057,8 +5061,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==} @@ -5258,8 +5262,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.4.1: + resolution: {integrity: sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -5646,8 +5650,8 @@ 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.15: + resolution: {integrity: sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg==} engines: {node: '>=16.9.0'} hosted-git-info@9.0.2: @@ -6296,8 +6300,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: @@ -6702,13 +6706,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==} @@ -7818,8 +7822,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: @@ -7842,8 +7846,8 @@ 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.5.0: + resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -8031,8 +8035,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==} + typed-query-selector@2.12.2: + resolution: {integrity: sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==} typescript@6.0.2: resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} @@ -8331,8 +8335,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.0: + resolution: {integrity: sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==} engines: {node: '>=10.13.0'} webpack-subresource-integrity@5.1.0: @@ -8562,13 +8566,13 @@ snapshots: '@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 @@ -9797,7 +9801,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 @@ -10245,9 +10249,9 @@ snapshots: '@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.15)': dependencies: - hono: 4.12.14 + hono: 4.12.15 '@humanfs/core@0.19.2': dependencies: @@ -10587,7 +10591,7 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.14) + '@hono/node-server': 1.19.14(hono@4.12.15) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -10596,8 +10600,8 @@ snapshots: 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 + express-rate-limit: 8.4.1(express@5.2.1) + hono: 4.12.15 jose: 6.2.2 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -10625,7 +10629,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@mswjs/interceptors@0.41.4': + '@mswjs/interceptors@0.41.6': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -10780,10 +10784,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: @@ -10986,21 +10988,21 @@ snapshots: '@peculiar/asn1-schema': 2.6.0 '@peculiar/asn1-x509': 2.6.1 '@peculiar/asn1-x509-attr': 2.6.1 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-csr@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-ecc@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-pfx@2.6.1': @@ -11009,14 +11011,14 @@ snapshots: '@peculiar/asn1-pkcs8': 2.6.1 '@peculiar/asn1-rsa': 2.6.1 '@peculiar/asn1-schema': 2.6.0 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-pkcs8@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-pkcs9@2.6.1': @@ -11027,19 +11029,19 @@ snapshots: '@peculiar/asn1-schema': 2.6.0 '@peculiar/asn1-x509': 2.6.1 '@peculiar/asn1-x509-attr': 2.6.1 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-rsa@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-schema@2.6.0': dependencies: - asn1js: 3.0.7 + asn1js: 3.0.10 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -11047,13 +11049,13 @@ snapshots: dependencies: '@peculiar/asn1-schema': 2.6.0 '@peculiar/asn1-x509': 2.6.1 - asn1js: 3.0.7 + asn1js: 3.0.10 tslib: 2.8.1 '@peculiar/asn1-x509@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - asn1js: 3.0.7 + asn1js: 3.0.10 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -11355,7 +11357,7 @@ snapshots: '@stylistic/eslint-plugin@5.10.0(eslint@10.2.1(jiti@2.6.1))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.0 eslint: 10.2.1(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -11366,7 +11368,7 @@ 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.2.1(jiti@2.6.1))': dependencies: eslint: 10.2.1(jiti@2.6.1) @@ -11732,6 +11734,8 @@ snapshots: '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/types@8.59.0': {} + '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': dependencies: '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) @@ -12143,7 +12147,7 @@ snapshots: ajv: 8.18.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 @@ -12270,7 +12274,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 @@ -12307,7 +12311,7 @@ snapshots: autoprefixer@10.5.0(postcss@8.5.10): dependencies: browserslist: 4.28.2 - caniuse-lite: 1.0.30001788 + caniuse-lite: 1.0.30001791 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.10 @@ -12373,17 +12377,17 @@ snapshots: 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-url: 2.4.2 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.8.7: {} + bare-os@3.9.0: {} bare-path@3.0.0: dependencies: - bare-os: 3.8.7 + bare-os: 3.9.0 bare-stream@2.13.0(bare-events@2.8.2): dependencies: @@ -12394,7 +12398,7 @@ snapshots: transitivePeerDependencies: - react-native-b4a - bare-url@2.4.1: + bare-url@2.4.2: dependencies: bare-path: 3.0.0 @@ -12402,7 +12406,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.10.20: {} + baseline-browser-mapping@2.10.23: {} basic-ftp@5.3.0: {} @@ -12440,7 +12444,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 @@ -12450,7 +12454,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 @@ -12559,10 +12563,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.23 + caniuse-lite: 1.0.30001791 + electron-to-chromium: 1.5.344 + node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) bs-recipes@1.3.4: {} @@ -12634,7 +12638,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001788: {} + caniuse-lite@1.0.30001791: {} caseless@0.12.0: {} @@ -13105,7 +13109,7 @@ snapshots: ejs@5.0.2: {} - electron-to-chromium@1.5.340: {} + electron-to-chromium@1.5.344: {} emoji-regex@10.6.0: {} @@ -13158,10 +13162,10 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.20.1: + enhanced-resolve@5.21.0: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.2 + tapable: 2.3.3 ent@2.2.2: dependencies: @@ -13252,7 +13256,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: @@ -13430,7 +13434,7 @@ snapshots: '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 @@ -13519,7 +13523,7 @@ snapshots: express-rate-limit@5.5.1: {} - express-rate-limit@8.3.2(express@5.2.1): + express-rate-limit@8.4.1(express@5.2.1): dependencies: express: 5.2.1 ip-address: 10.1.0 @@ -13528,7 +13532,7 @@ snapshots: 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 @@ -14066,7 +14070,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.12.14: {} + hono@4.12.15: {} hosted-git-info@9.0.2: dependencies: @@ -14685,7 +14689,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 @@ -14751,7 +14755,7 @@ snapshots: license-webpack-plugin@4.0.2(webpack@5.106.2(esbuild@0.28.0)): dependencies: - webpack-sources: 3.3.4 + webpack-sources: 3.4.0 optionalDependencies: webpack: 5.106.2(esbuild@0.28.0) @@ -14785,7 +14789,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: @@ -14980,7 +14984,7 @@ snapshots: mini-css-extract-plugin@2.10.2(webpack@5.106.2(esbuild@0.28.0)): dependencies: schema-utils: 4.3.3 - tapable: 2.3.2 + tapable: 2.3.3 webpack: 5.106.2(esbuild@0.28.0) minimalistic-assert@1.0.1: {} @@ -15137,7 +15141,7 @@ snapshots: nock@14.0.13: dependencies: - '@mswjs/interceptors': 0.41.4 + '@mswjs/interceptors': 0.41.6 json-stringify-safe: 5.0.1 propagate: 2.0.1 @@ -15183,22 +15187,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 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: @@ -15567,7 +15569,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 @@ -15721,7 +15723,7 @@ snapshots: chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) debug: 4.4.3(supports-color@10.2.2) devtools-protocol: 0.0.1595872 - typed-query-selector: 2.12.1 + 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: @@ -15739,7 +15741,7 @@ snapshots: 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 + typed-query-selector: 2.12.2 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -16590,7 +16592,7 @@ snapshots: symbol-tree@3.2.4: {} - tapable@2.3.2: {} + tapable@2.3.3: {} tar-fs@3.1.2: dependencies: @@ -16648,7 +16650,7 @@ 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.5.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 @@ -16841,7 +16843,7 @@ snapshots: typed-graphqlify@3.1.6: {} - typed-query-selector@2.12.1: {} + typed-query-selector@2.12.2: {} typescript@6.0.2: {} @@ -17040,7 +17042,7 @@ snapshots: '@vitest/snapshot': 4.1.4 '@vitest/spy': 4.1.4 '@vitest/utils': 4.1.4 - es-module-lexer: 2.0.0 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 @@ -17169,7 +17171,7 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@3.3.4: {} + webpack-sources@3.4.0: {} webpack-subresource-integrity@5.1.0(webpack@5.106.2(esbuild@0.28.0)): dependencies: @@ -17188,20 +17190,20 @@ 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.0 + 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.5.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)) watchpack: 2.5.1 - webpack-sources: 3.3.4 + webpack-sources: 3.4.0 transitivePeerDependencies: - '@swc/core' - esbuild From 9bfab3a7eca2f75c87e84c3aa2ed2f625b8e74ce Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 28 Apr 2026 20:53:01 +0000 Subject: [PATCH 06/82] build: update cross-repo angular dependencies See associated pull request for more information. --- tests/e2e/ng-snapshot/package.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 6bc4d038e905..2701b3c2e40e 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#87941912d94f1319546445d14d66dfc1e6433a30", + "@angular/animations": "github:angular/animations-builds#9b754c0ca4da311fc6783dc5c98da1f183707c9b", "@angular/cdk": "github:angular/cdk-builds#c2d20f36438de8c10caeea62e0c2edb17ef626ac", - "@angular/common": "github:angular/common-builds#80e58a59c42a24902a97bfbf3cd4ef513e21469c", - "@angular/compiler": "github:angular/compiler-builds#5535bf11e4cbcb643794a014434b2de4e0a69503", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#0a095f1e3b7b00046a1b5cbd0df7367e4065460a", - "@angular/core": "github:angular/core-builds#996438b8a2f91b0d5b497a3602fce8945beab5da", - "@angular/forms": "github:angular/forms-builds#df66eaa3be89ae2b0bcf7d06c10a698409a572cc", - "@angular/language-service": "github:angular/language-service-builds#37a008a0c844322096280739fe8549eae520df0a", - "@angular/localize": "github:angular/localize-builds#9440eecfd7fd8d5a52852b3e435782ebf63ad41d", + "@angular/common": "github:angular/common-builds#90986ca3735c6db9429d4d37a0e0e98db43822b2", + "@angular/compiler": "github:angular/compiler-builds#11b70d259dc4ff15187df5b93d11a2e7891ab37b", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#2efc95f8efc03cc975d0f670e1c4079d7ad5ffbf", + "@angular/core": "github:angular/core-builds#44b84c06097bdd680158ef0ae9731d75671be66e", + "@angular/forms": "github:angular/forms-builds#67f141c8cf77be5eddac02660550b0f0c6942315", + "@angular/language-service": "github:angular/language-service-builds#c33e9eee854bdedf220169b8db3f920db5baa0e4", + "@angular/localize": "github:angular/localize-builds#4f786f6c2f8caec76b531c4e578e44c90901d8a7", "@angular/material": "github:angular/material-builds#87c2b054da2f59cb31e6c59b4882f7a6d2c274d1", "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#e119b90a1c7df721b61ea0397d886025ff432b8b", - "@angular/platform-browser": "github:angular/platform-browser-builds#4109cba229ed99b4ca561d1822cbb47e71ada952", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#fbca40c2182bba5dda1775348108513f91d0408a", - "@angular/platform-server": "github:angular/platform-server-builds#34cecf4260659867c0f10d85ebafeca66d55aeb4", - "@angular/router": "github:angular/router-builds#c081e36db049aa7df22c1c35a4bc4e2ca74b761a", - "@angular/service-worker": "github:angular/service-worker-builds#187098e67bfc26c9d677bb0eb663d76b5c2a1303" + "@angular/platform-browser": "github:angular/platform-browser-builds#b4da284cca4a4f9a7a350b64011b088d84df5e45", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#bab426507fe13bf1ed381e9605bdf2b9960b97e9", + "@angular/platform-server": "github:angular/platform-server-builds#391b4d8d69db1c5fae03803ac75d63932c657868", + "@angular/router": "github:angular/router-builds#813a3e9e5a03977f97093465275af555eece04d9", + "@angular/service-worker": "github:angular/service-worker-builds#da5d9a8b8754f8f86b0de5d05ed11fd43668badb" } } From 23bb81b248419b0e487eb81a5eec89b864ba9358 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Tue, 28 Apr 2026 11:37:07 +0000 Subject: [PATCH 07/82] fix(@schematics/angular): add trusted-proxy-headers migration Adds a new schematic migration to automatically add trustProxyHeaders configuration to server.ts files in workspaces where either AngularNodeAppEngine or AngularAppEngine are used. --- .../migrations/migration-collection.json | 7 +- .../trust-proxy-headers/migration.ts | 97 +++++++++++++++++ .../trust-proxy-headers/migration_spec.ts | 101 ++++++++++++++++++ 3 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 packages/schematics/angular/migrations/trust-proxy-headers/migration.ts create mode 100644 packages/schematics/angular/migrations/trust-proxy-headers/migration_spec.ts 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); + }); +}); From c403bfc0feba1b217487e94202c9835775ed5d41 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 28 Apr 2026 16:53:26 -0400 Subject: [PATCH 08/82] refactor(@angular/cli): remove find_examples tool and associated database rule Remove the `find_examples` tool from the Angular CLI MCP server, along with the `ng_examples_db` Bazel rule and associated example files. With the availability of the official Angular developer skills repository (https://github.com/angular/skills), this local database lookup tool is redundant. Reduce maintenance overhead and simplify the codebase by eliminating the need to maintain a local SQLite database of examples within the CLI repository. --- packages/angular/cli/BUILD.bazel | 14 +- packages/angular/cli/lib/examples/if-block.md | 85 -------- .../cli/src/commands/mcp/mcp-server.ts | 6 - .../mcp/tools/examples/database-discovery.ts | 106 --------- .../tools/examples/database-discovery_spec.ts | 137 ------------ .../commands/mcp/tools/examples/database.ts | 142 ------------- .../src/commands/mcp/tools/examples/index.ts | 133 ------------ .../mcp/tools/examples/query-escaper.ts | 66 ------ .../mcp/tools/examples/query-escaper_spec.ts | 53 ----- .../mcp/tools/examples/runtime-database.ts | 201 ------------------ .../commands/mcp/tools/examples/schemas.ts | 132 ------------ .../src/commands/mcp/tools/examples/utils.ts | 31 --- tests/e2e/tests/mcp/find-examples-basic.ts | 48 ----- tools/defaults.bzl | 4 - 14 files changed, 1 insertion(+), 1157 deletions(-) delete mode 100644 packages/angular/cli/lib/examples/if-block.md delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/database-discovery.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/database-discovery_spec.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/database.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/index.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/query-escaper.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/query-escaper_spec.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/runtime-database.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/schemas.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/examples/utils.ts delete mode 100644 tests/e2e/tests/mcp/find-examples-basic.ts diff --git a/packages/angular/cli/BUILD.bazel b/packages/angular/cli/BUILD.bazel index a49e30695138..eed9ad7360f1 100644 --- a/packages/angular/cli/BUILD.bazel +++ b/packages/angular/cli/BUILD.bazel @@ -4,7 +4,7 @@ # found in the LICENSE file at https://angular.dev/license load("@npm//:defs.bzl", "npm_link_all_packages") -load("//tools:defaults.bzl", "jasmine_test", "ng_examples_db", "npm_package", "ts_project") +load("//tools:defaults.bzl", "jasmine_test", "npm_package", "ts_project") load("//tools:ng_cli_schema_generator.bzl", "cli_json_schema") load("//tools:ts_json_schema.bzl", "ts_json_schema") @@ -36,7 +36,6 @@ RUNTIME_ASSETS = glob( ], ) + [ "//packages/angular/cli:lib/config/schema.json", - "//packages/angular/cli:lib/code-examples.db", ":angular_best_practices", ] @@ -87,17 +86,6 @@ ts_project( ], ) -ng_examples_db( - name = "cli_example_database", - srcs = glob( - include = [ - "lib/examples/**/*.md", - ], - ), - out = "lib/code-examples.db", - path = "packages/angular/cli/lib/examples", -) - CLI_SCHEMA_DATA = [ "//packages/angular/build:schemas", "//packages/angular_devkit/build_angular:schemas", diff --git a/packages/angular/cli/lib/examples/if-block.md b/packages/angular/cli/lib/examples/if-block.md deleted file mode 100644 index 806e3d05516c..000000000000 --- a/packages/angular/cli/lib/examples/if-block.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: 'Using the @if Built-in Control Flow Block' -summary: 'Demonstrates how to use the @if built-in control flow block to conditionally render content in an Angular template based on a boolean expression.' -keywords: - - '@if' - - 'control flow' - - 'conditional rendering' - - 'template syntax' -related_concepts: - - '@else' - - '@else if' - - 'signals' -related_tools: - - 'modernize' ---- - -## Purpose - -The purpose of this pattern is to create dynamic user interfaces by controlling which elements are rendered to the DOM based on the application's state. This is a fundamental technique for building responsive and interactive components. - -## When to Use - -Use the `@if` block as the modern, preferred alternative to the `*ngIf` directive for all conditional rendering. It offers better type-checking and a cleaner, more intuitive syntax within the template. - -## Key Concepts - -- **`@if` block:** The primary syntax for conditional rendering in modern Angular templates. It evaluates a boolean expression and renders the content within its block if the expression is true. - -## Example Files - -### `conditional-content.component.ts` - -This is a self-contained standalone component that demonstrates the `@if` block with an optional `@else` block. - -```typescript -import { Component, signal } from '@angular/core'; - -@Component({ - selector: 'app-conditional-content', - template: ` - - - @if (isVisible()) { -
This content is conditionally displayed.
- } @else { -
The content is hidden. Click the button to show it.
- } - `, -}) -export class ConditionalContentComponent { - protected readonly isVisible = signal(true); - - toggleVisibility(): void { - this.isVisible.update((v) => !v); - } -} -``` - -## Usage Notes - -- The expression inside the `@if ()` block must evaluate to a boolean. -- This example uses a signal, which is a common pattern, but any boolean property or method call from the component can be used. -- The `@else` block is optional and is rendered when the `@if` condition is `false`. - -## How to Use This Example - -### 1. Import the Component - -In a standalone architecture, import the component into the `imports` array of the parent component where you want to use it. - -```typescript -// in app.component.ts -import { Component } from '@angular/core'; -import { ConditionalContentComponent } from './conditional-content.component'; - -@Component({ - selector: 'app-root', - imports: [ConditionalContentComponent], - template: ` -

My Application

- - `, -}) -export class AppComponent {} -``` diff --git a/packages/angular/cli/src/commands/mcp/mcp-server.ts b/packages/angular/cli/src/commands/mcp/mcp-server.ts index a2bc1b0f9aeb..c7beb7c83397 100644 --- a/packages/angular/cli/src/commands/mcp/mcp-server.ts +++ b/packages/angular/cli/src/commands/mcp/mcp-server.ts @@ -21,7 +21,6 @@ import { DEVSERVER_STOP_TOOL } from './tools/devserver/devserver-stop'; import { DEVSERVER_WAIT_FOR_BUILD_TOOL } from './tools/devserver/devserver-wait-for-build'; import { DOC_SEARCH_TOOL } from './tools/doc-search'; import { E2E_TOOL } from './tools/e2e'; -import { FIND_EXAMPLE_TOOL } from './tools/examples/index'; import { MODERNIZE_TOOL } from './tools/modernize'; import { ZONELESS_MIGRATION_TOOL } from './tools/onpush-zoneless-migration/zoneless-migration'; import { LIST_PROJECTS_TOOL } from './tools/projects'; @@ -41,7 +40,6 @@ const STABLE_TOOLS = [ AI_TUTOR_TOOL, BEST_PRACTICES_TOOL, DOC_SEARCH_TOOL, - FIND_EXAMPLE_TOOL, LIST_PROJECTS_TOOL, ZONELESS_MIGRATION_TOOL, ] as const; @@ -107,7 +105,6 @@ equivalent actions. * **3. Answer User Questions:** - For conceptual questions ("what is..."), use \`search_documentation\`. - - For code examples ("show me how to..."), use \`find_examples\`. @@ -163,9 +160,6 @@ export function assembleToolDeclarations( } const enabledExperimentalTools = new Set(options.experimentalTools); - if (process.env['NG_MCP_CODE_EXAMPLES'] === '1') { - enabledExperimentalTools.add('find_examples'); - } for (const [toolGroupName, toolGroup] of Object.entries(EXPERIMENTAL_TOOL_GROUPS)) { if (enabledExperimentalTools.delete(toolGroupName)) { for (const tool of toolGroup) { diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/database-discovery.ts b/packages/angular/cli/src/commands/mcp/tools/examples/database-discovery.ts deleted file mode 100644 index aeab96e15871..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/database-discovery.ts +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { dirname, isAbsolute, relative, resolve } from 'node:path'; -import type { McpToolContext } from '../tool-registry'; - -/** - * A list of known Angular packages that may contain example databases. - * The tool will attempt to resolve and load example databases from these packages. - */ -const KNOWN_EXAMPLE_PACKAGES = ['@angular/core', '@angular/aria', '@angular/forms']; - -/** - * Attempts to find version-specific example databases from the user's installed - * versions of known Angular packages. It looks for a custom `angular` metadata property in each - * package's `package.json` to locate the database. - * - * @example A sample `package.json` `angular` field: - * ```json - * { - * "angular": { - * "examples": { - * "format": "sqlite", - * "path": "./resources/code-examples.db" - * } - * } - * } - * ``` - * - * @param workspacePath The absolute path to the user's `angular.json` file. - * @param logger The MCP tool context logger for reporting warnings. - * @param host The host interface for file system and module resolution operations. - * @returns A promise that resolves to an array of objects, each containing a database path and source. - */ -export async function getVersionSpecificExampleDatabases( - workspacePath: string, - logger: McpToolContext['logger'], - host: McpToolContext['host'], -): Promise<{ dbPath: string; source: string }[]> { - const databases: { dbPath: string; source: string }[] = []; - - for (const packageName of KNOWN_EXAMPLE_PACKAGES) { - // 1. Resolve the path to package.json - let pkgJsonPath: string; - try { - pkgJsonPath = host.resolveModule(`${packageName}/package.json`, workspacePath); - } catch (e) { - // This is not a warning because the user may not have all known packages installed. - continue; - } - - // 2. Read and parse package.json, then find the database. - try { - const pkgJsonContent = await host.readFile(pkgJsonPath, 'utf-8'); - const pkgJson = JSON.parse(pkgJsonContent); - const examplesInfo = pkgJson['angular']?.examples; - - if ( - examplesInfo && - examplesInfo.format === 'sqlite' && - typeof examplesInfo.path === 'string' - ) { - const packageDirectory = dirname(pkgJsonPath); - const dbPath = resolve(packageDirectory, examplesInfo.path); - - // Ensure the resolved database path is within the package boundary. - const relativePath = relative(packageDirectory, dbPath); - if (relativePath.startsWith('..') || isAbsolute(relativePath)) { - logger.warn( - `Detected a potential path traversal attempt in '${pkgJsonPath}'. ` + - `The path '${examplesInfo.path}' escapes the package boundary. ` + - 'This database will be skipped.', - ); - continue; - } - - // Check the file size to prevent reading a very large file. - const stats = await host.stat(dbPath); - if (stats.size > 10 * 1024 * 1024) { - // 10MB - logger.warn( - `The example database at '${dbPath}' is larger than 10MB (${stats.size} bytes). ` + - 'This is unexpected and the file will not be used.', - ); - continue; - } - - const source = `package ${packageName}@${pkgJson.version}`; - databases.push({ dbPath, source }); - } - } catch (e) { - logger.warn( - `Failed to read or parse version-specific examples metadata referenced in '${pkgJsonPath}': ${ - e instanceof Error ? e.message : e - }.`, - ); - } - } - - return databases; -} diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/database-discovery_spec.ts b/packages/angular/cli/src/commands/mcp/tools/examples/database-discovery_spec.ts deleted file mode 100644 index 0d5680d01c06..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/database-discovery_spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import type { Stats } from 'node:fs'; -import { Host } from '../../host'; -import { getVersionSpecificExampleDatabases } from './database-discovery'; - -describe('getVersionSpecificExampleDatabases', () => { - let mockHost: jasmine.SpyObj; - let mockLogger: { warn: jasmine.Spy }; - - beforeEach(() => { - mockHost = jasmine.createSpyObj('Host', ['resolveModule', 'readFile', 'stat']); - mockLogger = { - warn: jasmine.createSpy('warn'), - }; - }); - - it('should find a valid example database from a package', async () => { - mockHost.resolveModule.and.callFake((specifier) => { - if (specifier === '@angular/core/package.json') { - return '/path/to/node_modules/@angular/core/package.json'; - } - throw new Error(`Unexpected module specifier: ${specifier}`); - }); - mockHost.readFile.and.resolveTo( - JSON.stringify({ - name: '@angular/core', - version: '18.1.0', - angular: { - examples: { - format: 'sqlite', - path: './resources/code-examples.db', - }, - }, - }), - ); - mockHost.stat.and.resolveTo({ size: 1024 } as Stats); - - const databases = await getVersionSpecificExampleDatabases( - '/path/to/workspace', - mockLogger, - mockHost, - ); - - expect(databases.length).toBe(1); - expect(databases[0].dbPath).toBe( - '/path/to/node_modules/@angular/core/resources/code-examples.db', - ); - expect(databases[0].source).toBe('package @angular/core@18.1.0'); - expect(mockLogger.warn).not.toHaveBeenCalled(); - }); - - it('should skip packages without angular.examples metadata', async () => { - mockHost.resolveModule.and.returnValue('/path/to/node_modules/@angular/core/package.json'); - mockHost.readFile.and.resolveTo(JSON.stringify({ name: '@angular/core', version: '18.1.0' })); - - const databases = await getVersionSpecificExampleDatabases( - '/path/to/workspace', - mockLogger, - mockHost, - ); - - expect(databases.length).toBe(0); - }); - - it('should handle packages that are not found', async () => { - mockHost.resolveModule.and.throwError(new Error('Cannot find module')); - - const databases = await getVersionSpecificExampleDatabases( - '/path/to/workspace', - mockLogger, - mockHost, - ); - - expect(databases.length).toBe(0); - expect(mockLogger.warn).not.toHaveBeenCalled(); - }); - - it('should reject database paths that attempt path traversal', async () => { - mockHost.resolveModule.and.returnValue('/path/to/node_modules/@angular/core/package.json'); - mockHost.readFile.and.resolveTo( - JSON.stringify({ - name: '@angular/core', - version: '18.1.0', - angular: { - examples: { - format: 'sqlite', - path: '../outside-package/danger.db', - }, - }, - }), - ); - - const databases = await getVersionSpecificExampleDatabases( - '/path/to/workspace', - mockLogger, - mockHost, - ); - - expect(databases.length).toBe(0); - expect(mockLogger.warn).toHaveBeenCalledWith( - jasmine.stringMatching(/Detected a potential path traversal attempt/), - ); - }); - - it('should skip database files larger than 10MB', async () => { - mockHost.resolveModule.and.returnValue('/path/to/node_modules/@angular/core/package.json'); - mockHost.readFile.and.resolveTo( - JSON.stringify({ - name: '@angular/core', - version: '18.1.0', - angular: { - examples: { - format: 'sqlite', - path: './resources/code-examples.db', - }, - }, - }), - ); - mockHost.stat.and.resolveTo({ size: 11 * 1024 * 1024 } as Stats); // 11MB - - const databases = await getVersionSpecificExampleDatabases( - '/path/to/workspace', - mockLogger, - mockHost, - ); - - expect(databases.length).toBe(0); - expect(mockLogger.warn).toHaveBeenCalledWith(jasmine.stringMatching(/is larger than 10MB/)); - }); -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/database.ts b/packages/angular/cli/src/commands/mcp/tools/examples/database.ts deleted file mode 100644 index cd4f31a655c0..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/database.ts +++ /dev/null @@ -1,142 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import type { DatabaseSync, SQLInputValue } from 'node:sqlite'; -import { escapeSearchQuery } from './query-escaper'; -import type { FindExampleInput } from './schemas'; - -const EXPECTED_SCHEMA_VERSION = 1; - -/** - * Validates the schema version of the example database. - * - * @param db The database connection to validate. - * @param dbSource A string identifying the source of the database (e.g., 'bundled' or a version number). - * @throws An error if the schema version is missing or incompatible. - */ -export function validateDatabaseSchema(db: DatabaseSync, dbSource: string): void { - const schemaVersionResult = db - .prepare('SELECT value FROM metadata WHERE key = ?') - .get('schema_version') as { value: string } | undefined; - const actualSchemaVersion = schemaVersionResult ? Number(schemaVersionResult.value) : undefined; - - if (actualSchemaVersion !== EXPECTED_SCHEMA_VERSION) { - db.close(); - - let errorMessage: string; - if (actualSchemaVersion === undefined) { - errorMessage = 'The example database is missing a schema version and cannot be used.'; - } else if (actualSchemaVersion > EXPECTED_SCHEMA_VERSION) { - errorMessage = - `This project's example database (version ${actualSchemaVersion})` + - ` is newer than what this version of the Angular CLI supports (version ${EXPECTED_SCHEMA_VERSION}).` + - ' Please update your `@angular/cli` package to a newer version.'; - } else { - errorMessage = - `This version of the Angular CLI (expects schema version ${EXPECTED_SCHEMA_VERSION})` + - ` requires a newer example database than the one found in this project (version ${actualSchemaVersion}).`; - } - - throw new Error( - `Incompatible example database schema from source '${dbSource}':\n${errorMessage}`, - ); - } -} - -export function queryDatabase(dbs: DatabaseSync[], input: FindExampleInput) { - const { query, keywords, required_packages, related_concepts, includeExperimental } = input; - - // Build the query dynamically - const params: SQLInputValue[] = []; - let sql = - `SELECT e.title, e.summary, e.keywords, e.required_packages, e.related_concepts, e.related_tools, e.content, ` + - // The `snippet` function generates a contextual snippet of the matched text. - // Column 6 is the `content` column. We highlight matches with asterisks and limit the snippet size. - "snippet(examples_fts, 6, '**', '**', '...', 15) AS snippet, " + - // The `bm25` function returns the relevance score of the match. The weights - // assigned to each column boost the ranking of documents where the search - // term appears in a more important field. - // Column order: title, summary, keywords, required_packages, related_concepts, related_tools, content - 'bm25(examples_fts, 10.0, 5.0, 5.0, 1.0, 2.0, 1.0, 1.0) AS rank ' + - 'FROM examples e JOIN examples_fts ON e.id = examples_fts.rowid'; - const whereClauses = []; - - // FTS query - if (query) { - whereClauses.push('examples_fts MATCH ?'); - params.push(escapeSearchQuery(query)); - } - - // JSON array filters - const addJsonFilter = (column: string, values: string[] | undefined) => { - if (values?.length) { - for (const value of values) { - whereClauses.push(`e.${column} LIKE ?`); - params.push(`%"${value}"%`); - } - } - }; - - addJsonFilter('keywords', keywords); - addJsonFilter('required_packages', required_packages); - addJsonFilter('related_concepts', related_concepts); - - if (!includeExperimental) { - whereClauses.push('e.experimental = 0'); - } - - if (whereClauses.length > 0) { - sql += ` WHERE ${whereClauses.join(' AND ')}`; - } - - // Query database and return results - const examples = []; - const textContent = []; - - for (const db of dbs) { - const queryStatement = db.prepare(sql); - for (const exampleRecord of queryStatement.all(...params)) { - const record = exampleRecord as Record; - const example = { - title: record['title'] as string, - summary: record['summary'] as string, - keywords: JSON.parse((record['keywords'] as string) || '[]') as string[], - required_packages: JSON.parse((record['required_packages'] as string) || '[]') as string[], - related_concepts: JSON.parse((record['related_concepts'] as string) || '[]') as string[], - related_tools: JSON.parse((record['related_tools'] as string) || '[]') as string[], - content: record['content'] as string, - snippet: record['snippet'] as string, - rank: record['rank'] as number, - }; - examples.push(example); - } - } - - // Order the combined results by relevance. - // The `bm25` algorithm returns a smaller number for a more relevant match. - examples.sort((a, b) => a.rank - b.rank); - - // The `rank` field is an internal implementation detail for sorting and should not be - // returned to the user. We create a new array of examples without the `rank`. - const finalExamples = examples.map(({ rank, ...rest }) => rest); - - for (const example of finalExamples) { - // Also create a more structured text output - let text = `## Example: ${example.title}\n**Summary:** ${example.summary}`; - if (example.snippet) { - text += `\n**Snippet:** ${example.snippet}`; - } - text += `\n\n---\n\n${example.content}`; - textContent.push({ type: 'text' as const, text }); - } - - return { - content: textContent, - structuredContent: { examples: finalExamples }, - }; -} diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/index.ts b/packages/angular/cli/src/commands/mcp/tools/examples/index.ts deleted file mode 100644 index 8ceecf2d840d..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/index.ts +++ /dev/null @@ -1,133 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import type { DatabaseSync } from 'node:sqlite'; -import { type McpToolContext, declareTool } from '../tool-registry'; -import { queryDatabase, validateDatabaseSchema } from './database'; -import { getVersionSpecificExampleDatabases } from './database-discovery'; -import { setupRuntimeExamples } from './runtime-database'; -import { type FindExampleInput, findExampleInputSchema, findExampleOutputSchema } from './schemas'; -import { suppressSqliteWarning } from './utils'; - -export const FIND_EXAMPLE_TOOL = declareTool({ - name: 'find_examples', - title: 'Find Angular Code Examples', - description: ` - -Augments your knowledge base with a curated database of official, best-practice code examples, -focusing on **modern, new, and recently updated** Angular features. This tool acts as a RAG -(Retrieval-Augmented Generation) source, providing ground-truth information on the latest Angular -APIs and patterns. You **MUST** use it to understand and apply current standards when working with -new or evolving features. - - -* **Knowledge Augmentation:** Learning about new or updated Angular features (e.g., query: 'signal input' or 'deferrable views'). -* **Modern Implementation:** Finding the correct modern syntax for features - (e.g., query: 'functional route guard' or 'http client with fetch'). -* **Refactoring to Modern Patterns:** Upgrading older code by finding examples of new syntax - (e.g., query: 'built-in control flow' to replace "*ngIf"). -* **Advanced Filtering:** Combining a full-text search with filters to narrow results. - (e.g., query: 'forms', required_packages: ['@angular/forms'], keywords: ['validation']) - - -* **Project-Specific Use (Recommended):** For tasks inside a user's project, you **MUST** provide the - \`workspacePath\` argument to get examples that match the project's Angular version. Get this - path from \`list_projects\`. -* **General Use:** If no project context is available (e.g., for general questions or learning), - you can call the tool without the \`workspacePath\` argument. It will return the latest - generic examples. -* **Tool Selection:** This database primarily contains examples for new and recently updated Angular - features. For established, core features, the main documentation (via the - \`search_documentation\` tool) may be a better source of information. -* The examples in this database are the single source of truth for modern Angular coding patterns. -* The search query uses a powerful full-text search syntax (FTS5). Refer to the 'query' - parameter description for detailed syntax rules and examples. -* You can combine the main 'query' with optional filters like 'keywords', 'required_packages', - and 'related_concepts' to create highly specific searches. -`, - inputSchema: findExampleInputSchema.shape, - outputSchema: findExampleOutputSchema.shape, - isReadOnly: true, - isLocalOnly: true, - shouldRegister: ({ logger }) => { - // sqlite database support requires Node.js 22.16+ - const [nodeMajor, nodeMinor] = process.versions.node.split('.', 2).map(Number); - if (nodeMajor < 22 || (nodeMajor === 22 && nodeMinor < 16)) { - logger.warn( - `MCP tool 'find_examples' requires Node.js 22.16 (or higher). ` + - ' Registration of this tool has been skipped.', - ); - - return false; - } - - return true; - }, - factory: createFindExampleHandler, -}); - -async function createFindExampleHandler({ logger, exampleDatabasePath, host }: McpToolContext) { - const runtimeDb = process.env['NG_MCP_EXAMPLES_DIR'] - ? await setupRuntimeExamples(process.env['NG_MCP_EXAMPLES_DIR'], host) - : undefined; - - suppressSqliteWarning(); - - return async (input: FindExampleInput) => { - // If the dev-time override is present, use it and bypass all other logic. - if (runtimeDb) { - return queryDatabase([runtimeDb], input); - } - - const resolvedDbs: { path: string; source: string }[] = []; - - // First, try to get all available version-specific guides. - if (input.workspacePath) { - const versionSpecificDbs = await getVersionSpecificExampleDatabases( - input.workspacePath, - logger, - host, - ); - for (const db of versionSpecificDbs) { - resolvedDbs.push({ path: db.dbPath, source: db.source }); - } - } - - // If no version-specific guides were found for any reason, fall back to the bundled version. - if (resolvedDbs.length === 0 && exampleDatabasePath) { - resolvedDbs.push({ path: exampleDatabasePath, source: 'bundled' }); - } - - if (resolvedDbs.length === 0) { - // This should be prevented by the registration logic in mcp-server.ts - throw new Error('No example databases are available.'); - } - - const { DatabaseSync } = await import('node:sqlite'); - const dbConnections: DatabaseSync[] = []; - - for (const { path, source } of resolvedDbs) { - const db = new DatabaseSync(path, { readOnly: true }); - try { - validateDatabaseSchema(db, source); - dbConnections.push(db); - } catch (e) { - logger.warn((e as Error).message); - // If a database is invalid, we should not query it, but we should not fail the whole tool. - // We will just skip this database and try to use the others. - continue; - } - } - - if (dbConnections.length === 0) { - throw new Error('All available example databases were invalid. Cannot perform query.'); - } - - return queryDatabase(dbConnections, input); - }; -} diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/query-escaper.ts b/packages/angular/cli/src/commands/mcp/tools/examples/query-escaper.ts deleted file mode 100644 index bb6acd375d45..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/query-escaper.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -/** - * Escapes a search query for FTS5 by tokenizing and quoting terms. - * - * This function processes a raw search string and prepares it for an FTS5 full-text search. - * It correctly handles quoted phrases, logical operators (AND, OR, NOT), parentheses, - * and prefix searches (ending with an asterisk), ensuring that individual search - * terms are properly quoted to be treated as literals by the search engine. - * This is primarily intended to avoid unintentional usage of FTS5 query syntax by consumers. - * - * @param query The raw search query string. - * @returns A sanitized query string suitable for FTS5. - */ -export function escapeSearchQuery(query: string): string { - // This regex tokenizes the query string into parts: - // 1. Quoted phrases (e.g., "foo bar") - // 2. Parentheses ( and ) - // 3. FTS5 operators (AND, OR, NOT, NEAR) - // 4. Words, which can include a trailing asterisk for prefix search (e.g., foo*) - const tokenizer = /"([^"]*)"|([()])|\b(AND|OR|NOT|NEAR)\b|([^\s()]+)/g; - let match; - const result: string[] = []; - let lastIndex = 0; - - while ((match = tokenizer.exec(query)) !== null) { - // Add any whitespace or other characters between tokens - if (match.index > lastIndex) { - result.push(query.substring(lastIndex, match.index)); - } - - const [, quoted, parenthesis, operator, term] = match; - - if (quoted !== undefined) { - // It's a quoted phrase, keep it as is. - result.push(`"${quoted}"`); - } else if (parenthesis) { - // It's a parenthesis, keep it as is. - result.push(parenthesis); - } else if (operator) { - // It's an operator, keep it as is. - result.push(operator); - } else if (term) { - // It's a term that needs to be quoted. - if (term.endsWith('*')) { - result.push(`"${term.slice(0, -1)}"*`); - } else { - result.push(`"${term}"`); - } - } - lastIndex = tokenizer.lastIndex; - } - - // Add any remaining part of the string - if (lastIndex < query.length) { - result.push(query.substring(lastIndex)); - } - - return result.join(''); -} diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/query-escaper_spec.ts b/packages/angular/cli/src/commands/mcp/tools/examples/query-escaper_spec.ts deleted file mode 100644 index 6aa801fe0349..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/query-escaper_spec.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { escapeSearchQuery } from './query-escaper'; - -describe('escapeSearchQuery', () => { - it('should wrap single terms in double quotes', () => { - expect(escapeSearchQuery('foo')).toBe('"foo"'); - }); - - it('should wrap multiple terms in double quotes', () => { - expect(escapeSearchQuery('foo bar')).toBe('"foo" "bar"'); - }); - - it('should not wrap FTS5 operators', () => { - expect(escapeSearchQuery('foo AND bar')).toBe('"foo" AND "bar"'); - expect(escapeSearchQuery('foo OR bar')).toBe('"foo" OR "bar"'); - expect(escapeSearchQuery('foo NOT bar')).toBe('"foo" NOT "bar"'); - expect(escapeSearchQuery('foo NEAR bar')).toBe('"foo" NEAR "bar"'); - }); - - it('should not wrap terms that are already quoted', () => { - expect(escapeSearchQuery('"foo" bar')).toBe('"foo" "bar"'); - expect(escapeSearchQuery('"foo bar"')).toBe('"foo bar"'); - }); - - it('should handle prefix searches', () => { - expect(escapeSearchQuery('foo*')).toBe('"foo"*'); - expect(escapeSearchQuery('foo* bar')).toBe('"foo"* "bar"'); - }); - - it('should handle multi-word quoted phrases', () => { - expect(escapeSearchQuery('"foo bar" baz')).toBe('"foo bar" "baz"'); - expect(escapeSearchQuery('foo "bar baz"')).toBe('"foo" "bar baz"'); - }); - - it('should handle complex queries', () => { - expect(escapeSearchQuery('("foo bar" OR baz) AND qux*')).toBe( - '("foo bar" OR "baz") AND "qux"*', - ); - }); - - it('should handle multi-word quoted phrases with three or more words', () => { - expect(escapeSearchQuery('"foo bar baz" qux')).toBe('"foo bar baz" "qux"'); - expect(escapeSearchQuery('foo "bar baz qux"')).toBe('"foo" "bar baz qux"'); - expect(escapeSearchQuery('foo "bar baz qux" quux')).toBe('"foo" "bar baz qux" "quux"'); - }); -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/runtime-database.ts b/packages/angular/cli/src/commands/mcp/tools/examples/runtime-database.ts deleted file mode 100644 index 5ca74dc60d63..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/runtime-database.ts +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { join } from 'node:path'; -import type { DatabaseSync } from 'node:sqlite'; -import { z } from 'zod'; -import type { McpToolContext } from '../tool-registry'; - -/** - * A simple YAML front matter parser. - * - * This function extracts the YAML block enclosed by `---` at the beginning of a string - * and parses it into a JavaScript object. It is not a full YAML parser and only - * supports simple key-value pairs and string arrays. - * - * @param content The string content to parse. - * @returns A record containing the parsed front matter data. - */ -function parseFrontmatter(content: string): Record { - const match = content.match(/^---\r?\n(.*?)\r?\n---/s); - if (!match) { - return {}; - } - - const frontmatter = match[1]; - const data: Record = {}; - const lines = frontmatter.split(/\r?\n/); - - let currentKey = ''; - let isArray = false; - const arrayValues: string[] = []; - - for (const line of lines) { - const keyValueMatch = line.match(/^([^:]+):\s*(.*)/); - if (keyValueMatch) { - if (currentKey && isArray) { - data[currentKey] = arrayValues.slice(); - arrayValues.length = 0; - } - - const [, key, value] = keyValueMatch; - currentKey = key.trim(); - isArray = value.trim() === ''; - - if (!isArray) { - const trimmedValue = value.trim(); - if (trimmedValue === 'true') { - data[currentKey] = true; - } else if (trimmedValue === 'false') { - data[currentKey] = false; - } else { - data[currentKey] = trimmedValue; - } - } - } else { - const arrayItemMatch = line.match(/^\s*-\s*(.*)/); - if (arrayItemMatch && currentKey && isArray) { - let value = arrayItemMatch[1].trim(); - // Unquote if the value is quoted. - if ( - (value.startsWith("'") && value.endsWith("'")) || - (value.startsWith('"') && value.endsWith('"')) - ) { - value = value.slice(1, -1); - } - arrayValues.push(value); - } - } - } - - if (currentKey && isArray) { - data[currentKey] = arrayValues; - } - - return data; -} - -export async function setupRuntimeExamples( - examplesPath: string, - host: McpToolContext['host'], -): Promise { - const { DatabaseSync } = await import('node:sqlite'); - const db = new DatabaseSync(':memory:'); - - // Create a relational table to store the structured example data. - db.exec(` - CREATE TABLE metadata ( - key TEXT PRIMARY KEY NOT NULL, - value TEXT NOT NULL - ); - `); - - db.exec(` - INSERT INTO metadata (key, value) VALUES - ('schema_version', '1'), - ('created_at', '${new Date().toISOString()}'); - `); - - db.exec(` - CREATE TABLE examples ( - id INTEGER PRIMARY KEY, - title TEXT NOT NULL, - summary TEXT NOT NULL, - keywords TEXT, - required_packages TEXT, - related_concepts TEXT, - related_tools TEXT, - experimental INTEGER NOT NULL DEFAULT 0, - content TEXT NOT NULL - ); - `); - - // Create an FTS5 virtual table to provide full-text search capabilities. - db.exec(` - CREATE VIRTUAL TABLE examples_fts USING fts5( - title, - summary, - keywords, - required_packages, - related_concepts, - related_tools, - content, - content='examples', - content_rowid='id', - tokenize = 'porter ascii' - ); - `); - - // Create triggers to keep the FTS table synchronized with the examples table. - db.exec(` - CREATE TRIGGER examples_after_insert AFTER INSERT ON examples BEGIN - INSERT INTO examples_fts(rowid, title, summary, keywords, required_packages, related_concepts, related_tools, content) - VALUES ( - new.id, new.title, new.summary, new.keywords, new.required_packages, new.related_concepts, - new.related_tools, new.content - ); - END; - `); - - const insertStatement = db.prepare( - 'INSERT INTO examples(' + - 'title, summary, keywords, required_packages, related_concepts, related_tools, experimental, content' + - ') VALUES(?, ?, ?, ?, ?, ?, ?, ?);', - ); - - const frontmatterSchema = z.object({ - title: z.string(), - summary: z.string(), - keywords: z.array(z.string()).optional(), - required_packages: z.array(z.string()).optional(), - related_concepts: z.array(z.string()).optional(), - related_tools: z.array(z.string()).optional(), - experimental: z.boolean().optional(), - }); - - db.exec('BEGIN TRANSACTION'); - for await (const entry of host.glob('**/*.md', { cwd: examplesPath })) { - if (!entry.isFile()) { - continue; - } - - const content = await host.readFile(join(entry.parentPath, entry.name), 'utf-8'); - const frontmatter = parseFrontmatter(content); - - const validation = frontmatterSchema.safeParse(frontmatter); - if (!validation.success) { - // eslint-disable-next-line no-console - console.warn(`Skipping invalid example file ${entry.name}:`, validation.error.issues); - continue; - } - - const { - title, - summary, - keywords, - required_packages, - related_concepts, - related_tools, - experimental, - } = validation.data; - - insertStatement.run( - title, - summary, - JSON.stringify(keywords ?? []), - JSON.stringify(required_packages ?? []), - JSON.stringify(related_concepts ?? []), - JSON.stringify(related_tools ?? []), - experimental ? 1 : 0, - content, - ); - } - db.exec('END TRANSACTION'); - - return db; -} diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/schemas.ts b/packages/angular/cli/src/commands/mcp/tools/examples/schemas.ts deleted file mode 100644 index 2122f6775bc8..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/schemas.ts +++ /dev/null @@ -1,132 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { z } from 'zod'; - -export const findExampleInputSchema = z.object({ - workspacePath: z - .string() - .optional() - .describe( - 'The absolute path to the `angular.json` file for the workspace. This is used to find the ' + - 'version-specific code examples that correspond to the installed version of the ' + - 'Angular framework. You **MUST** get this path from the `list_projects` tool. ' + - 'If omitted, the tool will search the generic code examples bundled with the CLI.', - ), - query: z - .string() - .describe( - "The primary, conceptual search query. This should capture the user's main goal or question " + - "(e.g., 'lazy loading a route' or 'how to use signal inputs'). The query will be processed " + - 'by a powerful full-text search engine.\n\n' + - 'Key Syntax Features (see https://www.sqlite.org/fts5.html for full documentation):\n' + - ' - AND (default): Space-separated terms are combined with AND.\n' + - ' - Example: \'standalone component\' (finds results with both "standalone" and "component")\n' + - ' - OR: Use the OR operator to find results with either term.\n' + - " - Example: 'validation OR validator'\n" + - ' - NOT: Use the NOT operator to exclude terms.\n' + - " - Example: 'forms NOT reactive'\n" + - ' - Grouping: Use parentheses () to group expressions.\n' + - " - Example: '(validation OR validator) AND forms'\n" + - ' - Phrase Search: Use double quotes "" for exact phrases.\n' + - ' - Example: \'"template-driven forms"\'\n' + - ' - Prefix Search: Use an asterisk * for prefix matching.\n' + - ' - Example: \'rout*\' (matches "route", "router", "routing")', - ), - keywords: z - .array(z.string()) - .optional() - .describe( - 'A list of specific, exact keywords to narrow the search. Use this for precise terms like ', - ), - required_packages: z - .array(z.string()) - .optional() - .describe( - "A list of NPM packages that an example must use. Use this when the user's request is " + - 'specific to a feature within a certain package (e.g., if the user asks about `ngModel`, ' + - 'you should filter by `@angular/forms`).', - ), - related_concepts: z - .array(z.string()) - .optional() - .describe( - 'A list of high-level concepts to filter by. Use this to find examples related to broader ' + - 'architectural ideas or patterns (e.g., `signals`, `dependency injection`, `routing`).', - ), - includeExperimental: z - .boolean() - .optional() - .default(false) - .describe( - 'By default, this tool returns only production-safe examples. Set this to `true` **only if** ' + - 'the user explicitly asks for a bleeding-edge feature or if a stable solution to their ' + - 'problem cannot be found. If you set this to `true`, you **MUST** preface your answer by ' + - 'warning the user that the example uses experimental APIs that are not suitable for production.', - ), -}); - -export type FindExampleInput = z.infer; - -export const findExampleOutputSchema = z.object({ - examples: z.array( - z.object({ - title: z - .string() - .describe( - 'The title of the example. Use this as a heading when presenting the example to the user.', - ), - summary: z - .string() - .describe( - "A one-sentence summary of the example's purpose. Use this to help the user decide " + - 'if the example is relevant to them.', - ), - keywords: z - .array(z.string()) - .optional() - .describe( - 'A list of keywords for the example. You can use these to explain why this example ' + - "was a good match for the user's query.", - ), - required_packages: z - .array(z.string()) - .optional() - .describe( - 'A list of NPM packages required for the example to work. Before presenting the code, ' + - 'you should inform the user if any of these packages need to be installed.', - ), - related_concepts: z - .array(z.string()) - .optional() - .describe( - 'A list of related concepts. You can suggest these to the user as topics for ' + - 'follow-up questions.', - ), - related_tools: z - .array(z.string()) - .optional() - .describe( - 'A list of related MCP tools. You can suggest these as potential next steps for the user.', - ), - content: z - .string() - .describe( - 'A complete, self-contained Angular code example in Markdown format. This should be ' + - 'presented to the user inside a markdown code block.', - ), - snippet: z - .string() - .optional() - .describe( - 'A contextual snippet from the content showing the matched search term. This field is ' + - 'critical for efficiently evaluating a result`s relevance. It enables two primary ', - ), - }), - ), -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/examples/utils.ts b/packages/angular/cli/src/commands/mcp/tools/examples/utils.ts deleted file mode 100644 index 312994d7b3fd..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/examples/utils.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -/** - * Suppresses the experimental warning emitted by Node.js for the `node:sqlite` module. - * - * This is a workaround to prevent the console from being cluttered with warnings - * about the experimental status of the SQLite module, which is used by this tool. - */ -export function suppressSqliteWarning(): void { - const originalProcessEmit = process.emit; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - process.emit = function (event: string, error?: unknown): any { - if ( - event === 'warning' && - error instanceof Error && - error.name === 'ExperimentalWarning' && - error.message.includes('SQLite') - ) { - return false; - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any, prefer-rest-params - return originalProcessEmit.apply(process, arguments as any); - }; -} 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/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) From 91bbbd4bb2f640ec5e887ea47e160aa1cfabaf97 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 29 Apr 2026 16:55:53 +0000 Subject: [PATCH 09/82] build: update cross-repo angular dependencies See associated pull request for more information. --- MODULE.bazel | 2 +- package.json | 4 ++-- pnpm-lock.yaml | 24 +++++++++++----------- tests/e2e/ng-snapshot/package.json | 32 +++++++++++++++--------------- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index a694184aa957..1ff466be704d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -26,7 +26,7 @@ git_override( bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "069730b7aac7a34fde6bde3dcd11776d809e373f", + commit = "f018eca84d10c594e16e9517ade1254a36dc8733", remote = "https://github.com/angular/dev-infra.git", ) diff --git a/package.json b/package.json index 5fb74feb3f00..862a537ce338 100644 --- a/package.json +++ b/package.json @@ -47,13 +47,13 @@ }, "devDependencies": { "@angular/animations": "22.0.0-next.9", - "@angular/cdk": "22.0.0-next.6", + "@angular/cdk": "22.0.0-next.7", "@angular/common": "22.0.0-next.9", "@angular/compiler": "22.0.0-next.9", "@angular/core": "22.0.0-next.9", "@angular/forms": "22.0.0-next.9", "@angular/localize": "22.0.0-next.9", - "@angular/material": "22.0.0-next.6", + "@angular/material": "22.0.0-next.7", "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ab3557efa43d75ac873b8a6d94683b33bf18ca0f", "@angular/platform-browser": "22.0.0-next.9", "@angular/platform-server": "22.0.0-next.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44ff33754d32..c501ad8d9fc4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,8 +29,8 @@ importers: specifier: 22.0.0-next.9 version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/cdk': - specifier: 22.0.0-next.6 - version: 22.0.0-next.6(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.7 + version: 22.0.0-next.7(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/common': specifier: 22.0.0-next.9 version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) @@ -47,8 +47,8 @@ importers: specifier: 22.0.0-next.9 version: 22.0.0-next.9(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(@angular/compiler@22.0.0-next.9) '@angular/material': - specifier: 22.0.0-next.6 - version: 22.0.0-next.6(68d7531aea4d51eda6419eb6fe82b2bb) + specifier: 22.0.0-next.7 + version: 22.0.0-next.7(6a2dec2de4ee360a8b26fca2cd020273) '@angular/ng-dev': specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#ab3557efa43d75ac873b8a6d94683b33bf18ca0f version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ab3557efa43d75ac873b8a6d94683b33bf18ca0f(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) @@ -941,8 +941,8 @@ packages: peerDependencies: '@angular/core': 22.0.0-next.9 - '@angular/cdk@22.0.0-next.6': - resolution: {integrity: sha512-gvk+QYKSA4pmT9tKZDKI3WAWtmVKC6GyZ7KL+t8/yE9heeDUQ5KYURohYfYwLkg/PHXeurKc9I+XSPKsq2N5ZQ==} + '@angular/cdk@22.0.0-next.7': + resolution: {integrity: sha512-dAJexPGuFn6LwHNRJU2UVNcv0pL8VZzGdcaTs77dPKAR0W8V42/EhFR02SvondsYMA7kpfLLBjVdH5ckwsTCkA==} 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 @@ -1001,10 +1001,10 @@ packages: '@angular/compiler': 22.0.0-next.9 '@angular/compiler-cli': 22.0.0-next.9 - '@angular/material@22.0.0-next.6': - resolution: {integrity: sha512-PtFU5FGJonPfoAaFcfhieB8TZrDliBqWhOXudTPQXtSaOLBoEYScRTIMqXhd4NQeN0pB0SAtczPOM1Iral7Haw==} + '@angular/material@22.0.0-next.7': + resolution: {integrity: sha512-yRmvcm7qrR43GTG33czQ988bCnvspZBadOpA8uci1UHsLF76T/v6U1BNVeM8bZYUofURtvLjyGDlggJmGYqRtg==} peerDependencies: - '@angular/cdk': 22.0.0-next.6 + '@angular/cdk': 22.0.0-next.7 '@angular/common': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 '@angular/core': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 '@angular/forms': ^22.0.0-0 || ^22.1.0-0 || ^22.2.0-0 || ^22.3.0-0 || ^23.0.0-0 @@ -8673,7 +8673,7 @@ snapshots: '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - '@angular/cdk@22.0.0-next.6(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/cdk@22.0.0-next.7(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) @@ -8736,9 +8736,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@22.0.0-next.6(68d7531aea4d51eda6419eb6fe82b2bb)': + '@angular/material@22.0.0-next.7(6a2dec2de4ee360a8b26fca2cd020273)': dependencies: - '@angular/cdk': 22.0.0-next.6(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/cdk': 22.0.0-next.7(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/forms': 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 2701b3c2e40e..633185f70d14 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#9b754c0ca4da311fc6783dc5c98da1f183707c9b", - "@angular/cdk": "github:angular/cdk-builds#c2d20f36438de8c10caeea62e0c2edb17ef626ac", - "@angular/common": "github:angular/common-builds#90986ca3735c6db9429d4d37a0e0e98db43822b2", - "@angular/compiler": "github:angular/compiler-builds#11b70d259dc4ff15187df5b93d11a2e7891ab37b", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#2efc95f8efc03cc975d0f670e1c4079d7ad5ffbf", - "@angular/core": "github:angular/core-builds#44b84c06097bdd680158ef0ae9731d75671be66e", - "@angular/forms": "github:angular/forms-builds#67f141c8cf77be5eddac02660550b0f0c6942315", - "@angular/language-service": "github:angular/language-service-builds#c33e9eee854bdedf220169b8db3f920db5baa0e4", - "@angular/localize": "github:angular/localize-builds#4f786f6c2f8caec76b531c4e578e44c90901d8a7", - "@angular/material": "github:angular/material-builds#87c2b054da2f59cb31e6c59b4882f7a6d2c274d1", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#e119b90a1c7df721b61ea0397d886025ff432b8b", - "@angular/platform-browser": "github:angular/platform-browser-builds#b4da284cca4a4f9a7a350b64011b088d84df5e45", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#bab426507fe13bf1ed381e9605bdf2b9960b97e9", - "@angular/platform-server": "github:angular/platform-server-builds#391b4d8d69db1c5fae03803ac75d63932c657868", - "@angular/router": "github:angular/router-builds#813a3e9e5a03977f97093465275af555eece04d9", - "@angular/service-worker": "github:angular/service-worker-builds#da5d9a8b8754f8f86b0de5d05ed11fd43668badb" + "@angular/animations": "github:angular/animations-builds#d2c951a843879c4c8645ec65dae97b9ad0216571", + "@angular/cdk": "github:angular/cdk-builds#524447197c5fb93c537227bc770408fcf7425d4e", + "@angular/common": "github:angular/common-builds#74c4e329c9cc3c9431b1bc8fdd8256df0af774f5", + "@angular/compiler": "github:angular/compiler-builds#ee1d0722e9f0634fa791d80f252b4c3cb7f6bbd6", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#4a0e399388c13c1d3becd8a6e9f7d676224e478e", + "@angular/core": "github:angular/core-builds#80004395a88e8d814691bac88a19fcd3aba1cbeb", + "@angular/forms": "github:angular/forms-builds#4ccb840e0687fd73464f100f3217eaa4b85c1bda", + "@angular/language-service": "github:angular/language-service-builds#4d4a33bd75ea5820b158d9c3cd2a176dab3d46b5", + "@angular/localize": "github:angular/localize-builds#af669bcc28bd8c53a389603cdf971945a214c2b2", + "@angular/material": "github:angular/material-builds#54fb44530909f1869a32f234a901eaf59898d9c7", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#f1c74db096c95483c22ba506a1912e78be142899", + "@angular/platform-browser": "github:angular/platform-browser-builds#38dc36e2a70eb99388560c77e951fd78f3631b74", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#70b7d84c5e125a76bcf88d2e3d8ee18dbe03e513", + "@angular/platform-server": "github:angular/platform-server-builds#4f2cdbe4e3434d31d4809dab01c35da094fead1e", + "@angular/router": "github:angular/router-builds#1f379a2e48335bb737870f1f7bbd2beac1d6a66b", + "@angular/service-worker": "github:angular/service-worker-builds#842cee8a7d01d85c5d120a2d59347a9fc072c066" } } From 0835364a69ea777eb8006c4ec64f51e49c272e2c Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 29 Apr 2026 06:02:20 +0000 Subject: [PATCH 10/82] build: update pnpm to v10.33.2 See associated pull request for more information. --- MODULE.bazel | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 1ff466be704d..47c06ad86606 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -110,8 +110,8 @@ use_repo( 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.2", + pnpm_version_integrity = "sha512-qQ+vb+6rca1sblf5Tg/hoS9dzCLNdU20CulZPraj4LaxLjVAIYuzeuCDQEsfLObbKkEh6XmCm0r/lLmfSdoc+A==", ) use_repo(pnpm, "pnpm") diff --git a/package.json b/package.json index 862a537ce338..a72d59bc85b5 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,12 @@ "type": "git", "url": "git+https://github.com/angular/angular-cli.git" }, - "packageManager": "pnpm@10.33.0", + "packageManager": "pnpm@10.33.2", "engines": { "node": "^22.22.0 || >=24.13.1", "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.2" }, "author": "Angular Authors", "license": "MIT", From c19d90cd20be05f8bc16591a0b6fde396969ccda Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 29 Apr 2026 11:45:09 -0700 Subject: [PATCH 11/82] docs: release notes for the v21.2.9 release --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33c1713ff2e8..95f565d3de1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,32 @@ + + +# 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 | + + + # 22.0.0-next.6 (2026-04-22) From 5d0343d104328ecbecf7d9c3a901a32f3310d368 Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 29 Apr 2026 14:12:33 -0700 Subject: [PATCH 12/82] docs: release notes for the v20.3.25 release --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95f565d3de1f..cf34b0e0f5b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,24 @@ + + +# 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) From d368da33edacce8a638d6cb21dc2a08b5de9ea22 Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 29 Apr 2026 14:16:28 -0700 Subject: [PATCH 13/82] release: cut the v22.0.0-next.7 release --- CHANGELOG.md | 37 +++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf34b0e0f5b0..30cb8a1a49ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,40 @@ + + +# 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) diff --git a/package.json b/package.json index a72d59bc85b5..56cd8eee6c2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "22.0.0-next.6", + "version": "22.0.0-next.7", "private": true, "description": "Software Development Kit for Angular", "keywords": [ From 7c290f3e721b7a8d1b6b4ce0ff6d3fbb0eebe61b Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 29 Apr 2026 06:30:15 +0000 Subject: [PATCH 14/82] fix(@angular/cli): restrict MCP workspace access to allowed client roots during resolution Introduces validation during workspace and project resolution to ensure the resolved workspace path falls within the allowed MCP roots defined by client capabilities. Throws an error if the workspace resolves outside the allowed roots. Closes #33077 --- .../cli/src/commands/mcp/tools/build.ts | 1 + .../mcp/tools/devserver/devserver-start.ts | 1 + .../mcp/tools/devserver/devserver-stop.ts | 1 + .../devserver/devserver-wait-for-build.ts | 1 + .../angular/cli/src/commands/mcp/tools/e2e.ts | 1 + .../cli/src/commands/mcp/tools/modernize.ts | 1 + .../cli/src/commands/mcp/workspace-utils.ts | 61 +++++++++++++++++- .../src/commands/mcp/workspace-utils_spec.ts | 64 +++++++++++++++++++ 8 files changed, 130 insertions(+), 1 deletion(-) diff --git a/packages/angular/cli/src/commands/mcp/tools/build.ts b/packages/angular/cli/src/commands/mcp/tools/build.ts index 45d3765b3c86..a04812f8544b 100644 --- a/packages/angular/cli/src/commands/mcp/tools/build.ts +++ b/packages/angular/cli/src/commands/mcp/tools/build.ts @@ -38,6 +38,7 @@ export type BuildToolOutput = z.infer; export async function runBuild(input: BuildToolInput, context: McpToolContext) { const { workspacePath, projectName } = await resolveWorkspaceAndProject({ host: context.host, + server: context.server, workspacePathInput: input.workspace, projectNameInput: input.project, mcpWorkspace: context.workspace, diff --git a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts index f5f413cfad30..8f5548f14019 100644 --- a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts +++ b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-start.ts @@ -45,6 +45,7 @@ function localhostAddress(port: number) { export async function startDevserver(input: DevserverStartToolInput, context: McpToolContext) { const { workspacePath, projectName } = await resolveWorkspaceAndProject({ host: context.host, + server: context.server, workspacePathInput: input.workspace, projectNameInput: input.project, mcpWorkspace: context.workspace, diff --git a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-stop.ts b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-stop.ts index 64991bc5adb3..1c90bd9ecd98 100644 --- a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-stop.ts +++ b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-stop.ts @@ -29,6 +29,7 @@ export type DevserverStopToolOutput = z.infer; export async function runE2e(input: E2eToolInput, host: Host, context: McpToolContext) { const { workspacePath, workspace, projectName } = await resolveWorkspaceAndProject({ host, + server: context.server, workspacePathInput: input.workspace, projectNameInput: input.project, mcpWorkspace: context.workspace, diff --git a/packages/angular/cli/src/commands/mcp/tools/modernize.ts b/packages/angular/cli/src/commands/mcp/tools/modernize.ts index 871622d76390..d56d2c30edfd 100644 --- a/packages/angular/cli/src/commands/mcp/tools/modernize.ts +++ b/packages/angular/cli/src/commands/mcp/tools/modernize.ts @@ -108,6 +108,7 @@ export async function runModernization(input: ModernizeInput, context: McpToolCo const { workspacePath, projectName } = await resolveWorkspaceAndProject({ host: context.host, + server: context.server, workspacePathInput: input.workspace, projectNameInput: input.project, mcpWorkspace: context.workspace, diff --git a/packages/angular/cli/src/commands/mcp/workspace-utils.ts b/packages/angular/cli/src/commands/mcp/workspace-utils.ts index d1edf55fa56b..6cc245ff1dbc 100644 --- a/packages/angular/cli/src/commands/mcp/workspace-utils.ts +++ b/packages/angular/cli/src/commands/mcp/workspace-utils.ts @@ -7,7 +7,9 @@ */ import { workspaces } from '@angular-devkit/core'; -import { dirname, join } from 'node:path'; +import { realpathSync } from 'node:fs'; +import { dirname, isAbsolute, join, normalize, relative } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { AngularWorkspace } from '../../utilities/config'; import { type Host, LocalWorkspaceHost } from './host'; import { McpToolContext } from './tools/tool-registry'; @@ -80,6 +82,44 @@ export function getDefaultProjectName(workspace: AngularWorkspace | undefined): return undefined; } +function isWithinAllowedRoot(root: string, targetPath: string): boolean { + const rel = relative(root, targetPath); + + return !rel.startsWith('..') && !isAbsolute(rel); +} + +async function getAllowedWorkspaceRoots(server: McpToolContext['server']): Promise { + let roots: string[]; + const clientCapabilities = server.server.getClientCapabilities(); + + if (clientCapabilities?.roots) { + const { roots: clientRoots } = await server.server.listRoots(); + roots = clientRoots?.map((root) => fileURLToPath(root.uri)) ?? []; + } else { + roots = [process.cwd()]; + } + + return roots + .map((root) => { + try { + return realpathSync(root); + } catch { + return null; + } + }) + .filter((root): root is string => root !== null); +} + +async function isAllowedWorkspacePath( + server: McpToolContext['server'], + workspacePath: string, +): Promise { + const allowedRoots = await getAllowedWorkspaceRoots(server); + const resolvedWorkspacePath = realpathSync(workspacePath); + + return allowedRoots.some((root) => isWithinAllowedRoot(root, resolvedWorkspacePath)); +} + /** * Resolves workspace and project for tools to operate on. * @@ -89,11 +129,13 @@ export function getDefaultProjectName(workspace: AngularWorkspace | undefined): */ export async function resolveWorkspaceAndProject({ host, + server, workspacePathInput, projectNameInput, mcpWorkspace, }: { host: Host; + server?: McpToolContext['server']; workspacePathInput?: string; projectNameInput?: string; mcpWorkspace?: AngularWorkspace; @@ -118,6 +160,15 @@ export async function resolveWorkspaceAndProject({ "You can use 'list_projects' to find available workspaces.", ); } + if (server) { + if (!(await isAllowedWorkspacePath(server, workspacePathInput))) { + throw new Error( + `Workspace path is outside the allowed MCP roots: ${workspacePathInput}. ` + + "You can use 'list_projects' to find available workspaces.", + ); + } + } + workspacePath = workspacePathInput; const configPath = join(workspacePath, 'angular.json'); try { @@ -137,6 +188,14 @@ export async function resolveWorkspaceAndProject({ "You can use 'list_projects' to find available workspaces.", ); } + + if (server && !(await isAllowedWorkspacePath(server, found))) { + throw new Error( + `The current directory resolves to a workspace outside the allowed MCP roots: ${found}. ` + + "You can use 'list_projects' to find available workspaces.", + ); + } + workspacePath = found; const configPath = join(workspacePath, 'angular.json'); try { diff --git a/packages/angular/cli/src/commands/mcp/workspace-utils_spec.ts b/packages/angular/cli/src/commands/mcp/workspace-utils_spec.ts index 62e8df3100e8..a000dd01da34 100644 --- a/packages/angular/cli/src/commands/mcp/workspace-utils_spec.ts +++ b/packages/angular/cli/src/commands/mcp/workspace-utils_spec.ts @@ -7,7 +7,10 @@ */ import { workspaces } from '@angular-devkit/core'; +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; import { join } from 'node:path'; +import { pathToFileURL } from 'node:url'; import { AngularWorkspace } from '../../utilities/config'; import { LocalWorkspaceHost } from './host'; import { addProjectToWorkspace, createMockContext, createMockHost } from './testing/test-utils'; @@ -101,11 +104,24 @@ describe('MCP Workspace Utils', () => { describe('resolveWorkspaceAndProject', () => { let mockHost: ReturnType; let mockWorkspace: AngularWorkspace; + let mockServer: NonNullable[0]['server']>; + let tempDir: string; + let allowedRoot: string; + let allowedWorkspace: string; + let outsideWorkspace: string; const cwd = './'; beforeEach(() => { mockHost = createMockHost(); spyOn(process, 'cwd').and.returnValue(cwd); + tempDir = mkdtempSync(join(tmpdir(), 'mcp-workspace-utils-')); + allowedRoot = join(tempDir, 'allowed-root'); + allowedWorkspace = join(allowedRoot, 'workspace'); + outsideWorkspace = join(tempDir, 'outside-workspace'); + mkdirSync(allowedWorkspace, { recursive: true }); + mkdirSync(outsideWorkspace, { recursive: true }); + writeFileSync(join(allowedWorkspace, 'angular.json'), '{}'); + writeFileSync(join(outsideWorkspace, 'angular.json'), '{}'); // Setup default mocks mockHost.existsSync.and.callFake((p) => { @@ -120,6 +136,18 @@ describe('MCP Workspace Utils', () => { if (p === '/my/workspace/angular.json') { return true; } + if (p === allowedWorkspace) { + return true; + } + if (p === join(allowedWorkspace, 'angular.json')) { + return true; + } + if (p === outsideWorkspace) { + return true; + } + if (p === join(outsideWorkspace, 'angular.json')) { + return true; + } return false; }); @@ -139,6 +167,21 @@ describe('MCP Workspace Utils', () => { } as unknown as AngularWorkspace; spyOn(AngularWorkspace, 'load').and.resolveTo(mockWorkspace); + + mockServer = { + server: { + getClientCapabilities: jasmine.createSpy('getClientCapabilities').and.returnValue({ + roots: { listChanged: false }, + }), + listRoots: jasmine.createSpy('listRoots').and.resolveTo({ + roots: [{ uri: pathToFileURL(allowedRoot).href, name: 'allowed-root' }], + }), + }, + } as unknown as NonNullable[0]['server']>; + }); + + afterEach(() => { + rmSync(tempDir, { recursive: true, force: true }); }); it('should resolve workspace from CWD if not provided and mcpWorkspace is absent', async () => { @@ -179,6 +222,27 @@ describe('MCP Workspace Utils', () => { expect(AngularWorkspace.load).toHaveBeenCalledWith('/my/workspace/angular.json'); }); + it('should allow provided workspace within allowed MCP roots', async () => { + const result = await resolveWorkspaceAndProject({ + host: mockHost, + server: mockServer, + workspacePathInput: allowedWorkspace, + }); + expect(result.workspacePath).toBe(allowedWorkspace); + expect(AngularWorkspace.load).toHaveBeenCalledWith(join(allowedWorkspace, 'angular.json')); + expect(mockServer.server.listRoots).toHaveBeenCalled(); + }); + + it('should reject provided workspace outside allowed MCP roots', async () => { + await expectAsync( + resolveWorkspaceAndProject({ + host: mockHost, + server: mockServer, + workspacePathInput: outsideWorkspace, + }), + ).toBeRejectedWithError(/Workspace path is outside the allowed MCP roots/); + }); + it('should throw if provided workspace does not exist', async () => { mockHost.existsSync.and.returnValue(false); await expectAsync( From 88d69af5e3c1f4bf924fe2d6a58cd0506a94e5fb Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Thu, 30 Apr 2026 06:21:30 +0000 Subject: [PATCH 15/82] docs: release notes for the v19.2.25 release --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30cb8a1a49ea..780f4afbca3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ + + +# 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) @@ -3087,6 +3111,7 @@ - Protractor is no longer supported. Protractor was marked end-of-life in August 2023 (see https://protractortest.org/). Projects still relying on Protractor should consider migrating to another E2E testing framework, several support solid migration paths from Protractor. + - https://angular.dev/tools/cli/end-to-end - https://blog.angular.dev/the-state-of-end-to-end-testing-with-angular-d175f751cb9c @@ -6721,6 +6746,7 @@ Alan Agius, Charles Lyding and Doug Parker ### @angular/cli - Several changes to the `ng analytics` command syntax. + - `ng analytics project ` has been replaced with `ng analytics ` - `ng analytics ` has been replaced with `ng analytics --global` @@ -6750,6 +6776,7 @@ Alan Agius, Charles Lyding and Doug Parker - `browser` and `karma` builders `script` and `styles` options input files extensions are now validated. Valid extensions for `scripts` are: + - `.js` - `.cjs` - `.mjs` @@ -6758,6 +6785,7 @@ Alan Agius, Charles Lyding and Doug Parker - `.mjsx` Valid extensions for `styles` are: + - `.css` - `.less` - `.sass` From 107ddf85ef39afb3439d73e0cfb5da9fc42f802b Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Thu, 30 Apr 2026 07:57:35 +0000 Subject: [PATCH 16/82] test: allow underscores in hash for server routes preload links Updates the regular expressions in server-routes-preload-links.ts to allow underscores in the generated file hashes (changing [a-zA-Z0-9]{8} to [a-zA-Z0-9_]{8}). This ensures that the test correctly identifies modulepreload links when the hash contains an underscore, preventing failures due to overly strict matching. --- .../server-routes-preload-links.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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-/], }, }; From 83a7a80b5438c84b299fd9a459ff8c13aa4da494 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 29 Apr 2026 11:22:13 -0400 Subject: [PATCH 17/82] refactor(@angular/cli): remove modernize tool and add instructions for schematic discovery Remove the `modernize` tool from the Angular CLI MCP server, as it is largely redundant with the official Angular developer skill and direct usage of schematics. To compensate for this removal, add instructions to the server describing how agents can use `ng generate : --help` to discover available modernization schematics. This simplifies the codebase while maintaining the ability for agents to perform code modernization. --- .../cli/src/commands/mcp/mcp-server.ts | 15 +- .../cli/src/commands/mcp/tools/modernize.ts | 193 ------------------ .../src/commands/mcp/tools/modernize_spec.ts | 131 ------------ .../zoneless-migration.ts | 4 +- 4 files changed, 9 insertions(+), 334 deletions(-) delete mode 100644 packages/angular/cli/src/commands/mcp/tools/modernize.ts delete mode 100644 packages/angular/cli/src/commands/mcp/tools/modernize_spec.ts diff --git a/packages/angular/cli/src/commands/mcp/mcp-server.ts b/packages/angular/cli/src/commands/mcp/mcp-server.ts index c7beb7c83397..2b01d79f4e45 100644 --- a/packages/angular/cli/src/commands/mcp/mcp-server.ts +++ b/packages/angular/cli/src/commands/mcp/mcp-server.ts @@ -21,7 +21,6 @@ import { DEVSERVER_STOP_TOOL } from './tools/devserver/devserver-stop'; import { DEVSERVER_WAIT_FOR_BUILD_TOOL } from './tools/devserver/devserver-wait-for-build'; import { DOC_SEARCH_TOOL } from './tools/doc-search'; import { E2E_TOOL } from './tools/e2e'; -import { MODERNIZE_TOOL } from './tools/modernize'; import { ZONELESS_MIGRATION_TOOL } from './tools/onpush-zoneless-migration/zoneless-migration'; import { LIST_PROJECTS_TOOL } from './tools/projects'; import { TEST_TOOL } from './tools/test'; @@ -48,13 +47,7 @@ const STABLE_TOOLS = [ * The set of tools that are available but not enabled by default. * These tools are considered experimental and may have limitations. */ -export const EXPERIMENTAL_TOOLS = [ - BUILD_TOOL, - E2E_TOOL, - MODERNIZE_TOOL, - TEST_TOOL, - ...DEVSERVER_TOOLS, -] as const; +export const EXPERIMENTAL_TOOLS = [BUILD_TOOL, E2E_TOOL, TEST_TOOL, ...DEVSERVER_TOOLS] as const; /** * Experimental tools that are grouped together under a single name. @@ -105,6 +98,12 @@ equivalent actions. * **3. Answer User Questions:** - For conceptual questions ("what is..."), use \`search_documentation\`. + +* **4. Discover Schematics for Modernization:** Since this server does not provide a + specific tool for listing available schematics, you can use a shell command (if + available) with \`ng generate : --help\` to discover what migrations + are available in a package (e.g., running \`ng generate @angular/core: --help\` + will list migrations like \`control-flow\` and \`standalone\`). diff --git a/packages/angular/cli/src/commands/mcp/tools/modernize.ts b/packages/angular/cli/src/commands/mcp/tools/modernize.ts deleted file mode 100644 index d56d2c30edfd..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/modernize.ts +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { z } from 'zod'; -import { workspaceAndProjectOptions } from '../shared-options'; -import { createStructuredContentOutput, getCommandErrorLogs } from '../utils'; -import { resolveWorkspaceAndProject } from '../workspace-utils'; -import { type McpToolContext, type McpToolDeclaration, declareTool } from './tool-registry'; - -interface Transformation { - name: string; - description: string; - documentationUrl: string; - instructions?: string; -} - -const TRANSFORMATIONS: Array = [ - { - name: 'control-flow', - description: - 'Migrates from `*ngIf`, `*ngFor`, and `*ngSwitch` to the new `@if`, `@for`, and `@switch` block syntax in templates.', - documentationUrl: 'https://angular.dev/reference/migrations/control-flow', - }, - { - name: 'self-closing-tag', - description: - 'Converts tags for elements with no content to be self-closing (e.g., `` becomes ``).', - documentationUrl: 'https://angular.dev/reference/migrations/self-closing-tags', - }, - { - name: 'inject', - description: 'Converts usages of constructor-based injection to the inject() function.', - documentationUrl: 'https://angular.dev/reference/migrations/inject-function', - }, - { - name: 'output-migration', - description: 'Converts `@Output` declarations to the new functional `output()` syntax.', - documentationUrl: 'https://angular.dev/reference/migrations/outputs', - }, - { - name: 'signal-input-migration', - description: 'Migrates `@Input` declarations to the new signal-based `input()` syntax.', - documentationUrl: 'https://angular.dev/reference/migrations/signal-inputs', - }, - { - name: 'signal-queries-migration', - description: - 'Migrates `@ViewChild` and `@ContentChild` queries to their signal-based `viewChild` and `contentChild` versions.', - documentationUrl: 'https://angular.dev/reference/migrations/signal-queries', - }, - { - name: 'standalone', - description: - 'Converts the application to use standalone components, directives, and pipes. This is a ' + - 'three-step process. After each step, you should verify that your application builds and ' + - 'runs correctly.', - instructions: - 'This migration requires running a cli schematic multiple times. Run the commands in the ' + - 'order listed below, verifying that your code builds and runs between each step:\n\n' + - '1. Run `ng g @angular/core:standalone` and select "Convert all components, directives and pipes to standalone"\n' + - '2. Run `ng g @angular/core:standalone` and select "Remove unnecessary NgModule classes"\n' + - '3. Run `ng g @angular/core:standalone` and select "Bootstrap the project using standalone APIs"', - documentationUrl: 'https://angular.dev/reference/migrations/standalone', - }, -]; - -const modernizeInputSchema = z.object({ - ...workspaceAndProjectOptions, - transformations: z - .array(z.enum(TRANSFORMATIONS.map((t) => t.name) as [string, ...string[]])) - .optional() - .describe('A list of specific transformations to apply.'), - path: z - .string() - .optional() - .describe('The path to the file or directory to modernize, relative to the workspace root.'), -}); - -const modernizeOutputSchema = z.object({ - instructions: z - .array(z.string()) - .optional() - .describe( - 'Migration summary, as well as any instructions that need to be performed to complete the migrations.', - ), - logs: z.array(z.string()).optional().describe('All logs from all executed commands.'), -}); - -export type ModernizeInput = z.infer; -export type ModernizeOutput = z.infer; - -export async function runModernization(input: ModernizeInput, context: McpToolContext) { - const transformationNames = input.transformations ?? []; - - if (transformationNames.length === 0) { - return createStructuredContentOutput({ - instructions: [ - 'Call this tool with the specific transformations you want to run. See the tool description for more info. Also call the' + - ' `get_best_practices` tool for general Angular best practices.', - ], - }); - } - - const { workspacePath, projectName } = await resolveWorkspaceAndProject({ - host: context.host, - server: context.server, - workspacePathInput: input.workspace, - projectNameInput: input.project, - mcpWorkspace: context.workspace, - }); - - const instructions: string[] = []; - let logs: string[] = []; - const transformationsToRun = TRANSFORMATIONS.filter((t) => transformationNames.includes(t.name)); - - for (const transformation of transformationsToRun) { - if (transformation.instructions) { - // This is a complex case, return instructions. - let transformationInstructions = transformation.instructions; - if (transformation.documentationUrl) { - transformationInstructions += `\nFor more information, see ${transformation.documentationUrl}.`; - } - instructions.push(transformationInstructions); - } else { - // Simple case, run the command. - const command = 'ng'; - const args = ['generate', `@angular/core:${transformation.name}`, '--project', projectName]; - if (input.path) { - args.push('--path', input.path); - } - - try { - logs = ( - await context.host.runCommand(command, args, { - cwd: workspacePath, - }) - ).logs; - instructions.push(`Migration ${transformation.name} completed successfully.`); - } catch (e) { - logs = getCommandErrorLogs(e); - instructions.push(`Migration ${transformation.name} failed.`); - } - } - } - - return createStructuredContentOutput({ - instructions: instructions.length > 0 ? instructions : undefined, - logs, - }); -} - -export const MODERNIZE_TOOL: McpToolDeclaration< - typeof modernizeInputSchema.shape, - typeof modernizeOutputSchema.shape -> = declareTool({ - name: 'modernize', - title: 'Modernize Angular Code', - description: ` - -Provides instructions and commands for modernizing Angular code to align with the latest best -practices and syntax. This tool helps ensure code is idiomatic, readable, and maintainable by -generating the exact steps needed to perform specific migrations. - - -* **Applying Specific Migrations:** Get the precise commands to update code to modern patterns - (e.g., selecting 'control-flow-migration' to replace *ngIf with @if). -* **Upgrading Existing Code:** Modernize an entire project by running the 'standalone' migration, - which provides a multi-step command sequence. -* **Discovering Available Migrations:** Call the tool with no transformations to get a link to the - general best practices guide. - - -* **Execution:** This tool executes 'ng generate' commands for simple migrations in a temporary - environment using the provided file content. For complex migrations like 'standalone', it - provides instructions which you **MUST** then execute as shell commands. -* **File Modifications:** This tool has been fixed and now correctly finds the node_modules directory in a Bazel environment. -* **Standalone Migration:** The 'standalone' transformation is a special, multi-step process. - The tool will provide instructions. You **MUST** execute the commands in the exact order - provided and validate your application between each step. -* **Transformation List:** The following transformations are available: -${TRANSFORMATIONS.map((t) => ` * ${t.name}: ${t.description}`).join('\n')} -`, - inputSchema: modernizeInputSchema.shape, - outputSchema: modernizeOutputSchema.shape, - isLocalOnly: true, - isReadOnly: false, - factory: (context) => (input) => runModernization(input, context), -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/modernize_spec.ts b/packages/angular/cli/src/commands/mcp/tools/modernize_spec.ts deleted file mode 100644 index fe3dc93be9d1..000000000000 --- a/packages/angular/cli/src/commands/mcp/tools/modernize_spec.ts +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { CommandError } from '../host'; -import type { MockHost } from '../testing/mock-host'; -import { - MockMcpToolContext, - addProjectToWorkspace, - createMockContext, -} from '../testing/test-utils'; -import { type ModernizeOutput, runModernization } from './modernize'; - -describe('Modernize Tool', () => { - let mockHost: MockHost; - let mockContext: MockMcpToolContext; - - beforeEach(() => { - const mock = createMockContext(); - mockHost = mock.host; - mockContext = mock.context; - - addProjectToWorkspace(mock.projects, 'my-app'); - mockContext.workspace.extensions['defaultProject'] = 'my-app'; - }); - - it('should return instructions if no transformations are provided', async () => { - const { structuredContent } = (await runModernization({}, mockContext)) as { - structuredContent: ModernizeOutput; - }; - - expect(mockHost.runCommand).not.toHaveBeenCalled(); - expect(structuredContent?.instructions).toEqual([ - 'Call this tool with the specific transformations you want to run. See the tool description for more info. Also call the' + - ' `get_best_practices` tool for general Angular best practices.', - ]); - }); - - it('can run a single transformation', async () => { - const { structuredContent } = (await runModernization( - { - transformations: ['self-closing-tag'], - }, - mockContext, - )) as { structuredContent: ModernizeOutput }; - - expect(mockHost.runCommand).toHaveBeenCalledOnceWith( - 'ng', - ['generate', '@angular/core:self-closing-tag', '--project', 'my-app'], - { cwd: '/test' }, - ); - expect(structuredContent?.instructions).toEqual([ - 'Migration self-closing-tag completed successfully.', - ]); - }); - - it('can run a single transformation with path', async () => { - const { structuredContent } = (await runModernization( - { - transformations: ['self-closing-tag'], - path: '.', - }, - mockContext, - )) as { structuredContent: ModernizeOutput }; - - expect(mockHost.runCommand).toHaveBeenCalledOnceWith( - 'ng', - ['generate', '@angular/core:self-closing-tag', '--project', 'my-app', '--path', '.'], - { cwd: '/test' }, - ); - expect(structuredContent?.instructions).toEqual([ - 'Migration self-closing-tag completed successfully.', - ]); - }); - - it('can run multiple transformations', async () => { - const { structuredContent } = (await runModernization( - { - transformations: ['control-flow', 'self-closing-tag'], - }, - mockContext, - )) as { structuredContent: ModernizeOutput }; - - expect(mockHost.runCommand).toHaveBeenCalledTimes(2); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['generate', '@angular/core:control-flow', '--project', 'my-app'], - { - cwd: '/test', - }, - ); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', - ['generate', '@angular/core:self-closing-tag', '--project', 'my-app'], - { cwd: '/test' }, - ); - expect(structuredContent?.logs).toEqual([]); - expect(structuredContent?.instructions).toEqual( - jasmine.arrayWithExactContents([ - 'Migration control-flow completed successfully.', - 'Migration self-closing-tag completed successfully.', - ]), - ); - }); - - it('should report errors from transformations', async () => { - // Simulate a failed execution - mockHost.runCommand.and.rejectWith( - new CommandError('Command failed with error', ['some logs'], 1), - ); - - const { structuredContent } = (await runModernization( - { - transformations: ['self-closing-tag'], - }, - mockContext, - )) as { structuredContent: ModernizeOutput }; - - expect(mockHost.runCommand).toHaveBeenCalledOnceWith( - 'ng', - ['generate', '@angular/core:self-closing-tag', '--project', 'my-app'], - { cwd: '/test' }, - ); - expect(structuredContent?.logs).toEqual(['some logs', 'Command failed with error']); - expect(structuredContent?.instructions).toEqual(['Migration self-closing-tag failed.']); - }); -}); diff --git a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts index 28941e47b355..5e9c9db972e0 100644 --- a/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts +++ b/packages/angular/cli/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.ts @@ -44,8 +44,8 @@ most important action to take in the migration journey. * **Iterative Process:** The migration process is iterative. You must call this tool repeatedly, applying the suggested fix after each call, until the tool indicates that no more actions are needed. -* **Relationship to \`modernize\`:** This tool is the specialized starting point for the zoneless/OnPush - migration. For other migrations (like signal inputs), you should use the \`modernize\` tool first, +* **Relationship to other migrations:** This tool is the specialized starting point for the zoneless/OnPush + migration. For other migrations (like signal inputs), you should run the corresponding schematics first, as the zoneless migration may depend on them as prerequisites. * **Input:** The tool can operate on either a single file or an entire directory. Provide the absolute path. From 048e40c598f8da3122f48f1bc250f2dfd63179aa Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 29 Apr 2026 12:34:49 -0400 Subject: [PATCH 18/82] refactor(@angular/cli): integrate MCP roots into Host abstraction Update the `Host` abstraction to be aware of allowed roots provided by the MCP client. A new `createRootRestrictedHost` wrapper enforces that file operations and command executions stay within these roots. The server is updated to initialize roots on connection and listen for changes. --- packages/angular/cli/src/commands/mcp/host.ts | 130 ++++++++++++++++-- .../cli/src/commands/mcp/mcp-server.ts | 42 +++++- .../cli/src/commands/mcp/testing/mock-host.ts | 2 +- 3 files changed, 156 insertions(+), 18 deletions(-) diff --git a/packages/angular/cli/src/commands/mcp/host.ts b/packages/angular/cli/src/commands/mcp/host.ts index 5c7612ea15bb..40586bdcd8ac 100644 --- a/packages/angular/cli/src/commands/mcp/host.ts +++ b/packages/angular/cli/src/commands/mcp/host.ts @@ -15,11 +15,11 @@ import { existsSync as nodeExistsSync } from 'fs'; import { ChildProcess, spawn } from 'node:child_process'; -import { Stats } from 'node:fs'; +import { Stats, realpathSync } from 'node:fs'; import { glob as nodeGlob, readFile as nodeReadFile, stat } from 'node:fs/promises'; import { createRequire } from 'node:module'; import { createServer } from 'node:net'; -import { dirname, join, resolve } from 'node:path'; +import { dirname, isAbsolute, join, relative, resolve } from 'node:path'; /** * An error thrown when a command fails to execute. @@ -71,14 +71,6 @@ export interface Host { options: { cwd: string }, ): AsyncIterable<{ name: string; parentPath: string; isFile(): boolean }>; - /** - * Resolves a module request from a given path. - * @param request The module request to resolve. - * @param from The path from which to resolve the request. - * @returns The resolved module path. - */ - resolveModule(request: string, from: string): string; - /** * Spawns a child process and returns a promise that resolves with the process's * output or rejects with a structured error. @@ -124,6 +116,11 @@ export interface Host { * Checks whether a TCP port is available on the system. */ isPortAvailable(port: number): Promise; + + /** + * Sets the allowed roots for this host. + */ + setRoots(roots: string[]): void; } function resolveCommand( @@ -173,10 +170,6 @@ export const LocalWorkspaceHost: Host = { return nodeGlob(pattern, { ...options, withFileTypes: true }); }, - resolveModule(request: string, from: string): string { - return createRequire(from).resolve(request); - }, - runCommand: async ( command: string, args: readonly string[], @@ -287,4 +280,113 @@ export const LocalWorkspaceHost: Host = { }); }); }, + + setRoots(roots: string[]) { + // LocalWorkspaceHost does not enforce roots, so this is a no-op. + }, }; + +export function createRootRestrictedHost( + baseHost: Host, + initialRoots: string[] = [process.cwd()], +): Host { + let roots = initialRoots; + + function checkPath(path: string) { + const resolvedPath = resolve(path); + let realPath: string; + try { + realPath = realpathSync(resolvedPath); + } catch (e) { + if ((e as Error & { code?: string }).code === 'ENOENT') { + // Path does not exist. Find the first existing ancestor. + let current = resolvedPath; + while (current) { + try { + realPath = realpathSync(current); + break; + } catch (err) { + if ((err as Error & { code?: string }).code !== 'ENOENT') { + throw err; + } + const parent = dirname(current); + if (parent === current) { + // Reached filesystem root + throw err; + } + current = parent; + } + } + } else { + throw e; + } + } + + const isAllowed = roots.some((root) => { + const rel = relative(root, realPath); + + return !rel.startsWith('..') && !isAbsolute(rel); + }); + + if (!isAllowed) { + throw new Error(`Access denied: path '${path}' is outside allowed roots.`); + } + } + + return { + ...baseHost, + setRoots(newRoots: string[]) { + roots = newRoots; + }, + stat(path: string) { + checkPath(path); + + return baseHost.stat(path); + }, + existsSync(path: string) { + checkPath(path); + + return baseHost.existsSync(path); + }, + readFile(path: string, encoding: 'utf-8') { + checkPath(path); + + return baseHost.readFile(path, encoding); + }, + glob(pattern: string, options: { cwd: string }) { + if (pattern.includes('..')) { + throw new Error( + `Access denied: glob pattern '${pattern}' contains path traversal sequences.`, + ); + } + + checkPath(options.cwd); + + const firstWildcardIndex = pattern.search(/[*?[{]/); + const basePath = firstWildcardIndex >= 0 ? pattern.substring(0, firstWildcardIndex) : pattern; + + const targetDir = resolve(options.cwd, basePath); + checkPath(targetDir); + + return baseHost.glob(pattern, options); + }, + runCommand(command: string, args: readonly string[], options: { cwd?: string } = {}) { + const effectiveCwd = options.cwd ?? process.cwd(); + checkPath(effectiveCwd); + if (command.includes('/') || command.includes('\\')) { + checkPath(resolve(effectiveCwd, command)); + } + + return baseHost.runCommand(command, args, options); + }, + spawn(command: string, args: readonly string[], options: { cwd?: string } = {}) { + const effectiveCwd = options.cwd ?? process.cwd(); + checkPath(effectiveCwd); + if (command.includes('/') || command.includes('\\')) { + checkPath(resolve(effectiveCwd, command)); + } + + return baseHost.spawn(command, args, options); + }, + }; +} diff --git a/packages/angular/cli/src/commands/mcp/mcp-server.ts b/packages/angular/cli/src/commands/mcp/mcp-server.ts index 2b01d79f4e45..235ccf682372 100644 --- a/packages/angular/cli/src/commands/mcp/mcp-server.ts +++ b/packages/angular/cli/src/commands/mcp/mcp-server.ts @@ -7,11 +7,13 @@ */ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -import { join } from 'node:path'; +import { RootsListChangedNotificationSchema } from '@modelcontextprotocol/sdk/types.js'; +import { join, normalize } from 'node:path'; +import { fileURLToPath } from 'node:url'; import type { AngularWorkspace } from '../../utilities/config'; import { VERSION } from '../../utilities/version'; import type { Devserver } from './devserver'; -import { LocalWorkspaceHost } from './host'; +import { LocalWorkspaceHost, createRootRestrictedHost } from './host'; import { registerInstructionsResource } from './resources/instructions'; import { AI_TUTOR_TOOL } from './tools/ai-tutor'; import { BEST_PRACTICES_TOOL } from './tools/best-practices'; @@ -123,6 +125,40 @@ equivalent actions. logger, }); + const restrictedHost = createRootRestrictedHost(LocalWorkspaceHost); + + server.server.oninitialized = () => { + void (async () => { + try { + const clientCapabilities = server.server.getClientCapabilities(); + if (clientCapabilities?.roots) { + const { roots } = await server.server.listRoots(); + const searchRoots = roots?.map((r) => normalize(fileURLToPath(r.uri))) ?? []; + restrictedHost.setRoots(searchRoots); + + if (clientCapabilities.roots.listChanged) { + server.server.setNotificationHandler(RootsListChangedNotificationSchema, async () => { + try { + const { roots: updatedRoots } = await server.server.listRoots(); + const updatedSearchRoots = + updatedRoots?.map((r) => normalize(fileURLToPath(r.uri))) ?? []; + restrictedHost.setRoots(updatedSearchRoots); + } catch (e) { + logger.warn( + `Failed to update roots on notification: ${e instanceof Error ? e.message : e}`, + ); + } + }); + } + } + } catch (e) { + logger.warn( + `Failed to initialize roots on connection: ${e instanceof Error ? e.message : e}`, + ); + } + })(); + }; + await registerTools( server, { @@ -130,7 +166,7 @@ equivalent actions. logger, exampleDatabasePath: join(__dirname, '../../../lib/code-examples.db'), devservers: new Map(), - host: LocalWorkspaceHost, + host: restrictedHost, }, toolDeclarations, ); diff --git a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts index ce2e5177ffab..ef818062d559 100644 --- a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts +++ b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts @@ -18,8 +18,8 @@ export class MockHost implements Host { existsSync = jasmine.createSpy('existsSync'); readFile = jasmine.createSpy('readFile').and.resolveTo(''); glob = jasmine.createSpy('glob').and.returnValue((async function* () {})()); - resolveModule = jasmine.createSpy('resolveRequest').and.returnValue('/dev/null'); spawn = jasmine.createSpy('spawn'); getAvailablePort = jasmine.createSpy('getAvailablePort'); isPortAvailable = jasmine.createSpy('isPortAvailable').and.resolveTo(true); + setRoots = jasmine.createSpy('setRoots'); } From d46fd31bbcc48ce5e33be92ca94d5fc1fb6a815d Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 29 Apr 2026 14:50:24 -0700 Subject: [PATCH 19/82] refactor: configure Gemini reviewer to ignore lockfile and changelog The bot doesn't provide much useful feedback on these files and pollutes release PRs, so we can just skip them. --- .gemini/config.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 From 40032006d0f9e58c43d7a277fb9f1270873c69d6 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 30 Apr 2026 11:01:36 +0000 Subject: [PATCH 20/82] build: update cross-repo angular dependencies See associated pull request for more information. --- MODULE.bazel | 6 +- MODULE.bazel.lock | 19 +- package.json | 24 +-- packages/angular/ssr/package.json | 12 +- packages/ngtools/webpack/package.json | 4 +- pnpm-lock.yaml | 272 +++++++++++++------------- tests/e2e/ng-snapshot/package.json | 32 +-- 7 files changed, 186 insertions(+), 183 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 47c06ad86606..48a58aad6a44 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -19,21 +19,21 @@ bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4") bazel_dep(name = "rules_angular") git_override( module_name = "rules_angular", - commit = "c6f7e15470934f7c2fe46ff5bae7d68be0230501", + commit = "b1d295334e70335dab7ac9984a989fae0a9c9dc2", remote = "https://github.com/angular/rules_angular.git", ) bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "f018eca84d10c594e16e9517ade1254a36dc8733", + commit = "48c48fa3848de5bb0ec1c3203558f099765165ab", remote = "https://github.com/angular/dev-infra.git", ) bazel_dep(name = "rules_browsers") git_override( module_name = "rules_browsers", - commit = "af35c89a5a099c4bbc3f1a3495688cf51bd6a8da", + commit = "b03f09ef28a08f8ae07482851cf5ecbf6ac23a2a", remote = "https://github.com/angular/rules_browsers.git", ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index c8cd87aacc28..2cc7894611e6 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -50,7 +50,8 @@ "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", @@ -212,7 +213,7 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "QxNkTCcD6yURsbqznKyC/WCjCyhHZbEipGXl2UQjjzY=", + "bzlTransitiveDigest": "3l5lERuIkp41OnB+ZcMQkXS5ttpwE3LfWmePbmwDofk=", "usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -428,7 +429,7 @@ "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { "bzlTransitiveDigest": "dhTbv9E6UfT1WJmmu3ORRPO6AKFJvgBjBxu+BO+u1RY=", - "usagesDigest": "mnWOxbm/kIwuW9HmcBRVBhHU3ThlGE832G0JAy/sn+4=", + "usagesDigest": "HRb2f7bITsAYryQClLOB8GSzqqQT63B6u1BY+z/wpFU=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -446,8 +447,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 +457,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 +467,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" ] diff --git a/package.json b/package.json index 56cd8eee6c2e..55361ed5c7a0 100644 --- a/package.json +++ b/package.json @@ -42,23 +42,23 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular/compiler-cli": "22.0.0-next.9", + "@angular/compiler-cli": "22.0.0-next.10", "typescript": "6.0.2" }, "devDependencies": { - "@angular/animations": "22.0.0-next.9", + "@angular/animations": "22.0.0-next.10", "@angular/cdk": "22.0.0-next.7", - "@angular/common": "22.0.0-next.9", - "@angular/compiler": "22.0.0-next.9", - "@angular/core": "22.0.0-next.9", - "@angular/forms": "22.0.0-next.9", - "@angular/localize": "22.0.0-next.9", + "@angular/common": "22.0.0-next.10", + "@angular/compiler": "22.0.0-next.10", + "@angular/core": "22.0.0-next.10", + "@angular/forms": "22.0.0-next.10", + "@angular/localize": "22.0.0-next.10", "@angular/material": "22.0.0-next.7", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ab3557efa43d75ac873b8a6d94683b33bf18ca0f", - "@angular/platform-browser": "22.0.0-next.9", - "@angular/platform-server": "22.0.0-next.9", - "@angular/router": "22.0.0-next.9", - "@angular/service-worker": "22.0.0-next.9", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904", + "@angular/platform-browser": "22.0.0-next.10", + "@angular/platform-server": "22.0.0-next.10", + "@angular/router": "22.0.0-next.10", + "@angular/service-worker": "22.0.0-next.10", "@babel/core": "7.29.0", "@bazel/bazelisk": "1.28.1", "@bazel/buildifier": "8.2.1", diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index 154e6c7e4175..9cfd3d126e0a 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -29,12 +29,12 @@ }, "devDependencies": { "@angular-devkit/schematics": "workspace:*", - "@angular/common": "22.0.0-next.9", - "@angular/compiler": "22.0.0-next.9", - "@angular/core": "22.0.0-next.9", - "@angular/platform-browser": "22.0.0-next.9", - "@angular/platform-server": "22.0.0-next.9", - "@angular/router": "22.0.0-next.9", + "@angular/common": "22.0.0-next.10", + "@angular/compiler": "22.0.0-next.10", + "@angular/core": "22.0.0-next.10", + "@angular/platform-browser": "22.0.0-next.10", + "@angular/platform-server": "22.0.0-next.10", + "@angular/router": "22.0.0-next.10", "@schematics/angular": "workspace:*", "beasties": "0.4.2" }, diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 9e65660f9b2f..da1a83caad06 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", - "@angular/compiler": "22.0.0-next.9", - "@angular/compiler-cli": "22.0.0-next.9", + "@angular/compiler": "22.0.0-next.10", + "@angular/compiler-cli": "22.0.0-next.10", "typescript": "6.0.2", "webpack": "5.106.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c501ad8d9fc4..c49c0a905045 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,8 +14,8 @@ importers: .: dependencies: '@angular/compiler-cli': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) typescript: specifier: 6.0.2 version: 6.0.2 @@ -26,44 +26,44 @@ importers: built: true devDependencies: '@angular/animations': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/cdk': specifier: 22.0.0-next.7 - version: 22.0.0-next.7(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + version: 22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/common': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9 + specifier: 22.0.0-next.10 + version: 22.0.0-next.10 '@angular/core': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/forms': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/localize': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(@angular/compiler@22.0.0-next.9) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(@angular/compiler@22.0.0-next.10) '@angular/material': specifier: 22.0.0-next.7 - version: 22.0.0-next.7(6a2dec2de4ee360a8b26fca2cd020273) + version: 22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#ab3557efa43d75ac873b8a6d94683b33bf18ca0f - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ab3557efa43d75ac873b8a6d94683b33bf18ca0f(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904 + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) '@angular/platform-browser': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/platform-server': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.9)(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/service-worker': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@babel/core': specifier: 7.29.0 version: 7.29.0 @@ -327,7 +327,7 @@ importers: version: 29.0.2 ng-packagr: specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) rxjs: specifier: 7.8.2 version: 7.8.2 @@ -430,7 +430,7 @@ importers: 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.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) postcss: specifier: 8.5.10 version: 8.5.10 @@ -527,23 +527,23 @@ importers: specifier: workspace:* version: link:../../angular_devkit/schematics '@angular/common': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9 + specifier: 22.0.0-next.10 + version: 22.0.0-next.10 '@angular/core': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/platform-browser': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) '@angular/platform-server': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.9)(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular @@ -730,7 +730,7 @@ importers: 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.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) undici: specifier: 8.1.0 version: 8.1.0 @@ -822,11 +822,11 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../angular_devkit/core '@angular/compiler': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9 + specifier: 22.0.0-next.10 + version: 22.0.0-next.10 '@angular/compiler-cli': - specifier: 22.0.0-next.9 - version: 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) + specifier: 22.0.0-next.10 + version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) typescript: specifier: 6.0.2 version: 6.0.2 @@ -935,11 +935,11 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular/animations@22.0.0-next.9': - resolution: {integrity: sha512-mWWsuq7TvzVuAz0eMLqMrOdi/Z57TsyYUvlETKlZ8Ik4VXZ3ozDFUC6ysSiratr5Y0H/fA+wmLRFm+Uu2RfOqg==} + '@angular/animations@22.0.0-next.10': + resolution: {integrity: sha512-o4YxddwSuqW/l+Mot35Se/k3H/7tarFDjppHaf7IEPmZVqRz2+6/LLfmv51RuSZmtt5L+0FIFmazFmS+3+wRNw==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/core': 22.0.0-next.9 + '@angular/core': 22.0.0-next.10 '@angular/cdk@22.0.0-next.7': resolution: {integrity: sha512-dAJexPGuFn6LwHNRJU2UVNcv0pL8VZzGdcaTs77dPKAR0W8V42/EhFR02SvondsYMA7kpfLLBjVdH5ckwsTCkA==} @@ -949,33 +949,33 @@ packages: '@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.9': - resolution: {integrity: sha512-cjnDWnGjMT/78EEZjQQutQPuUdKO0nfcBlEiG9cL1dliaHpwjLNzOW4TNlNQJr7hz9FSWCWAZAFJugRoZxc8vQ==} + '@angular/common@22.0.0-next.10': + resolution: {integrity: sha512-AqcFvnjCMjwS9wNxCWMTy+tQH1Kr6HTHgyqBgDWP01Y4NDLicJSGtU99fZ7KXsalHyZyXmYqqZqvmyeCIzweqw==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/core': 22.0.0-next.9 + '@angular/core': 22.0.0-next.10 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@22.0.0-next.9': - resolution: {integrity: sha512-OBFNOsA18miM8U1A4lsCQz5f7THelVH+10NhoI7+YLJZreUUdK1SDlk0pF4MBs2lbYP99k2G35Pm68W1k89f0g==} + '@angular/compiler-cli@22.0.0-next.10': + resolution: {integrity: sha512-kCV2elmGIVu+k0UydnWnGgiNEvmCe6diyXntz7Hw3Ynuap62/ZiiLcHZVJRGhuei7TIUu6qoNAKHj7jm8pQ2xw==} engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.9 + '@angular/compiler': 22.0.0-next.10 typescript: '>=6.0 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@22.0.0-next.9': - resolution: {integrity: sha512-O7HroLbQFcl2JLJrEKCu3eob0a2w2nTZ36Bx93pzAsWxNMt6nMcIFv1y0qL5TO5eS2WOUGQXagv4+7U+m+0C4Q==} + '@angular/compiler@22.0.0-next.10': + resolution: {integrity: sha512-EQKOrWGiZjZ5Jd4cV9wGxvqcS/8dfXIpo4hsvDQLvNGHQL3uVZqlCH+M6+iEahEYXO/u7QLcilDtOJ1jfwqbyQ==} engines: {node: ^22.22.0 || >=24.13.1} - '@angular/core@22.0.0-next.9': - resolution: {integrity: sha512-cXE3ZM13xd3d4YfrYCRiDs+EikzDm9qeutwiuZ43f3kEsfgvPkdoYtpSevaG+92752XRwyOan3Lz7TLxKp9i2w==} + '@angular/core@22.0.0-next.10': + resolution: {integrity: sha512-L/uE6f8U+2aqzgNTq1OQbquV090kpR/lyOsnmtP4cZSUTPPG0fnIyA2ct3ycifw4xxpxEwhOv2VYQ4EYRyWb5w==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/compiler': 22.0.0-next.9 + '@angular/compiler': 22.0.0-next.10 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -984,22 +984,22 @@ packages: zone.js: optional: true - '@angular/forms@22.0.0-next.9': - resolution: {integrity: sha512-5Mf5p2FWKOFYipylvpyXZ7UCFSSWO8oGwkKj4qRpojH8i7T6l8y6uym2dakYZwYvjCZdCMKQss63ldFPObQRJA==} + '@angular/forms@22.0.0-next.10': + resolution: {integrity: sha512-3RMIm2LmJwBSzQMIpv90ZAZfkkObW0Yq1GrpyJKv1U8lIQWcNnib1e9RIFVVMhTDk5+MRzpPH8Z5lAeo8yLAeg==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/common': 22.0.0-next.9 - '@angular/core': 22.0.0-next.9 - '@angular/platform-browser': 22.0.0-next.9 + '@angular/common': 22.0.0-next.10 + '@angular/core': 22.0.0-next.10 + '@angular/platform-browser': 22.0.0-next.10 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@22.0.0-next.9': - resolution: {integrity: sha512-vYUYC15AVpPZZ9qGEwOyT3a1EAo0Sf+Y0kZIsRNGadl5FU1txyYmTx+ZCOoHoYLk8xI8AZWFcZOQGV1t9N9G4w==} + '@angular/localize@22.0.0-next.10': + resolution: {integrity: sha512-AuNQIl1OI1Lgje4KflwIlV7wEFQPE9WyNA8SgCR4Eief9N3TO4couzlfxUp72lq7eB13mCclScixiTZ+ys4aTA==} engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/compiler': 22.0.0-next.9 - '@angular/compiler-cli': 22.0.0-next.9 + '@angular/compiler': 22.0.0-next.10 + '@angular/compiler-cli': 22.0.0-next.10 '@angular/material@22.0.0-next.7': resolution: {integrity: sha512-yRmvcm7qrR43GTG33czQ988bCnvspZBadOpA8uci1UHsLF76T/v6U1BNVeM8bZYUofURtvLjyGDlggJmGYqRtg==} @@ -1011,47 +1011,47 @@ packages: '@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/ab3557efa43d75ac873b8a6d94683b33bf18ca0f': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ab3557efa43d75ac873b8a6d94683b33bf18ca0f} - version: 0.0.0-a71a5d725b4f2c8f090a58c8fda7b437bdc3b89a + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904} + version: 0.0.0-e391d56ec4a9d89b4006515b0679350f1394d19a hasBin: true - '@angular/platform-browser@22.0.0-next.9': - resolution: {integrity: sha512-YKZiwnWDsDRlyw6MmcpZIO/vb4mMFOPXyZaTNvuSR63rBx/jJ/eo1ocii5k2cW+CMu7ZwuABrWoEBSRughhwyA==} + '@angular/platform-browser@22.0.0-next.10': + resolution: {integrity: sha512-Gs4vo/2Mof1T4LCJUJuaPaQV18p0KpkrhWJ0gEVT6MFX/wjM1uuHvP25tPKYQysNzb2iaUTVcS8QwuX0HGPoJQ==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/animations': 22.0.0-next.9 - '@angular/common': 22.0.0-next.9 - '@angular/core': 22.0.0-next.9 + '@angular/animations': 22.0.0-next.10 + '@angular/common': 22.0.0-next.10 + '@angular/core': 22.0.0-next.10 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/platform-server@22.0.0-next.9': - resolution: {integrity: sha512-nIG0wGc8jpwdy/KsFq7VWH6U7uHRbczNrldC4kmq96+btwcg1iDE7ipippaJVzlkn6CKU9AYAAYoaJsTTexG9A==} + '@angular/platform-server@22.0.0-next.10': + resolution: {integrity: sha512-KTtW83mQfmwlyzUhf3oS+M7WzrYYB+0apkmEAw+7HuvsGbAcAFO9ltzhykPwfslwwEV6mqbkGJRFxtkpqMQGqA==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/common': 22.0.0-next.9 - '@angular/compiler': 22.0.0-next.9 - '@angular/core': 22.0.0-next.9 - '@angular/platform-browser': 22.0.0-next.9 + '@angular/common': 22.0.0-next.10 + '@angular/compiler': 22.0.0-next.10 + '@angular/core': 22.0.0-next.10 + '@angular/platform-browser': 22.0.0-next.10 rxjs: ^6.5.3 || ^7.4.0 - '@angular/router@22.0.0-next.9': - resolution: {integrity: sha512-2GnVrAUHZjlXvdEE8Bvwvf8rvXIlKYRaqDE8fwPQNqDEoCWnPo+wEb8V4x0J2PfcwIsAo3nqV77FtjQxt2wvUQ==} + '@angular/router@22.0.0-next.10': + resolution: {integrity: sha512-IV28yTF+HM4SBGJGaHEwdDNr3ASLfjQhBuKSKoUy4Yf5vg87qZzbZnXIFo1jQWmbAu7lnFMMTfuLqnwHl07dAQ==} engines: {node: ^22.22.0 || >=24.13.1} peerDependencies: - '@angular/common': 22.0.0-next.9 - '@angular/core': 22.0.0-next.9 - '@angular/platform-browser': 22.0.0-next.9 + '@angular/common': 22.0.0-next.10 + '@angular/core': 22.0.0-next.10 + '@angular/platform-browser': 22.0.0-next.10 rxjs: ^6.5.3 || ^7.4.0 - '@angular/service-worker@22.0.0-next.9': - resolution: {integrity: sha512-gf+vb4mUQ8YDRekKldbxyDWznNiqNzxWz4K0ecuLauS6yKiOmJeD467V5/UjwT5SN3I68Jw3rJNi/hO8VrepGg==} + '@angular/service-worker@22.0.0-next.10': + resolution: {integrity: sha512-E72wxCjc/Oha0t0paXIjDUqfuak8ZMglmx7pCmZC50/84Nu1BkZ/d542nAAyVDVfiQl4wZWTBpD2DoHc7KWe+g==} engines: {node: ^22.22.0 || >=24.13.1} hasBin: true peerDependencies: - '@angular/core': 22.0.0-next.9 + '@angular/core': 22.0.0-next.10 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@5.1.11': @@ -8150,6 +8150,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: @@ -8668,29 +8669,29 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))': dependencies: - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - '@angular/cdk@22.0.0-next.7(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/cdk@22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) parse5: 8.0.1 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2)': + '@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2)': dependencies: - '@angular/compiler': 22.0.0-next.9 + '@angular/compiler': 22.0.0-next.10 '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -8704,31 +8705,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@22.0.0-next.9': + '@angular/compiler@22.0.0-next.10': dependencies: tslib: 2.8.1 - '@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)': + '@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 22.0.0-next.9 + '@angular/compiler': 22.0.0-next.10 zone.js: 0.16.1 - '@angular/forms@22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/forms@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 + zod: 4.3.6 - '@angular/localize@22.0.0-next.9(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(@angular/compiler@22.0.0-next.9)': + '@angular/localize@22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(@angular/compiler@22.0.0-next.10)': dependencies: - '@angular/compiler': 22.0.0-next.9 - '@angular/compiler-cli': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) + '@angular/compiler': 22.0.0-next.10 + '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.16 @@ -8736,17 +8738,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@22.0.0-next.7(6a2dec2de4ee360a8b26fca2cd020273)': + '@angular/material@22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133)': dependencies: - '@angular/cdk': 22.0.0-next.7(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/cdk': 22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/forms': 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ab3557efa43d75ac873b8a6d94683b33bf18ca0f(@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/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))': dependencies: '@actions/core': 3.0.1 '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) @@ -8796,7 +8798,7 @@ snapshots: 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 @@ -8806,35 +8808,35 @@ snapshots: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' - '@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))': dependencies: - '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/animations': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) - '@angular/platform-server@22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.9)(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/platform-server@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/compiler': 22.0.0-next.9 - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/compiler': 22.0.0-next.10 + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 xhr2: 0.2.1 - '@angular/router@22.0.0-next.9(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/router@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.9(@angular/animations@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/service-worker@22.0.0-next.9(@angular/core@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/service-worker@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 @@ -15111,10 +15113,10 @@ snapshots: netmask@2.1.1: {} - ng-packagr@22.0.0-next.3(@angular/compiler-cli@22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2): + ng-packagr@22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 22.0.0-next.9(@angular/compiler@22.0.0-next.9)(typescript@6.0.2) + '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) '@rollup/plugin-json': 6.1.0(rollup@4.60.2) '@rollup/wasm-node': 4.60.2 ajv: 8.18.0 diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 633185f70d14..c1d6189144c0 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#d2c951a843879c4c8645ec65dae97b9ad0216571", - "@angular/cdk": "github:angular/cdk-builds#524447197c5fb93c537227bc770408fcf7425d4e", - "@angular/common": "github:angular/common-builds#74c4e329c9cc3c9431b1bc8fdd8256df0af774f5", - "@angular/compiler": "github:angular/compiler-builds#ee1d0722e9f0634fa791d80f252b4c3cb7f6bbd6", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#4a0e399388c13c1d3becd8a6e9f7d676224e478e", - "@angular/core": "github:angular/core-builds#80004395a88e8d814691bac88a19fcd3aba1cbeb", - "@angular/forms": "github:angular/forms-builds#4ccb840e0687fd73464f100f3217eaa4b85c1bda", - "@angular/language-service": "github:angular/language-service-builds#4d4a33bd75ea5820b158d9c3cd2a176dab3d46b5", - "@angular/localize": "github:angular/localize-builds#af669bcc28bd8c53a389603cdf971945a214c2b2", - "@angular/material": "github:angular/material-builds#54fb44530909f1869a32f234a901eaf59898d9c7", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#f1c74db096c95483c22ba506a1912e78be142899", - "@angular/platform-browser": "github:angular/platform-browser-builds#38dc36e2a70eb99388560c77e951fd78f3631b74", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#70b7d84c5e125a76bcf88d2e3d8ee18dbe03e513", - "@angular/platform-server": "github:angular/platform-server-builds#4f2cdbe4e3434d31d4809dab01c35da094fead1e", - "@angular/router": "github:angular/router-builds#1f379a2e48335bb737870f1f7bbd2beac1d6a66b", - "@angular/service-worker": "github:angular/service-worker-builds#842cee8a7d01d85c5d120a2d59347a9fc072c066" + "@angular/animations": "github:angular/animations-builds#821ffa82641e246b0baa1ab046513799138d846d", + "@angular/cdk": "github:angular/cdk-builds#b65c2c281813d435d47d6230830b5a72920d96f3", + "@angular/common": "github:angular/common-builds#a2850aa26dfd485414e26e23248f9ef372644fab", + "@angular/compiler": "github:angular/compiler-builds#1c322b71955720e4246ca3521d46633b5d051301", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#bbd92190d2c3f37a78f8d00612291f515188f4b9", + "@angular/core": "github:angular/core-builds#1b44fb74f2b0a8f4290f52a724a943a838e67297", + "@angular/forms": "github:angular/forms-builds#25ccc09b2b712d3f46baf6475abd673636b2da3b", + "@angular/language-service": "github:angular/language-service-builds#e79aacae8987e1c9af851e2132a7b8803b3cb8fe", + "@angular/localize": "github:angular/localize-builds#ccf82a047c50b57c06802a5b1151c8f94bcb495b", + "@angular/material": "github:angular/material-builds#75aadc377e1423d03a2ad241271b0c07458d4e9c", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#428852cb107f39c836c1f7664f4d4090bc8daec5", + "@angular/platform-browser": "github:angular/platform-browser-builds#37dd76084b6d7257bcba06ed2dc894781da4b03b", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#66883f22b822d8881ca1cf8b43883c8173f78ad7", + "@angular/platform-server": "github:angular/platform-server-builds#9ad543d82b0ecc0ad4b2908cefdaed7c88428163", + "@angular/router": "github:angular/router-builds#eea623bd8c8a90821af6a634ee95b1a72ac5afbb", + "@angular/service-worker": "github:angular/service-worker-builds#78ee1b4608c515004e5f217d16d0a2fceb9f2991" } } From 2423cd5a144a064d6f619f79add46f35f84497bc Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 30 Apr 2026 15:58:18 +0000 Subject: [PATCH 21/82] build: update dependency typescript to v6.0.3 See associated pull request for more information. --- MODULE.bazel | 4 +- MODULE.bazel.lock | 6 +- package.json | 2 +- packages/ngtools/webpack/package.json | 2 +- pnpm-lock.yaml | 139 ++++++++++++-------------- 5 files changed, 73 insertions(+), 80 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 48a58aad6a44..c0a6891b2da0 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -168,8 +168,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 2cc7894611e6..6735c729083a 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -429,7 +429,7 @@ "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { "bzlTransitiveDigest": "dhTbv9E6UfT1WJmmu3ORRPO6AKFJvgBjBxu+BO+u1RY=", - "usagesDigest": "HRb2f7bITsAYryQClLOB8GSzqqQT63B6u1BY+z/wpFU=", + "usagesDigest": "QQqokxpCVnBJntX7dhxnf/c13LeWUQxDTUnILYCp4Jc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -437,8 +437,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" ] diff --git a/package.json b/package.json index 55361ed5c7a0..a52a7ff7891c 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular/compiler-cli": "22.0.0-next.10", - "typescript": "6.0.2" + "typescript": "6.0.3" }, "devDependencies": { "@angular/animations": "22.0.0-next.10", diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index da1a83caad06..00924ddef652 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -29,7 +29,7 @@ "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", "@angular/compiler": "22.0.0-next.10", "@angular/compiler-cli": "22.0.0-next.10", - "typescript": "6.0.2", + "typescript": "6.0.3", "webpack": "5.106.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c49c0a905045..17d25543090a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,10 +15,10 @@ importers: dependencies: '@angular/compiler-cli': specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) + version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(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 @@ -45,7 +45,7 @@ importers: version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/localize': specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(@angular/compiler@22.0.0-next.10) + version: 22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10) '@angular/material': specifier: 22.0.0-next.7 version: 22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133) @@ -174,10 +174,10 @@ importers: 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) + version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(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) + version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) ajv: specifier: 8.18.0 version: 8.18.0 @@ -198,7 +198,7 @@ importers: version: 10.1.8(eslint@10.2.1(jiti@2.6.1)) 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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)) express: specifier: 5.2.1 version: 5.2.1 @@ -258,7 +258,7 @@ importers: 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) + version: 24.41.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) @@ -270,7 +270,7 @@ importers: 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.2)(typescript@6.0.3) rollup-plugin-sourcemaps2: specifier: 0.5.6 version: 0.5.6(@types/node@22.19.17)(rollup@4.60.2) @@ -327,7 +327,7 @@ importers: version: 29.0.2 ng-packagr: specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) rxjs: specifier: 7.8.2 version: 7.8.2 @@ -430,7 +430,7 @@ importers: version: 4.6.4 ng-packagr: specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) postcss: specifier: 8.5.10 version: 8.5.10 @@ -675,7 +675,7 @@ importers: version: 8.5.10 postcss-loader: specifier: 8.2.1 - version: 8.2.1(postcss@8.5.10)(typescript@6.0.2)(webpack@5.106.2(esbuild@0.28.0)) + version: 8.2.1(postcss@8.5.10)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -730,7 +730,7 @@ importers: version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2) + version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) undici: specifier: 8.1.0 version: 8.1.0 @@ -826,10 +826,10 @@ importers: version: 22.0.0-next.10 '@angular/compiler-cli': specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) + version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(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) @@ -8038,11 +8038,6 @@ packages: typed-query-selector@2.12.2: resolution: {integrity: sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==} - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -8689,7 +8684,7 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2)': + '@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3)': dependencies: '@angular/compiler': 22.0.0-next.10 '@babel/core': 7.29.0 @@ -8701,7 +8696,7 @@ snapshots: tslib: 2.8.1 yargs: 18.0.0 optionalDependencies: - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8727,10 +8722,10 @@ snapshots: tslib: 2.8.1 zod: 4.3.6 - '@angular/localize@22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(@angular/compiler@22.0.0-next.10)': + '@angular/localize@22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10)': dependencies: '@angular/compiler': 22.0.0-next.10 - '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) + '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.16 @@ -11676,40 +11671,40 @@ snapshots: '@types/node': 22.19.17 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.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(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/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) '@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/type-utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.2 eslint: 10.2.1(jiti@2.6.1) 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.58.2(eslint@10.2.1(jiti@2.6.1))(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/typescript-estree': 8.58.2(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3(supports-color@10.2.2) eslint: 10.2.1(jiti@2.6.1) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': + '@typescript-eslint/project-service@8.58.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) '@typescript-eslint/types': 8.58.2 debug: 4.4.3(supports-color@10.2.2) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -11718,19 +11713,19 @@ snapshots: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/visitor-keys': 8.58.2 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.58.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.58.2(eslint@10.2.1(jiti@2.6.1))(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/typescript-estree': 8.58.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(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 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -11738,29 +11733,29 @@ snapshots: '@typescript-eslint/types@8.59.0': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.58.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/project-service': 8.58.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) '@typescript-eslint/types': 8.58.2 '@typescript-eslint/visitor-keys': 8.58.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.58.2(eslint@10.2.1(jiti@2.6.1))(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) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) eslint: 10.2.1(jiti@2.6.1) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -12859,14 +12854,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.1(typescript@6.0.2): + cosmiconfig@9.0.1(typescript@6.0.3): 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 + typescript: 6.0.3 cross-fetch@4.1.0(encoding@0.1.13): dependencies: @@ -13367,17 +13362,17 @@ snapshots: 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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.2.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) eslint: 10.2.1(jiti@2.6.1) 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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13388,7 +13383,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.2.1(jiti@2.6.1) 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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.2.1(jiti@2.6.1)) hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13400,7 +13395,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.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -15113,10 +15108,10 @@ snapshots: netmask@2.1.1: {} - ng-packagr@22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2))(tslib@2.8.1)(typescript@6.0.2): + ng-packagr@22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.2) + '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) '@rollup/plugin-json': 6.1.0(rollup@4.60.2) '@rollup/wasm-node': 4.60.2 ajv: 8.18.0 @@ -15132,12 +15127,12 @@ snapshots: ora: 9.3.0 piscina: 5.1.4 postcss: 8.5.10 - rollup-plugin-dts: 6.4.1(rollup@4.60.2)(typescript@6.0.2) + rollup-plugin-dts: 6.4.1(rollup@4.60.2)(typescript@6.0.3) rxjs: 7.8.2 sass: 1.99.0 tinyglobby: 0.2.16 tslib: 2.8.1 - typescript: 6.0.2 + typescript: 6.0.3 optionalDependencies: rollup: 4.60.2 @@ -15586,9 +15581,9 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.1(postcss@8.5.10)(typescript@6.0.2)(webpack@5.106.2(esbuild@0.28.0)): + postcss-loader@8.2.1(postcss@8.5.10)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)): dependencies: - cosmiconfig: 9.0.1(typescript@6.0.2) + cosmiconfig: 9.0.1(typescript@6.0.3) jiti: 2.6.1 postcss: 8.5.10 semver: 7.7.4 @@ -15736,11 +15731,11 @@ 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.41.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) + cosmiconfig: 9.0.1(typescript@6.0.3) 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.2 @@ -15998,14 +15993,14 @@ 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.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 - typescript: 6.0.2 + typescript: 6.0.3 optionalDependencies: '@babel/code-frame': 7.29.0 @@ -16749,9 +16744,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: @@ -16847,8 +16842,6 @@ snapshots: typed-query-selector@2.12.2: {} - typescript@6.0.2: {} - typescript@6.0.3: {} ua-parser-js@0.7.41: {} From 4f2250cc75b653c1b957f6637c3f0759cb08e91c Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 30 Apr 2026 15:59:00 +0000 Subject: [PATCH 22/82] build: update bazel dependencies See associated pull request for more information. --- MODULE.bazel | 4 ++-- MODULE.bazel.lock | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index c0a6891b2da0..910a6476e50b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,9 +10,9 @@ 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") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 6735c729083a..41b64246a13a 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -44,7 +44,8 @@ "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", @@ -63,6 +64,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", @@ -122,8 +124,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", @@ -213,7 +215,7 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "3l5lERuIkp41OnB+ZcMQkXS5ttpwE3LfWmePbmwDofk=", + "bzlTransitiveDigest": "RJZEFwxTtTSj8BUT6RYAEkcq8BHH9IVPJ//T0MDu3sA=", "usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -2187,7 +2189,7 @@ }, "@@rules_python+//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "WViZ5k1A9F8R5wfEe2ArLMFS1g9UmgfbS8Q/7q1/z7o=", + "bzlTransitiveDigest": "gnOBzUu2hbOMXwy32CnPKpNrOsOEirGIas2EVtC8diM=", "usagesDigest": "AK1R124YPWwAs8z1CQYyjYuci8RO5Ofot+EP5ZCNQDc=", "recordedFileInputs": { "@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", From 3ddf7965da2a83087480c7eecb7353b09a9de43e Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 1 May 2026 12:08:31 +0000 Subject: [PATCH 23/82] build: update cross-repo angular dependencies See associated pull request for more information. --- tests/e2e/ng-snapshot/package.json | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index c1d6189144c0..4940441713ff 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#821ffa82641e246b0baa1ab046513799138d846d", - "@angular/cdk": "github:angular/cdk-builds#b65c2c281813d435d47d6230830b5a72920d96f3", - "@angular/common": "github:angular/common-builds#a2850aa26dfd485414e26e23248f9ef372644fab", - "@angular/compiler": "github:angular/compiler-builds#1c322b71955720e4246ca3521d46633b5d051301", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#bbd92190d2c3f37a78f8d00612291f515188f4b9", - "@angular/core": "github:angular/core-builds#1b44fb74f2b0a8f4290f52a724a943a838e67297", - "@angular/forms": "github:angular/forms-builds#25ccc09b2b712d3f46baf6475abd673636b2da3b", - "@angular/language-service": "github:angular/language-service-builds#e79aacae8987e1c9af851e2132a7b8803b3cb8fe", - "@angular/localize": "github:angular/localize-builds#ccf82a047c50b57c06802a5b1151c8f94bcb495b", - "@angular/material": "github:angular/material-builds#75aadc377e1423d03a2ad241271b0c07458d4e9c", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#428852cb107f39c836c1f7664f4d4090bc8daec5", - "@angular/platform-browser": "github:angular/platform-browser-builds#37dd76084b6d7257bcba06ed2dc894781da4b03b", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#66883f22b822d8881ca1cf8b43883c8173f78ad7", - "@angular/platform-server": "github:angular/platform-server-builds#9ad543d82b0ecc0ad4b2908cefdaed7c88428163", - "@angular/router": "github:angular/router-builds#eea623bd8c8a90821af6a634ee95b1a72ac5afbb", - "@angular/service-worker": "github:angular/service-worker-builds#78ee1b4608c515004e5f217d16d0a2fceb9f2991" + "@angular/animations": "github:angular/animations-builds#75b67fb20e34c1690a19a732b3106e8f7f454fc6", + "@angular/cdk": "github:angular/cdk-builds#c72d7297744f01f13435202e10764c11fb0fbb98", + "@angular/common": "github:angular/common-builds#504daec05383ce402fdae16ae19a46f8d155d256", + "@angular/compiler": "github:angular/compiler-builds#4e3014c69a825409e6a2c827ceb0f89dd8f9405a", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#88464c173ccd1562c3bdfa22cfc725de2f75f255", + "@angular/core": "github:angular/core-builds#d91229659aa8ac4e3964fdf7cbfaa27a50c95f54", + "@angular/forms": "github:angular/forms-builds#6aba91146ca0274ab19a0fece82cbee84320dfb1", + "@angular/language-service": "github:angular/language-service-builds#76ebde7592c9feaa7bc872d68a1739b21feeaba9", + "@angular/localize": "github:angular/localize-builds#0de5d9668a484206dd63cf46e66808c98880e4eb", + "@angular/material": "github:angular/material-builds#26d021024aa905c5d42a4cd9b67f757a71ed7e3c", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#35cb51e92f3e8990842eae2e1bded148c0c6b0af", + "@angular/platform-browser": "github:angular/platform-browser-builds#bde6d33678b0ebbecc1a913d10d78fde8b29e863", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#60a4602660f1d5531ea88aaf725c2dac5b5e5ca5", + "@angular/platform-server": "github:angular/platform-server-builds#40d7868dc10c1cf638a3e2ba900f56940e61fca3", + "@angular/router": "github:angular/router-builds#300fe35fbdab61f9032627faddc9e2bbe645e1bf", + "@angular/service-worker": "github:angular/service-worker-builds#87dd428569f12a519f7e89679173a25fca2e2779" } } From a5c1024d62b3df9ac55e787b91f70eb2fe3f753f Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:18:47 -0400 Subject: [PATCH 24/82] fix(@angular/build): use dynamic TestComponentRenderer for Vitest This commit implements a custom TestComponentRenderer in the virtual init-testbed.js file generated for Vitest. In Vitests non-isolated mode (isolate: false) with JSDOM, Vitest creates a fresh document for each spec file but reuses the module cache. The default Angular DOMTestComponentRenderer caches the document during initialization, leading to stale references and errors like setAttribute is not a function in subsequent tests. The new DynamicDOMTestComponentRenderer looks up the document dynamically on every operation, resolving the issue without requiring a breaking change to defaults or affecting browser-based testing. --- .../unit-test/runners/vitest/build-options.ts | 32 ++++++++++++++++++- tests/e2e/tests/vitest/larger-project.ts | 3 +- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts index 482878c520ca..34d65d3d418a 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/build-options.ts @@ -54,11 +54,15 @@ function createTestBedInitVirtualFile( }`; } + // The DynamicDOMTestComponentRenderer is used to avoid stale document references + // when running Vitest in non-isolated mode with JSDOM. It looks up the + // document dynamically on every operation instead of caching it. return ` // Initialize the Angular testing environment import { NgModule, provideZoneChangeDetection } from '@angular/core'; - import { getTestBed, ɵgetCleanupHook as getCleanupHook } from '@angular/core/testing'; + import { getTestBed, ɵgetCleanupHook as getCleanupHook, TestComponentRenderer } from '@angular/core/testing'; import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; + import { ɵgetDOM } from '@angular/common'; import { afterEach, beforeEach } from 'vitest'; ${providersImport} @@ -70,6 +74,31 @@ function createTestBedInitVirtualFile( beforeEach(getCleanupHook(false)); afterEach(getCleanupHook(true)); + class DynamicDOMTestComponentRenderer extends TestComponentRenderer { + insertRootElement(rootElId, tagName = 'div') { + this.removeAllRootElements(); + + const dom = ɵgetDOM(); + const doc = dom.getDefaultDocument(); + if (doc && doc.body) { + const rootElement = doc.createElement(tagName); + rootElement.setAttribute('id', rootElId); + doc.body.appendChild(rootElement); + } + } + + removeAllRootElements() { + const dom = ɵgetDOM(); + const doc = dom.getDefaultDocument(); + if (doc && typeof doc.querySelectorAll === 'function') { + const oldRoots = doc.querySelectorAll('[id^=root]'); + for (let i = 0; i < oldRoots.length; i++) { + dom.remove(oldRoots[i]); + } + } + } + } + const ANGULAR_TESTBED_SETUP = Symbol.for('@angular/cli/testbed-setup'); if (!globalThis[ANGULAR_TESTBED_SETUP]) { globalThis[ANGULAR_TESTBED_SETUP] = true; @@ -82,6 +111,7 @@ function createTestBedInitVirtualFile( providers: [ ...(typeof Zone !== 'undefined' ? [provideZoneChangeDetection()] : []), ...providers, + { provide: TestComponentRenderer, useClass: DynamicDOMTestComponentRenderer }, ], }) class TestModule {} 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; From d1348283136f8c5f210e90102aa3eccba3ed43ca Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:05:45 -0400 Subject: [PATCH 25/82] fix(@schematics/angular): defer karma config deletion in Karma to Vitest migration This commit resolves a race condition in the Karma-to-Vitest migration where shared configuration files were deleted prematurely within the schematic transaction. Previously, the routine erased the target file upon discovering it was identical to boilerplate, which blinded other referring projects to extraction metadata. The solution introduces analysis object caching so AST parsing occurs exactly once per discrete path. Deletion operations are deferred and batch-executed at the end of workspace processing. This mechanism guarantees continuous readability across iterating dependencies and yields operational speed improvements via memoized checks. --- .../karma-processor.ts | 50 +++++++++------- .../migrate-karma-to-vitest/migration.ts | 13 +++- .../migrate-karma-to-vitest/migration_spec.ts | 60 +++++++++++++++++++ 3 files changed, 98 insertions(+), 25 deletions(-) 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..7c2d4924420e 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts @@ -14,14 +14,14 @@ 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[], @@ -122,7 +122,7 @@ async function processTestTargetOptions( function updateProjects(tree: Tree, context: SchematicContext): Rule { return updateWorkspace(async (workspace) => { let needsCoverage = false; - const removableKarmaConfigs = new Map(); + const removableKarmaConfigs = new Map(); const migratedProjects: string[] = []; const skippedNonApplications: string[] = []; const skippedMissingAppBuilder: string[] = []; @@ -235,6 +235,13 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { migratedProjects.push(projectName); } + // Perform cleanup of removable karma config files + for (const [configPath, result] of removableKarmaConfigs) { + if (result.isRemovable && tree.exists(configPath)) { + tree.delete(configPath); + } + } + // Log summary context.logger.info('\n--- Karma to Vitest Migration Summary ---'); context.logger.info(`Projects migrated: ${migratedProjects.length}`); 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..243835f99b91 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,61 @@ 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(); + }); }); From 4ff912521b996856babb5ccf7c968f76f80a48b5 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:12:43 -0400 Subject: [PATCH 26/82] refactor(@schematics/angular): support parsing plain template literals in karma config analyzer Updates the AST analyzer to accept static backtick strings that do not contain runtime expressions. Previously, even simple template literals resulted in a fallback warning flag, triggering manual migration overrides unnecessarily. --- .../karma-config-analyzer.ts | 3 +- .../karma-config-analyzer_spec.ts | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) 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); + }); }); From 3c617818d9772f8b095a007270c543406bc49bbc Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:25:59 -0400 Subject: [PATCH 27/82] feat(@schematics/angular): update TSConfig globals during karma to vitest migration Automates the transition of developer test configurations from Jasmine typing providers to Vitest globals definitions. The tool parses each collected tsconfig path and actively relocates 'vitest/globals' into the compiler options type list while removing the 'jasmine' package. --- .../migrate-karma-to-vitest/migration.ts | 54 +++++++++++++++++++ .../migrate-karma-to-vitest/migration_spec.ts | 22 ++++++++ 2 files changed, 76 insertions(+) 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 7c2d4924420e..ea4af6849860 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts @@ -8,8 +8,10 @@ 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'; @@ -119,11 +121,45 @@ async function processTestTargetOptions( return needsCoverage; } +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 updateProjects(tree: Tree, context: SchematicContext): Rule { return updateWorkspace(async (workspace) => { let needsCoverage = false; const removableKarmaConfigs = new Map(); const migratedProjects: string[] = []; + const tsConfigsToUpdate = new Set(); const skippedNonApplications: string[] = []; const skippedMissingAppBuilder: string[] = []; const manualMigrationFiles: string[] = []; @@ -169,6 +205,21 @@ 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> = {}; @@ -242,6 +293,9 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { } } + // Update TSConfig files to use Vitest types instead of Jasmine + updateTsConfigTypes(tree, tsConfigsToUpdate, context); + // Log summary context.logger.info('\n--- Karma to Vitest Migration Summary ---'); context.logger.info(`Projects migrated: ${migratedProjects.length}`); 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 243835f99b91..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 @@ -420,4 +420,26 @@ module.exports = function (config) { // 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'); + }); }); From 9ccb2771571553ad282e90fa37b6e76a52d057a3 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:33:50 -0400 Subject: [PATCH 28/82] feat(@schematics/angular): conditionally install istanbul coverage provider for Vitest migration Recognize non-Chromium browser usage during the Karma to Vitest migration. While Node-based and Chromium environments can leverage @vitest/coverage-v8, browser-based test runs using engines such as Firefox or WebKit natively necessitate istanbul instrumentation. --- .../migrate-karma-to-vitest/migration.ts | 114 +++++++++++++----- .../utility/latest-versions/package.json | 1 + 2 files changed, 82 insertions(+), 33 deletions(-) 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 ea4af6849860..7d2306428b32 100644 --- a/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts +++ b/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts @@ -27,8 +27,9 @@ async function processTestTargetOptions( 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]) { @@ -81,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 ` + @@ -118,7 +133,7 @@ async function processTestTargetOptions( delete options['main']; } - return needsCoverage; + return { needsCoverage, needsIstanbul }; } function updateTsConfigTypes( @@ -154,9 +169,49 @@ function updateTsConfigTypes( } } +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; + let needsIstanbul = false; const removableKarmaConfigs = new Map(); const migratedProjects: string[] = []; const tsConfigsToUpdate = new Set(); @@ -223,7 +278,7 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { // 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, @@ -234,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 @@ -297,36 +355,13 @@ function updateProjects(tree: Tree, context: SchematicContext): Rule { updateTsConfigTypes(tree, tsConfigsToUpdate, context); // 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}`, + logSummary( + context, + migratedProjects, + skippedNonApplications, + skippedMissingAppBuilder, + manualMigrationFiles, ); - 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'); if (migratedProjects.length > 0) { const rules = [ @@ -343,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/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", From 80945bf167f8ffd0bd248d23e77a6b73007d9358 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 4 May 2026 18:01:42 +0200 Subject: [PATCH 29/82] fix(@schematics/angular): use service decorator in ng generate Updates the `service` schematic in `ng generate` to use the `@Service` decorator instead of `@Injectable`. There's also a new `--injectable` flag to get back the old behavior. --- ...name@dasherize__.__type@dasherize__.ts.template | 6 +++--- packages/schematics/angular/service/index_spec.ts | 14 +++++++++++++- packages/schematics/angular/service/schema.json | 5 +++++ 3 files changed, 21 insertions(+), 4 deletions(-) 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"] From ca8407406c91f631b3e3366e4f06b68babe817b4 Mon Sep 17 00:00:00 2001 From: Younes Jaaidi Date: Tue, 17 Mar 2026 14:21:39 +0100 Subject: [PATCH 30/82] feat(@schematics/angular): migrate fake async to Vitest fake timers --- .../angular/refactor/jasmine-vitest/index.ts | 1 + .../refactor/jasmine-vitest/schema.json | 5 + .../test-file-transformer.integration_spec.ts | 64 ++++- .../jasmine-vitest/test-file-transformer.ts | 44 ++- .../test-file-transformer_add-imports_spec.ts | 28 ++ .../refactor/jasmine-vitest/test-helpers.ts | 1 + .../fake-async-flush-microtasks.ts | 38 +++ .../fake-async-flush-microtasks_spec.ts | 43 +++ .../transformers/fake-async-flush.ts | 60 +++++ .../transformers/fake-async-flush_spec.ts | 108 ++++++++ .../transformers/fake-async-test.ts | 211 +++++++++++++++ .../transformers/fake-async-test_spec.ts | 250 ++++++++++++++++++ .../transformers/fake-async-tick.ts | 41 +++ .../transformers/fake-async-tick_spec.ts | 65 +++++ .../transformers/jasmine-misc.ts | 16 +- .../transformers/jasmine-spy.ts | 25 +- .../jasmine-vitest/utils/ast-helpers.ts | 124 +++++++-- .../jasmine-vitest/utils/constants.ts | 9 + .../jasmine-vitest/utils/refactor-context.ts | 6 + .../jasmine-vitest/utils/refactor-helpers.ts | 65 +++++ .../jasmine-vitest/utils/todo-notes.ts | 7 + 21 files changed, 1165 insertions(+), 46 deletions(-) create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush-microtasks_spec.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-flush_spec.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test_spec.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-tick_spec.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/utils/constants.ts create mode 100644 packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-helpers.ts 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..016c8d9fe1d4 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', () => { + beforeAll(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterAll(() => { + 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..c835dc9640c5 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 { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; + + describe('My fakeAsync suite', () => { + beforeAll(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterAll(() => { + 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..ea2a2ef52cb5 --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test.ts @@ -0,0 +1,211 @@ +/** + * @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\`.`, + ); + + return ts.factory.createArrowFunction( + [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)], + fakeAsyncCallback.typeParameters, + fakeAsyncCallback.parameters, + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock(callbackBody.statements), + ); +} + +function _createFakeTimersHookStatements(ctx: RefactorContext): ts.Statement[] { + return [ + // > beforeAll(() => { + // > vi.useFakeTimers({ + // > advanceTimeDelta: 1, + // > shouldAdvanceTime: true + // > }); + // > }); + ts.factory.createExpressionStatement( + ts.factory.createCallExpression(ts.factory.createIdentifier('beforeAll'), 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, + ), + ), + ]), + ), + + // > afterAll(() => { + // > vi.useRealTimers(); + // > }); + ts.factory.createExpressionStatement( + ts.factory.createCallExpression(ts.factory.createIdentifier('afterAll'), undefined, [ + ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createBlock( + [ts.factory.createExpressionStatement(createViCallExpression(ctx, 'useRealTimers'))], + true, + ), + ), + ]), + ), + ]; +} + +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..5efb23282f5a --- /dev/null +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test_spec.ts @@ -0,0 +1,250 @@ +/** + * @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', () => { + beforeAll(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterAll(() => { + 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', () => { + beforeAll(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterAll(() => { + 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', () => { + beforeAll(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterAll(() => { + 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', () => { + beforeAll(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterAll(() => { + vi.useRealTimers(); + }); + + describe('My inner fakeAsync suite', () => { + it('works', async () => { + expect(1).toBe(1); + }); + }); + }); + `, + }, + { + description: + 'should transform fakeAsync test to `vi.useFakeTimers()` in `beforeEach`, `afterEach`, `beforeAll`, `afterAll`', + input: ` + import { fakeAsync } from '@angular/core/testing'; + + describe('My fakeAsync suite', () => { + beforeAll(fakeAsync(() => { + console.log('beforeAll'); + })); + + afterAll(fakeAsync(() => { + console.log('afterAll'); + })); + + beforeEach(fakeAsync(() => { + console.log('beforeEach'); + })); + + afterEach(fakeAsync(() => { + console.log('afterEach'); + })); + }); + `, + expected: ` + describe('My fakeAsync suite', () => { + beforeAll(() => { + vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); + }); + afterAll(() => { + vi.useRealTimers(); + }); + beforeAll(async () => { + console.log('beforeAll'); + }); + + afterAll(async () => { + console.log('afterAll'); + }); + + beforeEach(async () => { + console.log('beforeEach'); + }); + + afterEach(async () => { + console.log('afterEach'); + }); + }); + `, + }, + { + 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); + })); + }); + `, + }, + ]; + + 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..543ba5a2daee 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( 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; /** From 84cf6db982d6b2855a3781adfe9417bdd0d60c41 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 4 May 2026 12:28:22 -0400 Subject: [PATCH 31/82] build: temporarily disable @typescript-eslint/no-unnecessary-type-assertion Disables the unnecessary type assertion lint rule across the repository to accommodate an upcoming typescript-eslint upgrade. The updated version introduces rule modifications that generate a significant volume of validation failures, which would block the upgrade process. Temporarily disabling the rule provides a path forward for the version bump, after which the codebase can be audited and the rule can be re-enabled incrementally. --- eslint.config.mjs | 1 + 1 file changed, 1 insertion(+) 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', }, }, { From a4e2f8855e2f53ad666c8b8b4b7959f593f1530b Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 4 May 2026 22:41:22 +0000 Subject: [PATCH 32/82] build: update all non-major dependencies See associated pull request for more information. --- modules/testing/builder/package.json | 6 +- package.json | 14 +- packages/angular/build/package.json | 8 +- packages/angular/cli/package.json | 4 +- .../angular_devkit/build_angular/package.json | 12 +- packages/angular_devkit/core/package.json | 2 +- .../angular_devkit/schematics/package.json | 2 +- pnpm-lock.yaml | 1010 +++++++++-------- tests/package.json | 2 +- 9 files changed, 557 insertions(+), 503 deletions(-) diff --git a/modules/testing/builder/package.json b/modules/testing/builder/package.json index 9ffae1c74f5f..705e97cb7ea8 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", + "jsdom": "29.1.1", "ng-packagr": "22.0.0-next.3", "rxjs": "7.8.2", - "vitest": "4.1.4" + "vitest": "4.1.5" } } diff --git a/package.json b/package.json index a52a7ff7891c..d41bfe9d82ae 100644 --- a/package.json +++ b/package.json @@ -95,18 +95,18 @@ "@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.1", + "@typescript-eslint/parser": "8.59.1", + "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", "husky": "9.1.7", @@ -123,7 +123,7 @@ "lodash": "^4.17.21", "magic-string": "0.30.21", "prettier": "^3.0.0", - "puppeteer": "24.41.0", + "puppeteer": "24.42.0", "quicktype-core": "23.2.6", "rollup": "4.60.2", "rollup-license-plugin": "~3.2.0", @@ -132,7 +132,7 @@ "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..9aa419021594 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -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", + "postcss": "8.5.13", + "rolldown": "1.0.0-rc.18", "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/cli/package.json b/packages/angular/cli/package.json index ef2a02c53a7c..bc41c868bc88 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -30,7 +30,7 @@ "@modelcontextprotocol/sdk": "1.29.0", "@schematics/angular": "workspace:0.0.0-PLACEHOLDER", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.50.2", + "algoliasearch": "5.52.0", "ini": "6.0.0", "jsonc-parser": "3.3.1", "listr2": "10.2.1", @@ -39,7 +39,7 @@ "parse5-html-rewriting-stream": "8.0.1", "semver": "7.7.4", "yargs": "18.0.0", - "zod": "4.3.6" + "zod": "4.4.2" }, "ng-update": { "migrations": "@schematics/angular/migrations/migration-collection.json", diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index 5529d776e5d1..f50208e0e73f 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -18,9 +18,9 @@ "@babel/plugin-transform-async-generator-functions": "7.29.0", "@babel/plugin-transform-async-to-generator": "7.28.6", "@babel/plugin-transform-runtime": "7.29.0", - "@babel/preset-env": "7.29.2", + "@babel/preset-env": "7.29.3", "@babel/runtime": "7.29.2", - "@discoveryjs/json-ext": "1.0.0", + "@discoveryjs/json-ext": "1.1.0", "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER", "ansi-colors": "4.1.3", "autoprefixer": "10.5.0", @@ -39,10 +39,10 @@ "loader-utils": "3.3.1", "mini-css-extract-plugin": "2.10.2", "open": "11.0.0", - "ora": "9.3.0", + "ora": "9.4.0", "picomatch": "4.0.4", "piscina": "5.1.4", - "postcss": "8.5.10", + "postcss": "8.5.13", "postcss-loader": "8.2.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", @@ -51,7 +51,7 @@ "semver": "7.7.4", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.46.1", + "terser": "5.46.2", "tinyglobby": "0.2.16", "tslib": "2.8.1", "webpack": "5.106.2", @@ -67,7 +67,7 @@ "@angular/ssr": "workspace:*", "browser-sync": "3.0.4", "ng-packagr": "22.0.0-next.3", - "undici": "8.1.0" + "undici": "8.2.0" }, "peerDependencies": { "@angular/compiler-cli": "0.0.0-ANGULAR-FW-PEER-DEP", 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/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/pnpm-lock.yaml b/pnpm-lock.yaml index 17d25543090a..2d5b179409d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,7 +51,7 @@ importers: version: 22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133) '@angular/ng-dev': specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904 - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)) + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)) '@angular/platform-browser': specifier: 22.0.0-next.10 version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) @@ -78,13 +78,13 @@ 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.6.1)) '@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.6.1)) '@rollup/plugin-alias': specifier: ^6.0.0 version: 6.0.0(rollup@4.60.2) @@ -102,10 +102,10 @@ importers: version: 4.60.2 '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.10.0(eslint@10.2.1(jiti@2.6.1)) + version: 5.10.0(eslint@10.3.0(jiti@2.6.1)) '@tony.ganchev/eslint-plugin-header': specifier: ~3.4.0 - version: 3.4.4(eslint@10.2.1(jiti@2.6.1)) + version: 3.4.4(eslint@10.3.0(jiti@2.6.1)) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -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.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + specifier: 8.59.1 + version: 8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/parser': - specifier: 8.58.2 - version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + specifier: 8.59.1 + version: 8.59.1(eslint@10.3.0(jiti@2.6.1))(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.6.1) 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.6.1)) 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.3))(eslint@10.2.1(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)) express: specifier: 5.2.1 version: 5.2.1 @@ -206,8 +206,8 @@ 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) @@ -257,8 +257,8 @@ 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.3)(utf-8-validate@6.0.6) + specifier: 24.42.0 + version: 24.42.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) @@ -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 @@ -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,8 +323,8 @@ 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.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) @@ -332,8 +332,8 @@ importers: 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.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) 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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) beasties: specifier: 0.4.2 version: 0.4.2 @@ -408,7 +408,7 @@ importers: 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) + version: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) watchpack: specifier: 2.5.1 version: 2.5.1 @@ -423,8 +423,8 @@ 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 @@ -432,17 +432,17 @@ importers: specifier: 22.0.0-next.3 version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) postcss: - specifier: 8.5.10 - version: 8.5.10 + specifier: 8.5.13 + version: 8.5.13 rolldown: - specifier: 1.0.0-rc.16 - version: 1.0.0-rc.16 + specifier: 1.0.0-rc.18 + version: 1.0.0-rc.18 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.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) 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.2) '@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.0 + version: 5.52.0 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.2 + version: 4.4.2 packages/angular/pwa: dependencies: @@ -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.3 + version: 7.29.3(@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,7 +615,7 @@ 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.13) babel-loader: specifier: 10.1.1 version: 10.1.1(@babel/core@7.29.0)(webpack@5.106.2(esbuild@0.28.0)) @@ -662,8 +662,8 @@ importers: 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.13 + version: 8.5.13 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.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -698,8 +698,8 @@ importers: specifier: 0.5.21 version: 0.5.21 terser: - specifier: 5.46.1 - version: 5.46.1 + specifier: 5.46.2 + version: 5.46.2 tinyglobby: specifier: 0.2.16 version: 0.2.16 @@ -732,8 +732,8 @@ importers: specifier: 22.0.0-next.3 version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) 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 @@ -858,8 +858,8 @@ 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: @@ -875,60 +875,60 @@ packages: '@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.0': + resolution: {integrity: sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==} engines: {node: '>= 14.0.0'} - '@algolia/client-abtesting@5.50.2': - resolution: {integrity: sha512-52iq0vHy1sphgnwoZyx5PmbEt8hsh+m7jD123LmBs6qy4GK7LbYZIeKd+nSnSipN2zvKRZ2zScS6h9PW3J7SXg==} + '@algolia/client-abtesting@5.52.0': + resolution: {integrity: sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.50.2': - resolution: {integrity: sha512-WpPIUg+cSG2aPUG0gS8Ko9DwRgbRPUZxJkolhL2aCsmSlcEEZT65dILrfg5ovcxtx0Kvr+xtBVsTMtsQWRtPDQ==} + '@algolia/client-analytics@5.52.0': + resolution: {integrity: sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.50.2': - resolution: {integrity: sha512-Gj2MgtArGcsr82kIqRlo6/dCAFjrs2gLByEqyRENuT7ugrSMFuqg1vDzeBjRL1t3EJEJCFtT0PLX3gB8A6Hq4Q==} + '@algolia/client-common@5.52.0': + resolution: {integrity: sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.50.2': - resolution: {integrity: sha512-CUqoid5jDpmrc0oK3/xuZXFt6kwT0P9Lw7/nsM14YTr6puvmi+OUKmURpmebQF22S2vCG8L1DAoXXujxQUi/ug==} + '@algolia/client-insights@5.52.0': + resolution: {integrity: sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.50.2': - resolution: {integrity: sha512-AndZWFoc0gbP5901OeQJ73BazgGgSGiBEba4ohdoJuZwHTO2Gio8Q4L1VLmytMBYcviVigB0iICToMvEJxI4ug==} + '@algolia/client-personalization@5.52.0': + resolution: {integrity: sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==} 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.0': + resolution: {integrity: sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.50.2': - resolution: {integrity: sha512-ypSboUJ3XJoQz5DeDo82hCnrRuwq3q9ZdFhVKAik9TnZh1DvLqoQsrbBjXg7C7zQOtV/Qbge/HmyoV6V5L7MhQ==} + '@algolia/client-search@5.52.0': + resolution: {integrity: sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.50.2': - resolution: {integrity: sha512-VlR2FRXLw2bCB94SQo6zxg/Qi+547aOji6Pb+dKE7h1DMCCY317St+OpjpmgzE+bT2O9ALIc0V4nVIBOd7Gy+Q==} + '@algolia/ingestion@1.52.0': + resolution: {integrity: sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.50.2': - resolution: {integrity: sha512-Cmvfp2+qopzQt8OilU97rhLhosq7ZrB6uieok3EwFUqG/aalPg6DgfCmu0yJMrYe+KMC1qRVt1MTRAUwLknUMQ==} + '@algolia/monitoring@1.52.0': + resolution: {integrity: sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.50.2': - resolution: {integrity: sha512-jrkuyKoOM7dFWQ/6Y4hQAse2SC3L/RldG6GnPjMvAj65h+7Ubb51S0pKk4ofSStF0xm4LCNe0C4T6XX4nOFDiQ==} + '@algolia/recommend@5.52.0': + resolution: {integrity: sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.50.2': - resolution: {integrity: sha512-4107YLJqCudPiBUlwnk6oTSUVwU7ab+qL1SfQGEDYI8DZH5gsf1ekPt9JykXRKYXf2IfouFL5GiCY/PHTFIjYw==} + '@algolia/requester-browser-xhr@5.52.0': + resolution: {integrity: sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.50.2': - resolution: {integrity: sha512-vOrd3MQpLgmf6wXAueTuZ/cA0W4uRwIHHaxNy3h+a6YcNn6bCV/gFdZuv3F13v593zRU2k5R75NmvRWLenvMrw==} + '@algolia/requester-fetch@5.52.0': + resolution: {integrity: sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==} 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.0': + resolution: {integrity: sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': @@ -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': @@ -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'} @@ -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.3': + resolution: {integrity: sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==} 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==} @@ -2997,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.128.0': + resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -3184,103 +3190,103 @@ packages: 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-rc.18': + resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} 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-rc.18': + resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} 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-rc.18': + resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} 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-rc.18': + resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} 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-rc.18': + resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} 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-rc.18': + resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} 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-rc.18': + resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} 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-rc.18': + resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} 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-rc.18': + resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} 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-rc.18': + resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} 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-rc.18': + resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} 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-rc.18': + resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} 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-rc.18': + resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} 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-rc.18': + resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} 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-rc.18': + resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} 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-rc.18': + resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -3766,67 +3772,67 @@ 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.1': + resolution: {integrity: sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.59.1 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.1': + resolution: {integrity: sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==} 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.1': + resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} 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.1': + resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} 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.1': + resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} 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.1': + resolution: {integrity: sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==} 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==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.59.0': resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} 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/types@8.59.1': + resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.59.1': + resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 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.1': + resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} 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.1': + resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@verdaccio/auth@8.0.0-next-8.37': @@ -3922,20 +3928,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 @@ -3945,20 +3951,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==} @@ -4095,8 +4101,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.0: + resolution: {integrity: sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w==} engines: {node: '>= 14.0.0'} ansi-colors@4.1.3: @@ -5171,8 +5180,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: @@ -5564,8 +5573,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: @@ -6134,8 +6143,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 @@ -6843,6 +6852,10 @@ packages: resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} engines: {node: '>=20'} + ora@9.4.0: + resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} + engines: {node: '>=20'} + ordered-binary@1.6.1: resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} @@ -7097,6 +7110,10 @@ packages: resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.13: + resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} + engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} @@ -7173,12 +7190,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.42.0: + resolution: {integrity: sha512-T4zXokk/izH01fYPhyyev1A4piWiOKrYq7CUFpdoYQxmOnXoV6YjUabmfIjCYkNspSoAXIxRid3Tw+Vg0fthYg==} engines: {node: '>=18'} - puppeteer@24.41.0: - resolution: {integrity: sha512-W6Fk0J3TPjjtwjXOyR/qf+YaL0H/Uq8HIgHcXG4mNM/IgbKMCH/HPyK0Fi2qbTU/QpSl9bCte2yBpGHKejTpIw==} + puppeteer@24.42.0: + resolution: {integrity: sha512-94MoPfFp2eY3eYIMdINkez4IOP5TMHntlZbVx06fHlQTtiQiYgaY0L2Zzfod8PVUkPqP7m3Qlre2v8YS8cudPA==} engines: {node: '>=18'} hasBin: true @@ -7359,8 +7376,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-rc.18: + resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7832,8 +7849,8 @@ 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==} @@ -7862,8 +7879,8 @@ packages: uglify-js: optional: true - terser@5.46.1: - resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} + terser@5.46.2: + resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} engines: {node: '>=10'} hasBin: true @@ -8074,8 +8091,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: @@ -8221,20 +8238,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: @@ -8551,8 +8568,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.2: + resolution: {integrity: sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==} zone.js@0.16.1: resolution: {integrity: sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==} @@ -8575,89 +8592,89 @@ snapshots: '@actions/io@3.0.2': {} - '@algolia/abtesting@1.16.2': + '@algolia/abtesting@1.18.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/client-abtesting@5.50.2': + '@algolia/client-abtesting@5.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/client-analytics@5.50.2': + '@algolia/client-analytics@5.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/client-common@5.50.2': {} + '@algolia/client-common@5.52.0': {} - '@algolia/client-insights@5.50.2': + '@algolia/client-insights@5.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/client-personalization@5.50.2': + '@algolia/client-personalization@5.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/client-query-suggestions@5.50.2': + '@algolia/client-query-suggestions@5.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/client-search@5.50.2': + '@algolia/client-search@5.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/ingestion@1.50.2': + '@algolia/ingestion@1.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/monitoring@1.50.2': + '@algolia/monitoring@1.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/recommend@5.50.2': + '@algolia/recommend@5.52.0': 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.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 - '@algolia/requester-browser-xhr@5.50.2': + '@algolia/requester-browser-xhr@5.52.0': dependencies: - '@algolia/client-common': 5.50.2 + '@algolia/client-common': 5.52.0 - '@algolia/requester-fetch@5.50.2': + '@algolia/requester-fetch@5.52.0': dependencies: - '@algolia/client-common': 5.50.2 + '@algolia/client-common': 5.52.0 - '@algolia/requester-node-http@5.50.2': + '@algolia/requester-node-http@5.52.0': dependencies: - '@algolia/client-common': 5.50.2 + '@algolia/client-common': 5.52.0 '@ampproject/remapping@2.3.0': dependencies: @@ -8720,7 +8737,7 @@ snapshots: '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - zod: 4.3.6 + zod: 4.4.2 '@angular/localize@22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10)': dependencies: @@ -8743,12 +8760,12 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))': dependencies: '@actions/core': 3.0.1 '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@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) + '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) '@inquirer/prompts': 8.4.2(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) '@octokit/auth-app': 8.2.0 @@ -8798,7 +8815,7 @@ snapshots: which: 6.0.1 yaml: 2.8.3 yargs: 18.0.0 - zod: 4.3.6 + zod: 4.4.2 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' @@ -8861,7 +8878,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: @@ -8897,7 +8914,7 @@ 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 @@ -9035,6 +9052,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 @@ -9417,9 +9442,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.3(@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 @@ -9427,6 +9452,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) @@ -9593,15 +9619,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 @@ -9767,18 +9793,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.6.1))': dependencies: - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) 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.6.1))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) '@eslint/config-array@0.23.5': dependencies: @@ -9810,9 +9836,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.6.1))': optionalDependencies: - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) '@eslint/object-schema@3.0.5': {} @@ -10206,14 +10232,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.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': dependencies: google-auth-library: 10.6.2(supports-color@10.2.2) p-retry: 4.6.2 protobufjs: 7.5.5 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.2) transitivePeerDependencies: - bufferutil - supports-color @@ -10586,7 +10612,7 @@ 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.2)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.15) ajv: 8.18.0 @@ -10603,8 +10629,8 @@ snapshots: 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.2 + zod-to-json-schema: 3.25.2(zod@4.4.2) transitivePeerDependencies: - supports-color @@ -10707,10 +10733,10 @@ 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 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -10917,7 +10943,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.40.0': {} - '@oxc-project/types@0.126.0': {} + '@oxc-project/types@0.128.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -11133,56 +11159,56 @@ snapshots: - react-native-b4a - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.16': + '@rolldown/binding-android-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + '@rolldown/binding-darwin-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.16': + '@rolldown/binding-darwin-x64@1.0.0-rc.18': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + '@rolldown/binding-freebsd-x64@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': 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-rc.18': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': optional: true - '@rolldown/pluginutils@1.0.0-rc.16': {} + '@rolldown/pluginutils@1.0.0-rc.18': {} '@rollup/plugin-alias@6.0.0(rollup@4.60.2)': optionalDependencies: @@ -11351,11 +11377,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.6.1))': 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.6.1)) '@typescript-eslint/types': 8.59.0 - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -11365,9 +11391,9 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tony.ganchev/eslint-plugin-header@3.4.4(eslint@10.2.1(jiti@2.6.1))': + '@tony.ganchev/eslint-plugin-header@3.4.4(eslint@10.3.0(jiti@2.6.1))': dependencies: - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -11671,15 +11697,15 @@ snapshots: '@types/node': 22.19.17 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.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(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.3) - '@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.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.1(jiti@2.6.1) + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/type-utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.1 + eslint: 10.3.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -11687,58 +11713,58 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(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.3) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.1 debug: 4.4.3(supports-color@10.2.2) - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 debug: 4.4.3(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.59.1': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.1(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) debug: 4.4.3(supports-color@10.2.2) - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) 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.0': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3)': + '@typescript-eslint/types@8.59.1': {} + + '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/project-service': 8.59.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.7.4 @@ -11748,20 +11774,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': 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.3) - eslint: 10.2.1(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.59.1': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.1 eslint-visitor-keys: 5.0.1 '@verdaccio/auth@8.0.0-next-8.37': @@ -11942,14 +11968,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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': 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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) - '@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 @@ -11958,46 +11984,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.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) - '@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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': 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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) - '@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 @@ -12133,15 +12159,19 @@ snapshots: ajv-formats@2.1.1: dependencies: - ajv: 8.18.0 + ajv: 8.20.0 ajv-formats@3.0.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 - ajv-keywords@5.1.0(ajv@8.18.0): + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.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.15.0: @@ -12165,22 +12195,29 @@ snapshots: 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.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.52.0: + dependencies: + '@algolia/abtesting': 1.18.0 + '@algolia/client-abtesting': 5.52.0 + '@algolia/client-analytics': 5.52.0 + '@algolia/client-common': 5.52.0 + '@algolia/client-insights': 5.52.0 + '@algolia/client-personalization': 5.52.0 + '@algolia/client-query-suggestions': 5.52.0 + '@algolia/client-search': 5.52.0 + '@algolia/ingestion': 1.52.0 + '@algolia/monitoring': 1.52.0 + '@algolia/recommend': 5.52.0 + '@algolia/requester-browser-xhr': 5.52.0 + '@algolia/requester-fetch': 5.52.0 + '@algolia/requester-node-http': 5.52.0 ansi-colors@4.1.3: {} @@ -12305,13 +12342,13 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.5.0(postcss@8.5.10): + autoprefixer@10.5.0(postcss@8.5.13): dependencies: browserslist: 4.28.2 caniuse-lite: 1.0.30001791 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.10 + postcss: 8.5.13 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -12333,7 +12370,7 @@ snapshots: 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 @@ -12423,9 +12460,9 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.10 + postcss: 8.5.13 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.13) before-after-hook@4.0.0: {} @@ -12877,12 +12914,12 @@ snapshots: css-loader@7.1.4(webpack@5.106.2(esbuild@0.28.0)): 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.13) + postcss: 8.5.13 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.13) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.13) + postcss-modules-scope: 3.2.1(postcss@8.5.13) + postcss-modules-values: 4.0.0(postcss@8.5.13) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: @@ -13350,9 +13387,9 @@ 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.6.1)): dependencies: - eslint: 10.2.1(jiti@2.6.1) + eslint: 10.3.0(jiti@2.6.1) eslint-import-resolver-node@0.3.10: dependencies: @@ -13362,17 +13399,17 @@ snapshots: 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.3))(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.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3) - eslint: 10.2.1(jiti@2.6.1) + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + eslint: 10.3.0(jiti@2.6.1) 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.3))(eslint@10.2.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13381,9 +13418,9 @@ 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.6.1) 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.3))(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.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)) hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13395,7 +13432,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.3) + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -13419,9 +13456,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.1(jiti@2.6.1): + eslint@10.3.0(jiti@2.6.1): 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.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 @@ -13958,7 +13995,7 @@ snapshots: globals@14.0.0: {} - globals@17.5.0: {} + globals@17.6.0: {} globalthis@1.0.4: dependencies: @@ -14215,9 +14252,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.13): dependencies: - postcss: 8.5.10 + postcss: 8.5.13 idb@7.1.1: {} @@ -14552,7 +14589,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 @@ -15361,6 +15398,17 @@ snapshots: stdin-discarder: 0.3.2 string-width: 8.2.0 + ora@9.4.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.2 + string-width: 8.2.0 + ordered-binary@1.6.1: optional: true @@ -15581,11 +15629,11 @@ 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.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)): dependencies: cosmiconfig: 9.0.1(typescript@6.0.3) jiti: 2.6.1 - postcss: 8.5.10 + postcss: 8.5.13 semver: 7.7.4 optionalDependencies: webpack: 5.106.2(esbuild@0.28.0) @@ -15594,30 +15642,30 @@ snapshots: 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.13): dependencies: - postcss: 8.5.10 + postcss: 8.5.13 - postcss-modules-local-by-default@4.2.0(postcss@8.5.10): + postcss-modules-local-by-default@4.2.0(postcss@8.5.13): dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 + icss-utils: 5.1.0(postcss@8.5.13) + postcss: 8.5.13 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.13): dependencies: - postcss: 8.5.10 + postcss: 8.5.13 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.13): dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 + icss-utils: 5.1.0(postcss@8.5.13) + postcss: 8.5.13 - postcss-safe-parser@7.0.1(postcss@8.5.10): + postcss-safe-parser@7.0.1(postcss@8.5.13): dependencies: - postcss: 8.5.10 + postcss: 8.5.13 postcss-selector-parser@7.1.1: dependencies: @@ -15632,6 +15680,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.13: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + powershell-utils@0.1.0: {} prelude-ls@1.2.1: {} @@ -15714,7 +15768,7 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.41.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + puppeteer-core@24.42.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) @@ -15731,13 +15785,13 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.41.0(bufferutil@4.1.0)(typescript@6.0.3)(utf-8-validate@6.0.6): + puppeteer@24.42.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.3) devtools-protocol: 0.0.1595872 - puppeteer-core: 24.41.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + puppeteer-core: 24.42.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) typed-query-selector: 2.12.2 transitivePeerDependencies: - bare-abort-controller @@ -15909,7 +15963,7 @@ 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.13 source-map: 0.6.1 resolve@1.22.12: @@ -15965,26 +16019,26 @@ snapshots: dependencies: glob: 10.5.0 - rolldown@1.0.0-rc.16: + rolldown@1.0.0-rc.18: dependencies: - '@oxc-project/types': 0.126.0 - '@rolldown/pluginutils': 1.0.0-rc.16 + '@oxc-project/types': 0.128.0 + '@rolldown/pluginutils': 1.0.0-rc.18 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-rc.18 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 + '@rolldown/binding-darwin-x64': 1.0.0-rc.18 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 rollup-license-plugin@3.2.1: dependencies: @@ -16116,9 +16170,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: {} @@ -16594,7 +16648,7 @@ snapshots: 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 @@ -16612,7 +16666,7 @@ snapshots: - bare-abort-controller - react-native-b4a - tar-stream@3.1.8: + tar-stream@3.2.0: dependencies: b4a: 1.8.0 bare-fs: 4.7.1 @@ -16652,12 +16706,12 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.46.1 + terser: 5.46.2 webpack: 5.106.2(esbuild@0.28.0) optionalDependencies: esbuild: 0.28.0 - terser@5.46.1: + terser@5.46.2: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -16866,7 +16920,7 @@ snapshots: undici@7.25.0: {} - undici@8.1.0: {} + undici@8.2.0: {} unenv@1.10.0: dependencies: @@ -17010,12 +17064,12 @@ 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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.10 + postcss: 8.5.13 rollup: 4.60.2 tinyglobby: 0.2.16 optionalDependencies: @@ -17024,19 +17078,19 @@ snapshots: jiti: 2.6.1 less: 4.6.4 sass: 1.99.0 - terser: 5.46.1 + terser: 5.46.2 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): + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.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 + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) + '@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 @@ -17048,13 +17102,13 @@ snapshots: tinyexec: 1.1.1 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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) 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 @@ -17400,12 +17454,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.2): dependencies: - zod: 4.3.6 + zod: 4.4.2 zod@3.25.76: {} - zod@4.3.6: {} + zod@4.4.2: {} zone.js@0.16.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" } } From 15ae5f69d74e47dc2481c563ebff2574604c1697 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 4 May 2026 15:07:32 -0400 Subject: [PATCH 33/82] refactor(@angular/build): eliminate circular dependencies in bundler context Relocate foundational bundler file types and creation utilities to a new, standalone module to resolve multiple recursive dependencies centered around the utilities implementation. By decoupling the core output file definitions from the heavier build contexts, the overall module graph is streamlined, ensuring cleaner isolation and enabling the removal of several longstanding circular paths from the package golden file. --- goldens/circular-deps/packages.json | 31 +--- goldens/public-api/angular/build/index.api.md | 2 +- .../src/builders/application/build-action.ts | 2 +- .../builders/application/chunk-optimizer.ts | 10 +- .../src/builders/application/execute-build.ts | 7 +- .../application/execute-post-bundle.ts | 16 +- .../build/src/builders/application/i18n.ts | 2 +- .../build/src/builders/application/index.ts | 2 +- .../build/src/builders/application/results.ts | 2 +- .../build/src/builders/dev-server/internal.ts | 2 +- .../angular/build/src/builders/karma/utils.ts | 2 +- packages/angular/build/src/index.ts | 2 +- .../esbuild/angular/component-stylesheets.ts | 8 +- .../tools/esbuild/application-code-bundle.ts | 3 +- .../build/src/tools/esbuild/budget-stats.ts | 6 +- .../src/tools/esbuild/bundler-context.ts | 31 +--- .../tools/esbuild/bundler-execution-result.ts | 4 +- .../build/src/tools/esbuild/bundler-files.ts | 138 ++++++++++++++++++ .../build/src/tools/esbuild/i18n-inliner.ts | 3 +- .../src/tools/esbuild/index-html-generator.ts | 2 +- .../angular/build/src/tools/esbuild/utils.ts | 126 +--------------- .../src/utils/server-rendering/manifest.ts | 21 ++- .../src/utils/server-rendering/prerender.ts | 2 +- .../angular/build/src/utils/service-worker.ts | 2 +- .../angular/build/src/utils/test-files.ts | 2 +- 25 files changed, 202 insertions(+), 226 deletions(-) create mode 100644 packages/angular/build/src/tools/esbuild/bundler-files.ts 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/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 a7b7be1f208d..5935cfcc0615 100644 --- a/packages/angular/build/src/builders/application/execute-build.ts +++ b/packages/angular/build/src/builders/application/execute-build.ts @@ -10,12 +10,9 @@ 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'; 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/dev-server/internal.ts b/packages/angular/build/src/builders/dev-server/internal.ts index a0a6f2de57b4..4e5e97e5cf14 100644 --- a/packages/angular/build/src/builders/dev-server/internal.ts +++ b/packages/angular/build/src/builders/dev-server/internal.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -export { type BuildOutputFile, BuildOutputFileType } from '../../tools/esbuild/bundler-context'; +export { type BuildOutputFile, BuildOutputFileType } from '../../tools/esbuild/bundler-files'; export { createRxjsEsmResolutionPlugin } from '../../tools/esbuild/rxjs-esm-resolution-plugin'; export { JavaScriptTransformer } from '../../tools/esbuild/javascript-transformer'; export { getFeatureSupport, isZonelessApp } from '../../tools/esbuild/utils'; diff --git a/packages/angular/build/src/builders/karma/utils.ts b/packages/angular/build/src/builders/karma/utils.ts index 6ce8e33ed9aa..9a8aa749c269 100644 --- a/packages/angular/build/src/builders/karma/utils.ts +++ b/packages/angular/build/src/builders/karma/utils.ts @@ -8,7 +8,7 @@ import type { BuilderContext } from '@angular-devkit/architect'; import { createRequire } from 'node:module'; -import { BuildOutputFileType } from '../../tools/esbuild/bundler-context'; +import { BuildOutputFileType } from '../../tools/esbuild/bundler-files'; import { getProjectRootPaths } from '../../utils/project-metadata'; import { findTests, getTestEntrypoints } from './find-tests'; import type { NormalizedKarmaBuilderOptions } from './options'; diff --git a/packages/angular/build/src/index.ts b/packages/angular/build/src/index.ts index 2831f59a38f4..b6a547921db8 100644 --- a/packages/angular/build/src/index.ts +++ b/packages/angular/build/src/index.ts @@ -8,7 +8,7 @@ export { buildApplication, type ApplicationBuilderOptions } from './builders/application'; export type { ApplicationBuilderExtensions } from './builders/application/options'; -export { type BuildOutputFile, BuildOutputFileType } from './tools/esbuild/bundler-context'; +export { type BuildOutputFile, BuildOutputFileType } from './tools/esbuild/bundler-files'; export type { BuildOutputAsset } from './tools/esbuild/bundler-execution-result'; export { diff --git a/packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts b/packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts index b6670b3ab98a..0b0faffdbc8d 100644 --- a/packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts +++ b/packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts @@ -9,12 +9,8 @@ import assert from 'node:assert'; import { createHash } from 'node:crypto'; import path from 'node:path'; -import { - BuildOutputFile, - BuildOutputFileType, - BundleContextResult, - BundlerContext, -} from '../bundler-context'; +import { BundleContextResult, BundlerContext } from '../bundler-context'; +import { type BuildOutputFile, BuildOutputFileType } from '../bundler-files'; import { MemoryCache } from '../cache'; import { BundleStylesheetOptions, diff --git a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts index d11e1b6fb63c..7333843d7196 100644 --- a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts +++ b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts @@ -17,6 +17,7 @@ import { toPosixPath } from '../../utils/path'; import { SERVER_APP_ENGINE_MANIFEST_FILENAME, SERVER_APP_MANIFEST_FILENAME, + SERVER_GENERATED_EXTERNALS, } from '../../utils/server-rendering/manifest'; import { AngularCompilation, NoopCompilation } from '../angular/compilation'; import { createCompilerPlugin } from './angular/compiler-plugin'; @@ -32,7 +33,7 @@ import { createLoaderImportAttributePlugin } from './loader-import-attribute-plu import { createRxjsEsmResolutionPlugin } from './rxjs-esm-resolution-plugin'; import { createServerBundleMetadata } from './server-bundle-metadata-plugin'; import { createSourcemapIgnorelistPlugin } from './sourcemap-ignorelist-plugin'; -import { SERVER_GENERATED_EXTERNALS, getFeatureSupport, isZonelessApp } from './utils'; +import { getFeatureSupport, isZonelessApp } from './utils'; import { createVirtualModulePlugin } from './virtual-module-plugin'; import { createWasmPlugin } from './wasm-plugin'; diff --git a/packages/angular/build/src/tools/esbuild/budget-stats.ts b/packages/angular/build/src/tools/esbuild/budget-stats.ts index ee9b6b3b6dde..a9c32778b3db 100644 --- a/packages/angular/build/src/tools/esbuild/budget-stats.ts +++ b/packages/angular/build/src/tools/esbuild/budget-stats.ts @@ -8,11 +8,7 @@ import type { Metafile } from 'esbuild'; import type { BudgetStats } from '../../utils/bundle-calculator'; -import { - type BuildOutputFile, - BuildOutputFileType, - type InitialFileRecord, -} from './bundler-context'; +import { type BuildOutputFile, BuildOutputFileType, type InitialFileRecord } from './bundler-files'; import { getChunkNameFromMetafile } from './utils'; /** diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts index 8544c426a294..8145087345a4 100644 --- a/packages/angular/build/src/tools/esbuild/bundler-context.ts +++ b/packages/angular/build/src/tools/esbuild/bundler-context.ts @@ -20,8 +20,14 @@ import { import assert from 'node:assert'; import { builtinModules } from 'node:module'; import { basename, extname, join, relative } from 'node:path'; +import { SERVER_GENERATED_EXTERNALS } from '../../utils/server-rendering/manifest'; +import { + type BuildOutputFile, + BuildOutputFileType, + type InitialFileRecord, + convertOutputFile, +} from './bundler-files'; import { LoadResultCache, MemoryLoadResultCache } from './load-result-cache'; -import { SERVER_GENERATED_EXTERNALS, convertOutputFile } from './utils'; export type BundleContextResult = | { errors: Message[]; warnings: Message[] } @@ -40,29 +46,6 @@ export type BundleContextResult = externalConfiguration?: string[]; }; -export interface InitialFileRecord { - entrypoint: boolean; - name?: string; - type: 'script' | 'style'; - external?: boolean; - serverFile: boolean; - depth: number; -} - -export enum BuildOutputFileType { - Browser, - Media, - ServerApplication, - ServerRoot, - Root, -} - -export interface BuildOutputFile extends OutputFile { - type: BuildOutputFileType; - readonly size: number; - clone: () => BuildOutputFile; -} - export type BundlerOptionsFactory = ( loadCache: LoadResultCache | undefined, ) => T; diff --git a/packages/angular/build/src/tools/esbuild/bundler-execution-result.ts b/packages/angular/build/src/tools/esbuild/bundler-execution-result.ts index 1ba176287450..bebfd6a3eedd 100644 --- a/packages/angular/build/src/tools/esbuild/bundler-execution-result.ts +++ b/packages/angular/build/src/tools/esbuild/bundler-execution-result.ts @@ -11,8 +11,8 @@ import { normalize } from 'node:path'; import type { ChangedFiles } from '../../tools/esbuild/watcher'; import type { ComponentStylesheetBundler } from './angular/component-stylesheets'; import type { SourceFileCache } from './angular/source-file-cache'; -import type { BuildOutputFile, BuildOutputFileType, BundlerContext } from './bundler-context'; -import { createOutputFile } from './utils'; +import type { BundlerContext } from './bundler-context'; +import { type BuildOutputFile, BuildOutputFileType, createOutputFile } from './bundler-files'; export interface BuildOutputAsset { source: string; diff --git a/packages/angular/build/src/tools/esbuild/bundler-files.ts b/packages/angular/build/src/tools/esbuild/bundler-files.ts new file mode 100644 index 000000000000..ac33d471a395 --- /dev/null +++ b/packages/angular/build/src/tools/esbuild/bundler-files.ts @@ -0,0 +1,138 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import type { OutputFile } from 'esbuild'; +import { createHash } from 'node:crypto'; + +export interface InitialFileRecord { + entrypoint: boolean; + name?: string; + type: 'script' | 'style'; + external?: boolean; + serverFile: boolean; + depth: number; +} + +export enum BuildOutputFileType { + Browser, + Media, + ServerApplication, + ServerRoot, + Root, +} + +export interface BuildOutputFile extends OutputFile { + type: BuildOutputFileType; + readonly size: number; + clone: () => BuildOutputFile; +} + +export function createOutputFile( + path: string, + data: string | Uint8Array, + type: BuildOutputFileType, +): BuildOutputFile { + if (typeof data === 'string') { + let cachedContents: Uint8Array | null = null; + let cachedText: string | null = data; + let cachedHash: string | null = null; + + return { + path, + type, + get contents(): Uint8Array { + cachedContents ??= new TextEncoder().encode(data); + + return cachedContents; + }, + set contents(value: Uint8Array) { + cachedContents = value; + cachedText = null; + }, + get text(): string { + cachedText ??= new TextDecoder('utf-8').decode(this.contents); + + return cachedText; + }, + get size(): number { + return this.contents.byteLength; + }, + get hash(): string { + cachedHash ??= createHash('sha256') + .update(cachedText ?? this.contents) + .digest('hex'); + + return cachedHash; + }, + clone(): BuildOutputFile { + return createOutputFile(this.path, cachedText ?? this.contents, this.type); + }, + }; + } else { + let cachedContents = data; + let cachedText: string | null = null; + let cachedHash: string | null = null; + + return { + get contents(): Uint8Array { + return cachedContents; + }, + set contents(value: Uint8Array) { + cachedContents = value; + cachedText = null; + }, + path, + type, + get size(): number { + return this.contents.byteLength; + }, + get text(): string { + cachedText ??= new TextDecoder('utf-8').decode(this.contents); + + return cachedText; + }, + get hash(): string { + cachedHash ??= createHash('sha256').update(this.contents).digest('hex'); + + return cachedHash; + }, + clone(): BuildOutputFile { + return createOutputFile(this.path, this.contents, this.type); + }, + }; + } +} + +export function convertOutputFile(file: OutputFile, type: BuildOutputFileType): BuildOutputFile { + let { contents: cachedContents } = file; + let cachedText: string | null = null; + + return { + get contents(): Uint8Array { + return cachedContents; + }, + set contents(value: Uint8Array) { + cachedContents = value; + cachedText = null; + }, + hash: file.hash, + path: file.path, + type, + get size(): number { + return this.contents.byteLength; + }, + get text(): string { + cachedText ??= new TextDecoder('utf-8').decode(this.contents); + + return cachedText; + }, + clone(): BuildOutputFile { + return convertOutputFile(this, this.type); + }, + }; +} diff --git a/packages/angular/build/src/tools/esbuild/i18n-inliner.ts b/packages/angular/build/src/tools/esbuild/i18n-inliner.ts index fcb439b84c5c..9e17714df807 100644 --- a/packages/angular/build/src/tools/esbuild/i18n-inliner.ts +++ b/packages/angular/build/src/tools/esbuild/i18n-inliner.ts @@ -10,9 +10,8 @@ import assert from 'node:assert'; import { createHash } from 'node:crypto'; import { extname, join } from 'node:path'; import { WorkerPool } from '../../utils/worker-pool'; -import { BuildOutputFile, BuildOutputFileType } from './bundler-context'; +import { type BuildOutputFile, BuildOutputFileType, createOutputFile } from './bundler-files'; import type { LmdbCacheStore } from './lmdb-cache-store'; -import { createOutputFile } from './utils'; /** * A keyword used to indicate if a JavaScript file may require inlining of translations. diff --git a/packages/angular/build/src/tools/esbuild/index-html-generator.ts b/packages/angular/build/src/tools/esbuild/index-html-generator.ts index 4ccd48f2b595..2fcf56c6aacb 100644 --- a/packages/angular/build/src/tools/esbuild/index-html-generator.ts +++ b/packages/angular/build/src/tools/esbuild/index-html-generator.ts @@ -10,7 +10,7 @@ import assert from 'node:assert'; import path from 'node:path'; import { NormalizedApplicationBuildOptions } from '../../builders/application/options'; import { IndexHtmlGenerator } from '../../utils/index-file/index-html-generator'; -import { BuildOutputFile, BuildOutputFileType, InitialFileRecord } from './bundler-context'; +import { BuildOutputFile, BuildOutputFileType, InitialFileRecord } from './bundler-files'; /** * The maximum number of module preload link elements that should be added for diff --git a/packages/angular/build/src/tools/esbuild/utils.ts b/packages/angular/build/src/tools/esbuild/utils.ts index a17c80df42d1..8c1af958d2c3 100644 --- a/packages/angular/build/src/tools/esbuild/utils.ts +++ b/packages/angular/build/src/tools/esbuild/utils.ts @@ -17,17 +17,14 @@ import { coerce } from 'semver'; import { NormalizedApplicationBuildOptions } from '../../builders/application/options'; import { OutputMode } from '../../builders/application/schema'; import { BudgetCalculatorResult } from '../../utils/bundle-calculator'; -import { - SERVER_APP_ENGINE_MANIFEST_FILENAME, - SERVER_APP_MANIFEST_FILENAME, -} from '../../utils/server-rendering/manifest'; + import { BundleStats, generateEsbuildBuildStatsTable } from '../../utils/stats-table'; -import { BuildOutputFile, BuildOutputFileType, InitialFileRecord } from './bundler-context'; import { BuildOutputAsset, ExecutionResult, PrerenderedRoutesRecord, } from './bundler-execution-result'; +import { type BuildOutputFile, BuildOutputFileType, type InitialFileRecord } from './bundler-files'; /** * Filters a metafile to only include outputs matching a predicate, @@ -263,111 +260,6 @@ export async function emitFilesToDisk( } } -export function createOutputFile( - path: string, - data: string | Uint8Array, - type: BuildOutputFileType, -): BuildOutputFile { - if (typeof data === 'string') { - let cachedContents: Uint8Array | null = null; - let cachedText: string | null = data; - let cachedHash: string | null = null; - - return { - path, - type, - get contents(): Uint8Array { - cachedContents ??= new TextEncoder().encode(data); - - return cachedContents; - }, - set contents(value: Uint8Array) { - cachedContents = value; - cachedText = null; - }, - get text(): string { - cachedText ??= new TextDecoder('utf-8').decode(this.contents); - - return cachedText; - }, - get size(): number { - return this.contents.byteLength; - }, - get hash(): string { - cachedHash ??= createHash('sha256') - .update(cachedText ?? this.contents) - .digest('hex'); - - return cachedHash; - }, - clone(): BuildOutputFile { - return createOutputFile(this.path, cachedText ?? this.contents, this.type); - }, - }; - } else { - let cachedContents = data; - let cachedText: string | null = null; - let cachedHash: string | null = null; - - return { - get contents(): Uint8Array { - return cachedContents; - }, - set contents(value: Uint8Array) { - cachedContents = value; - cachedText = null; - }, - path, - type, - get size(): number { - return this.contents.byteLength; - }, - get text(): string { - cachedText ??= new TextDecoder('utf-8').decode(this.contents); - - return cachedText; - }, - get hash(): string { - cachedHash ??= createHash('sha256').update(this.contents).digest('hex'); - - return cachedHash; - }, - clone(): BuildOutputFile { - return createOutputFile(this.path, this.contents, this.type); - }, - }; - } -} - -export function convertOutputFile(file: OutputFile, type: BuildOutputFileType): BuildOutputFile { - let { contents: cachedContents } = file; - let cachedText: string | null = null; - - return { - get contents(): Uint8Array { - return cachedContents; - }, - set contents(value: Uint8Array) { - cachedContents = value; - cachedText = null; - }, - hash: file.hash, - path: file.path, - type, - get size(): number { - return this.contents.byteLength; - }, - get text(): string { - cachedText ??= new TextDecoder('utf-8').decode(this.contents); - - return cachedText; - }, - clone(): BuildOutputFile { - return convertOutputFile(this, this.type); - }, - }; -} - /** * Transform browserlists result to esbuild target. * @see https://esbuild.github.io/api/#target @@ -516,17 +408,3 @@ export function getEntryPointName(entryPoint: string): string { .replace(/\.[cm]?[jt]s$/, '') .replace(/[\\/.]/g, '-'); } - -/** - * A set of server-generated dependencies that are treated as external. - * - * These dependencies are marked as external because they are produced by a - * separate bundling process and are not included in the primary bundle. This - * ensures that these generated files are resolved from an external source rather - * than being part of the main bundle. - */ -export const SERVER_GENERATED_EXTERNALS = new Set([ - './polyfills.server.mjs', - './' + SERVER_APP_MANIFEST_FILENAME, - './' + SERVER_APP_ENGINE_MANIFEST_FILENAME, -]); diff --git a/packages/angular/build/src/utils/server-rendering/manifest.ts b/packages/angular/build/src/utils/server-rendering/manifest.ts index 41e40d3d1dd5..bd294b1e7e4b 100644 --- a/packages/angular/build/src/utils/server-rendering/manifest.ts +++ b/packages/angular/build/src/utils/server-rendering/manifest.ts @@ -10,12 +10,29 @@ import type { Metafile } from 'esbuild'; import { extname } from 'node:path'; import { runInThisContext } from 'node:vm'; import { NormalizedApplicationBuildOptions } from '../../builders/application/options'; -import { type BuildOutputFile, BuildOutputFileType } from '../../tools/esbuild/bundler-context'; -import { createOutputFile } from '../../tools/esbuild/utils'; +import { + type BuildOutputFile, + BuildOutputFileType, + createOutputFile, +} from '../../tools/esbuild/bundler-files'; export const SERVER_APP_MANIFEST_FILENAME = 'angular-app-manifest.mjs'; export const SERVER_APP_ENGINE_MANIFEST_FILENAME = 'angular-app-engine-manifest.mjs'; +/** + * A set of server-generated dependencies that are treated as external. + * + * These dependencies are marked as external because they are produced by a + * separate bundling process and are not included in the primary bundle. This + * ensures that these generated files are resolved from an external source rather + * than being part of the main bundle. + */ +export const SERVER_GENERATED_EXTERNALS = new Set([ + './polyfills.server.mjs', + './' + SERVER_APP_MANIFEST_FILENAME, + './' + SERVER_APP_ENGINE_MANIFEST_FILENAME, +]); + interface FilesMapping { path: string; dynamicImport: boolean; diff --git a/packages/angular/build/src/utils/server-rendering/prerender.ts b/packages/angular/build/src/utils/server-rendering/prerender.ts index 1033a7575f88..b4f81f03a800 100644 --- a/packages/angular/build/src/utils/server-rendering/prerender.ts +++ b/packages/angular/build/src/utils/server-rendering/prerender.ts @@ -10,8 +10,8 @@ import { readFile } from 'node:fs/promises'; import { extname, posix } from 'node:path'; import { NormalizedApplicationBuildOptions } from '../../builders/application/options'; import { OutputMode } from '../../builders/application/schema'; -import { BuildOutputFile, BuildOutputFileType } from '../../tools/esbuild/bundler-context'; import { BuildOutputAsset } from '../../tools/esbuild/bundler-execution-result'; +import { BuildOutputFile, BuildOutputFileType } from '../../tools/esbuild/bundler-files'; import { assertIsError } from '../error'; import { toPosixPath } from '../path'; import { addLeadingSlash, addTrailingSlash, joinUrlParts, stripLeadingSlash } from '../url'; diff --git a/packages/angular/build/src/utils/service-worker.ts b/packages/angular/build/src/utils/service-worker.ts index 3c8b4cbe6b63..ab8f058003db 100644 --- a/packages/angular/build/src/utils/service-worker.ts +++ b/packages/angular/build/src/utils/service-worker.ts @@ -12,8 +12,8 @@ import type { Config, Filesystem } from '@angular/service-worker/config' with { import * as crypto from 'node:crypto'; import { existsSync, promises as fsPromises } from 'node:fs'; import * as path from 'node:path'; -import { BuildOutputFile, BuildOutputFileType } from '../tools/esbuild/bundler-context'; import { BuildOutputAsset } from '../tools/esbuild/bundler-execution-result'; +import { BuildOutputFile, BuildOutputFileType } from '../tools/esbuild/bundler-files'; import { assertIsError } from './error'; import { toPosixPath } from './path'; diff --git a/packages/angular/build/src/utils/test-files.ts b/packages/angular/build/src/utils/test-files.ts index 522bb1e778c0..d5f0edb2815d 100644 --- a/packages/angular/build/src/utils/test-files.ts +++ b/packages/angular/build/src/utils/test-files.ts @@ -9,7 +9,7 @@ import * as fs from 'node:fs/promises'; import path from 'node:path'; import { ResultFile } from '../builders/application/results'; -import { BuildOutputFileType } from '../tools/esbuild/bundler-context'; +import { BuildOutputFileType } from '../tools/esbuild/bundler-files'; import { emitFilesToDisk } from '../tools/esbuild/utils'; /** From fc91bdcd0ac9b8dd9aa09adb7f8e65433f1bdead Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 5 May 2026 06:08:23 +0000 Subject: [PATCH 34/82] build: lock file maintenance See associated pull request for more information. --- pnpm-lock.yaml | 515 ++++++++++++++++++++++++------------------------- 1 file changed, 250 insertions(+), 265 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d5b179409d1..6694d20de137 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -333,7 +333,7 @@ importers: version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) 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.2)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) beasties: specifier: 0.4.2 version: 0.4.2 @@ -408,7 +408,7 @@ importers: version: 0.2.16 vite: specifier: 7.3.2 - version: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + version: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) watchpack: specifier: 2.5.1 version: 2.5.1 @@ -442,7 +442,7 @@ importers: version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) optionalDependencies: lmdb: specifier: 3.5.4 @@ -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 @@ -2719,8 +2719,8 @@ packages: cpu: [x64] os: [win32] - '@mswjs/interceptors@0.41.6': - resolution: {integrity: sha512-qmDvJIjcNsZ6tXWy2G9yuCgMPTTn35GMA3dPpSLm7QJVpbQzYdw0ALy1bKoivXnEM3U93/OrK+/M719b+fg84Q==} + '@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': @@ -2987,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' @@ -3094,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==} @@ -3161,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==} @@ -3173,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==} @@ -3182,8 +3185,8 @@ 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==} @@ -3547,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==} @@ -3810,10 +3813,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.0': - resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.59.1': resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4247,8 +4246,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: @@ -4312,15 +4311,15 @@ packages: bare-buffer: optional: true - bare-os@3.9.0: - resolution: {integrity: sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q==} + 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: '*' @@ -4343,13 +4342,13 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.10.23: - resolution: {integrity: sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==} + baseline-browser-mapping@2.10.27: + resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} 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: @@ -4977,8 +4976,8 @@ packages: engines: {node: '>=0.12.18'} hasBin: true - electron-to-chromium@1.5.344: - resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} + electron-to-chromium@1.5.349: + resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5014,8 +5013,8 @@ 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.21.0: @@ -5659,12 +5658,12 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - hono@4.12.15: - resolution: {integrity: sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg==} + hono@4.12.16: + resolution: {integrity: sha512-jN0ZewiNAWSe5khM3EyCmBb250+b40wWbwNILNfEvq84VREWwOIkuUsFONk/3i3nqkz7Oe1PcpM2mwQEK2L9Kg==} 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: @@ -5835,12 +5834,16 @@ packages: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} + 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: @@ -6124,8 +6127,8 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 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==} @@ -6603,8 +6606,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==} @@ -6618,8 +6621,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 @@ -6848,10 +6851,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@9.3.0: - resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} - engines: {node: '>=20'} - ora@9.4.0: resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} engines: {node: '>=20'} @@ -7106,10 +7105,6 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.10: - resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.13: resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} @@ -7156,8 +7151,8 @@ packages: resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==} engines: {node: '>=18'} - protobufjs@7.5.5: - resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} + protobufjs@7.5.6: + resolution: {integrity: sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -7634,8 +7629,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.8: + resolution: {integrity: sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@3.8.1: @@ -7779,8 +7774,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: @@ -7914,8 +7909,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: @@ -7929,15 +7924,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: @@ -8348,8 +8343,8 @@ packages: resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} engines: {node: '>=18.0.0'} - webpack-sources@3.4.0: - resolution: {integrity: sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==} + webpack-sources@3.4.1: + resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} engines: {node: '>=10.13.0'} webpack-subresource-integrity@5.1.0: @@ -8525,6 +8520,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.8.4: + resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -8887,7 +8887,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 @@ -8902,7 +8902,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 @@ -8920,7 +8920,7 @@ snapshots: 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 @@ -9030,7 +9030,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 @@ -9133,7 +9133,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 @@ -9141,7 +9141,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 @@ -9344,7 +9344,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 @@ -9353,7 +9353,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 @@ -9531,7 +9531,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': @@ -9539,7 +9539,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) @@ -10205,8 +10205,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 @@ -10217,12 +10217,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.6) 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.6 retry-request: 8.0.2(supports-color@10.2.2) split-array-stream: 2.0.0 stack-trace: 0.0.10 @@ -10236,7 +10236,7 @@ snapshots: dependencies: google-auth-library: 10.6.2(supports-color@10.2.2) p-retry: 4.6.2 - protobufjs: 7.5.5 + protobufjs: 7.5.6 ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.2) @@ -10259,22 +10259,22 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.5 + protobufjs: 7.5.6 yargs: 17.7.2 '@grpc/proto-loader@0.8.0': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.5 + protobufjs: 7.5.6 yargs: 17.7.2 '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@1.19.14(hono@4.12.15)': + '@hono/node-server@1.19.14(hono@4.12.16)': dependencies: - hono: 4.12.15 + hono: 4.12.16 '@humanfs/core@0.19.2': dependencies: @@ -10614,9 +10614,9 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.15) - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) + '@hono/node-server': 1.19.14(hono@4.12.16) + 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 @@ -10624,8 +10624,8 @@ snapshots: eventsource-parser: 3.0.8 express: 5.2.1 express-rate-limit: 8.4.1(express@5.2.1) - hono: 4.12.15 - jose: 6.2.2 + hono: 4.12.16 + jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 @@ -10652,7 +10652,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@mswjs/interceptors@0.41.6': + '@mswjs/interceptors@0.41.8': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -10737,7 +10737,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.1 + '@tybys/wasm-util': 0.10.2 optional: true '@noble/hashes@1.4.0': {} @@ -10790,7 +10790,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 @@ -10932,11 +10932,11 @@ 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 @@ -11006,91 +11006,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 + '@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 + '@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 + '@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 + '@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 + '@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 + '@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 + '@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: + '@peculiar/utils': 2.0.3 asn1js: 3.0.10 - pvtsutils: 1.3.6 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 + '@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.6.0 + '@peculiar/asn1-schema': 2.7.0 + '@peculiar/utils': 2.0.3 asn1js: 3.0.10 - pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/utils@2.0.3': + dependencies: 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 @@ -11125,24 +11129,24 @@ 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': dependencies: @@ -11380,7 +11384,7 @@ snapshots: '@stylistic/eslint-plugin@5.10.0(eslint@10.3.0(jiti@2.6.1))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) - '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/types': 8.59.1 eslint: 10.3.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -11404,14 +11408,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 @@ -11423,7 +11427,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': @@ -11755,8 +11759,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.0': {} - '@typescript-eslint/types@8.59.1': {} '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': @@ -11968,9 +11970,9 @@ snapshots: lodash: 4.18.1 minimatch: 7.4.9 - '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))': dependencies: - vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: @@ -11984,7 +11986,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) '@vitest/expect@4.1.5': dependencies: @@ -11995,13 +11997,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) '@vitest/pretty-format@4.1.5': dependencies: @@ -12161,10 +12163,6 @@ snapshots: dependencies: ajv: 8.20.0 - ajv-formats@3.0.1(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -12359,7 +12357,7 @@ 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)): dependencies: @@ -12410,20 +12408,20 @@ snapshots: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.13.0(bare-events@2.8.2) + bare-stream: 2.13.1(bare-events@2.8.2) bare-url: 2.4.2 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.9.0: {} + bare-os@3.9.1: {} bare-path@3.0.0: dependencies: - bare-os: 3.9.0 + 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 @@ -12440,9 +12438,9 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.10.23: {} + baseline-browser-mapping@2.10.27: {} - basic-ftp@5.3.0: {} + basic-ftp@5.3.1: {} batch@0.6.1: {} @@ -12597,9 +12595,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.23 + baseline-browser-mapping: 2.10.27 caniuse-lite: 1.0.30001791 - electron-to-chromium: 1.5.344 + electron-to-chromium: 1.5.349 node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -12738,7 +12736,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: {} @@ -13143,7 +13141,7 @@ snapshots: ejs@5.0.2: {} - electron-to-chromium@1.5.344: {} + electron-to-chromium@1.5.349: {} emoji-regex@10.6.0: {} @@ -13179,7 +13177,7 @@ 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 @@ -13945,7 +13943,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: @@ -14023,7 +14021,7 @@ snapshots: node-fetch: 3.3.2 object-hash: 3.0.0 proto3-json-serializer: 3.0.4 - protobufjs: 7.5.5 + protobufjs: 7.5.6 retry-request: 8.0.2(supports-color@10.2.2) rimraf: 5.0.10 transitivePeerDependencies: @@ -14057,10 +14055,10 @@ snapshots: graphql@16.13.2: {} - grpc-gcp@1.0.1(protobufjs@7.5.5): + grpc-gcp@1.0.1(protobufjs@7.5.6): dependencies: '@grpc/grpc-js': 1.14.3 - protobufjs: 7.5.5 + protobufjs: 7.5.6 gunzip-maybe@1.4.2: dependencies: @@ -14104,9 +14102,9 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.12.15: {} + hono@4.12.16: {} - hosted-git-info@9.0.2: + hosted-git-info@9.0.3: dependencies: lru-cache: 11.3.5 @@ -14303,9 +14301,11 @@ snapshots: 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: @@ -14506,7 +14506,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 @@ -14516,7 +14516,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 @@ -14575,7 +14575,7 @@ snapshots: jiti@2.6.1: {} - jose@6.2.2: {} + jose@6.2.3: {} js-base64@3.7.8: {} @@ -14789,7 +14789,7 @@ snapshots: license-webpack-plugin@4.0.2(webpack@5.106.2(esbuild@0.28.0)): dependencies: - webpack-sources: 3.4.0 + webpack-sources: 3.4.1 optionalDependencies: webpack: 5.106.2(esbuild@0.28.0) @@ -14808,7 +14808,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 @@ -14918,7 +14918,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 @@ -15107,7 +15107,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 @@ -15125,7 +15125,7 @@ snapshots: mute-stream@3.0.0: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -15151,7 +15151,7 @@ snapshots: '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) '@rollup/plugin-json': 6.1.0(rollup@4.60.2) '@rollup/wasm-node': 4.60.2 - ajv: 8.18.0 + ajv: 8.20.0 browserslist: 4.28.2 chokidar: 5.0.0 commander: 14.0.3 @@ -15161,9 +15161,9 @@ 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 + postcss: 8.5.13 rollup-plugin-dts: 6.4.1(rollup@4.60.2)(typescript@6.0.3) rxjs: 7.8.2 sass: 1.99.0 @@ -15175,7 +15175,7 @@ snapshots: nock@14.0.13: dependencies: - '@mswjs/interceptors': 0.41.6 + '@mswjs/interceptors': 0.41.8 json-stringify-safe: 5.0.1 propagate: 2.0.1 @@ -15256,7 +15256,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 @@ -15387,17 +15387,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@9.3.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 3.4.0 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 7.0.1 - stdin-discarder: 0.3.2 - string-width: 8.2.0 - ora@9.4.0: dependencies: chalk: 5.6.2 @@ -15407,7 +15396,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 @@ -15674,15 +15663,9 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.10: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.13: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -15708,20 +15691,20 @@ snapshots: proto3-json-serializer@3.0.4: dependencies: - protobufjs: 7.5.5 + protobufjs: 7.5.6 - protobufjs@7.5.5: + protobufjs@7.5.6: 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 + '@protobufjs/utf8': 1.1.1 '@types/node': 22.19.17 long: 5.3.2 @@ -15839,7 +15822,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 @@ -16384,7 +16367,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: @@ -16402,13 +16385,13 @@ snapshots: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) - socks: 2.8.7 + socks: 2.8.8 transitivePeerDependencies: - supports-color - socks@2.8.7: + socks@2.8.8: dependencies: - ip-address: 10.1.0 + ip-address: 10.2.0 smart-buffer: 4.2.0 sonic-boom@3.8.1: @@ -16579,7 +16562,7 @@ snapshots: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 - string-width@8.2.0: + string-width@8.2.1: dependencies: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 @@ -16659,7 +16642,7 @@ 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: @@ -16668,7 +16651,7 @@ snapshots: 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 @@ -16720,7 +16703,7 @@ snapshots: text-decoder@1.2.7: dependencies: - b4a: 1.8.0 + b4a: 1.8.1 transitivePeerDependencies: - react-native-b4a @@ -16749,7 +16732,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.1.1: {} + tinyexec@1.1.2: {} tinyglobby@0.2.16: dependencies: @@ -16760,15 +16743,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: {} @@ -16786,7 +16769,7 @@ snapshots: tough-cookie@6.0.1: dependencies: - tldts: 7.0.28 + tldts: 7.0.30 tr46@0.0.3: {} @@ -17064,7 +17047,7 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3): + vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -17080,12 +17063,12 @@ snapshots: sass: 1.99.0 terser: 5.46.2 tsx: 4.21.0 - yaml: 2.8.3 + 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.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3): + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -17099,10 +17082,10 @@ 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.2)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -17194,7 +17177,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 @@ -17220,7 +17203,7 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@3.4.0: {} + webpack-sources@3.4.1: {} webpack-subresource-integrity@5.1.0(webpack@5.106.2(esbuild@0.28.0)): dependencies: @@ -17252,7 +17235,7 @@ snapshots: tapable: 2.3.3 terser-webpack-plugin: 5.5.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)) watchpack: 2.5.1 - webpack-sources: 3.4.0 + webpack-sources: 3.4.1 transitivePeerDependencies: - '@swc/core' - esbuild @@ -17348,7 +17331,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: @@ -17410,6 +17393,8 @@ snapshots: yaml@2.8.3: {} + yaml@2.8.4: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} From bedeb7af68c03f7300dcb9b85d45634d23f9fee8 Mon Sep 17 00:00:00 2001 From: Younes Jaaidi Date: Tue, 5 May 2026 16:53:04 +0200 Subject: [PATCH 35/82] feat(@schematics/angular): set up fake timers in beforeEach instead of beforeAll When migrating `fakeAsync` to vitest fake timers, fake timers were setup in `beforeAll` to support `fakeAsync` usage in `beforeAll` / `afterAll` hooks. This was sacrificing timers isolation between tests. This change resets fake timers between tests. Any usage of fake timers APIs in `beforeAll` or `afterAll` hooks will fail. --- .../test-file-transformer.integration_spec.ts | 4 ++-- .../test-file-transformer_add-imports_spec.ts | 6 +++--- .../transformers/fake-async-test.ts | 8 ++++---- .../transformers/fake-async-test_spec.ts | 20 +++++++++---------- 4 files changed, 19 insertions(+), 19 deletions(-) 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 016c8d9fe1d4..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 @@ -576,10 +576,10 @@ describe('Jasmine to Vitest Transformer - Integration Tests', () => { `; const vitestCode = ` describe('My fakeAsync suite', () => { - beforeAll(() => { + beforeEach(() => { vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); }); - afterAll(() => { + afterEach(() => { vi.useRealTimers(); }); it('works', async () => { 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 c835dc9640c5..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 @@ -162,13 +162,13 @@ describe('Jasmine to Vitest Transformer - addImports option', () => { }); `; const expected = ` - import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; + import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; describe('My fakeAsync suite', () => { - beforeAll(() => { + beforeEach(() => { vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); }); - afterAll(() => { + afterEach(() => { vi.useRealTimers(); }); it('works', async () => { 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 index ea2a2ef52cb5..723d3a66c4b7 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/fake-async-test.ts @@ -119,14 +119,14 @@ function _transformFakeAsyncCall( function _createFakeTimersHookStatements(ctx: RefactorContext): ts.Statement[] { return [ - // > beforeAll(() => { + // > beforeEach(() => { // > vi.useFakeTimers({ // > advanceTimeDelta: 1, // > shouldAdvanceTime: true // > }); // > }); ts.factory.createExpressionStatement( - ts.factory.createCallExpression(ts.factory.createIdentifier('beforeAll'), undefined, [ + ts.factory.createCallExpression(ts.factory.createIdentifier('beforeEach'), undefined, [ ts.factory.createArrowFunction( undefined, undefined, @@ -156,11 +156,11 @@ function _createFakeTimersHookStatements(ctx: RefactorContext): ts.Statement[] { ]), ), - // > afterAll(() => { + // > afterEach(() => { // > vi.useRealTimers(); // > }); ts.factory.createExpressionStatement( - ts.factory.createCallExpression(ts.factory.createIdentifier('afterAll'), undefined, [ + ts.factory.createCallExpression(ts.factory.createIdentifier('afterEach'), undefined, [ ts.factory.createArrowFunction( undefined, undefined, 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 index 5efb23282f5a..9ac3e8f5f9bc 100644 --- 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 @@ -23,10 +23,10 @@ describe('transformFakeAsyncTest', () => { `, expected: ` describe('My fakeAsync suite', () => { - beforeAll(() => { + beforeEach(() => { vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); }); - afterAll(() => { + afterEach(() => { vi.useRealTimers(); }); it('works', async () => { @@ -49,10 +49,10 @@ describe('transformFakeAsyncTest', () => { `, expected: ` describe('My fakeAsync suite', () => { - beforeAll(() => { + beforeEach(() => { vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); }); - afterAll(() => { + afterEach(() => { vi.useRealTimers(); }); it('works', async (strangeArg: Strange = myStrangeDefault) => { @@ -91,10 +91,10 @@ describe('transformFakeAsyncTest', () => { }); describe('My outer fakeAsync suite', () => { - beforeAll(() => { + beforeEach(() => { vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); }); - afterAll(() => { + afterEach(() => { vi.useRealTimers(); }); @@ -137,10 +137,10 @@ describe('transformFakeAsyncTest', () => { }); describe.skip('My outer fakeAsync suite', () => { - beforeAll(() => { + beforeEach(() => { vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); }); - afterAll(() => { + afterEach(() => { vi.useRealTimers(); }); @@ -178,10 +178,10 @@ describe('transformFakeAsyncTest', () => { `, expected: ` describe('My fakeAsync suite', () => { - beforeAll(() => { + beforeEach(() => { vi.useFakeTimers({ advanceTimeDelta: 1, shouldAdvanceTime: true }); }); - afterAll(() => { + afterEach(() => { vi.useRealTimers(); }); beforeAll(async () => { From ac3e5dfc1cc6c5f3e87c64d2354433da71668abf Mon Sep 17 00:00:00 2001 From: Dennis Kugelmann Date: Thu, 30 Apr 2026 15:24:54 +0200 Subject: [PATCH 36/82] feat(@angular/build): subresource integrity validation for dynamically loaded modules Adds support for verifying the integrity of dynamically loaded sub-resources by generating and pre-pending an import map with integrity hashes in the index.html Closes #30724 Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> style: Fix lint issues test: Fix missing lazy modules resulting in test failures test: Adjust test to validate more specific assumptions fix: Escape < in generated importmap JSON style: fix all formatting issues in angular-build refactor: Inject importmap after base tag fix: Lint failures in tests --- .../options/subresource-integrity_spec.ts | 98 ++++++++++++++++++- .../angular/compilation/jit-compilation.ts | 5 +- .../src/tools/esbuild/index-html-generator.ts | 18 ++++ .../build/src/tools/esbuild/watcher.ts | 2 +- .../utils/index-file/augment-index-html.ts | 54 +++++++++- .../index-file/augment-index-html_spec.ts | 16 +++ .../utils/index-file/index-html-generator.ts | 17 +++- .../build/src/utils/server-rendering/utils.ts | 4 +- 8 files changed, 205 insertions(+), 9 deletions(-) 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/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/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/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/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/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/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/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'); }); }); }); From f2f17045b018cf343d0b006f52a45fb5e4c102c6 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 5 May 2026 13:09:16 -0400 Subject: [PATCH 54/82] refactor(@angular/cli): restrict MCP host process spawning to Angular CLI executable Update the Host abstraction inside the Model Context Protocol (MCP) layer to tighten the system shell surface and improve semantics. The generic spawn and execute methods are replaced with specialized counterparts that default to the Angular CLI, enabling stronger path security containment for developers while also clarifying the distinct control flows needed for buffered discrete commands and long-running background services. --- .../angular/cli/src/commands/mcp/devserver.ts | 2 +- packages/angular/cli/src/commands/mcp/host.ts | 49 ++++++++----------- .../cli/src/commands/mcp/testing/mock-host.ts | 4 +- .../src/commands/mcp/testing/test-utils.ts | 6 ++- .../cli/src/commands/mcp/tools/build.ts | 2 +- .../cli/src/commands/mcp/tools/build_spec.ts | 20 +++----- .../mcp/tools/devserver/devserver_spec.ts | 12 ++--- .../angular/cli/src/commands/mcp/tools/e2e.ts | 2 +- .../cli/src/commands/mcp/tools/e2e_spec.ts | 18 +++---- .../cli/src/commands/mcp/tools/test.ts | 2 +- .../cli/src/commands/mcp/tools/test_spec.ts | 22 +++------ 11 files changed, 61 insertions(+), 78 deletions(-) diff --git a/packages/angular/cli/src/commands/mcp/devserver.ts b/packages/angular/cli/src/commands/mcp/devserver.ts index dc24e5c73e4e..51b230e9289f 100644 --- a/packages/angular/cli/src/commands/mcp/devserver.ts +++ b/packages/angular/cli/src/commands/mcp/devserver.ts @@ -118,7 +118,7 @@ export class LocalDevserver implements Devserver { args.push(`--port=${this.port}`); - this.devserverProcess = this.host.spawn('ng', args, { + this.devserverProcess = this.host.startNgProcess(args, { stdio: 'pipe', cwd: this.workspacePath, }); diff --git a/packages/angular/cli/src/commands/mcp/host.ts b/packages/angular/cli/src/commands/mcp/host.ts index c1665be98b2f..8a378a4d238b 100644 --- a/packages/angular/cli/src/commands/mcp/host.ts +++ b/packages/angular/cli/src/commands/mcp/host.ts @@ -74,13 +74,11 @@ export interface Host { /** * Spawns a child process and returns a promise that resolves with the process's * output or rejects with a structured error. - * @param command The command to run. * @param args The arguments to pass to the command. * @param options Options for the child process. * @returns A promise that resolves with the standard output and standard error of the command. */ - runCommand( - command: string, + executeNgCommand( args: readonly string[], options?: { timeout?: number; @@ -92,13 +90,11 @@ export interface Host { /** * Spawns a long-running child process and returns the `ChildProcess` object. - * @param command The command to run. * @param args The arguments to pass to the command. * @param options Options for the child process. * @returns The spawned `ChildProcess` instance. */ - spawn( - command: string, + startNgProcess( args: readonly string[], options?: { stdio?: 'pipe' | 'ignore'; @@ -123,13 +119,13 @@ export interface Host { setRoots(roots: string[]): void; } -function resolveCommand( - command: string, +function resolveNgCommand( args: readonly string[], cwd?: string, ): { command: string; args: readonly string[] } { - if (command !== 'ng' || !cwd) { - return { command, args }; + const defaultCommand = { command: 'ng', args }; + if (!cwd) { + return defaultCommand; } try { @@ -150,7 +146,7 @@ function resolveCommand( // Failed to resolve the CLI binary, fall back to assuming `ng` is on PATH. } - return { command, args }; + return defaultCommand; } /** @@ -170,8 +166,7 @@ export const LocalWorkspaceHost: Host = { return nodeGlob(pattern, { ...options, withFileTypes: true }); }, - runCommand: async ( - command: string, + executeNgCommand: async ( args: readonly string[], options: { timeout?: number; @@ -180,7 +175,7 @@ export const LocalWorkspaceHost: Host = { env?: Record; } = {}, ): Promise<{ logs: string[] }> => { - const resolved = resolveCommand(command, args, options.cwd); + const resolved = resolveNgCommand(args, options.cwd); const signal = options.timeout ? AbortSignal.timeout(options.timeout) : undefined; return new Promise((resolve, reject) => { @@ -221,8 +216,7 @@ export const LocalWorkspaceHost: Host = { }); }, - spawn( - command: string, + startNgProcess( args: readonly string[], options: { stdio?: 'pipe' | 'ignore'; @@ -230,7 +224,7 @@ export const LocalWorkspaceHost: Host = { env?: Record; } = {}, ): ChildProcess { - const resolved = resolveCommand(command, args, options.cwd); + const resolved = resolveNgCommand(args, options.cwd); return spawn(resolved.command, resolved.args, { shell: false, @@ -370,23 +364,20 @@ export function createRootRestrictedHost( return baseHost.glob(pattern, options); }, - runCommand(command: string, args: readonly string[], options: { cwd?: string } = {}) { - const effectiveCwd = options.cwd ?? process.cwd(); + executeNgCommand( + args: readonly string[], + options: Parameters[1] = {}, + ) { + const effectiveCwd = options?.cwd ?? process.cwd(); checkPath(effectiveCwd); - if (command.includes('/') || command.includes('\\')) { - checkPath(resolve(effectiveCwd, command)); - } - return baseHost.runCommand(command, args, options); + return baseHost.executeNgCommand(args, options); }, - spawn(command: string, args: readonly string[], options: { cwd?: string } = {}) { - const effectiveCwd = options.cwd ?? process.cwd(); + startNgProcess(args: readonly string[], options: Parameters[1] = {}) { + const effectiveCwd = options?.cwd ?? process.cwd(); checkPath(effectiveCwd); - if (command.includes('/') || command.includes('\\')) { - checkPath(resolve(effectiveCwd, command)); - } - return baseHost.spawn(command, args, options); + return baseHost.startNgProcess(args, options); }, }; } diff --git a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts index ef818062d559..1062191aebe1 100644 --- a/packages/angular/cli/src/commands/mcp/testing/mock-host.ts +++ b/packages/angular/cli/src/commands/mcp/testing/mock-host.ts @@ -13,12 +13,12 @@ import type { Host } from '../host'; * This class allows spying on host methods and controlling their return values. */ export class MockHost implements Host { - runCommand = jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }); + executeNgCommand = jasmine.createSpy('executeNgCommand').and.resolveTo({ logs: [] }); stat = jasmine.createSpy('stat'); existsSync = jasmine.createSpy('existsSync'); readFile = jasmine.createSpy('readFile').and.resolveTo(''); glob = jasmine.createSpy('glob').and.returnValue((async function* () {})()); - spawn = jasmine.createSpy('spawn'); + startNgProcess = jasmine.createSpy('startNgProcess'); getAvailablePort = jasmine.createSpy('getAvailablePort'); isPortAvailable = jasmine.createSpy('isPortAvailable').and.resolveTo(true); setRoots = jasmine.createSpy('setRoots'); diff --git a/packages/angular/cli/src/commands/mcp/testing/test-utils.ts b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts index 1bdf2ef416a5..1c95c51fe25e 100644 --- a/packages/angular/cli/src/commands/mcp/testing/test-utils.ts +++ b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts @@ -20,10 +20,12 @@ import { MockHost } from './mock-host'; */ export function createMockHost(): MockHost { return { - runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), + executeNgCommand: jasmine + .createSpy('executeNgCommand') + .and.resolveTo({ logs: [] }), stat: jasmine.createSpy('stat'), existsSync: jasmine.createSpy('existsSync'), - spawn: jasmine.createSpy('spawn'), + startNgProcess: jasmine.createSpy('startNgProcess'), getAvailablePort: jasmine .createSpy('getAvailablePort') .and.resolveTo(0), diff --git a/packages/angular/cli/src/commands/mcp/tools/build.ts b/packages/angular/cli/src/commands/mcp/tools/build.ts index a04812f8544b..fbf2729bf8bf 100644 --- a/packages/angular/cli/src/commands/mcp/tools/build.ts +++ b/packages/angular/cli/src/commands/mcp/tools/build.ts @@ -52,7 +52,7 @@ export async function runBuild(input: BuildToolInput, context: McpToolContext) { let outputPath: string | undefined; try { - logs = (await context.host.runCommand('ng', args, { cwd: workspacePath })).logs; + logs = (await context.host.executeNgCommand(args, { cwd: workspacePath })).logs; } catch (e) { status = 'failure'; logs = getCommandErrorLogs(e); diff --git a/packages/angular/cli/src/commands/mcp/tools/build_spec.ts b/packages/angular/cli/src/commands/mcp/tools/build_spec.ts index 403d5e68f877..3fd7318c554b 100644 --- a/packages/angular/cli/src/commands/mcp/tools/build_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/build_spec.ts @@ -29,8 +29,7 @@ describe('Build Tool', () => { it('should construct the command correctly with default configuration', async () => { mockContext.workspace.extensions['defaultProject'] = 'my-app'; await runBuild({}, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['build', 'my-app', '-c', 'development'], { cwd: '/test' }, ); @@ -39,8 +38,7 @@ describe('Build Tool', () => { it('should construct the command correctly with a specified project', async () => { addProjectToWorkspace(mockContext.workspace.projects, 'another-app'); await runBuild({ project: 'another-app' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['build', 'another-app', '-c', 'development'], { cwd: '/test' }, ); @@ -49,7 +47,7 @@ describe('Build Tool', () => { it('should construct the command correctly for a custom configuration', async () => { mockContext.workspace.extensions['defaultProject'] = 'my-app'; await runBuild({ configuration: 'myconfig' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['build', 'my-app', '-c', 'myconfig'], { + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['build', 'my-app', '-c', 'myconfig'], { cwd: '/test', }); }); @@ -61,14 +59,13 @@ describe('Build Tool', () => { 'some warning', 'Output location: dist/my-app', ]; - mockHost.runCommand.and.resolveTo({ + mockHost.executeNgCommand.and.resolveTo({ logs: buildLogs, }); const { structuredContent } = await runBuild({ project: 'my-app' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['build', 'my-app', '-c', 'development'], { cwd: '/test' }, ); @@ -81,15 +78,14 @@ describe('Build Tool', () => { addProjectToWorkspace(mockContext.workspace.projects, 'my-failed-app'); const buildLogs = ['Some output before the crash.', 'Error: Something went wrong!']; const error = new CommandError('Build failed', buildLogs, 1); - mockHost.runCommand.and.rejectWith(error); + mockHost.executeNgCommand.and.rejectWith(error); const { structuredContent } = await runBuild( { project: 'my-failed-app', configuration: 'production' }, mockContext, ); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['build', 'my-failed-app', '-c', 'production'], { cwd: '/test' }, ); @@ -100,7 +96,7 @@ describe('Build Tool', () => { it('should handle builds where the output path is not found in logs', async () => { const buildLogs = ["Some logs that don't match any output path."]; - mockHost.runCommand.and.resolveTo({ logs: buildLogs }); + mockHost.executeNgCommand.and.resolveTo({ logs: buildLogs }); mockContext.workspace.extensions['defaultProject'] = 'my-app'; const { structuredContent } = await runBuild({}, mockContext); diff --git a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts index 52a66902e2ef..ea5fddad184b 100644 --- a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver_spec.ts @@ -39,7 +39,7 @@ describe('Serve Tools', () => { mockContext = mock.context; // Customize host spies - mockHost.spawn.and.returnValue(mockProcess as unknown as ChildProcess); + mockHost.startNgProcess.and.returnValue(mockProcess as unknown as ChildProcess); mockHost.getAvailablePort.and.callFake(() => Promise.resolve(portCounter++)); // Setup default project @@ -52,7 +52,7 @@ describe('Serve Tools', () => { expect(startResult.structuredContent.message).toBe( `Development server for project 'my-app' started and watching for workspace changes.`, ); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'my-app', '--port=12345'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'my-app', '--port=12345'], { stdio: 'pipe', cwd: '/test', }); @@ -69,7 +69,7 @@ describe('Serve Tools', () => { expect(startResult.structuredContent.message).toBe( `Development server for project 'my-app' started and watching for workspace changes.`, ); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'my-app', '--port=54321'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'my-app', '--port=54321'], { stdio: 'pipe', cwd: '/test', }); @@ -125,17 +125,17 @@ describe('Serve Tools', () => { // Start server for project 2, returning a new mock process. const process2 = new MockChildProcess(); - mockHost.spawn.and.returnValue(process2 as unknown as ChildProcess); + mockHost.startNgProcess.and.returnValue(process2 as unknown as ChildProcess); const startResult2 = await startDevserver({ project: 'app-two' }, mockContext); expect(startResult2.structuredContent.message).toBe( `Development server for project 'app-two' started and watching for workspace changes.`, ); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'app-one', '--port=12345'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'app-one', '--port=12345'], { stdio: 'pipe', cwd: '/test', }); - expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', 'app-two', '--port=12346'], { + expect(mockHost.startNgProcess).toHaveBeenCalledWith(['serve', 'app-two', '--port=12346'], { stdio: 'pipe', cwd: '/test', }); diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e.ts b/packages/angular/cli/src/commands/mcp/tools/e2e.ts index 2bd0441d2434..726308b12c87 100644 --- a/packages/angular/cli/src/commands/mcp/tools/e2e.ts +++ b/packages/angular/cli/src/commands/mcp/tools/e2e.ts @@ -62,7 +62,7 @@ export async function runE2e(input: E2eToolInput, host: Host, context: McpToolCo let logs: string[]; try { - logs = (await host.runCommand('ng', args, { cwd: workspacePath })).logs; + logs = (await host.executeNgCommand(args, { cwd: workspacePath })).logs; } catch (e) { status = 'failure'; logs = getCommandErrorLogs(e); diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts b/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts index d2d3949a6451..318dd41aea52 100644 --- a/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts @@ -33,14 +33,14 @@ describe('E2E Tool', () => { mockContext.workspace.extensions['defaultProject'] = 'my-app'; await runE2e({}, mockHost, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app'], { cwd: '/test' }); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['e2e', 'my-app'], { cwd: '/test' }); }); it('should construct the command correctly with a specified project', async () => { addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); await runE2e({ project: 'my-app' }, mockHost, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app'], { cwd: '/test' }); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['e2e', 'my-app'], { cwd: '/test' }); }); it('should error if project does not have e2e target', async () => { @@ -50,7 +50,7 @@ describe('E2E Tool', () => { expect(structuredContent.status).toBe('failure'); expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'my-app'"); - expect(mockHost.runCommand).not.toHaveBeenCalled(); + expect(mockHost.executeNgCommand).not.toHaveBeenCalled(); }); it('should error if no project was specified and the default project does not have e2e target', async () => { @@ -61,32 +61,32 @@ describe('E2E Tool', () => { expect(structuredContent.status).toBe('failure'); expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'my-app'"); - expect(mockHost.runCommand).not.toHaveBeenCalled(); + expect(mockHost.executeNgCommand).not.toHaveBeenCalled(); }); it('should handle a successful e2e run with a specified project', async () => { addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); const e2eLogs = ['E2E passed for my-app']; - mockHost.runCommand.and.resolveTo({ logs: e2eLogs }); + mockHost.executeNgCommand.and.resolveTo({ logs: e2eLogs }); const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); expect(structuredContent.status).toBe('success'); expect(structuredContent.logs).toEqual(e2eLogs); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app'], { cwd: '/test' }); + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['e2e', 'my-app'], { cwd: '/test' }); }); it('should handle a successful e2e run with the default project', async () => { mockContext.workspace.extensions['defaultProject'] = 'default-app'; addProjectToWorkspace(mockProjects, 'default-app', { e2e: { builder: 'mock-builder' } }); const e2eLogs = ['E2E passed for default-app']; - mockHost.runCommand.and.resolveTo({ logs: e2eLogs }); + mockHost.executeNgCommand.and.resolveTo({ logs: e2eLogs }); const { structuredContent } = await runE2e({}, mockHost, mockContext); expect(structuredContent.status).toBe('success'); expect(structuredContent.logs).toEqual(e2eLogs); - expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'default-app'], { + expect(mockHost.executeNgCommand).toHaveBeenCalledWith(['e2e', 'default-app'], { cwd: '/test', }); }); @@ -94,7 +94,7 @@ describe('E2E Tool', () => { it('should handle a failed e2e run', async () => { addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); const e2eLogs = ['E2E failed']; - mockHost.runCommand.and.rejectWith(new CommandError('Failed', e2eLogs, 1)); + mockHost.executeNgCommand.and.rejectWith(new CommandError('Failed', e2eLogs, 1)); const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); diff --git a/packages/angular/cli/src/commands/mcp/tools/test.ts b/packages/angular/cli/src/commands/mcp/tools/test.ts index 9c05a2f0f29b..72093c268a1b 100644 --- a/packages/angular/cli/src/commands/mcp/tools/test.ts +++ b/packages/angular/cli/src/commands/mcp/tools/test.ts @@ -65,7 +65,7 @@ export async function runTest(input: TestToolInput, context: McpToolContext) { let logs: string[]; try { - logs = (await context.host.runCommand('ng', args, { cwd: workspacePath })).logs; + logs = (await context.host.executeNgCommand(args, { cwd: workspacePath })).logs; } catch (e) { status = 'failure'; logs = getCommandErrorLogs(e); diff --git a/packages/angular/cli/src/commands/mcp/tools/test_spec.ts b/packages/angular/cli/src/commands/mcp/tools/test_spec.ts index 487c986cdcd2..a56307dcf3cb 100644 --- a/packages/angular/cli/src/commands/mcp/tools/test_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/test_spec.ts @@ -29,8 +29,7 @@ describe('Test Tool', () => { it('should construct the command correctly with defaults', async () => { mockContext.workspace.extensions['defaultProject'] = 'my-app'; await runTest({}, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['test', 'my-app', '--browsers', 'ChromeHeadless', '--watch', 'false'], { cwd: '/test' }, ); @@ -39,8 +38,7 @@ describe('Test Tool', () => { it('should construct the command correctly with a specified project', async () => { addProjectToWorkspace(mockContext.workspace.projects, 'my-lib'); await runTest({ project: 'my-lib' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['test', 'my-lib', '--browsers', 'ChromeHeadless', '--watch', 'false'], { cwd: '/test' }, ); @@ -49,8 +47,7 @@ describe('Test Tool', () => { it('should construct the command correctly with filter', async () => { mockContext.workspace.extensions['defaultProject'] = 'my-app'; await runTest({ filter: 'AppComponent' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( [ 'test', 'my-app', @@ -67,14 +64,13 @@ describe('Test Tool', () => { it('should handle a successful test run and capture logs', async () => { const testLogs = ['Executed 10 of 10 SUCCESS', 'Total: 10 success']; - mockHost.runCommand.and.resolveTo({ + mockHost.executeNgCommand.and.resolveTo({ logs: testLogs, }); const { structuredContent } = await runTest({ project: 'my-app' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['test', 'my-app', '--browsers', 'ChromeHeadless', '--watch', 'false'], { cwd: '/test' }, ); @@ -86,7 +82,7 @@ describe('Test Tool', () => { addProjectToWorkspace(mockContext.workspace.projects, 'my-failed-app'); const testLogs = ['Executed 10 of 10 FAILED', 'Error: Some test failed']; const error = new CommandError('Test failed', testLogs, 1); - mockHost.runCommand.and.rejectWith(error); + mockHost.executeNgCommand.and.rejectWith(error); const { structuredContent } = await runTest({ project: 'my-failed-app' }, mockContext); @@ -106,8 +102,7 @@ describe('Test Tool', () => { await runTest({ project: 'my-vitest-app' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['test', 'my-vitest-app', '--headless', 'true', '--watch', 'false'], { cwd: '/test' }, ); @@ -123,8 +118,7 @@ describe('Test Tool', () => { await runTest({ project: 'my-default-vitest-app' }, mockContext); - expect(mockHost.runCommand).toHaveBeenCalledWith( - 'ng', + expect(mockHost.executeNgCommand).toHaveBeenCalledWith( ['test', 'my-default-vitest-app', '--headless', 'true', '--watch', 'false'], { cwd: '/test' }, ); From 75f0dd7970840d06a9e34d0edd69d11b373d3c7f Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 8 May 2026 10:53:23 +0000 Subject: [PATCH 55/82] build: update all non-major dependencies See associated pull request for more information. --- package.json | 10 +- packages/angular/build/package.json | 8 +- packages/angular/cli/package.json | 4 +- .../angular_devkit/build_angular/package.json | 6 +- pnpm-lock.yaml | 1097 +++++++++++------ 5 files changed, 742 insertions(+), 383 deletions(-) diff --git a/package.json b/package.json index 2e6690180f6c..08ad303bb96b 100644 --- a/package.json +++ b/package.json @@ -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,8 +95,8 @@ "@types/yargs": "^17.0.20", "@types/yargs-parser": "^21.0.0", "@types/yarnpkg__lockfile": "^1.1.5", - "@typescript-eslint/eslint-plugin": "8.59.1", - "@typescript-eslint/parser": "8.59.1", + "@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", @@ -123,9 +123,9 @@ "lodash": "^4.17.21", "magic-string": "0.30.21", "prettier": "^3.0.0", - "puppeteer": "24.42.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", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index 9aa419021594..406d81793c3d 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": { @@ -54,8 +54,8 @@ "jsdom": "29.1.1", "less": "4.6.4", "ng-packagr": "22.0.0-next.3", - "postcss": "8.5.13", - "rolldown": "1.0.0-rc.18", + "postcss": "8.5.14", + "rolldown": "1.0.0", "rxjs": "7.8.2", "vitest": "4.1.5" }, diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json index bc41c868bc88..5284a6260cca 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -30,7 +30,7 @@ "@modelcontextprotocol/sdk": "1.29.0", "@schematics/angular": "workspace:0.0.0-PLACEHOLDER", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.52.0", + "algoliasearch": "5.52.1", "ini": "6.0.0", "jsonc-parser": "3.3.1", "listr2": "10.2.1", @@ -39,7 +39,7 @@ "parse5-html-rewriting-stream": "8.0.1", "semver": "7.7.4", "yargs": "18.0.0", - "zod": "4.4.2" + "zod": "4.4.3" }, "ng-update": { "migrations": "@schematics/angular/migrations/migration-collection.json", diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index f50208e0e73f..bbfafe203523 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -18,7 +18,7 @@ "@babel/plugin-transform-async-generator-functions": "7.29.0", "@babel/plugin-transform-async-to-generator": "7.28.6", "@babel/plugin-transform-runtime": "7.29.0", - "@babel/preset-env": "7.29.3", + "@babel/preset-env": "7.29.5", "@babel/runtime": "7.29.2", "@discoveryjs/json-ext": "1.1.0", "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER", @@ -42,7 +42,7 @@ "ora": "9.4.0", "picomatch": "4.0.4", "piscina": "5.1.4", - "postcss": "8.5.13", + "postcss": "8.5.14", "postcss-loader": "8.2.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", @@ -51,7 +51,7 @@ "semver": "7.7.4", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.46.2", + "terser": "5.47.1", "tinyglobby": "0.2.16", "tslib": "2.8.1", "webpack": "5.106.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6694d20de137..00bc534f59c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,7 +51,7 @@ importers: version: 22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133) '@angular/ng-dev': specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904 - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)) + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) '@angular/platform-browser': specifier: 22.0.0-next.10 version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) @@ -87,19 +87,19 @@ importers: version: 10.0.1(eslint@10.3.0(jiti@2.6.1)) '@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.3.0(jiti@2.6.1)) @@ -173,11 +173,11 @@ importers: specifier: ^1.1.5 version: 1.1.9 '@typescript-eslint/eslint-plugin': - specifier: 8.59.1 - version: 8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + specifier: 8.59.2 + version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) '@typescript-eslint/parser': - specifier: 8.59.1 - version: 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + specifier: 8.59.2 + version: 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) ajv: specifier: 8.20.0 version: 8.20.0 @@ -198,7 +198,7 @@ importers: version: 10.1.8(eslint@10.3.0(jiti@2.6.1)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)) express: specifier: 5.2.1 version: 5.2.1 @@ -257,23 +257,23 @@ importers: specifier: ^3.0.0 version: 3.8.3 puppeteer: - specifier: 24.42.0 - version: 24.42.0(bufferutil@4.1.0)(typescript@6.0.3)(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.3) + 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.17)(rollup@4.60.3) semver: specifier: 7.7.4 version: 7.7.4 @@ -333,7 +333,7 @@ importers: version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.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.2)(tsx@4.21.0)(yaml@2.8.4)) + version: 2.3.0(vite@7.3.3(@types/node@24.12.2)(jiti@2.6.1)(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.2)(tsx@4.21.0)(yaml@2.8.4) + specifier: 7.3.3 + version: 7.3.3(@types/node@24.12.2)(jiti@2.6.1)(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 @@ -432,17 +432,17 @@ importers: specifier: 22.0.0-next.3 version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) postcss: - specifier: 8.5.13 - version: 8.5.13 + specifier: 8.5.14 + version: 8.5.14 rolldown: - specifier: 1.0.0-rc.18 - version: 1.0.0-rc.18 + specifier: 1.0.0 + version: 1.0.0 rxjs: specifier: 7.8.2 version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.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.4.2) + 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.52.0 - version: 5.52.0 + 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.4.2 - version: 4.4.2 + specifier: 4.4.3 + version: 4.4.3 packages/angular/pwa: dependencies: @@ -599,8 +599,8 @@ importers: specifier: 7.29.0 version: 7.29.0(@babel/core@7.29.0) '@babel/preset-env': - specifier: 7.29.3 - version: 7.29.3(@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 @@ -615,7 +615,7 @@ importers: version: 4.1.3 autoprefixer: specifier: 10.5.0 - version: 10.5.0(postcss@8.5.13) + 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)) @@ -671,11 +671,11 @@ importers: specifier: 5.1.4 version: 5.1.4 postcss: - specifier: 8.5.13 - version: 8.5.13 + specifier: 8.5.14 + version: 8.5.14 postcss-loader: specifier: 8.2.1 - version: 8.2.1(postcss@8.5.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)) + version: 8.2.1(postcss@8.5.14)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -698,8 +698,8 @@ importers: specifier: 0.5.21 version: 0.5.21 terser: - specifier: 5.46.2 - version: 5.46.2 + specifier: 5.47.1 + version: 5.47.1 tinyglobby: specifier: 0.2.16 version: 0.2.16 @@ -875,60 +875,60 @@ packages: '@actions/io@3.0.2': resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} - '@algolia/abtesting@1.18.0': - resolution: {integrity: sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==} + '@algolia/abtesting@1.18.1': + resolution: {integrity: sha512-aehCadlWOGvrT91KUIZpC0MbB8KBW9yUuvTJFd2xesR7le/IsT4nJUnjCCZ4ZqZCeTcPHPV5mo//fZ5oxcSVYw==} engines: {node: '>= 14.0.0'} - '@algolia/client-abtesting@5.52.0': - resolution: {integrity: sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==} + '@algolia/client-abtesting@5.52.1': + resolution: {integrity: sha512-HmXOGBOAOJPounpBzBpuY0zDYeiCpxgHnQmuA7JO6ScukcBdGp3/XM9zJk5pJx/xNGD68mbPGXWpDxGtl6BwDQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.52.0': - resolution: {integrity: sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==} + '@algolia/client-analytics@5.52.1': + resolution: {integrity: sha512-5oo4+I8iixie9vXhCyNFCzeIr8pqA3FQ//VsLHTDvZAV4ttYOPGvYHGQq5NSalrLx5Jc3dRro/5uDOlnUMcBJg==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.52.0': - resolution: {integrity: sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==} + '@algolia/client-common@5.52.1': + resolution: {integrity: sha512-qCDoZfx5MpX7XQzvQ3bC4tSEMkQWQMaF/ABtLuoze03Y/flR563CCSws02qIJ23oX7lxl92LsilZjINVyTdtLw==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.52.0': - resolution: {integrity: sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==} + '@algolia/client-insights@5.52.1': + resolution: {integrity: sha512-hnGs0/lsFJ2PWDxNBz7pxreXo/Xz7gxYRcfePBUjsH26ad0kU/sgnVZd9LwWBpsQv65z2jlb5dkyaB9WE9M9FQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.52.0': - resolution: {integrity: sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==} + '@algolia/client-personalization@5.52.1': + resolution: {integrity: sha512-2VxxNc/uBysyKvGeBdSM5n9eIDKH8kWD7wd9/yqbJAiVwU4Yv6tU1LSJusHKrXV/aCu1KW7t9Gug9QyeEmtn/Q==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.52.0': - resolution: {integrity: sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==} + '@algolia/client-query-suggestions@5.52.1': + resolution: {integrity: sha512-O6mPtsw3xEfNOe6gWFpYLeAZAIljNa4Hgna3bq15PwyN7nbjTY0wXJFRbzs/0YVf75Br+SbOQUmjKxXYjDiSiQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.52.0': - resolution: {integrity: sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==} + '@algolia/client-search@5.52.1': + resolution: {integrity: sha512-gA8oJOV1LnQQkDf91iebNnFInHuW0gRPEgLSOQ7EfipCEjYTHm5swm1DlH9H5RaRw4RrHuzHBegnlzc0MAstcg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.52.0': - resolution: {integrity: sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==} + '@algolia/ingestion@1.52.1': + resolution: {integrity: sha512-U9zZfc5xIu9wRxZkt+HceJUAD4VKHKbAyLSloJdEyMRmphXeibfrY9cxqIXBcmPeZzGhn3Imb35Dq8l19PkJhw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.52.0': - resolution: {integrity: sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==} + '@algolia/monitoring@1.52.1': + resolution: {integrity: sha512-a3SGNceHmkQfq77iG8Ka+w1pvwfZa/0lzEIgse30fL0kD+yKnd/dg0dQvSfFPAEt2f21DMcGkDSSeJlO3KdQjQ==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.52.0': - resolution: {integrity: sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==} + '@algolia/recommend@5.52.1': + resolution: {integrity: sha512-z98QEguCFDpxb4S/PyrUK1igqF8tPsdbqOUUO6ON91vJ58w+Gwa6ncrI0oNXSFcrkxA5EqPKPQ2A1PBCn08TYQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.52.0': - resolution: {integrity: sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==} + '@algolia/requester-browser-xhr@5.52.1': + resolution: {integrity: sha512-CI7+/0I11QeZM59Uc8whd2or0kqzFVjpaPn9Qpwll/krHcBAxk24WkAQ6WX+IwDVMfpont4YGbKwAmCre3vE8Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.52.0': - resolution: {integrity: sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==} + '@algolia/requester-fetch@5.52.1': + resolution: {integrity: sha512-S6bDuw9byfOvm3T71cgdoZgrgnZq6hpdMLkx52Louh57nUAmvGQESz2aojOynQHjbTiV55smvAFbgn0qT4tJrg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.52.0': - resolution: {integrity: sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==} + '@algolia/requester-node-http@5.52.1': + resolution: {integrity: sha512-tqZXM+54rWo4mk5jL5Z/flE11nPmNEdXwFBM5py9DkOmbjeCNemfVd45FyM97XdzfZ0dl9uOJC6PYn1FpkeyQg==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': @@ -1391,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 @@ -1553,8 +1553,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.29.3': - resolution: {integrity: sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==} + '@babel/preset-env@7.29.5': + resolution: {integrity: sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3003,8 +3003,8 @@ packages: resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} engines: {node: '>=14'} - '@oxc-project/types@0.128.0': - resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -3188,108 +3188,108 @@ packages: '@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.18': - resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.18': - resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': - resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': - resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': - resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.18': - resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -3341,144 +3341,287 @@ packages: cpu: [arm] os: [android] + '@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==} cpu: [arm64] os: [android] + '@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==} cpu: [arm64] os: [darwin] + '@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==} cpu: [x64] os: [darwin] + '@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==} cpu: [arm64] os: [freebsd] + '@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==} cpu: [x64] os: [freebsd] + '@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==} cpu: [arm] os: [linux] libc: [glibc] + '@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==} cpu: [arm] os: [linux] libc: [musl] + '@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==} cpu: [arm64] os: [linux] libc: [glibc] + '@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==} cpu: [arm64] os: [linux] libc: [musl] + '@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==} cpu: [loong64] os: [linux] libc: [glibc] + '@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==} cpu: [loong64] os: [linux] libc: [musl] + '@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==} cpu: [ppc64] os: [linux] libc: [glibc] + '@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==} cpu: [ppc64] os: [linux] libc: [musl] + '@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==} cpu: [riscv64] os: [linux] libc: [glibc] + '@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==} cpu: [riscv64] os: [linux] libc: [musl] + '@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==} cpu: [s390x] os: [linux] libc: [glibc] + '@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==} cpu: [x64] os: [linux] libc: [glibc] + '@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==} cpu: [x64] os: [linux] libc: [musl] + '@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==} cpu: [x64] os: [openbsd] + '@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==} cpu: [arm64] os: [openharmony] + '@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==} cpu: [arm64] os: [win32] + '@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==} cpu: [ia32] os: [win32] + '@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==} cpu: [x64] os: [win32] + '@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==} cpu: [x64] os: [win32] + '@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==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + '@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 + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -3775,39 +3918,39 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.59.1': - resolution: {integrity: sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==} + '@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.59.1 + '@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.59.1': - resolution: {integrity: sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==} + '@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.59.1': - resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} + '@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.59.1': - resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} + '@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.59.1': - resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} + '@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.59.1': - resolution: {integrity: sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==} + '@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 @@ -3817,21 +3960,25 @@ packages: resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.1': - resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} + '@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.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.59.1': - resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} + '@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.59.1': - resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} + '@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': @@ -4103,8 +4250,8 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - algoliasearch@5.52.0: - resolution: {integrity: sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w==} + algoliasearch@5.52.1: + resolution: {integrity: sha512-fHA8+kXTbjagw3jkLiaS7KKrH8qe2DyOsiUhGlN4cdT77PEsfqXZl7ewDk1hsg+pJnPlnE50XtLxjR91iJOpmg==} engines: {node: '>= 14.0.0'} ansi-colors@4.1.3: @@ -4911,8 +5058,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==} @@ -7109,6 +7256,10 @@ packages: resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} @@ -7185,12 +7336,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.42.0: - resolution: {integrity: sha512-T4zXokk/izH01fYPhyyev1A4piWiOKrYq7CUFpdoYQxmOnXoV6YjUabmfIjCYkNspSoAXIxRid3Tw+Vg0fthYg==} + puppeteer-core@24.43.0: + resolution: {integrity: sha512-cCRNXsUlhyPoKDz6+TiSpfZpRS3mD6Y1YFKhkdr6ik6TMfuJb7fAtXq9ThUFc4sphxObDk3BuAvdxc1Y6YOnqQ==} engines: {node: '>=18'} - puppeteer@24.42.0: - resolution: {integrity: sha512-94MoPfFp2eY3eYIMdINkez4IOP5TMHntlZbVx06fHlQTtiQiYgaY0L2Zzfod8PVUkPqP7m3Qlre2v8YS8cudPA==} + puppeteer@24.43.0: + resolution: {integrity: sha512-DRnMFz+J3s4lFUQcjqKl0/7h0jzlCZuUFU9lNjtKrnMl5WI1RwCaIItpHVu9empuPyUreYueN0sUW3/pnfdqsg==} engines: {node: '>=18'} hasBin: true @@ -7371,8 +7522,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@1.0.0-rc.18: - resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7402,6 +7553,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.60.3: + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -7874,8 +8030,8 @@ packages: uglify-js: optional: true - terser@5.46.2: - resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} + terser@5.47.1: + resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} engines: {node: '>=10'} hasBin: true @@ -8233,6 +8389,46 @@ packages: yaml: optional: true + vite@7.3.3: + resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@4.1.5: resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -8568,8 +8764,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.4.2: - resolution: {integrity: sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} zone.js@0.16.1: resolution: {integrity: sha512-dpvY17vxYIW3+bNrP0ClUlaiY0CiIRK3tnoLaGoQsQcY9/I/NpzIWQ7tQNhbV7LacQMpCII6wVzuL3tuWOyfuA==} @@ -8592,89 +8788,89 @@ snapshots: '@actions/io@3.0.2': {} - '@algolia/abtesting@1.18.0': + '@algolia/abtesting@1.18.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/client-abtesting@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/client-analytics@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': {} + '@algolia/client-common@5.52.1': {} - '@algolia/client-insights@5.52.0': + '@algolia/client-insights@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/client-personalization@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/client-query-suggestions@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/client-search@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/ingestion@1.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/monitoring@1.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/recommend@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + '@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.52.0': + '@algolia/requester-browser-xhr@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 + '@algolia/client-common': 5.52.1 - '@algolia/requester-fetch@5.52.0': + '@algolia/requester-fetch@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 + '@algolia/client-common': 5.52.1 - '@algolia/requester-node-http@5.52.0': + '@algolia/requester-node-http@5.52.1': dependencies: - '@algolia/client-common': 5.52.0 + '@algolia/client-common': 5.52.1 '@ampproject/remapping@2.3.0': dependencies: @@ -8737,7 +8933,7 @@ snapshots: '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - zod: 4.4.2 + zod: 4.4.3 '@angular/localize@22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10)': dependencies: @@ -8760,12 +8956,12 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': dependencies: '@actions/core': 3.0.1 '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) + '@google/genai': 1.50.1(@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 @@ -8815,7 +9011,7 @@ snapshots: which: 6.0.1 yaml: 2.8.3 yargs: 18.0.0 - zod: 4.4.2 + zod: 4.4.3 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' @@ -9265,7 +9461,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) @@ -9442,7 +9638,7 @@ 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.3(@babel/core@7.29.0)': + '@babel/preset-env@7.29.5(@babel/core@7.29.0)': dependencies: '@babel/compat-data': 7.29.3 '@babel/core': 7.29.0 @@ -9484,7 +9680,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) @@ -10232,14 +10428,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.2))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': + '@google/genai@1.50.1(@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.6 ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.2) + '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) transitivePeerDependencies: - bufferutil - supports-color @@ -10612,7 +10808,7 @@ snapshots: '@lmdb/lmdb-win32-x64@3.5.4': optional: true - '@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)': + '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.16) ajv: 8.20.0 @@ -10629,8 +10825,8 @@ snapshots: json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.4.2 - zod-to-json-schema: 3.25.2(zod@4.4.2) + zod: 4.4.3 + zod-to-json-schema: 3.25.2(zod@4.4.3) transitivePeerDependencies: - supports-color @@ -10943,7 +11139,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.40.0': {} - '@oxc-project/types@0.128.0': {} + '@oxc-project/types@0.129.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -11148,7 +11344,7 @@ snapshots: '@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 @@ -11163,64 +11359,64 @@ snapshots: - react-native-b4a - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.18': + '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.18': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/pluginutils@1.0.0-rc.18': {} + '@rolldown/pluginutils@1.0.0': {} - '@rollup/plugin-alias@6.0.0(rollup@4.60.2)': + '@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) @@ -11228,7 +11424,7 @@ 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)': dependencies: @@ -11236,15 +11432,21 @@ snapshots: optionalDependencies: rollup: 4.60.2 - '@rollup/plugin-node-resolve@16.0.3(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.3 + + '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.3)': + dependencies: + '@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)': dependencies: @@ -11254,87 +11456,176 @@ snapshots: optionalDependencies: rollup: 4.60.2 + '@rollup/pluginutils@5.3.0(rollup@4.60.3)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.3 + '@rollup/rollup-android-arm-eabi@4.60.2': optional: true + '@rollup/rollup-android-arm-eabi@4.60.3': + optional: true + '@rollup/rollup-android-arm64@4.60.2': optional: true + '@rollup/rollup-android-arm64@4.60.3': + optional: true + '@rollup/rollup-darwin-arm64@4.60.2': optional: true + '@rollup/rollup-darwin-arm64@4.60.3': + optional: true + '@rollup/rollup-darwin-x64@4.60.2': optional: true + '@rollup/rollup-darwin-x64@4.60.3': + optional: true + '@rollup/rollup-freebsd-arm64@4.60.2': optional: true + '@rollup/rollup-freebsd-arm64@4.60.3': + optional: true + '@rollup/rollup-freebsd-x64@4.60.2': optional: true + '@rollup/rollup-freebsd-x64@4.60.3': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.60.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.60.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.60.3': + optional: true + '@rollup/rollup-linux-arm64-musl@4.60.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.60.3': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.60.2': optional: true + '@rollup/rollup-linux-loong64-gnu@4.60.3': + optional: true + '@rollup/rollup-linux-loong64-musl@4.60.2': optional: true + '@rollup/rollup-linux-loong64-musl@4.60.3': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.60.2': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + optional: true + '@rollup/rollup-linux-ppc64-musl@4.60.2': optional: true + '@rollup/rollup-linux-ppc64-musl@4.60.3': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.60.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.60.2': optional: true + '@rollup/rollup-linux-riscv64-musl@4.60.3': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.60.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.60.3': + optional: true + '@rollup/rollup-linux-x64-gnu@4.60.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.60.3': + optional: true + '@rollup/rollup-linux-x64-musl@4.60.2': optional: true + '@rollup/rollup-linux-x64-musl@4.60.3': + optional: true + '@rollup/rollup-openbsd-x64@4.60.2': optional: true + '@rollup/rollup-openbsd-x64@4.60.3': + optional: true + '@rollup/rollup-openharmony-arm64@4.60.2': optional: true + '@rollup/rollup-openharmony-arm64@4.60.3': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.60.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.60.3': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.60.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.60.3': + optional: true + '@rollup/rollup-win32-x64-gnu@4.60.2': optional: true + '@rollup/rollup-win32-x64-gnu@4.60.3': + optional: true + '@rollup/rollup-win32-x64-msvc@4.60.2': optional: true + '@rollup/rollup-win32-x64-msvc@4.60.3': + optional: true + '@rollup/wasm-node@4.60.2': dependencies: '@types/estree': 1.0.8 optionalDependencies: fsevents: 2.3.3 + '@rollup/wasm-node@4.60.3': + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + '@rtsao/scc@1.1.0': {} '@sigstore/bundle@4.0.0': @@ -11701,14 +11992,14 @@ snapshots: '@types/node': 22.19.17 optional: true - '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/type-utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 eslint: 10.3.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -11717,41 +12008,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.1 + '@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.3.0(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.1(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) - '@typescript-eslint/types': 8.59.1 + '@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.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.1': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/visitor-keys': 8.59.1 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.59.1(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/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.6.1))(typescript@6.0.3) debug: 4.4.3(supports-color@10.2.2) eslint: 10.3.0(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.3) @@ -11761,12 +12052,14 @@ snapshots: '@typescript-eslint/types@8.59.1': {} - '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': + '@typescript-eslint/types@8.59.2': {} + + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/visitor-keys': 8.59.1 + '@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 @@ -11776,20 +12069,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.59.1 - '@typescript-eslint/types': 8.59.1 - '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/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.6.1) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.1': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 '@verdaccio/auth@8.0.0-next-8.37': @@ -11970,9 +12263,9 @@ snapshots: lodash: 4.18.1 minimatch: 7.4.9 - '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.3(@types/node@24.12.2)(jiti@2.6.1)(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.2)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.3(@types/node@24.12.2)(jiti@2.6.1)(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.5(vitest@4.1.5)': dependencies: @@ -11986,7 +12279,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) '@vitest/expect@4.1.5': dependencies: @@ -11997,13 +12290,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4))': + '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(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.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(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': dependencies: @@ -12200,22 +12493,22 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.52.0: - dependencies: - '@algolia/abtesting': 1.18.0 - '@algolia/client-abtesting': 5.52.0 - '@algolia/client-analytics': 5.52.0 - '@algolia/client-common': 5.52.0 - '@algolia/client-insights': 5.52.0 - '@algolia/client-personalization': 5.52.0 - '@algolia/client-query-suggestions': 5.52.0 - '@algolia/client-search': 5.52.0 - '@algolia/ingestion': 1.52.0 - '@algolia/monitoring': 1.52.0 - '@algolia/recommend': 5.52.0 - '@algolia/requester-browser-xhr': 5.52.0 - '@algolia/requester-fetch': 5.52.0 - '@algolia/requester-node-http': 5.52.0 + 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: {} @@ -12340,13 +12633,13 @@ snapshots: atomic-sleep@1.0.0: {} - autoprefixer@10.5.0(postcss@8.5.13): + autoprefixer@10.5.0(postcss@8.5.14): dependencies: browserslist: 4.28.2 caniuse-lite: 1.0.30001791 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.13 + postcss: 8.5.14 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -12458,9 +12751,9 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.1.0 picocolors: 1.1.1 - postcss: 8.5.13 + postcss: 8.5.14 postcss-media-query-parser: 0.2.3 - postcss-safe-parser: 7.0.1(postcss@8.5.13) + postcss-safe-parser: 7.0.1(postcss@8.5.14) before-after-hook@4.0.0: {} @@ -12717,9 +13010,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 @@ -12912,12 +13205,12 @@ snapshots: css-loader@7.1.4(webpack@5.106.2(esbuild@0.28.0)): dependencies: - icss-utils: 5.1.0(postcss@8.5.13) - postcss: 8.5.13 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.13) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.13) - postcss-modules-scope: 3.2.1(postcss@8.5.13) - postcss-modules-values: 4.0.0(postcss@8.5.13) + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.14) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.14) + postcss-modules-scope: 3.2.1(postcss@8.5.14) + postcss-modules-values: 4.0.0(postcss@8.5.14) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: @@ -13061,7 +13354,7 @@ snapshots: dev-ip@1.0.1: {} - devtools-protocol@0.0.1595872: {} + devtools-protocol@0.0.1608973: {} di@0.0.1: {} @@ -13397,17 +13690,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) eslint: 10.3.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13418,7 +13711,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.3.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)) hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13430,7 +13723,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14250,9 +14543,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.13): + icss-utils@5.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.13 + postcss: 8.5.14 idb@7.1.1: {} @@ -15618,11 +15911,11 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.1(postcss@8.5.13)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)): + postcss-loader@8.2.1(postcss@8.5.14)(typescript@6.0.3)(webpack@5.106.2(esbuild@0.28.0)): dependencies: cosmiconfig: 9.0.1(typescript@6.0.3) jiti: 2.6.1 - postcss: 8.5.13 + postcss: 8.5.14 semver: 7.7.4 optionalDependencies: webpack: 5.106.2(esbuild@0.28.0) @@ -15631,30 +15924,30 @@ snapshots: postcss-media-query-parser@0.2.3: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.13): + postcss-modules-extract-imports@3.1.0(postcss@8.5.14): dependencies: - postcss: 8.5.13 + postcss: 8.5.14 - postcss-modules-local-by-default@4.2.0(postcss@8.5.13): + postcss-modules-local-by-default@4.2.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.13) - postcss: 8.5.13 + 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.13): + postcss-modules-scope@3.2.1(postcss@8.5.14): dependencies: - postcss: 8.5.13 + postcss: 8.5.14 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.13): + postcss-modules-values@4.0.0(postcss@8.5.14): dependencies: - icss-utils: 5.1.0(postcss@8.5.13) - postcss: 8.5.13 + icss-utils: 5.1.0(postcss@8.5.14) + postcss: 8.5.14 - postcss-safe-parser@7.0.1(postcss@8.5.13): + postcss-safe-parser@7.0.1(postcss@8.5.14): dependencies: - postcss: 8.5.13 + postcss: 8.5.14 postcss-selector-parser@7.1.1: dependencies: @@ -15669,6 +15962,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + powershell-utils@0.1.0: {} prelude-ls@1.2.1: {} @@ -15751,12 +16050,12 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.42.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 + 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) @@ -15768,13 +16067,13 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.42.0(bufferutil@4.1.0)(typescript@6.0.3)(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) + '@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.1595872 - puppeteer-core: 24.42.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + 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 @@ -15946,7 +16245,7 @@ snapshots: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.5.13 + postcss: 8.5.14 source-map: 0.6.1 resolve@1.22.12: @@ -16002,26 +16301,26 @@ snapshots: dependencies: glob: 10.5.0 - rolldown@1.0.0-rc.18: + rolldown@1.0.0: dependencies: - '@oxc-project/types': 0.128.0 - '@rolldown/pluginutils': 1.0.0-rc.18 + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-x64': 1.0.0-rc.18 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 rollup-license-plugin@3.2.1: dependencies: @@ -16041,10 +16340,21 @@ snapshots: optionalDependencies: '@babel/code-frame': 7.29.0 - rollup-plugin-sourcemaps2@0.5.6(@types/node@22.19.17)(rollup@4.60.2): + rollup-plugin-dts@6.4.1(rollup@4.60.3)(typescript@6.0.3): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) - rollup: 4.60.2 + '@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.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.3): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) + rollup: 4.60.3 optionalDependencies: '@types/node': 22.19.17 @@ -16079,6 +16389,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.60.2 fsevents: 2.3.3 + rollup@4.60.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@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: dependencies: debug: 4.4.3(supports-color@10.2.2) @@ -16689,12 +17030,12 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.46.2 + terser: 5.47.1 webpack: 5.106.2(esbuild@0.28.0) optionalDependencies: esbuild: 0.28.0 - terser@5.46.2: + terser@5.47.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -17047,13 +17388,31 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4): + vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(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.13 - 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 + less: 4.6.4 + sass: 1.99.0 + terser: 5.47.1 + tsx: 4.21.0 + yaml: 2.8.4 + + vite@7.3.3(@types/node@24.12.2)(jiti@2.6.1)(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.14 + rollup: 4.60.3 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.2 @@ -17061,14 +17420,14 @@ snapshots: jiti: 2.6.1 less: 4.6.4 sass: 1.99.0 - terser: 5.46.2 + terser: 5.47.1 tsx: 4.21.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.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4): + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.4)) + '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(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 @@ -17085,7 +17444,7 @@ snapshots: 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.2)(tsx@4.21.0)(yaml@2.8.4) + vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(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 @@ -17439,12 +17798,12 @@ snapshots: yoctocolors@2.1.2: {} - zod-to-json-schema@3.25.2(zod@4.4.2): + zod-to-json-schema@3.25.2(zod@4.4.3): dependencies: - zod: 4.4.2 + zod: 4.4.3 zod@3.25.76: {} - zod@4.4.2: {} + zod@4.4.3: {} zone.js@0.16.1: {} From dd5ceb02d9886fd44a4f03916d90eff2fa02afcc Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Mon, 11 May 2026 08:50:46 +0000 Subject: [PATCH 56/82] build: update cross-repo angular dependencies See associated pull request for more information. Closes #33118 as a pr takeover --- MODULE.bazel | 6 +- MODULE.bazel.lock | 30 +- modules/testing/builder/package.json | 2 +- package.json | 28 +- packages/angular/build/package.json | 2 +- .../src/builders/application/execute-build.ts | 5 +- .../node/src/common-engine/common-engine.ts | 2 + packages/angular/ssr/package.json | 12 +- .../angular_devkit/build_angular/package.json | 2 +- packages/ngtools/webpack/package.json | 4 +- pnpm-lock.yaml | 646 +++++------------- tests/e2e/ng-snapshot/package.json | 32 +- tests/e2e/tests/build/chunk-optimizer-env.ts | 4 - 13 files changed, 239 insertions(+), 536 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 880cf3ce8662..a871d4677b5c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -19,21 +19,21 @@ bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4") bazel_dep(name = "rules_angular") git_override( module_name = "rules_angular", - commit = "b1d295334e70335dab7ac9984a989fae0a9c9dc2", + commit = "19914e2fb677d50b16360dcea8740a1b0dd46172", remote = "https://github.com/angular/rules_angular.git", ) bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "48c48fa3848de5bb0ec1c3203558f099765165ab", + commit = "f91b383e3128872b21f709d2ae7543344c65526d", remote = "https://github.com/angular/dev-infra.git", ) bazel_dep(name = "rules_browsers") git_override( module_name = "rules_browsers", - commit = "b03f09ef28a08f8ae07482851cf5ecbf6ac23a2a", + commit = "bf27ea46fdbb0209526ca821f1500d4337eb8299", remote = "https://github.com/angular/rules_browsers.git", ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 06eb02660a88..2d94cce72e38 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", @@ -87,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", @@ -96,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", @@ -195,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", @@ -215,7 +219,7 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "RJZEFwxTtTSj8BUT6RYAEkcq8BHH9IVPJ//T0MDu3sA=", + "bzlTransitiveDigest": "MQJLDxT19qO8UDYhAPbY8zMo2QMI4yt9q7XhDFjLO7s=", "usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -430,7 +434,7 @@ }, "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { - "bzlTransitiveDigest": "dhTbv9E6UfT1WJmmu3ORRPO6AKFJvgBjBxu+BO+u1RY=", + "bzlTransitiveDigest": "cqZ07zAB92ofKybw48WmPNKyNQHaGZ7YVkj1SNs+f7c=", "usagesDigest": "QQqokxpCVnBJntX7dhxnf/c13LeWUQxDTUnILYCp4Jc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -494,7 +498,7 @@ "@@aspect_tools_telemetry+//:extension.bzl%telemetry": { "general": { "bzlTransitiveDigest": "cl5A2O84vDL6Tt+Qga8FCj1DUDGqn+e7ly5rZ+4xvcc=", - "usagesDigest": "0S2z9G3E1NIz6vCXk9IbRcO5LIckEcYVMSzRj2sEML8=", + "usagesDigest": "y/K1vMLYhlZhrdyg3UqaV3wb1hAy8ECSy2ibeBFcFZ0=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -503,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" @@ -948,7 +952,7 @@ "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "oZFClfRhTTwsYzpxVPkOpOt/r0+OzEfEV37au0jFZ0s=", - "usagesDigest": "bqCPXHiIs2yi6xo5XEjRzQJ3R8k+nwCWvizzoGSa3X8=", + "usagesDigest": "1vNEgfiNUxoLsAqSjuJplr7ufUJPhlDmiGBSws/ow1s=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -5338,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/modules/testing/builder/package.json b/modules/testing/builder/package.json index 705e97cb7ea8..9e67f25c024f 100644 --- a/modules/testing/builder/package.json +++ b/modules/testing/builder/package.json @@ -8,7 +8,7 @@ "browser-sync": "3.0.4", "istanbul-lib-instrument": "6.0.3", "jsdom": "29.1.1", - "ng-packagr": "22.0.0-next.3", + "ng-packagr": "22.0.0-next.4", "rxjs": "7.8.2", "vitest": "4.1.5" } diff --git a/package.json b/package.json index 08ad303bb96b..8386a9fdd88e 100644 --- a/package.json +++ b/package.json @@ -42,23 +42,23 @@ }, "homepage": "https://github.com/angular/angular-cli", "dependencies": { - "@angular/compiler-cli": "22.0.0-next.10", + "@angular/compiler-cli": "22.0.0-next.12", "typescript": "6.0.3" }, "devDependencies": { - "@angular/animations": "22.0.0-next.10", - "@angular/cdk": "22.0.0-next.7", - "@angular/common": "22.0.0-next.10", - "@angular/compiler": "22.0.0-next.10", - "@angular/core": "22.0.0-next.10", - "@angular/forms": "22.0.0-next.10", - "@angular/localize": "22.0.0-next.10", - "@angular/material": "22.0.0-next.7", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904", - "@angular/platform-browser": "22.0.0-next.10", - "@angular/platform-server": "22.0.0-next.10", - "@angular/router": "22.0.0-next.10", - "@angular/service-worker": "22.0.0-next.10", + "@angular/animations": "22.0.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#f084e2e88e71cdca8098489e6104ffcdbd9a8eda", + "@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", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index 406d81793c3d..eee9f1dba686 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -53,7 +53,7 @@ "istanbul-lib-instrument": "6.0.3", "jsdom": "29.1.1", "less": "4.6.4", - "ng-packagr": "22.0.0-next.3", + "ng-packagr": "22.0.0-next.4", "postcss": "8.5.14", "rolldown": "1.0.0", "rxjs": "7.8.2", diff --git a/packages/angular/build/src/builders/application/execute-build.ts b/packages/angular/build/src/builders/application/execute-build.ts index 5935cfcc0615..a6984a935dc0 100644 --- a/packages/angular/build/src/builders/application/execute-build.ts +++ b/packages/angular/build/src/builders/application/execute-build.ts @@ -161,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( diff --git a/packages/angular/ssr/node/src/common-engine/common-engine.ts b/packages/angular/ssr/node/src/common-engine/common-engine.ts index 708d263cde84..0c97c20d891a 100644 --- a/packages/angular/ssr/node/src/common-engine/common-engine.ts +++ b/packages/angular/ssr/node/src/common-engine/common-engine.ts @@ -200,6 +200,8 @@ export class CommonEngine { const commonRenderingOptions = { url: opts.url, document, + // Validation is already happened in the render method. + allowedHosts: ['*'], }; return isBootstrapFn(moduleOrFactory) diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index 9cfd3d126e0a..9350871fbd2a 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -29,12 +29,12 @@ }, "devDependencies": { "@angular-devkit/schematics": "workspace:*", - "@angular/common": "22.0.0-next.10", - "@angular/compiler": "22.0.0-next.10", - "@angular/core": "22.0.0-next.10", - "@angular/platform-browser": "22.0.0-next.10", - "@angular/platform-server": "22.0.0-next.10", - "@angular/router": "22.0.0-next.10", + "@angular/common": "22.0.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", + "@angular/platform-server": "22.0.0-next.12", + "@angular/router": "22.0.0-next.12", "@schematics/angular": "workspace:*", "beasties": "0.4.2" }, diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index bbfafe203523..64c017e2789a 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -66,7 +66,7 @@ "devDependencies": { "@angular/ssr": "workspace:*", "browser-sync": "3.0.4", - "ng-packagr": "22.0.0-next.3", + "ng-packagr": "22.0.0-next.4", "undici": "8.2.0" }, "peerDependencies": { diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 00924ddef652..61ff96362055 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", - "@angular/compiler": "22.0.0-next.10", - "@angular/compiler-cli": "22.0.0-next.10", + "@angular/compiler": "22.0.0-next.12", + "@angular/compiler-cli": "22.0.0-next.12", "typescript": "6.0.3", "webpack": "5.106.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00bc534f59c3..7dd3444053d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,8 +14,8 @@ importers: .: dependencies: '@angular/compiler-cli': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3) typescript: specifier: 6.0.3 version: 6.0.3 @@ -26,44 +26,44 @@ importers: built: true devDependencies: '@angular/animations': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.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.1)) '@angular/cdk': - specifier: 22.0.0-next.7 - version: 22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.0-next.8 + 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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) '@angular/common': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.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.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10 + specifier: 22.0.0-next.12 + version: 22.0.0-next.12 '@angular/core': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/forms': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) '@angular/localize': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10) + specifier: 22.0.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.7 - version: 22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133) + specifier: 22.0.0-next.8 + version: 22.0.0-next.8(fefe8b2296e695d2951e1d6c8f20881e) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4de8a14a1682d0f07e0b14a3b26498757c195904 - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#f084e2e88e71cdca8098489e6104ffcdbd9a8eda + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) '@angular/platform-browser': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.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.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.1))(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.1)) '@angular/platform-server': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) '@angular/service-worker': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.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.1))(rxjs@7.8.2) '@babel/core': specifier: 7.29.0 version: 7.29.0 @@ -326,8 +326,8 @@ importers: specifier: 29.1.1 version: 29.1.1 ng-packagr: - specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.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 @@ -429,8 +429,8 @@ importers: specifier: 4.6.4 version: 4.6.4 ng-packagr: - specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.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.14 version: 8.5.14 @@ -527,23 +527,23 @@ importers: specifier: workspace:* version: link:../../angular_devkit/schematics '@angular/common': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) + specifier: 22.0.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.1))(rxjs@7.8.2) '@angular/compiler': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10 + specifier: 22.0.0-next.12 + version: 22.0.0-next.12 '@angular/core': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1) '@angular/platform-browser': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + specifier: 22.0.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.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.1))(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.1)) '@angular/platform-server': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) '@angular/router': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) + specifier: 22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular @@ -729,8 +729,8 @@ importers: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: - specifier: 22.0.0-next.3 - version: 22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3) + specifier: 22.0.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.2.0 version: 8.2.0 @@ -822,11 +822,11 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../angular_devkit/core '@angular/compiler': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10 + specifier: 22.0.0-next.12 + version: 22.0.0-next.12 '@angular/compiler-cli': - specifier: 22.0.0-next.10 - version: 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) + specifier: 22.0.0-next.12 + version: 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3) typescript: specifier: 6.0.3 version: 6.0.3 @@ -935,47 +935,47 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular/animations@22.0.0-next.10': - resolution: {integrity: sha512-o4YxddwSuqW/l+Mot35Se/k3H/7tarFDjppHaf7IEPmZVqRz2+6/LLfmv51RuSZmtt5L+0FIFmazFmS+3+wRNw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/animations@22.0.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.10 + '@angular/core': 22.0.0-next.12 - '@angular/cdk@22.0.0-next.7': - resolution: {integrity: sha512-dAJexPGuFn6LwHNRJU2UVNcv0pL8VZzGdcaTs77dPKAR0W8V42/EhFR02SvondsYMA7kpfLLBjVdH5ckwsTCkA==} + '@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.10': - resolution: {integrity: sha512-AqcFvnjCMjwS9wNxCWMTy+tQH1Kr6HTHgyqBgDWP01Y4NDLicJSGtU99fZ7KXsalHyZyXmYqqZqvmyeCIzweqw==} - 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.10 + '@angular/core': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@22.0.0-next.10': - resolution: {integrity: sha512-kCV2elmGIVu+k0UydnWnGgiNEvmCe6diyXntz7Hw3Ynuap62/ZiiLcHZVJRGhuei7TIUu6qoNAKHj7jm8pQ2xw==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/compiler-cli@22.0.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.10 + '@angular/compiler': 22.0.0-next.12 typescript: '>=6.0 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@22.0.0-next.10': - resolution: {integrity: sha512-EQKOrWGiZjZ5Jd4cV9wGxvqcS/8dfXIpo4hsvDQLvNGHQL3uVZqlCH+M6+iEahEYXO/u7QLcilDtOJ1jfwqbyQ==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/compiler@22.0.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.10': - resolution: {integrity: sha512-L/uE6f8U+2aqzgNTq1OQbquV090kpR/lyOsnmtP4cZSUTPPG0fnIyA2ct3ycifw4xxpxEwhOv2VYQ4EYRyWb5w==} - 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.10 + '@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.10': - resolution: {integrity: sha512-3RMIm2LmJwBSzQMIpv90ZAZfkkObW0Yq1GrpyJKv1U8lIQWcNnib1e9RIFVVMhTDk5+MRzpPH8Z5lAeo8yLAeg==} - 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.10 - '@angular/core': 22.0.0-next.10 - '@angular/platform-browser': 22.0.0-next.10 + '@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.10': - resolution: {integrity: sha512-AuNQIl1OI1Lgje4KflwIlV7wEFQPE9WyNA8SgCR4Eief9N3TO4couzlfxUp72lq7eB13mCclScixiTZ+ys4aTA==} - 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.10 - '@angular/compiler-cli': 22.0.0-next.10 + '@angular/compiler': 22.0.0-next.12 + '@angular/compiler-cli': 22.0.0-next.12 - '@angular/material@22.0.0-next.7': - resolution: {integrity: sha512-yRmvcm7qrR43GTG33czQ988bCnvspZBadOpA8uci1UHsLF76T/v6U1BNVeM8bZYUofURtvLjyGDlggJmGYqRtg==} + '@angular/material@22.0.0-next.8': + resolution: {integrity: sha512-sQUXI2gzVv8DCryapqzYTgJNrCAh+p9ugEkUtUVORvVTyBG95pqYZ5SU9UZFkqoSR/FHGDlbD7Fry/Jyuvrm0g==} peerDependencies: - '@angular/cdk': 22.0.0-next.7 + '@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/4de8a14a1682d0f07e0b14a3b26498757c195904': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904} - version: 0.0.0-e391d56ec4a9d89b4006515b0679350f1394d19a + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda} + version: 0.0.0-ba993c8a28db88485a5474bf9cc387dffd3eabd9 hasBin: true - '@angular/platform-browser@22.0.0-next.10': - resolution: {integrity: sha512-Gs4vo/2Mof1T4LCJUJuaPaQV18p0KpkrhWJ0gEVT6MFX/wjM1uuHvP25tPKYQysNzb2iaUTVcS8QwuX0HGPoJQ==} - engines: {node: ^22.22.0 || >=24.13.1} + '@angular/platform-browser@22.0.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.10 - '@angular/common': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10 + '@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.10': - resolution: {integrity: sha512-KTtW83mQfmwlyzUhf3oS+M7WzrYYB+0apkmEAw+7HuvsGbAcAFO9ltzhykPwfslwwEV6mqbkGJRFxtkpqMQGqA==} - 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.10 - '@angular/compiler': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10 - '@angular/platform-browser': 22.0.0-next.10 + '@angular/common': 22.0.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.10': - resolution: {integrity: sha512-IV28yTF+HM4SBGJGaHEwdDNr3ASLfjQhBuKSKoUy4Yf5vg87qZzbZnXIFo1jQWmbAu7lnFMMTfuLqnwHl07dAQ==} - 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.10 - '@angular/core': 22.0.0-next.10 - '@angular/platform-browser': 22.0.0-next.10 + '@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.10': - resolution: {integrity: sha512-E72wxCjc/Oha0t0paXIjDUqfuak8ZMglmx7pCmZC50/84Nu1BkZ/d542nAAyVDVfiQl4wZWTBpD2DoHc7KWe+g==} - 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.10 + '@angular/core': 22.0.0-next.12 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@5.1.11': @@ -2287,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 @@ -3336,287 +3336,144 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.2': - resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} - cpu: [arm] - os: [android] - '@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==} - cpu: [arm64] - os: [android] - '@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==} - cpu: [arm64] - os: [darwin] - '@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==} - cpu: [x64] - os: [darwin] - '@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==} - cpu: [arm64] - os: [freebsd] - '@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==} - cpu: [x64] - os: [freebsd] - '@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==} - cpu: [arm] - os: [linux] - libc: [glibc] - '@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==} - cpu: [arm] - os: [linux] - libc: [musl] - '@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==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@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==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@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==} - cpu: [loong64] - os: [linux] - libc: [glibc] - '@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==} - cpu: [loong64] - os: [linux] - libc: [musl] - '@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==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@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==} - cpu: [ppc64] - os: [linux] - libc: [musl] - '@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==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@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==} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@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==} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@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==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@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==} - cpu: [x64] - os: [linux] - libc: [musl] - '@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==} - cpu: [x64] - os: [openbsd] - '@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==} - cpu: [arm64] - os: [openharmony] - '@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==} - cpu: [arm64] - os: [win32] - '@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==} - cpu: [ia32] - os: [win32] - '@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==} - cpu: [x64] - os: [win32] - '@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==} - cpu: [x64] - os: [win32] - '@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==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - '@rollup/wasm-node@4.60.3': resolution: {integrity: sha512-SVhQ4TJk0BvnJKwceVsCWHtmquucfjU0eu+Bonrjb6W3zombkA/tqw1efaqT2BONX/TJniqkzumF6Sz/sXMJ2w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -6800,9 +6657,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 @@ -6813,8 +6670,8 @@ packages: tailwindcss: optional: true - nock@14.0.13: - resolution: {integrity: sha512-SCPsQmGVNY8h1rfS3aU0MzOGYY+wKIFukHEsoSIwPRCYocZkya7MFIlWIEYPWQZj+Gaksg6EyUaY255ZDqpQuA==} + nock@14.0.14: + resolution: {integrity: sha512-PKk7tex0O3RRXUZC5XDKJ9yM3rYRPS13myduT85VIIYDBnib42Fpxoe6KxRSzqB4iL2NDxkcJ2yiskZ18hGLEQ==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} node-addon-api@6.1.0: @@ -7252,10 +7109,6 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.13: - resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.14: resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} @@ -7548,11 +7401,6 @@ packages: '@types/node': optional: true - rollup@4.60.2: - resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.60.3: resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -8711,11 +8559,6 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.8.4: resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==} engines: {node: '>= 14.6'} @@ -8877,29 +8720,29 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/animations@22.0.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.1))': dependencies: - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1) tslib: 2.8.1 - '@angular/cdk@22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/cdk@22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.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.1))(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.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.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.1))(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.1)) parse5: 8.0.1 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/common@22.0.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.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3)': + '@angular/compiler-cli@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(typescript@6.0.3)': dependencies: - '@angular/compiler': 22.0.0-next.10 + '@angular/compiler': 22.0.0-next.12 '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -8913,32 +8756,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@22.0.0-next.10': + '@angular/compiler@22.0.0-next.12': dependencies: tslib: 2.8.1 - '@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)': + '@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 22.0.0-next.10 + '@angular/compiler': 22.0.0-next.12 zone.js: 0.16.1 - '@angular/forms@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.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.1))(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.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.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.1))(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.1)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 zod: 4.4.3 - '@angular/localize@22.0.0-next.10(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(@angular/compiler@22.0.0-next.10)': + '@angular/localize@22.0.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.10 - '@angular/compiler-cli': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) + '@angular/compiler': 22.0.0-next.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 @@ -8946,22 +8789,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@22.0.0-next.7(1ee8d5fdc2f291e5a1da1bc147744133)': + '@angular/material@22.0.0-next.8(fefe8b2296e695d2951e1d6c8f20881e)': dependencies: - '@angular/cdk': 22.0.0-next.7(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/forms': 22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/cdk': 22.0.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.1))(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.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.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.1))(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.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.1))(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.1) + '@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.1))(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.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.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.1))(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.1)))(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.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.1))(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.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4de8a14a1682d0f07e0b14a3b26498757c195904(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': dependencies: '@actions/core': 3.0.1 '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(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) '@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 @@ -9001,7 +8844,7 @@ snapshots: jsonc-parser: 3.3.1 minimatch: 10.2.5 multimatch: 8.0.0 - nock: 14.0.13 + nock: 14.0.14 semver: 7.7.4 supports-color: 10.2.2 tsx: 4.21.0 @@ -9009,42 +8852,42 @@ snapshots: typescript: 6.0.3 utf-8-validate: 6.0.6 which: 6.0.1 - yaml: 2.8.3 + yaml: 2.8.4 yargs: 18.0.0 zod: 4.4.3 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' - '@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))': + '@angular/platform-browser@22.0.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.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.1))(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.1))': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/common': 22.0.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.1))(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.1) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/animations': 22.0.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.1)) - '@angular/platform-server@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/compiler@22.0.0-next.10)(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/platform-server@22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/compiler': 22.0.0-next.10 - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.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.1))(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.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.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.1))(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.1)) rxjs: 7.8.2 tslib: 2.8.1 xhr2: 0.2.1 - '@angular/router@22.0.0-next.10(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2)': + '@angular/router@22.0.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2)': dependencies: - '@angular/common': 22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2) - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) - '@angular/platform-browser': 22.0.0-next.10(@angular/animations@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1)) + '@angular/common': 22.0.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.1))(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.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.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.1))(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.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/service-worker@22.0.0-next.10(@angular/core@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2)': + '@angular/service-worker@22.0.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.1))(rxjs@7.8.2)': dependencies: - '@angular/core': 22.0.0-next.10(@angular/compiler@22.0.0-next.10)(rxjs@7.8.2)(zone.js@0.16.1) + '@angular/core': 22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1) rxjs: 7.8.2 tslib: 2.8.1 @@ -10428,7 +10271,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(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 @@ -11426,12 +11269,6 @@ snapshots: optionalDependencies: rollup: 4.60.3 - '@rollup/plugin-json@6.1.0(rollup@4.60.2)': - dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) - optionalDependencies: - rollup: 4.60.2 - '@rollup/plugin-json@6.1.0(rollup@4.60.3)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.3) @@ -11448,14 +11285,6 @@ snapshots: optionalDependencies: rollup: 4.60.3 - '@rollup/pluginutils@5.3.0(rollup@4.60.2)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.4 - optionalDependencies: - rollup: 4.60.2 - '@rollup/pluginutils@5.3.0(rollup@4.60.3)': dependencies: '@types/estree': 1.0.8 @@ -11464,162 +11293,81 @@ snapshots: optionalDependencies: rollup: 4.60.3 - '@rollup/rollup-android-arm-eabi@4.60.2': - optional: true - '@rollup/rollup-android-arm-eabi@4.60.3': optional: true - '@rollup/rollup-android-arm64@4.60.2': - optional: true - '@rollup/rollup-android-arm64@4.60.3': optional: true - '@rollup/rollup-darwin-arm64@4.60.2': - optional: true - '@rollup/rollup-darwin-arm64@4.60.3': optional: true - '@rollup/rollup-darwin-x64@4.60.2': - optional: true - '@rollup/rollup-darwin-x64@4.60.3': optional: true - '@rollup/rollup-freebsd-arm64@4.60.2': - optional: true - '@rollup/rollup-freebsd-arm64@4.60.3': optional: true - '@rollup/rollup-freebsd-x64@4.60.2': - optional: true - '@rollup/rollup-freebsd-x64@4.60.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.2': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.2': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.2': - optional: true - '@rollup/rollup-linux-arm64-musl@4.60.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.2': - optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.2': - optional: true - '@rollup/rollup-linux-loong64-musl@4.60.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.2': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.2': - optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.2': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.2': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.2': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.2': - optional: true - '@rollup/rollup-linux-x64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-x64-musl@4.60.2': - optional: true - '@rollup/rollup-linux-x64-musl@4.60.3': optional: true - '@rollup/rollup-openbsd-x64@4.60.2': - optional: true - '@rollup/rollup-openbsd-x64@4.60.3': optional: true - '@rollup/rollup-openharmony-arm64@4.60.2': - optional: true - '@rollup/rollup-openharmony-arm64@4.60.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.2': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.2': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.2': - optional: true - '@rollup/rollup-win32-x64-gnu@4.60.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.2': - optional: true - '@rollup/rollup-win32-x64-msvc@4.60.3': optional: true - '@rollup/wasm-node@4.60.2': - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - '@rollup/wasm-node@4.60.3': dependencies: '@types/estree': 1.0.8 @@ -15438,12 +15186,12 @@ snapshots: netmask@2.1.1: {} - ng-packagr@22.0.0-next.3(@angular/compiler-cli@22.0.0-next.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3))(tslib@2.8.1)(typescript@6.0.3): + ng-packagr@22.0.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.10(@angular/compiler@22.0.0-next.10)(typescript@6.0.3) - '@rollup/plugin-json': 6.1.0(rollup@4.60.2) - '@rollup/wasm-node': 4.60.2 + '@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 @@ -15456,17 +15204,17 @@ snapshots: less: 4.6.4 ora: 9.4.0 piscina: 5.1.4 - postcss: 8.5.13 - 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.13: + nock@14.0.14: dependencies: '@mswjs/interceptors': 0.41.8 json-stringify-safe: 5.0.1 @@ -15956,12 +15704,6 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.13: - dependencies: - nanoid: 3.3.12 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.14: dependencies: nanoid: 3.3.12 @@ -16329,17 +16071,6 @@ snapshots: semver: 7.7.4 spdx-expression-validate: 2.0.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 - typescript: 6.0.3 - optionalDependencies: - '@babel/code-frame': 7.29.0 - rollup-plugin-dts@6.4.1(rollup@4.60.3)(typescript@6.0.3): dependencies: '@jridgewell/remapping': 2.3.5 @@ -16358,37 +16089,6 @@ snapshots: optionalDependencies: '@types/node': 22.19.17 - rollup@4.60.2: - 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 - fsevents: 2.3.3 - rollup@4.60.3: dependencies: '@types/estree': 1.0.8 @@ -17750,8 +17450,6 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.3: {} - yaml@2.8.4: {} yargs-parser@20.2.9: {} diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 4940441713ff..d4e1fd4a3b19 100644 --- a/tests/e2e/ng-snapshot/package.json +++ b/tests/e2e/ng-snapshot/package.json @@ -2,21 +2,21 @@ "description": "snapshot versions of Angular for e2e testing", "private": true, "dependencies": { - "@angular/animations": "github:angular/animations-builds#75b67fb20e34c1690a19a732b3106e8f7f454fc6", - "@angular/cdk": "github:angular/cdk-builds#c72d7297744f01f13435202e10764c11fb0fbb98", - "@angular/common": "github:angular/common-builds#504daec05383ce402fdae16ae19a46f8d155d256", - "@angular/compiler": "github:angular/compiler-builds#4e3014c69a825409e6a2c827ceb0f89dd8f9405a", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#88464c173ccd1562c3bdfa22cfc725de2f75f255", - "@angular/core": "github:angular/core-builds#d91229659aa8ac4e3964fdf7cbfaa27a50c95f54", - "@angular/forms": "github:angular/forms-builds#6aba91146ca0274ab19a0fece82cbee84320dfb1", - "@angular/language-service": "github:angular/language-service-builds#76ebde7592c9feaa7bc872d68a1739b21feeaba9", - "@angular/localize": "github:angular/localize-builds#0de5d9668a484206dd63cf46e66808c98880e4eb", - "@angular/material": "github:angular/material-builds#26d021024aa905c5d42a4cd9b67f757a71ed7e3c", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#35cb51e92f3e8990842eae2e1bded148c0c6b0af", - "@angular/platform-browser": "github:angular/platform-browser-builds#bde6d33678b0ebbecc1a913d10d78fde8b29e863", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#60a4602660f1d5531ea88aaf725c2dac5b5e5ca5", - "@angular/platform-server": "github:angular/platform-server-builds#40d7868dc10c1cf638a3e2ba900f56940e61fca3", - "@angular/router": "github:angular/router-builds#300fe35fbdab61f9032627faddc9e2bbe645e1bf", - "@angular/service-worker": "github:angular/service-worker-builds#87dd428569f12a519f7e89679173a25fca2e2779" + "@angular/animations": "github:angular/animations-builds#bd3a434a99ebf09a8098d666c42e5646fb4c5711", + "@angular/cdk": "github:angular/cdk-builds#06248e11a309a454b9ac30f6e18e4e12c96f25af", + "@angular/common": "github:angular/common-builds#b7c6a8e28891dfa7ebf9e90c4b9019d913fe2842", + "@angular/compiler": "github:angular/compiler-builds#6fe948250ed116feefde4e98726df86f0c12dc46", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#de167999390564fa242f07272d9cca6e366a66ce", + "@angular/core": "github:angular/core-builds#e53fa344a5f670d06ec7f3eb1c35401a455e8841", + "@angular/forms": "github:angular/forms-builds#490e7e730b910d5e901bb55dd03e1c34fa7c90c9", + "@angular/language-service": "github:angular/language-service-builds#0b75c030531ab1dad9629f02ccbfabf24247cd2d", + "@angular/localize": "github:angular/localize-builds#5355950bc589ff115be5a11b9408fafea5147ea9", + "@angular/material": "github:angular/material-builds#942bd4bf832c27e0aa4435b55750a77555af7bc9", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#6d5fa3504b4685cb443ff1ea12bf6294f876da05", + "@angular/platform-browser": "github:angular/platform-browser-builds#71a1247ccaddfe722f3450dde189834ab842e895", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#2880d0153aa6bdd6a6398b0ec7bf0641a12aba1c", + "@angular/platform-server": "github:angular/platform-server-builds#48726fc18cc19ce910db6d176f4f92ddffff1ce4", + "@angular/router": "github:angular/router-builds#33d10905e36758a671d68bb1828cba4493f7bf51", + "@angular/service-worker": "github:angular/service-worker-builds#011f7afb9f86ba189a398650783dd93e716e85fe" } } diff --git a/tests/e2e/tests/build/chunk-optimizer-env.ts b/tests/e2e/tests/build/chunk-optimizer-env.ts index a7814ee7ac5c..5453b2e042d2 100644 --- a/tests/e2e/tests/build/chunk-optimizer-env.ts +++ b/tests/e2e/tests/build/chunk-optimizer-env.ts @@ -23,16 +23,12 @@ export default async function () { ...process.env, NG_BUILD_OPTIMIZE_CHUNKS: 'true', }); - const files1Opt = await readdir('dist/test-project/browser'); - const jsFiles1Opt = files1Opt.filter((f) => f.endsWith('.js')); // Build with forced off await execWithEnv('ng', ['build', '--output-hashing=none'], { ...process.env, NG_BUILD_OPTIMIZE_CHUNKS: 'false', }); - const files1Unopt = await readdir('dist/test-project/browser'); - const jsFiles1Unopt = files1Unopt.filter((f) => f.endsWith('.js')); // We just verify it runs without error. // With 1 chunk it might not be able to optimize further, so counts might be equal. From 4e3cc1e2d0d09bba88fcdb01e83cc02d33ce6f80 Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Mon, 11 May 2026 14:26:01 -0700 Subject: [PATCH 57/82] release: cut the v22.0.0-next.8 release --- CHANGELOG.md | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45ace1ba6263..0e24ea3e768d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,91 @@ + + +# 22.0.0-next.8 (2026-05-11) + +## 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-devkit/core + +- `stringToFileBuffer` and `fileBufferToString` are deprecated. Use standard Web APIs (`TextEncoder` and `TextDecoder`) instead. + + Internal usages within the repository have been removed and replaced with standard Web APIs. The public API golden file for `@angular-devkit/core` has been updated to reflect the deprecations. + +### @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 | +| [7932caaf9](https://github.com/angular/angular-cli/commit/7932caaf987c5692d6624f6af23e65ce3f6d27fd) | fix | robustly parse npm manifest from array | +| [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-devkit/core + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------- | +| [fd336d365](https://github.com/angular/angular-cli/commit/fd336d365dbfe8f558db177a8da24790914a541b) | refactor | deprecate stringToFileBuffer and fileBufferToString | + +### @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 | +| --------------------------------------------------------------------------------------------------- | -------- | --------------------------- | +| [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.10 (2026-05-06) diff --git a/package.json b/package.json index 8386a9fdd88e..ac8af45fecff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "22.0.0-next.7", + "version": "22.0.0-next.8", "private": true, "description": "Software Development Kit for Angular", "keywords": [ From 1178b8b2fa48234731600d5277db2a7a7d733a23 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 11 May 2026 20:55:53 +0000 Subject: [PATCH 58/82] build: update pnpm to v10.33.4 See associated pull request for more information. --- MODULE.bazel | 4 ++-- package.json | 4 ++-- pnpm-lock.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index a871d4677b5c..5d5cedf91936 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -131,8 +131,8 @@ use_repo( pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm") pnpm.pnpm( name = "pnpm", - pnpm_version = "10.33.2", - pnpm_version_integrity = "sha512-qQ+vb+6rca1sblf5Tg/hoS9dzCLNdU20CulZPraj4LaxLjVAIYuzeuCDQEsfLObbKkEh6XmCm0r/lLmfSdoc+A==", + pnpm_version = "10.33.4", + pnpm_version_integrity = "sha512-HGezs1my1AgRm6HtKJ80uPw8aHNBK+xv0mT73IJInlEPy+y5zp0i2ufzt2Jp2EQQRgFL3KU7mXnNelYa1jG4AA==", ) use_repo(pnpm, "pnpm") diff --git a/package.json b/package.json index ac8af45fecff..c588498bee05 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,12 @@ "type": "git", "url": "git+https://github.com/angular/angular-cli.git" }, - "packageManager": "pnpm@10.33.2", + "packageManager": "pnpm@10.33.4", "engines": { "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.2" + "pnpm": "10.33.4" }, "author": "Angular Authors", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7dd3444053d2..e5891bc1d537 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1012,7 +1012,7 @@ packages: rxjs: ^6.5.3 || ^7.4.0 '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda} + resolution: {gitHosted: true, tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda} version: 0.0.0-ba993c8a28db88485a5474bf9cc387dffd3eabd9 hasBin: true From 4c01bd1399b0aec8e4a8c17e2f7e6aa9fdafc23e Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 11 May 2026 21:49:01 +0000 Subject: [PATCH 59/82] build: update dependency bazel to v8.7.0 See associated pull request for more information. --- .bazelversion | 2 +- MODULE.bazel.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) 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/MODULE.bazel.lock b/MODULE.bazel.lock index 2d94cce72e38..f86336fd1c17 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -219,7 +219,7 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "MQJLDxT19qO8UDYhAPbY8zMo2QMI4yt9q7XhDFjLO7s=", + "bzlTransitiveDigest": "KFD6po3VH3bzbbFpfJYeoHrmWxJCThGGGTCGM9Url10=", "usagesDigest": "6We6zwGoawD9YXqMI0KPaxEKJTnamXBsuOekhFS2D40=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -434,7 +434,7 @@ }, "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { - "bzlTransitiveDigest": "cqZ07zAB92ofKybw48WmPNKyNQHaGZ7YVkj1SNs+f7c=", + "bzlTransitiveDigest": "oXZdaO5AFNj463wHR4NRAWU9XCc9wkl3rcZxqQoNWHQ=", "usagesDigest": "QQqokxpCVnBJntX7dhxnf/c13LeWUQxDTUnILYCp4Jc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -532,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" @@ -804,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": {}, @@ -887,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": {}, @@ -2603,7 +2603,7 @@ }, "@@rules_python+//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "gnOBzUu2hbOMXwy32CnPKpNrOsOEirGIas2EVtC8diM=", + "bzlTransitiveDigest": "1CieYf7PBGYmx4QxddIeJFyAiJ2OB1ah39h4F4rtjxo=", "usagesDigest": "AK1R124YPWwAs8z1CQYyjYuci8RO5Ofot+EP5ZCNQDc=", "recordedFileInputs": { "@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", From 98818b63c46fa021a34d530d1b9a58e346273345 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 12 May 2026 05:03:08 +0000 Subject: [PATCH 60/82] build: lock file maintenance See associated pull request for more information. --- pnpm-lock.yaml | 985 +++++++++++++++++++++++++++---------------------- 1 file changed, 534 insertions(+), 451 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5891bc1d537..c7361cce2380 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,43 +27,43 @@ importers: devDependencies: '@angular/animations': 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.1)) + 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.8 - 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.1))(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.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.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.1))(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.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.1))(rxjs@7.8.2) + 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.12 version: 22.0.0-next.12 '@angular/core': 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.1) + 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.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) + 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.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.8 - version: 22.0.0-next.8(fefe8b2296e695d2951e1d6c8f20881e) + version: 22.0.0-next.8(93ce75c341587667f5d7d40f3eefe13f) '@angular/ng-dev': specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#f084e2e88e71cdca8098489e6104ffcdbd9a8eda version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) '@angular/platform-browser': 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.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.1))(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.1)) + 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.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) + 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.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) + 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.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.1))(rxjs@7.8.2) + 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,13 +78,13 @@ importers: version: 0.28.0 '@eslint/compat': specifier: 2.0.5 - version: 2.0.5(eslint@10.3.0(jiti@2.6.1)) + version: 2.0.5(eslint@10.3.0(jiti@2.7.0)) '@eslint/eslintrc': specifier: 3.3.5 version: 3.3.5 '@eslint/js': specifier: 10.0.1 - version: 10.0.1(eslint@10.3.0(jiti@2.6.1)) + version: 10.0.1(eslint@10.3.0(jiti@2.7.0)) '@rollup/plugin-alias': specifier: ^6.0.0 version: 6.0.0(rollup@4.60.3) @@ -102,10 +102,10 @@ importers: version: 4.60.3 '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.10.0(eslint@10.3.0(jiti@2.6.1)) + version: 5.10.0(eslint@10.3.0(jiti@2.7.0)) '@tony.ganchev/eslint-plugin-header': specifier: ~3.4.0 - version: 3.4.4(eslint@10.3.0(jiti@2.6.1)) + version: 3.4.4(eslint@10.3.0(jiti@2.7.0)) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -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 @@ -174,10 +174,10 @@ importers: version: 1.1.9 '@typescript-eslint/eslint-plugin': specifier: 8.59.2 - version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + version: 8.59.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.59.2 - version: 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + version: 8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) ajv: specifier: 8.20.0 version: 8.20.0 @@ -192,13 +192,13 @@ importers: version: 0.28.0 eslint: specifier: 10.3.0 - version: 10.3.0(jiti@2.6.1) + version: 10.3.0(jiti@2.7.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@10.3.0(jiti@2.6.1)) + version: 10.1.8(eslint@10.3.0(jiti@2.7.0)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.59.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 @@ -273,7 +273,7 @@ importers: 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.3) + version: 0.5.6(@types/node@22.19.18)(rollup@4.60.3) semver: specifier: 7.7.4 version: 7.7.4 @@ -294,10 +294,10 @@ importers: version: 6.5.2(encoding@0.1.13) verdaccio-auth-memory: specifier: ^13.0.0 - version: 13.0.0 + version: 13.0.1 zone.js: specifier: ^0.16.0 - version: 0.16.1 + version: 0.16.2 modules/testing/builder: devDependencies: @@ -333,7 +333,7 @@ importers: version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) + 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.3(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) + 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 @@ -408,7 +408,7 @@ importers: version: 0.2.16 vite: specifier: 7.3.3 - version: 7.3.3(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) + 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 @@ -442,7 +442,7 @@ importers: version: 7.8.2 vitest: specifier: 4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) + 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 @@ -528,22 +528,22 @@ importers: version: link:../../angular_devkit/schematics '@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.1))(rxjs@7.8.2) + 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.12 version: 22.0.0-next.12 '@angular/core': 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.1) + 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.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.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.1))(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.1)) + 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.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) + 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.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.1))(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.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.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.1))(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.1)))(rxjs@7.8.2) + 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 @@ -618,16 +618,16 @@ importers: 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 @@ -648,16 +648,16 @@ importers: version: 4.6.4 less-loader: specifier: 12.3.2 - version: 12.3.2(less@4.6.4)(webpack@5.106.2(esbuild@0.28.0)) + version: 12.3.2(less@4.6.4)(webpack@5.106.2(esbuild@0.28.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 @@ -675,7 +675,7 @@ importers: version: 8.5.14 postcss-loader: specifier: 8.2.1 - version: 8.2.1(postcss@8.5.14)(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,13 +687,13 @@ importers: version: 1.99.0 sass-loader: specifier: 16.0.7 - version: 16.0.7(sass@1.99.0)(webpack@5.106.2(esbuild@0.28.0)) + version: 16.0.7(sass@1.99.0)(webpack@5.106.2(esbuild@0.28.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 @@ -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:* @@ -2309,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 @@ -2347,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' @@ -2365,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' @@ -2374,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' @@ -2383,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' @@ -2405,8 +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==} + '@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' @@ -2414,8 +2414,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.0.12': - resolution: {integrity: sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==} + '@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' @@ -2423,8 +2423,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.0.12': - resolution: {integrity: sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==} + '@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' @@ -2441,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' @@ -2450,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' @@ -2459,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' @@ -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==} @@ -3813,10 +3816,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.1': - resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.59.2': resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3846,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'} @@ -3858,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'} @@ -4336,8 +4335,8 @@ packages: bare-events: optional: true - bare-url@2.4.2: - resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==} + bare-url@2.4.3: + resolution: {integrity: sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4346,8 +4345,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.10.27: - resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -4407,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: @@ -4497,8 +4496,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001791: - resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4980,8 +4979,8 @@ packages: engines: {node: '>=0.12.18'} hasBin: true - electron-to-chromium@1.5.349: - resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5021,8 +5020,8 @@ packages: resolution: {integrity: sha512-DgOngfDKM2EviOH3Mr9m7ks1q8roetLy/IMmYthAYzbpInMbYc/GS+fWFA3rl1gvwKVsQrVV61fo5emD1y3OJQ==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} engines: {node: '>=10.13.0'} ent@2.2.2: @@ -5274,8 +5273,8 @@ packages: express-rate-limit@5.5.1: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} - express-rate-limit@8.4.1: - resolution: {integrity: sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==} + express-rate-limit@8.5.1: + resolution: {integrity: sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -5325,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==} @@ -5504,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: @@ -5613,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: @@ -5662,8 +5661,8 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - hono@4.12.16: - resolution: {integrity: sha512-jN0ZewiNAWSe5khM3EyCmBb250+b40wWbwNILNfEvq84VREWwOIkuUsFONk/3i3nqkz7Oe1PcpM2mwQEK2L9Kg==} + hono@4.12.18: + resolution: {integrity: sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==} engines: {node: '>=16.9.0'} hosted-git-info@9.0.3: @@ -5834,10 +5833,6 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - ip-address@10.2.0: resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} @@ -5877,8 +5872,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: @@ -5949,8 +5944,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: @@ -6127,8 +6122,8 @@ 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.3: @@ -6400,8 +6395,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: @@ -7155,8 +7150,8 @@ packages: resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==} engines: {node: '>=18'} - protobufjs@7.5.6: - resolution: {integrity: sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==} + protobufjs@7.5.7: + resolution: {integrity: sha512-NGnrxS/nLKUo5nkbVQxlC71sB4hdfImdYIbFeSCidxtwATx0AHRPcANSLd0q5Bb2BkoSWo2iisQhGg5/r+ihbA==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -7633,8 +7628,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.8: - resolution: {integrity: sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==} + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@3.8.1: @@ -7851,8 +7846,8 @@ packages: tar-stream@3.2.0: resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} - tar@7.5.13: - resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} + tar@7.5.15: + resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} engines: {node: '>=18'} teeny-request@10.1.2: @@ -7862,19 +7857,46 @@ packages: teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - terser-webpack-plugin@5.5.0: - resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} + terser-webpack-plugin@5.6.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 @@ -8180,8 +8202,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: @@ -8197,46 +8219,6 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - vite@7.3.2: - resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.3.3: resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -8610,8 +8592,8 @@ packages: 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: @@ -8720,23 +8702,23 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@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.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.12(@angular/compiler@22.0.0-next.12)(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.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.1))(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.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.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.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1))(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.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.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.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.12(@angular/compiler@22.0.0-next.12)(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 @@ -8760,19 +8742,19 @@ snapshots: dependencies: tslib: 2.8.1 - '@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.12 - zone.js: 0.16.1 + 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.1))(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.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.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.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1))(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.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.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.1))(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.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 @@ -8789,13 +8771,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@22.0.0-next.8(fefe8b2296e695d2951e1d6c8f20881e)': + '@angular/material@22.0.0-next.8(93ce75c341587667f5d7d40f3eefe13f)': dependencies: - '@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.1))(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.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.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.1))(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.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.1))(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.1) - '@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.1))(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.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.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.1))(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.1)))(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.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.1))(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.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 @@ -8859,35 +8841,35 @@ snapshots: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' - '@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.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.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.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.1))(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.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.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.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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) '@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.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.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.1))(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.1)) + '@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.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.1))(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.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.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.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(rxjs@7.8.2)(zone.js@0.16.1))(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.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.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.1))(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.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.12(@angular/core@22.0.0-next.12(@angular/compiler@22.0.0-next.12)(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.12(@angular/compiler@22.0.0-next.12)(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 @@ -9832,18 +9814,18 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.7.0))': dependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.5(eslint@10.3.0(jiti@2.6.1))': + '@eslint/compat@2.0.5(eslint@10.3.0(jiti@2.7.0))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@eslint/config-array@0.23.5': dependencies: @@ -9875,9 +9857,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -10256,12 +10238,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.6) + 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.6 + 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 @@ -10275,7 +10257,7 @@ snapshots: dependencies: google-auth-library: 10.6.2(supports-color@10.2.2) p-retry: 4.6.2 - protobufjs: 7.5.6 + 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.4.3) @@ -10286,34 +10268,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.6 + 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.6 + 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.16)': + '@hono/node-server@1.19.14(hono@4.12.18)': dependencies: - hono: 4.12.16 + hono: 4.12.18 '@humanfs/core@0.19.2': dependencies: @@ -10333,10 +10315,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: @@ -10344,12 +10326,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 @@ -10361,17 +10343,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 @@ -10385,62 +10367,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.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: @@ -10653,7 +10635,7 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.16) + '@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 @@ -10662,8 +10644,8 @@ snapshots: eventsource: 3.0.7 eventsource-parser: 3.0.8 express: 5.2.1 - express-rate-limit: 8.4.1(express@5.2.1) - hono: 4.12.16 + 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 @@ -10798,7 +10780,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 @@ -10812,7 +10794,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 @@ -10902,8 +10884,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: @@ -11287,7 +11269,7 @@ snapshots: '@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: @@ -11420,11 +11402,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.3.0(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.3.0(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) - '@typescript-eslint/types': 8.59.1 - eslint: 10.3.0(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) + '@typescript-eslint/types': 8.59.2 + eslint: 10.3.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -11434,9 +11416,9 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tony.ganchev/eslint-plugin-header@3.4.4(eslint@10.3.0(jiti@2.6.1))': + '@tony.ganchev/eslint-plugin-header@3.4.4(eslint@10.3.0(jiti@2.7.0))': dependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -11478,16 +11460,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 @@ -11498,56 +11480,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 @@ -11555,7 +11539,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': @@ -11568,13 +11552,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': {} @@ -11590,7 +11574,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 @@ -11599,11 +11583,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 @@ -11617,10 +11610,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 @@ -11632,7 +11625,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 @@ -11640,11 +11633,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 @@ -11655,14 +11648,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': {} @@ -11670,7 +11663,7 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 '@types/retry@0.12.0': {} @@ -11681,11 +11674,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: @@ -11694,38 +11687,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': {} @@ -11737,18 +11730,18 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.17 + '@types/node': 22.19.18 optional: true - '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.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.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@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.6.1))(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@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.6.1) + eslint: 10.3.0(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -11756,14 +11749,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@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.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -11786,20 +11779,18 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@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.6.1))(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.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.1': {} - '@typescript-eslint/types@8.59.2': {} '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': @@ -11817,13 +11808,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)': + '@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.3.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.59.2 '@typescript-eslint/types': 8.59.2 '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -11854,15 +11845,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 @@ -11881,6 +11863,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 @@ -12011,9 +12002,9 @@ snapshots: lodash: 4.18.1 minimatch: 7.4.9 - '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.3(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4))': + '@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.3(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4) + 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.5(vitest@4.1.5)': dependencies: @@ -12027,7 +12018,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.12.2)(@vitest/coverage-v8@4.1.5)(jiti@2.6.1)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.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) '@vitest/expect@4.1.5': dependencies: @@ -12038,13 +12029,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4))': + '@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.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.47.1)(tsx@4.21.0)(yaml@2.8.4) + 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': dependencies: @@ -12223,21 +12214,21 @@ 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 ajv@8.20.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 @@ -12384,7 +12375,7 @@ snapshots: autoprefixer@10.5.0(postcss@8.5.14): dependencies: browserslist: 4.28.2 - caniuse-lite: 1.0.30001791 + caniuse-lite: 1.0.30001792 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.14 @@ -12400,12 +12391,12 @@ snapshots: b4a@1.8.1: {} - babel-loader@10.1.1(@babel/core@7.29.0)(webpack@5.106.2(esbuild@0.28.0)): + babel-loader@10.1.1(@babel/core@7.29.0)(webpack@5.106.2(esbuild@0.28.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: @@ -12450,7 +12441,7 @@ snapshots: bare-events: 2.8.2 bare-path: 3.0.0 bare-stream: 2.13.1(bare-events@2.8.2) - bare-url: 2.4.2 + bare-url: 2.4.3 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller @@ -12471,7 +12462,7 @@ snapshots: transitivePeerDependencies: - react-native-b4a - bare-url@2.4.2: + bare-url@2.4.3: dependencies: bare-path: 3.0.0 @@ -12479,7 +12470,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.10.27: {} + baseline-browser-mapping@2.10.29: {} basic-ftp@5.3.1: {} @@ -12564,7 +12555,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -12636,9 +12627,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.27 - caniuse-lite: 1.0.30001791 - electron-to-chromium: 1.5.349 + 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) @@ -12672,7 +12663,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 @@ -12711,7 +12702,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001791: {} + caniuse-lite@1.0.30001792: {} caseless@0.12.0: {} @@ -12908,14 +12899,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: @@ -12951,7 +12942,7 @@ 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.14) postcss: 8.5.14 @@ -12962,7 +12953,7 @@ snapshots: 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: @@ -13182,7 +13173,7 @@ snapshots: ejs@5.0.2: {} - electron-to-chromium@1.5.349: {} + electron-to-chromium@1.5.353: {} emoji-regex@10.6.0: {} @@ -13221,7 +13212,7 @@ snapshots: 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 @@ -13235,7 +13226,7 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.21.0: + enhanced-resolve@5.21.2: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -13426,29 +13417,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.7.0)): dependencies: - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.1 + 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.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)): + eslint-module-utils@2.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.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) - eslint: 10.3.0(jiti@2.6.1) + '@typescript-eslint/parser': 8.59.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.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.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 @@ -13457,11 +13448,11 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.3.0(jiti@2.6.1) + eslint: 10.3.0(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0(jiti@2.6.1)) + eslint-module-utils: 2.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 @@ -13471,7 +13462,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) + '@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 @@ -13485,7 +13476,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 @@ -13495,9 +13486,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.3.0(jiti@2.6.1): + eslint@10.3.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 @@ -13506,7 +13497,7 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) @@ -13528,7 +13519,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -13562,7 +13553,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -13596,10 +13587,10 @@ snapshots: express-rate-limit@5.5.1: {} - express-rate-limit@8.4.1(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: @@ -13708,7 +13699,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: @@ -13944,7 +13935,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: @@ -14055,14 +14046,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.6 + protobufjs: 7.5.7 retry-request: 8.0.2(supports-color@10.2.2) rimraf: 5.0.10 transitivePeerDependencies: @@ -14089,17 +14080,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.6): + grpc-gcp@1.0.1(protobufjs@7.5.7): dependencies: '@grpc/grpc-js': 1.14.3 - protobufjs: 7.5.6 + protobufjs: 7.5.7 gunzip-maybe@1.4.2: dependencies: @@ -14143,11 +14134,11 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.12.16: {} + hono@4.12.18: {} hosted-git-info@9.0.3: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.3.6 hpack.js@2.1.6: dependencies: @@ -14340,8 +14331,6 @@ 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: {} @@ -14379,7 +14368,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: hasown: 2.0.3 @@ -14408,7 +14397,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: @@ -14438,7 +14427,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: {} @@ -14469,7 +14458,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 is-regex@1.2.1: dependencies: @@ -14610,11 +14599,11 @@ 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.3: {} @@ -14642,7 +14631,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 @@ -14804,11 +14793,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: @@ -14828,11 +14817,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.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: {} @@ -14945,7 +14934,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.3.6: {} lru-cache@5.1.1: dependencies: @@ -15056,17 +15045,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.3 - webpack: 5.106.2(esbuild@0.28.0) + 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: @@ -15270,7 +15259,7 @@ snapshots: 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 @@ -15477,7 +15466,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: @@ -15522,7 +15511,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 @@ -15574,7 +15563,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: {} @@ -15659,14 +15648,14 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.1(postcss@8.5.14)(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 + 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 @@ -15732,9 +15721,9 @@ snapshots: proto3-json-serializer@3.0.4: dependencies: - protobufjs: 7.5.6 + protobufjs: 7.5.7 - protobufjs@7.5.6: + protobufjs@7.5.7: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -15746,7 +15735,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.1 - '@types/node': 22.19.17 + '@types/node': 22.19.18 long: 5.3.2 proxy-addr@2.0.7: @@ -15993,14 +15982,14 @@ snapshots: 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 @@ -16082,12 +16071,12 @@ snapshots: optionalDependencies: '@babel/code-frame': 7.29.0 - rollup-plugin-sourcemaps2@0.5.6(@types/node@22.19.17)(rollup@4.60.3): + rollup-plugin-sourcemaps2@0.5.6(@types/node@22.19.18)(rollup@4.60.3): dependencies: '@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.3: dependencies: @@ -16169,12 +16158,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: @@ -16426,11 +16415,11 @@ snapshots: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@10.2.2) - socks: 2.8.8 + socks: 2.8.9 transitivePeerDependencies: - supports-color - socks@2.8.8: + socks@2.8.9: dependencies: ip-address: 10.2.0 smart-buffer: 4.2.0 @@ -16445,11 +16434,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: @@ -16600,12 +16589,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.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: @@ -16701,7 +16690,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 @@ -16725,7 +16714,18 @@ snapshots: - bare-abort-controller - react-native-b4a - terser-webpack-plugin@5.5.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)): + terser-webpack-plugin@5.6.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.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 @@ -17024,9 +17024,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 @@ -17088,25 +17088,7 @@ 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.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.14 - rollup: 4.60.3 - tinyglobby: 0.2.16 - optionalDependencies: - '@types/node': 24.12.2 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.6.4 - sass: 1.99.0 - terser: 5.47.1 - tsx: 4.21.0 - yaml: 2.8.4 - - vite@7.3.3(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4): + 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) @@ -17117,17 +17099,17 @@ snapshots: 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.47.1 tsx: 4.21.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.6.1)(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@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.2(@types/node@24.12.2)(jiti@2.6.1)(less@4.6.4)(sass@1.99.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.4)) + '@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 @@ -17144,7 +17126,7 @@ snapshots: 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.47.1)(tsx@4.21.0)(yaml@2.8.4) + 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 @@ -17192,6 +17174,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 @@ -17205,7 +17200,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 @@ -17213,10 +17208,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 @@ -17264,15 +17298,55 @@ snapshots: 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 @@ -17281,7 +17355,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.21.0 + enhanced-resolve: 5.21.2 es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -17292,12 +17366,21 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.5.0(esbuild@0.28.0)(webpack@5.106.2(esbuild@0.28.0)) + terser-webpack-plugin: 5.6.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.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: @@ -17504,4 +17587,4 @@ snapshots: zod@4.4.3: {} - zone.js@0.16.1: {} + zone.js@0.16.2: {} From 3245d4bf3fc022cc26a910afd65c66308e6dcbcb Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 7 May 2026 16:28:27 +0000 Subject: [PATCH 61/82] build: update github/codeql-action action to v4.35.4 See associated pull request for more information. --- .github/workflows/codeql.yml | 4 ++-- .github/workflows/scorecard.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 From efb7b6627fc0b36d8968d5a417762e2500c37fec Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 8 May 2026 11:31:32 -0400 Subject: [PATCH 62/82] refactor(@angular-devkit/architect): use custom indent logger Replaces `createConsoleLogger` with a custom `logging.IndentLogger` implementation to remove dependency on `@angular-devkit/core/node` helper. --- .../angular_devkit/architect/bin/architect.ts | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/packages/angular_devkit/architect/bin/architect.ts b/packages/angular_devkit/architect/bin/architect.ts index 05888c276e55..c835fed8394c 100644 --- a/packages/angular_devkit/architect/bin/architect.ts +++ b/packages/angular_devkit/architect/bin/architect.ts @@ -8,7 +8,7 @@ */ import { JsonValue, json, logging, schema, strings, tags, workspaces } from '@angular-devkit/core'; -import { NodeJsSyncHost, createConsoleLogger } from '@angular-devkit/core/node'; +import { NodeJsSyncHost } from '@angular-devkit/core/node'; import { existsSync } from 'node:fs'; import * as path from 'node:path'; import { parseArgs, styleText } from 'node:util'; @@ -217,12 +217,35 @@ async function main(args: string[]): Promise { const { positionals, cliOptions, builderOptions } = parseOptions(args); /** Create the DevKit Logger used through the CLI. */ - const logger = createConsoleLogger(!!cliOptions['verbose'], process.stdout, process.stderr, { + const logger = new logging.IndentLogger('architect'); + const colorLevels: Record string> = { info: (s) => s, debug: (s) => s, - warn: (s) => styleText(['yellow', 'bold'], s), - error: (s) => styleText(['red', 'bold'], s), - fatal: (s) => styleText(['red', 'bold'], s), + warn: (s) => styleText(['yellow', 'bold'], s, { stream: process.stderr }), + error: (s) => styleText(['red', 'bold'], s, { stream: process.stderr }), + fatal: (s) => styleText(['red', 'bold'], s, { stream: process.stderr }), + }; + + logger.subscribe((entry) => { + if (entry.level === 'debug' && !cliOptions['verbose']) { + return; + } + + const color = colorLevels[entry.level]; + const message = color ? color(entry.message) : entry.message; + + switch (entry.level) { + case 'warn': + case 'fatal': + case 'error': + // eslint-disable-next-line no-console + console.error(message); + break; + default: + // eslint-disable-next-line no-console + console.log(message); + break; + } }); // Check the target. From 2bd74b1f9e76b4f39fcaf4eef6586e273caec599 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 8 May 2026 11:31:59 -0400 Subject: [PATCH 63/82] refactor(@angular-devkit/schematics-cli): use custom indent logger and improve tests Replaces `createConsoleLogger` with a custom `logging.IndentLogger` implementation that respects custom output streams. Also refactors tests to use standard `PassThrough` streams and `stripVTControlCharacters` instead of custom mocks. --- .../schematics_cli/bin/schematics.ts | 45 ++++++++++++---- .../schematics_cli/test/schematics_spec.ts | 51 +++++++++---------- 2 files changed, 57 insertions(+), 39 deletions(-) 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); }); }); From 824ab2261867fc9ec1b9c167597fc2547c033670 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Tue, 12 May 2026 17:12:45 +0000 Subject: [PATCH 64/82] build: bump devkit-repo version to 22.1.0-next.0 This was not correctly bumped during the release process. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c588498bee05..05c4b357d326 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "22.0.0-next.8", + "version": "22.1.0-next.0", "private": true, "description": "Software Development Kit for Angular", "keywords": [ From c6fcf7037620b70f535cc7388677e7671e22049e Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Tue, 12 May 2026 07:12:46 +0000 Subject: [PATCH 65/82] build: remove repository fields from package manifests and exclude packageManager from release filters Several changes to align package.json files. --- .ng-dev/release.mjs | 2 +- packages/angular/cli/package.json | 10 ---------- packages/angular/ssr/package.json | 8 +------- packages/ngtools/webpack/package.json | 10 ---------- tools/package_json_release_filter.jq | 2 +- 5 files changed, 3 insertions(+), 29 deletions(-) diff --git a/.ng-dev/release.mjs b/.ng-dev/release.mjs index eb5aad2e4fcf..19e111f22f80 100644 --- a/.ng-dev/release.mjs +++ b/.ng-dev/release.mjs @@ -18,7 +18,7 @@ export const release = { name, experimental, deprecated: { - version: '>=22.0.0-next.0', + version: '>=22.0.0-rc.0', message: 'Angular\'s Webpack support is deprecated. Use the esbuild and Vite-based "@angular/build" package instead.', }, diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json index 5284a6260cca..e8777ce1808a 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -11,16 +11,6 @@ "angular-cli", "Angular CLI" ], - "repository": { - "type": "git", - "url": "git+https://github.com/angular/angular-cli.git" - }, - "author": "Angular Authors", - "license": "MIT", - "bugs": { - "url": "https://github.com/angular/angular-cli/issues" - }, - "homepage": "https://github.com/angular/angular-cli", "dependencies": { "@angular-devkit/architect": "workspace:0.0.0-EXPERIMENTAL-PLACEHOLDER", "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index 9350871fbd2a..5be4d2ba97a8 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -3,8 +3,6 @@ "version": "0.0.0-PLACEHOLDER", "description": "Angular server side rendering utilities", "type": "module", - "license": "MIT", - "homepage": "https://github.com/angular/angular-cli", "keywords": [ "angular", "ssr", @@ -39,9 +37,5 @@ "beasties": "0.4.2" }, "sideEffects": false, - "schematics": "./schematics/collection.json", - "repository": { - "type": "git", - "url": "git+https://github.com/angular/angular-cli.git" - } + "schematics": "./schematics/collection.json" } diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 61ff96362055..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", 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 From 84be2a4cc0b1c02e253f04d8a0218c7cd938ec4d Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Mon, 11 May 2026 08:52:46 +0000 Subject: [PATCH 66/82] fix(@angular/ssr): remove stateful flag from URL_PARAMETER_REGEXP Removes the stateful `/g` flag from `URL_PARAMETER_REGEXP`. Previously, calling `.test()` on the global regular expression advanced its internal `lastIndex` property. This caused subsequent evaluations in the route extraction pipeline to silently fail to match, skipping `getPrerenderParams` for parameterized routes. Closes #33154 --- packages/angular/ssr/src/routes/ng-routes.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/angular/ssr/src/routes/ng-routes.ts b/packages/angular/ssr/src/routes/ng-routes.ts index 438e8450d331..04f67c96d9d5 100644 --- a/packages/angular/ssr/src/routes/ng-routes.ts +++ b/packages/angular/ssr/src/routes/ng-routes.ts @@ -74,9 +74,14 @@ const MODULE_PRELOAD_MAX = 10; const CATCH_ALL_REGEXP = /\/(\*\*)$/; /** - * Regular expression to match segments preceded by a colon in a string. + * Regular expression to match a segment preceded by a colon in a string. */ -const URL_PARAMETER_REGEXP = /(? Date: Tue, 12 May 2026 08:44:30 +0000 Subject: [PATCH 67/82] ci: update Renovate base branch patterns to 22.0.x This should have been done by the release process but it failed. --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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": [ From b98de30aea4b249d2520a170727d7aec7bcd92de Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 12 May 2026 10:56:17 -0400 Subject: [PATCH 68/82] test(@angular-devkit/build-webpack): remove unused createConsoleLogger usage Removes the last usage of `createConsoleLogger` in the repository from the webpack builder tests. This makes the test consistent with others in the file and allows for potential removal of the function. Also removes an unused `BuildResult` import in the same file. --- .../build_webpack/src/builders/webpack/index_spec.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) 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); From e1f43aab963a24dc451cff7291468dc7feba1e36 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 12 May 2026 11:02:14 -0400 Subject: [PATCH 69/82] refactor(@angular-devkit/core): deprecate createConsoleLogger `createConsoleLogger` is deprecated. Use a custom logger implementation instead. This does not apply to application code. --- goldens/public-api/angular_devkit/core/node/index.api.md | 2 +- packages/angular_devkit/core/node/cli-logger.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) 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/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, From e51098002a43bde556b9c4ecae3c7f58b04af766 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 13 May 2026 05:04:14 +0000 Subject: [PATCH 70/82] build: update cross-repo angular dependencies See associated pull request for more information. --- MODULE.bazel | 4 ++-- package.json | 2 +- pnpm-lock.yaml | 23 ++++++++++++++------- tests/e2e/ng-snapshot/package.json | 32 +++++++++++++++--------------- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 5d5cedf91936..b00ae16b2981 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -19,14 +19,14 @@ bazel_dep(name = "aspect_rules_jasmine", version = "2.0.4") bazel_dep(name = "rules_angular") git_override( module_name = "rules_angular", - commit = "19914e2fb677d50b16360dcea8740a1b0dd46172", + commit = "045f98407a299ffaeeeafa275d8490d4507513f8", remote = "https://github.com/angular/rules_angular.git", ) bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "f91b383e3128872b21f709d2ae7543344c65526d", + commit = "6ef1cf3158022456bf1f7031de79b7e44fe479b2", remote = "https://github.com/angular/dev-infra.git", ) diff --git a/package.json b/package.json index 05c4b357d326..9f321ea62285 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@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#f084e2e88e71cdca8098489e6104ffcdbd9a8eda", + "@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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7361cce2380..df4db7026e90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,8 +50,8 @@ importers: 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#f084e2e88e71cdca8098489e6104ffcdbd9a8eda - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)) + 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.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)) @@ -1011,9 +1011,9 @@ packages: '@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/f084e2e88e71cdca8098489e6104ffcdbd9a8eda': - resolution: {gitHosted: true, tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda} - version: 0.0.0-ba993c8a28db88485a5474bf9cc387dffd3eabd9 + '@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.12': @@ -8442,6 +8442,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'} @@ -8781,7 +8786,7 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/f084e2e88e71cdca8098489e6104ffcdbd9a8eda(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))': + '@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.1 '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) @@ -8833,7 +8838,7 @@ snapshots: typed-graphqlify: 3.1.6 typescript: 6.0.3 utf-8-validate: 6.0.6 - which: 6.0.1 + which: 7.0.0 yaml: 2.8.4 yargs: 18.0.0 zod: 4.4.3 @@ -17459,6 +17464,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 diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index d4e1fd4a3b19..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#bd3a434a99ebf09a8098d666c42e5646fb4c5711", - "@angular/cdk": "github:angular/cdk-builds#06248e11a309a454b9ac30f6e18e4e12c96f25af", - "@angular/common": "github:angular/common-builds#b7c6a8e28891dfa7ebf9e90c4b9019d913fe2842", - "@angular/compiler": "github:angular/compiler-builds#6fe948250ed116feefde4e98726df86f0c12dc46", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#de167999390564fa242f07272d9cca6e366a66ce", - "@angular/core": "github:angular/core-builds#e53fa344a5f670d06ec7f3eb1c35401a455e8841", - "@angular/forms": "github:angular/forms-builds#490e7e730b910d5e901bb55dd03e1c34fa7c90c9", - "@angular/language-service": "github:angular/language-service-builds#0b75c030531ab1dad9629f02ccbfabf24247cd2d", - "@angular/localize": "github:angular/localize-builds#5355950bc589ff115be5a11b9408fafea5147ea9", - "@angular/material": "github:angular/material-builds#942bd4bf832c27e0aa4435b55750a77555af7bc9", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#6d5fa3504b4685cb443ff1ea12bf6294f876da05", - "@angular/platform-browser": "github:angular/platform-browser-builds#71a1247ccaddfe722f3450dde189834ab842e895", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#2880d0153aa6bdd6a6398b0ec7bf0641a12aba1c", - "@angular/platform-server": "github:angular/platform-server-builds#48726fc18cc19ce910db6d176f4f92ddffff1ce4", - "@angular/router": "github:angular/router-builds#33d10905e36758a671d68bb1828cba4493f7bf51", - "@angular/service-worker": "github:angular/service-worker-builds#011f7afb9f86ba189a398650783dd93e716e85fe" + "@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" } } From 86d54898345daa53f8747660a49cdf4bf31e2e29 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 13 May 2026 09:55:39 +0000 Subject: [PATCH 71/82] docs: release notes for the v19.2.26 release --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e24ea3e768d..1f2552e164eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ + + +# 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 | + + + # 22.0.0-next.8 (2026-05-11) @@ -3211,6 +3223,7 @@ - Protractor is no longer supported. Protractor was marked end-of-life in August 2023 (see https://protractortest.org/). Projects still relying on Protractor should consider migrating to another E2E testing framework, several support solid migration paths from Protractor. + - https://angular.dev/tools/cli/end-to-end - https://blog.angular.dev/the-state-of-end-to-end-testing-with-angular-d175f751cb9c @@ -6845,6 +6858,7 @@ Alan Agius, Charles Lyding and Doug Parker ### @angular/cli - Several changes to the `ng analytics` command syntax. + - `ng analytics project ` has been replaced with `ng analytics ` - `ng analytics ` has been replaced with `ng analytics --global` @@ -6874,6 +6888,7 @@ Alan Agius, Charles Lyding and Doug Parker - `browser` and `karma` builders `script` and `styles` options input files extensions are now validated. Valid extensions for `scripts` are: + - `.js` - `.cjs` - `.mjs` @@ -6882,6 +6897,7 @@ Alan Agius, Charles Lyding and Doug Parker - `.mjsx` Valid extensions for `styles` are: + - `.css` - `.less` - `.sass` From b46570e8da17b90336c0304b932d3b7db252fa61 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 13 May 2026 10:01:50 +0000 Subject: [PATCH 72/82] docs: release notes for the v20.3.26 release --- CHANGELOG.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f2552e164eb..ec62e0819229 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ + + +# 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) @@ -3223,7 +3235,6 @@ - Protractor is no longer supported. Protractor was marked end-of-life in August 2023 (see https://protractortest.org/). Projects still relying on Protractor should consider migrating to another E2E testing framework, several support solid migration paths from Protractor. - - https://angular.dev/tools/cli/end-to-end - https://blog.angular.dev/the-state-of-end-to-end-testing-with-angular-d175f751cb9c @@ -6858,7 +6869,6 @@ Alan Agius, Charles Lyding and Doug Parker ### @angular/cli - Several changes to the `ng analytics` command syntax. - - `ng analytics project ` has been replaced with `ng analytics ` - `ng analytics ` has been replaced with `ng analytics --global` @@ -6888,7 +6898,6 @@ Alan Agius, Charles Lyding and Doug Parker - `browser` and `karma` builders `script` and `styles` options input files extensions are now validated. Valid extensions for `scripts` are: - - `.js` - `.cjs` - `.mjs` @@ -6897,7 +6906,6 @@ Alan Agius, Charles Lyding and Doug Parker - `.mjsx` Valid extensions for `styles` are: - - `.css` - `.less` - `.sass` From 9a2acdcbcabb6217b943692239c9d44c2e2ee4c6 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 13 May 2026 10:14:06 +0000 Subject: [PATCH 73/82] docs: release notes for the v21.2.11 release --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec62e0819229..d90f29aad260 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ + + +# 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) From 3a52055ac85b5cbba777c0acc0b82cf6add9264d Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 13 May 2026 08:51:43 +0000 Subject: [PATCH 74/82] build: update dependency http-proxy-middleware to v4 See associated pull request for more information. --- package.json | 2 +- .../angular_devkit/build_angular/package.json | 2 +- pnpm-lock.yaml | 54 ++++++++++--------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 9f321ea62285..f5d0b4f836c9 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "fast-glob": "3.3.3", "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", diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index 64c017e2789a..753e0de1f1fd 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -29,7 +29,7 @@ "copy-webpack-plugin": "14.0.0", "css-loader": "7.1.4", "esbuild-wasm": "0.28.0", - "http-proxy-middleware": "3.0.5", + "http-proxy-middleware": "4.0.0", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index df4db7026e90..1e9341535183 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,10 +210,10 @@ importers: 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 @@ -632,8 +632,8 @@ importers: 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 @@ -5719,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==} @@ -5750,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'} @@ -5966,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==} @@ -12605,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 @@ -13847,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: @@ -14209,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 @@ -14218,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 @@ -14271,6 +14271,8 @@ snapshots: transitivePeerDependencies: - supports-color + httpxy@0.5.1: {} + husky@9.1.7: {} hyperdyperid@1.2.0: {} @@ -14449,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: {} @@ -14766,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 From a96575867904236f0de2762af24bb3fe0a6014cc Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Wed, 13 May 2026 12:31:06 +0200 Subject: [PATCH 75/82] fix(@angular/ssr): support all X-Forwarded-* headers when trustProxyHeaders is true Previously, setting `trustProxyHeaders: true` only allowed a predefined set of common proxy headers (such as `x-forwarded-for` and `x-forwarded-host`). This resulted in warning logs when requests contained other valid proxy headers like `x-forwarded-client-cert` or `x-forwarded-email`. --- packages/angular/ssr/src/utils/validation.ts | 26 ++++---- .../angular/ssr/test/utils/validation_spec.ts | 61 ++++++++++++++++--- 2 files changed, 67 insertions(+), 20 deletions(-) diff --git a/packages/angular/ssr/src/utils/validation.ts b/packages/angular/ssr/src/utils/validation.ts index f1f7d741dff7..3d57244c963e 100644 --- a/packages/angular/ssr/src/utils/validation.ts +++ b/packages/angular/ssr/src/utils/validation.ts @@ -7,15 +7,9 @@ */ /** - * Common X-Forwarded-* headers. + * Internal sentinel string representing a wildcard rule to trust all proxy headers. */ -const X_FORWARDED_HEADERS: ReadonlySet = new Set([ - 'x-forwarded-for', - 'x-forwarded-host', - 'x-forwarded-port', - 'x-forwarded-proto', - 'x-forwarded-prefix', -]); +const TRUST_ALL_PROXY_HEADERS = '*'; /** * The set of headers that should be validated for host header injection attacks. @@ -235,7 +229,10 @@ export function isProxyHeaderAllowed( headerName: string, trustProxyHeaders: ReadonlySet, ): boolean { - return trustProxyHeaders.has(headerName.toLowerCase()); + return ( + trustProxyHeaders.has(TRUST_ALL_PROXY_HEADERS) || + trustProxyHeaders.has(headerName.toLowerCase()) + ); } /** @@ -251,8 +248,15 @@ export function normalizeTrustProxyHeaders( } if (trustProxyHeaders === true) { - return X_FORWARDED_HEADERS; + return new Set([TRUST_ALL_PROXY_HEADERS]); } - return new Set(trustProxyHeaders.map((h) => h.toLowerCase())); + const normalizedTrustedProxyHeaders = new Set(trustProxyHeaders.map((h) => h.toLowerCase())); + if (normalizedTrustedProxyHeaders.has(TRUST_ALL_PROXY_HEADERS)) { + throw new Error( + `"${TRUST_ALL_PROXY_HEADERS}" is not allowed as a value for the "trustProxyHeaders" option.`, + ); + } + + return normalizedTrustedProxyHeaders; } diff --git a/packages/angular/ssr/test/utils/validation_spec.ts b/packages/angular/ssr/test/utils/validation_spec.ts index 618b7f7ea2bf..65562c21a755 100644 --- a/packages/angular/ssr/test/utils/validation_spec.ts +++ b/packages/angular/ssr/test/utils/validation_spec.ts @@ -8,6 +8,7 @@ import { getFirstHeaderValue, + normalizeTrustProxyHeaders, sanitizeRequestHeaders, validateRequest, validateUrl, @@ -37,6 +38,35 @@ describe('Validation Utils', () => { }); }); + describe('normalizeTrustProxyHeaders', () => { + it('should return an empty set when input is undefined', () => { + expect(normalizeTrustProxyHeaders(undefined)).toEqual(new Set()); + }); + + it('should return an empty set when input is false', () => { + expect(normalizeTrustProxyHeaders(false)).toEqual(new Set()); + }); + + it('should return a set containing "*" when input is true', () => { + expect(normalizeTrustProxyHeaders(true)).toEqual(new Set(['*'])); + }); + + it('should return a set of lowercased header names when input is an array of strings', () => { + expect(normalizeTrustProxyHeaders(['X-Forwarded-Host', 'X-Forwarded-Proto'])).toEqual( + new Set(['x-forwarded-host', 'x-forwarded-proto']), + ); + }); + + it('should throw an error if input array contains "*"', () => { + expect(() => normalizeTrustProxyHeaders(['*'])).toThrowError( + '"*" is not allowed as a value for the "trustProxyHeaders" option.', + ); + expect(() => normalizeTrustProxyHeaders(['X-Forwarded-Host', '*'])).toThrowError( + '"*" is not allowed as a value for the "trustProxyHeaders" option.', + ); + }); + }); + describe('validateUrl', () => { const allowedHosts = new Set(['example.com', '*.google.com']); @@ -224,15 +254,29 @@ describe('Validation Utils', () => { 'x-forwarded-proto': 'https', }, }); - const secured = sanitizeRequestHeaders(req, new Set()); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(undefined)); expect(secured.headers.get('host')).toBe('example.com'); expect(secured.headers.has('x-forwarded-host')).toBeFalse(); expect(secured.headers.has('x-forwarded-proto')).toBeFalse(); }); - it('should retain allowed proxy headers when explicitly provided', () => { - const trustProxyHeaders = new Set(['x-forwarded-host']); + it('should scrub unallowed proxy headers when trustProxyHeaders is false', () => { + const req = new Request('http://example.com', { + headers: { + 'host': 'example.com', + 'x-forwarded-host': 'evil.com', + 'x-forwarded-proto': 'https', + }, + }); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(false)); + + expect(secured.headers.get('host')).toBe('example.com'); + expect(secured.headers.has('x-forwarded-host')).toBeFalse(); + expect(secured.headers.has('x-forwarded-proto')).toBeFalse(); + }); + + it('should only retain allowed proxy headers when explicitly provided', () => { const req = new Request('http://example.com', { headers: { 'host': 'example.com', @@ -240,7 +284,7 @@ describe('Validation Utils', () => { 'x-forwarded-proto': 'https', }, }); - const secured = sanitizeRequestHeaders(req, trustProxyHeaders); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(['x-forwarded-host'])); expect(secured.headers.get('host')).toBe('example.com'); expect(secured.headers.get('x-forwarded-host')).toBe('proxy.com'); @@ -253,23 +297,22 @@ describe('Validation Utils', () => { 'host': 'example.com', 'x-forwarded-host': 'proxy.com', 'x-forwarded-proto': 'https', + 'x-forwarded-email': 'user@example.com', }, }); - const secured = sanitizeRequestHeaders( - req, - new Set(['x-forwarded-host', 'x-forwarded-proto']), - ); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(true)); expect(secured.headers.get('host')).toBe('example.com'); expect(secured.headers.get('x-forwarded-host')).toBe('proxy.com'); expect(secured.headers.get('x-forwarded-proto')).toBe('https'); + expect(secured.headers.get('x-forwarded-email')).toBe('user@example.com'); }); it('should not clone the request if no proxy headers need to be removed', () => { const req = new Request('http://example.com', { headers: { 'accept': 'application/json' }, }); - const secured = sanitizeRequestHeaders(req, new Set()); + const secured = sanitizeRequestHeaders(req, normalizeTrustProxyHeaders(false)); expect(secured).toBe(req); expect(secured.headers.get('accept')).toBe('application/json'); From f105eec88d925eb5c59160cdf338f70538ba2a75 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 13 May 2026 13:15:13 +0000 Subject: [PATCH 76/82] refactor(@angular/build): remove unused target parameter from getFeatureSupport The `target` parameter in the `getFeatureSupport` function is no longer used internally, so it has been removed to simplify the function signature and call sites. --- .../build/src/tools/esbuild/application-code-bundle.ts | 6 +++--- packages/angular/build/src/tools/esbuild/utils.ts | 8 ++------ packages/angular/build/src/tools/vite/utils.ts | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts index 7333843d7196..adb14dc2d737 100644 --- a/packages/angular/build/src/tools/esbuild/application-code-bundle.ts +++ b/packages/angular/build/src/tools/esbuild/application-code-bundle.ts @@ -67,7 +67,7 @@ export function createBrowserCodeBundleOptions( entryNames: outputNames.bundles, entryPoints, target, - supported: getFeatureSupport(target, zoneless), + supported: getFeatureSupport(zoneless), }; buildOptions.plugins ??= []; @@ -278,7 +278,7 @@ export function createServerMainCodeBundleOptions( js: `import './polyfills.server.mjs';`, }, entryPoints, - supported: getFeatureSupport(target, zoneless), + supported: getFeatureSupport(zoneless), }; buildOptions.plugins ??= []; @@ -423,7 +423,7 @@ export function createSsrEntryCodeBundleOptions( entryPoints: { 'server': ssrEntryNamespace, }, - supported: getFeatureSupport(target, true), + supported: getFeatureSupport(true), }; buildOptions.plugins ??= []; diff --git a/packages/angular/build/src/tools/esbuild/utils.ts b/packages/angular/build/src/tools/esbuild/utils.ts index 8c1af958d2c3..20556c557d67 100644 --- a/packages/angular/build/src/tools/esbuild/utils.ts +++ b/packages/angular/build/src/tools/esbuild/utils.ts @@ -217,16 +217,12 @@ export async function withNoProgress(text: string, action: () => T | Promise< } /** - * Generates a syntax feature object map for Angular applications based on a list of targets. + * Generates a syntax feature object map for Angular applications. * A full set of feature names can be found here: https://esbuild.github.io/api/#supported - * @param target An array of browser/engine targets in the format accepted by the esbuild `target` option. * @param nativeAsyncAwait Indicate whether to support native async/await. * @returns An object that can be used with the esbuild build `supported` option. */ -export function getFeatureSupport( - target: string[], - nativeAsyncAwait: boolean, -): BuildOptions['supported'] { +export function getFeatureSupport(nativeAsyncAwait: boolean): BuildOptions['supported'] { return { // Native async/await is not supported with Zone.js. Disabling support here will cause // esbuild to downlevel async/await, async generators, and for await...of to a Zone.js supported form. diff --git a/packages/angular/build/src/tools/vite/utils.ts b/packages/angular/build/src/tools/vite/utils.ts index 2f7cfba84306..8f3ded5325f7 100644 --- a/packages/angular/build/src/tools/vite/utils.ts +++ b/packages/angular/build/src/tools/vite/utils.ts @@ -100,7 +100,7 @@ export function getDepOptimizationConfig({ esbuildOptions: { // Set esbuild supported targets. target, - supported: getFeatureSupport(target, zoneless), + supported: getFeatureSupport(zoneless), plugins, loader, define: { From 6285aaea7c1a4d92784914c6aae29f50e650338f Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 13 May 2026 09:07:23 +0000 Subject: [PATCH 77/82] docs: update ng.ts render function documentation to reflect removal of rendering implementation details --- packages/angular/ssr/src/utils/ng.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/angular/ssr/src/utils/ng.ts b/packages/angular/ssr/src/utils/ng.ts index 2c4ada0b8c6d..55d054bd2387 100644 --- a/packages/angular/ssr/src/utils/ng.ts +++ b/packages/angular/ssr/src/utils/ng.ts @@ -40,8 +40,7 @@ export type AngularBootstrap = /** * Renders an Angular application or module to an HTML string. * - * This function determines whether the provided `bootstrap` value is an Angular module - * or a bootstrap function and invokes the appropriate rendering method (`renderModule` or `renderApplication`). + * This function supports both Angular modules and bootstrap functions for application initialization. * * @param html - The initial HTML document content. * @param bootstrap - An Angular module type or a function returning a promise that resolves to an `ApplicationRef`. From 8c5d4a411f2096ccfbdcae1f52e9930db337f4b0 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 13 May 2026 19:18:02 +0000 Subject: [PATCH 78/82] build: add package metadata to `@angular/ssr` package.json Unlike ng_package doesn't add these fields. --- packages/angular/ssr/package.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index 5be4d2ba97a8..3e39e13e0ef7 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -8,6 +8,16 @@ "ssr", "universal" ], + "repository": { + "type": "git", + "url": "git+https://github.com/angular/angular-cli.git" + }, + "author": "Angular Authors", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular-cli/issues" + }, + "homepage": "https://github.com/angular/angular-cli", "ng-add": { "save": "dependencies" }, From 8a5dc19e55d674836999b57984ec4c452ee8fe15 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 13 May 2026 19:55:14 +0000 Subject: [PATCH 79/82] docs: update changelog for 22.0.0-rc.0 release --- CHANGELOG.md | 112 +++++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d90f29aad260..f9625adfaa54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,49 +1,6 @@ - - -# 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 | - - - - - -# 22.0.0-next.8 (2026-05-11) +# 22.0.0-rc.0 (2026-05-13) ## Deprecations @@ -55,12 +12,6 @@ - Webpack builders in build-webpack are deprecated. Use @angular/build builders instead. -### @angular-devkit/core - -- `stringToFileBuffer` and `fileBufferToString` are deprecated. Use standard Web APIs (`TextEncoder` and `TextDecoder`) instead. - - Internal usages within the repository have been removed and replaced with standard Web APIs. The public API golden file for `@angular-devkit/core` has been updated to reflect the deprecations. - ### @angular/ssr - CommonEngine APIs are deprecated in favor of AngularNodeAppEngine or AngularAppEngine. @@ -87,7 +38,6 @@ | --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------- | | [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 | -| [7932caaf9](https://github.com/angular/angular-cli/commit/7932caaf987c5692d6624f6af23e65ce3f6d27fd) | fix | robustly parse npm manifest from array | | [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 @@ -102,12 +52,6 @@ | --------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------- | | [3d5daa45e](https://github.com/angular/angular-cli/commit/3d5daa45e3ade025c1bc0df35d2766563ccf7c03) | refactor | deprecate webpack and webpack-dev-server builders | -### @angular-devkit/core - -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | -------- | --------------------------------------------------- | -| [fd336d365](https://github.com/angular/angular-cli/commit/fd336d365dbfe8f558db177a8da24790914a541b) | refactor | deprecate stringToFileBuffer and fileBufferToString | - ### @angular/build | Commit | Type | Description | @@ -117,9 +61,11 @@ ### @angular/ssr -| Commit | Type | Description | -| --------------------------------------------------------------------------------------------------- | -------- | --------------------------- | -| [50b16a65b](https://github.com/angular/angular-cli/commit/50b16a65b1be1f9c2ec11d578240a8884518d517) | refactor | deprecate CommonEngine APIs | +| 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 @@ -127,6 +73,48 @@ | --------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------- | | [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 | + @@ -18063,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 From 361e065a3ba6f30bf366635e0853bf3a735deca4 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 14 May 2026 10:16:35 -0400 Subject: [PATCH 80/82] fix(@angular/build): ignore virtual esbuild paths with (disabled): Virtual files generated by esbuild for disabled browser fields leak into the watch list, causing spurious rebuilds in watch mode. Previously, only paths where the suffix was a Node.js builtin module were ignored. Now, any path containing `(disabled):` is ignored as it represents a virtual file that doesn't exist on disk. Fixes #33160 --- .../build/src/tools/esbuild/bundler-context.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/angular/build/src/tools/esbuild/bundler-context.ts b/packages/angular/build/src/tools/esbuild/bundler-context.ts index 8145087345a4..eb5798f77ae2 100644 --- a/packages/angular/build/src/tools/esbuild/bundler-context.ts +++ b/packages/angular/build/src/tools/esbuild/bundler-context.ts @@ -13,12 +13,10 @@ import { BuildResult, Message, Metafile, - OutputFile, build, context, } from 'esbuild'; import assert from 'node:assert'; -import { builtinModules } from 'node:module'; import { basename, extname, join, relative } from 'node:path'; import { SERVER_GENERATED_EXTERNALS } from '../../utils/server-rendering/manifest'; import { @@ -491,12 +489,9 @@ function isInternalBundlerFile(file: string) { return true; } - const DISABLED_BUILTIN = '(disabled):'; - - // Disabled node builtins such as "/some/path/(disabled):fs" - const disabledIndex = file.indexOf(DISABLED_BUILTIN); - if (disabledIndex >= 0) { - return builtinModules.includes(file.slice(disabledIndex + DISABLED_BUILTIN.length)); + // Any (disabled): path is a virtual esbuild entry that doesn't exist on disk + if (file.includes('(disabled):')) { + return true; } return false; From bc826f55a5fcb61f5464436aec0f9095bdc6a647 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 14 May 2026 09:27:11 -0400 Subject: [PATCH 81/82] docs: update JSDoc return tag to `@return` and fix description in registry.ts --- packages/angular_devkit/core/src/json/schema/registry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 { From 79fc4791058d2616d898cdf3d7edd89ec13b7b96 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 14 May 2026 19:55:26 -0400 Subject: [PATCH 82/82] fix(@schematics/angular): support spy call arguments migration in refactor-jasmine-vitest The `refactor-jasmine-vitest` schematic fails to remove `.args` when migrating `spy.calls.all()[i].args`, resulting in uncompilable code in Vitest. Now, a specialized transformer detects `spy.calls.all()[i].args` and transforms it to `vi.mocked(spy).mock.calls[i]`, removing the unnecessary `.args` property access. Fixes #33112 --- .../transformers/jasmine-spy.ts | 52 +++++++++++++++++++ .../transformers/jasmine-spy_spec.ts | 5 ++ 2 files changed, 57 insertions(+) diff --git a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts index 543ba5a2daee..c840c374976d 100644 --- a/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts +++ b/packages/schematics/angular/refactor/jasmine-vitest/transformers/jasmine-spy.ts @@ -505,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) { @@ -516,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;`,