From d85d7689d7e6658fe3b3789bdba45fc77f90c357 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:04:20 -0500 Subject: [PATCH 01/68] refactor(@angular/build): export compiler plugin and stylesheet options types Exposes `CompilerPluginOptions` and `BundleStylesheetOptions` via the private API. These types are required for consumers of the `createCompilerPlugin` function to strictly type their configuration. --- packages/angular/build/src/private.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/angular/build/src/private.ts b/packages/angular/build/src/private.ts index c55d7482bb2c..4791a94a42d3 100644 --- a/packages/angular/build/src/private.ts +++ b/packages/angular/build/src/private.ts @@ -59,6 +59,7 @@ export function createCompilerPlugin( ); } +export type { CompilerPluginOptions, BundleStylesheetOptions }; export type { AngularCompilation } from './tools/angular/compilation'; export { DiagnosticModes } from './tools/angular/compilation'; export { createAngularCompilation }; From 092aadf44aa05ede53218ae5fd4e3ab1d101fa27 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:21:39 -0500 Subject: [PATCH 02/68] test: migrate express engine E2E tests to Puppeteer Replaces the Protractor-based `ng e2e` execution with the new Puppeteer `executeBrowserTest` utility in the express-engine E2E test suite. --- .../express-engine-csp-nonce.ts | 133 +++++++----------- .../express-engine-ngmodule.ts | 122 +++++----------- .../express-engine-standalone.ts | 104 +++++--------- 3 files changed, 125 insertions(+), 234 deletions(-) diff --git a/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts b/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts index 19e7dcd28b60..3d6335b48465 100644 --- a/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts +++ b/tests/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts @@ -4,6 +4,7 @@ import { findFreePort } from '../../../utils/network'; import { installWorkspacePackages } from '../../../utils/packages'; import { execAndWaitForOutputToMatch, ng } from '../../../utils/process'; import { updateJsonFile, updateServerFileForEsbuild, useSha } from '../../../utils/project'; +import { executeBrowserTest } from '../../../utils/puppeteer'; export default async function () { const useWebpackBuilder = !getGlobalVariable('argv')['esbuild']; @@ -46,90 +47,6 @@ export default async function () { `, - 'e2e/src/app.e2e-spec.ts': ` - import { browser, by, element } from 'protractor'; - import * as webdriver from 'selenium-webdriver'; - - function verifyNoBrowserErrors() { - return browser - .manage() - .logs() - .get('browser') - .then(function (browserLog: any[]) { - const errors: any[] = []; - browserLog.filter((logEntry) => { - const msg = logEntry.message; - console.log('>> ' + msg); - if (logEntry.level.value >= webdriver.logging.Level.INFO.value) { - errors.push(msg); - } - }); - expect(errors).toEqual([]); - }); - } - - describe('Hello world E2E Tests', () => { - beforeAll(async () => { - await browser.waitForAngularEnabled(false); - }); - - it('should display: Welcome', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - expect( - await element(by.css('style[ng-app-id="ng"]')).getText() - ).not.toBeNull(); - - // Test the contents from the server. - expect(await element(by.css('h1')).getText()).toMatch('Hello'); - - // Bootstrap the client side app. - await browser.executeScript('doBootstrap()'); - - // Retest the contents after the client bootstraps. - expect(await element(by.css('h1')).getText()).toMatch('Hello'); - - // Make sure the server styles got replaced by client side ones. - expect( - await element(by.css('style[ng-app-id="ng"]')).isPresent() - ).toBeFalsy(); - expect(await element(by.css('style')).getText()).toMatch(''); - - // Make sure there were no client side errors. - await verifyNoBrowserErrors(); - }); - - it('stylesheets should be configured to load asynchronously', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - // Test the contents from the server. - const linkTag = await browser.driver.findElement( - by.css('link[rel="stylesheet"]') - ); - expect(await linkTag.getAttribute('media')).toMatch('all'); - expect(await linkTag.getAttribute('ngCspMedia')).toBeNull(); - expect(await linkTag.getAttribute('onload')).toBeNull(); - - // Make sure there were no client side errors. - await verifyNoBrowserErrors(); - }); - - it('style tags all have a nonce attribute', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - // Test the contents from the server. - for (const s of await browser.driver.findElements(by.css('style'))) { - expect(await s.getAttribute('nonce')).toBe('{% nonce %}'); - } - - // Make sure there were no client side errors. - await verifyNoBrowserErrors(); - }); - }); - `, }); async function spawnServer(): Promise { @@ -158,5 +75,51 @@ export default async function () { } const port = await spawnServer(); - await ng('e2e', `--base-url=http://localhost:${port}`, '--dev-server-target='); + await executeBrowserTest({ + baseUrl: `http://localhost:${port}/`, + checkFn: async (page) => { + // Test the contents from the server. + const h1Text = await page.$eval('h1', (el) => el.textContent); + if (!h1Text?.includes('Hello')) { + throw new Error(`Expected h1 to contain 'Hello', but got '${h1Text}'`); + } + + const serverStylePresent = await page.evaluate( + () => !!(globalThis as any).document.querySelector('style[ng-app-id="ng"]'), + ); + if (!serverStylePresent) { + throw new Error('Expected server-side style to be present'); + } + + // style tags all have a nonce attribute + const nonces = await page.$$eval('style', (styles) => + styles.map((s) => s.getAttribute('nonce')), + ); + for (const nonce of nonces) { + if (nonce !== '{% nonce %}') { + throw new Error(`Expected nonce to be '{% nonce %}', but got '${nonce}'`); + } + } + + // stylesheets should be configured to load asynchronously + const linkMedia = await page.$eval('link[rel="stylesheet"]', (el) => + el.getAttribute('media'), + ); + if (linkMedia !== 'all') { + throw new Error(`Expected link media to be 'all', but got '${linkMedia}'`); + } + + // Bootstrap the client side app. + await page.evaluate('window.doBootstrap()'); + + // Wait for server style to be removed by client + await page.waitForSelector('style[ng-app-id="ng"]', { hidden: true }); + + // Retest the contents after the client bootstraps. + const h1TextPost = await page.$eval('h1', (el) => el.textContent); + if (!h1TextPost?.includes('Hello')) { + throw new Error(`Expected h1 to contain 'Hello' after bootstrap, but got '${h1TextPost}'`); + } + }, + }); } diff --git a/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts b/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts index f05d2182bbd2..92e34f7ca3e8 100644 --- a/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts +++ b/tests/e2e/tests/build/server-rendering/express-engine-ngmodule.ts @@ -3,24 +3,14 @@ import { rimraf, writeMultipleFiles } from '../../../utils/fs'; import { findFreePort } from '../../../utils/network'; import { installWorkspacePackages } from '../../../utils/packages'; import { execAndWaitForOutputToMatch, ng } from '../../../utils/process'; -import { - updateJsonFile, - updateServerFileForEsbuild, - useCIChrome, - useCIDefaults, - useSha, -} from '../../../utils/project'; +import { updateJsonFile, updateServerFileForEsbuild, useSha } from '../../../utils/project'; +import { executeBrowserTest } from '../../../utils/puppeteer'; export default async function () { // forcibly remove in case another test doesn't clean itself up await rimraf('node_modules/@angular/ssr'); await ng('generate', 'app', 'test-project-two', '--no-standalone', '--skip-install'); - await ng('generate', 'private-e2e', '--related-app-name=test-project-two'); - - // Setup testing to use CI Chrome. - await useCIChrome('test-project-two', 'projects/test-project-two/e2e/'); - await useCIDefaults('test-project-two'); const useWebpackBuilder = !getGlobalVariable('argv')['esbuild']; @@ -79,71 +69,6 @@ export default async function () { .catch((err) => console.error(err)); }; `, - 'projects/test-project-two/e2e/src/app.e2e-spec.ts': ` - import { browser, by, element } from 'protractor'; - import * as webdriver from 'selenium-webdriver'; - - function verifyNoBrowserErrors() { - return browser - .manage() - .logs() - .get('browser') - .then(function (browserLog: any[]) { - const errors: any[] = []; - browserLog.filter((logEntry) => { - const msg = logEntry.message; - console.log('>> ' + msg); - if (logEntry.level.value >= webdriver.logging.Level.INFO.value) { - errors.push(msg); - } - }); - expect(errors).toEqual([]); - }); - } - - describe('Hello world E2E Tests', () => { - beforeAll(async () => { - await browser.waitForAngularEnabled(false); - }); - - it('should display: Welcome', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - const style = await browser.driver.findElement(by.css('style[ng-app-id="ng"]')); - expect(await style.getText()).not.toBeNull(); - - // Test the contents from the server. - const serverDiv = await browser.driver.findElement(by.css('h1')); - expect(await serverDiv.getText()).toMatch('Hello'); - - // Bootstrap the client side app. - await browser.executeScript('doBootstrap()'); - - // Retest the contents after the client bootstraps. - expect(await element(by.css('h1')).getText()).toMatch('Hello'); - - // Make sure the server styles got replaced by client side ones. - expect(await element(by.css('style[ng-app-id="ng"]')).isPresent()).toBeFalsy(); - expect(await element(by.css('style')).getText()).toMatch(''); - - // Make sure there were no client side errors. - await verifyNoBrowserErrors(); - }); - - it('stylesheets should be configured to load asynchronously', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - // Test the contents from the server. - const styleTag = await browser.driver.findElement(by.css('link[rel="stylesheet"]')); - expect(await styleTag.getAttribute('media')).toMatch('all'); - - // Make sure there were no client side errors. - await verifyNoBrowserErrors(); - }); - }); - `, }); async function spawnServer(): Promise { @@ -172,10 +97,41 @@ export default async function () { } const port = await spawnServer(); - await ng( - 'e2e', - '--project=test-project-two', - `--base-url=http://localhost:${port}`, - '--dev-server-target=', - ); + await executeBrowserTest({ + baseUrl: `http://localhost:${port}/`, + checkFn: async (page) => { + // Test the contents from the server. + const h1Text = await page.$eval('h1', (el) => el.textContent); + if (!h1Text?.includes('Hello')) { + throw new Error(`Expected h1 to contain 'Hello', but got '${h1Text}'`); + } + + const serverStylePresent = await page.evaluate( + `!!document.querySelector('style[ng-app-id="ng"]')`, + ); + if (!serverStylePresent) { + throw new Error('Expected server-side style to be present'); + } + + // stylesheets should be configured to load asynchronously + const linkMedia = await page.$eval('link[rel="stylesheet"]', (el) => + el.getAttribute('media'), + ); + if (linkMedia !== 'all') { + throw new Error(`Expected link media to be 'all', but got '${linkMedia}'`); + } + + // Bootstrap the client side app. + await page.evaluate('window.doBootstrap()'); + + // Wait for server style to be removed by client + await page.waitForSelector('style[ng-app-id="ng"]', { hidden: true }); + + // Retest the contents after the client bootstraps. + const h1TextPost = await page.$eval('h1', (el) => el.textContent); + if (!h1TextPost?.includes('Hello')) { + throw new Error(`Expected h1 to contain 'Hello' after bootstrap, but got '${h1TextPost}'`); + } + }, + }); } diff --git a/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts b/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts index 7c819e67693a..18920e3a5893 100644 --- a/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts +++ b/tests/e2e/tests/build/server-rendering/express-engine-standalone.ts @@ -4,6 +4,7 @@ import { findFreePort } from '../../../utils/network'; import { installWorkspacePackages } from '../../../utils/packages'; import { execAndWaitForOutputToMatch, ng } from '../../../utils/process'; import { updateJsonFile, updateServerFileForEsbuild, useSha } from '../../../utils/project'; +import { executeBrowserTest } from '../../../utils/puppeteer'; export default async function () { // forcibly remove in case another test doesn't clean itself up @@ -36,71 +37,6 @@ export default async function () { bootstrapApplication(App, appConfig).catch((err) => console.error(err)); }; `, - 'e2e/src/app.e2e-spec.ts': ` - import { browser, by, element } from 'protractor'; - import * as webdriver from 'selenium-webdriver'; - - function verifyNoBrowserErrors() { - return browser - .manage() - .logs() - .get('browser') - .then(function (browserLog: any[]) { - const errors: any[] = []; - browserLog.filter((logEntry) => { - const msg = logEntry.message; - console.log('>> ' + msg); - if (logEntry.level.value >= webdriver.logging.Level.INFO.value) { - errors.push(msg); - } - }); - expect(errors).toEqual([]); - }); - } - - describe('Hello world E2E Tests', () => { - beforeAll(async () => { - await browser.waitForAngularEnabled(false); - }); - - it('should display: Welcome', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - const style = await browser.driver.findElement(by.css('style[ng-app-id="ng"]')); - expect(await style.getText()).not.toBeNull(); - - // Test the contents from the server. - const serverDiv = await browser.driver.findElement(by.css('h1')); - expect(await serverDiv.getText()).toMatch('Hello'); - - // Bootstrap the client side app. - await browser.executeScript('doBootstrap()'); - - // Retest the contents after the client bootstraps. - expect(await element(by.css('h1')).getText()).toMatch('Hello'); - - // Make sure the server styles got replaced by client side ones. - expect(await element(by.css('style[ng-app-id="ng"]')).isPresent()).toBeFalsy(); - expect(await element(by.css('style')).getText()).toMatch(''); - - // Make sure there were no client side errors. - await verifyNoBrowserErrors(); - }); - - it('stylesheets should be configured to load asynchronously', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - // Test the contents from the server. - const styleTag = await browser.driver.findElement(by.css('link[rel="stylesheet"]')); - expect(await styleTag.getAttribute('media')).toMatch('all'); - - // Make sure there were no client side errors. - await verifyNoBrowserErrors(); - }); - }); - `, }); async function spawnServer(): Promise { @@ -127,5 +63,41 @@ export default async function () { } const port = await spawnServer(); - await ng('e2e', `--base-url=http://localhost:${port}`, '--dev-server-target='); + await executeBrowserTest({ + baseUrl: `http://localhost:${port}/`, + checkFn: async (page) => { + // Test the contents from the server. + const h1Text = await page.$eval('h1', (el) => el.textContent); + if (!h1Text?.includes('Hello')) { + throw new Error(`Expected h1 to contain 'Hello', but got '${h1Text}'`); + } + + const serverStylePresent = await page.evaluate( + `!!document.querySelector('style[ng-app-id="ng"]')`, + ); + if (!serverStylePresent) { + throw new Error('Expected server-side style to be present'); + } + + // stylesheets should be configured to load asynchronously + const linkMedia = await page.$eval('link[rel="stylesheet"]', (el) => + el.getAttribute('media'), + ); + if (linkMedia !== 'all') { + throw new Error(`Expected link media to be 'all', but got '${linkMedia}'`); + } + + // Bootstrap the client side app. + await page.evaluate('window.doBootstrap()'); + + // Wait for server style to be removed by client + await page.waitForSelector('style[ng-app-id="ng"]', { hidden: true }); + + // Retest the contents after the client bootstraps. + const h1TextPost = await page.$eval('h1', (el) => el.textContent); + if (!h1TextPost?.includes('Hello')) { + throw new Error(`Expected h1 to contain 'Hello' after bootstrap, but got '${h1TextPost}'`); + } + }, + }); } From 45d4f5668018362f90fcc4cdc487470286f03c02 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 29 Dec 2025 16:04:48 -0500 Subject: [PATCH 03/68] fix(@angular/cli): update yarn berry package manager configuration This commit updates the package manager descriptor for modern Yarn (Berry) to align with its current CLI options and configuration mechanisms: - Removes `noLockfileFlag` as Yarn Berry does not support a direct `--no-lockfile` flag for adding packages. - Updates `ignoreScriptsFlag` to use `--mode=skip-build`, which is the modern equivalent for skipping build scripts during installation. - Changes `getRegistryOptions` to use `YARN_NPM_REGISTRY_SERVER` environment variable, which is the correct way to configure the registry in Yarn Berry. --- .../cli/src/package-managers/package-manager-descriptor.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index f48ed1e32ed7..bfcbb8bc4548 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -162,9 +162,9 @@ export const SUPPORTED_PACKAGE_MANAGERS = { saveExactFlag: '--exact', saveTildeFlag: '--tilde', saveDevFlag: '--dev', - noLockfileFlag: '--no-lockfile', - ignoreScriptsFlag: '--ignore-scripts', - getRegistryOptions: (registry: string) => ({ env: { NPM_CONFIG_REGISTRY: registry } }), + noLockfileFlag: '', + ignoreScriptsFlag: '--mode=skip-build', + getRegistryOptions: (registry: string) => ({ env: { YARN_NPM_REGISTRY_SERVER: registry } }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json', '--recursive=false'], getManifestCommand: ['npm', 'info', '--json'], From 316fca8626d51b28ea8cd840f3815b7c6dfcfffa Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 29 Dec 2025 16:13:24 -0500 Subject: [PATCH 04/68] fix(@angular/cli): handle array output from npm view in manifest parser This commit updates `parseNpmLikeManifest` to correctly handle the output of `npm view` (and compatible commands) when a version range is specified. In such cases, `npm view --json` returns an array of manifests. The parser now returns the last element of the array, which corresponds to the latest version satisfying the range, preventing issues in `ng update` and other commands that rely on version checks. --- .../cli/src/package-managers/parsers.ts | 4 +++- .../cli/src/package-managers/parsers_spec.ts | 21 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/angular/cli/src/package-managers/parsers.ts b/packages/angular/cli/src/package-managers/parsers.ts index 0e12fd5f0cfb..ca52fd49d817 100644 --- a/packages/angular/cli/src/package-managers/parsers.ts +++ b/packages/angular/cli/src/package-managers/parsers.ts @@ -254,7 +254,9 @@ export function parseNpmLikeManifest(stdout: string, logger?: Logger): PackageMa return null; } - return JSON.parse(stdout); + const result = JSON.parse(stdout); + + return Array.isArray(result) ? result[result.length - 1] : result; } /** diff --git a/packages/angular/cli/src/package-managers/parsers_spec.ts b/packages/angular/cli/src/package-managers/parsers_spec.ts index 8717a6d1a5a1..3b831d71a286 100644 --- a/packages/angular/cli/src/package-managers/parsers_spec.ts +++ b/packages/angular/cli/src/package-managers/parsers_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { parseNpmLikeError, parseYarnClassicError } from './parsers'; +import { parseNpmLikeError, parseNpmLikeManifest, parseYarnClassicError } from './parsers'; describe('parsers', () => { describe('parseNpmLikeError', () => { @@ -69,6 +69,25 @@ describe('parsers', () => { }); }); + describe('parseNpmLikeManifest', () => { + it('should parse a single manifest', () => { + const stdout = JSON.stringify({ name: 'foo', version: '1.0.0' }); + expect(parseNpmLikeManifest(stdout)).toEqual({ name: 'foo', version: '1.0.0' }); + }); + + it('should return the last manifest from an array', () => { + const stdout = JSON.stringify([ + { name: 'foo', version: '1.0.0' }, + { name: 'foo', version: '1.1.0' }, + ]); + expect(parseNpmLikeManifest(stdout)).toEqual({ name: 'foo', version: '1.1.0' }); + }); + + it('should return null for empty stdout', () => { + expect(parseNpmLikeManifest('')).toBeNull(); + }); + }); + describe('parseYarnClassicError', () => { it('should parse a 404 from verbose logs', () => { const stdout = From 3fd7dcd764be0d0afb9cd792d53268d6f314df83 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:44:08 -0500 Subject: [PATCH 05/68] fix(@angular/build): normalize roots to POSIX in test discovery for Windows compatibility Ensures that project and workspace root paths are converted to POSIX format before being used to determine relative test file paths. This fixes an issue on Windows where mixed path separators (backslashes in roots, forward slashes in file paths) caused test discovery to fail to correctly generate entry point names. --- packages/angular/build/src/builders/unit-test/test-discovery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/angular/build/src/builders/unit-test/test-discovery.ts b/packages/angular/build/src/builders/unit-test/test-discovery.ts index d4f097b388f7..64e9718e48ac 100644 --- a/packages/angular/build/src/builders/unit-test/test-discovery.ts +++ b/packages/angular/build/src/builders/unit-test/test-discovery.ts @@ -129,7 +129,7 @@ export function generateNameFromPath( roots: string[], removeTestExtension: boolean, ): string { - const relativePath = removeRoots(testFile, roots); + const relativePath = removeRoots(testFile, roots.map(toPosixPath)); let startIndex = 0; // Skip leading dots and slashes From 164e7dbbc2b06bbd5aab84937c903e0590591c60 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:57:24 -0500 Subject: [PATCH 06/68] fix(@angular/build): resolve test files correctly on Windows when using non-C drives Ensures that test files requested via root-relative paths (common on Windows with non-C drives or specific Vitest configurations) are correctly resolved to their absolute path entry points. This fix prevents 'Cannot find module' errors by explicitly checking the test entry point map after normalizing the path to an absolute POSIX path. --- .../unit-test/runners/vitest/plugins.ts | 4 ++ tests/e2e/tests/vitest/windows-subst-drive.ts | 64 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 tests/e2e/tests/vitest/windows-subst-drive.ts 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 b92c6e7f872d..e4f3cfd5f810 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 @@ -229,6 +229,10 @@ export function createVitestPlugins(pluginOptions: PluginOptions): VitestPlugins // Construct the full, absolute path and normalize it to POSIX format. const fullPath = toPosixPath(path.join(baseDir, id)); + if (testFileToEntryPoint.has(fullPath)) { + return fullPath; + } + // Check if the resolved path corresponds to a known build artifact. const relativePath = path.relative(workspaceRoot, fullPath); if (buildResultFiles.has(toPosixPath(relativePath))) { diff --git a/tests/e2e/tests/vitest/windows-subst-drive.ts b/tests/e2e/tests/vitest/windows-subst-drive.ts new file mode 100644 index 000000000000..de5237da14a8 --- /dev/null +++ b/tests/e2e/tests/vitest/windows-subst-drive.ts @@ -0,0 +1,64 @@ +import assert from 'node:assert/strict'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import { execAndCaptureError, silentExec } from '../../utils/process'; +import { applyVitestBuilder } from '../../utils/vitest'; +import { stripVTControlCharacters } from 'node:util'; + +export default async function (): Promise { + // This test uses `subst` to map the project directory to a virtual drive letter + // to simulate running tests from a non-C drive on Windows. + if (process.platform !== 'win32') { + return; + } + + await applyVitestBuilder(); + + const originalCwd = process.cwd(); + const driveLetter = 'X:'; // Pick a drive letter that is unlikely to be in use. + + try { + // 1. Map the parent directory of the project to the virtual drive. + // This avoids running the project from the root of the drive (X:\), which can cause + // issues with workspace detection. + const projectParentDir = path.dirname(originalCwd); + const projectName = path.basename(originalCwd); + + await silentExec('subst', driveLetter, projectParentDir); + + // 2. Change the current process's working directory to the project folder on the virtual drive. + const newCwd = path.join(driveLetter + '\\', projectName); + process.chdir(newCwd); + + // Verify that the file system mapping is working as expected. + assert(fs.existsSync('angular.json'), 'angular.json should exist on the subst drive'); + + // 3. Run `ng test`. + // We expect this to fail with NG0203 in the subst environment due to dual-package hazards + // (Angular loading from both X: and D:) within bazel. However, the failure proves that the + // test file was discovered and loaded. + const error = await execAndCaptureError('ng', ['test', '--watch=false']); + const output = stripVTControlCharacters(error.message); + + // 4. Verify that Vitest found the test file and identified the tests within it. + assert.match( + output, + /src\/app\/app\.spec\.ts \(2 tests/, + 'Expected tests to be discovered and loaded, even if execution fails due to subst aliasing.', + ); + } finally { + // 5. Teardown: Restore CWD and remove the virtual drive mapping. + try { + process.chdir(originalCwd); + } catch (e) { + console.error('Failed to restore CWD:', e); + } + + try { + await silentExec('subst', driveLetter, '/d'); + } catch (e) { + // Ignore errors if the drive wasn't mounted or if unmount fails (best effort) + console.error(`Failed to unmount ${driveLetter}:`, e); + } + } +} From 5dfc0eea03c1faecd636fac775b0f5bc5f0ed430 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:04:56 +0000 Subject: [PATCH 07/68] fix(@schematics/angular): update default app component message Aligns the inline welcome message with the external template for consistency. --- .../files/module-files/src/app/app__suffix__.ts.template | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/schematics/angular/application/files/module-files/src/app/app__suffix__.ts.template b/packages/schematics/angular/application/files/module-files/src/app/app__suffix__.ts.template index 5679c852f173..055586955b75 100644 --- a/packages/schematics/angular/application/files/module-files/src/app/app__suffix__.ts.template +++ b/packages/schematics/angular/application/files/module-files/src/app/app__suffix__.ts.template @@ -4,7 +4,8 @@ import { Component, signal } from '@angular/core'; selector: '<%= selector %>',<% if(inlineTemplate) { %> template: `

Hello, {{ title() }}

- +

Congratulations! Your app is running. 🎉

+ <% if (routing) { %><% } %> From ad4f8ea5ec3416a666b90d231e59a6768534f611 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 5 Jan 2026 06:09:45 +0000 Subject: [PATCH 08/68] build: update dependency globals to v17 See associated pull request for more information. --- package.json | 2 +- pnpm-lock.yaml | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 5f862d813789..710de1c9193b 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "eslint-plugin-import": "2.32.0", "express": "5.2.1", "fast-glob": "3.3.3", - "globals": "16.5.0", + "globals": "17.0.0", "http-proxy": "^1.18.1", "http-proxy-middleware": "3.0.5", "husky": "9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 836c840b056a..33294bff3eca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -200,8 +200,8 @@ importers: specifier: 3.3.3 version: 3.3.3 globals: - specifier: 16.5.0 - version: 16.5.0 + specifier: 17.0.0 + version: 17.0.0 http-proxy: specifier: ^1.18.1 version: 1.18.1(debug@4.4.3) @@ -5713,8 +5713,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + globals@17.0.0: + resolution: {integrity: sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==} engines: {node: '>=18'} globalthis@1.0.4: @@ -8905,6 +8905,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} @@ -14891,7 +14892,7 @@ snapshots: globals@14.0.0: {} - globals@16.5.0: {} + globals@17.0.0: {} globalthis@1.0.4: dependencies: From 8729181a445b077450d265d48dcc423a086eb729 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 29 Dec 2025 16:35:21 -0500 Subject: [PATCH 09/68] refactor(@angular/cli): add ignorePeerDependencies option to package manager This commit adds support for ignoring peer dependency warnings and errors during package installation. This is useful for commands like `ng update` where transient peer dependency conflicts may occur. - Added `ignorePeerDependenciesFlag` to the `PackageManagerDescriptor` interface. - Implemented the flag for `npm` (`--force`) and `pnpm` (`--strict-peer-dependencies=false`). - Updated `PackageManager.install` to accept and apply the `ignorePeerDependencies` option. --- .../cli/src/package-managers/package-manager-descriptor.ts | 5 +++++ packages/angular/cli/src/package-managers/package-manager.ts | 2 ++ 2 files changed, 7 insertions(+) diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index bfcbb8bc4548..631d444db93d 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -62,6 +62,9 @@ export interface PackageManagerDescriptor { /** The flag to prevent lifecycle scripts from being executed. */ readonly ignoreScriptsFlag: string; + /** The flag to ignore peer dependency warnings/errors. */ + readonly ignorePeerDependenciesFlag?: string; + /** A function that returns the arguments and environment variables to use a custom registry. */ readonly getRegistryOptions?: (registry: string) => { args?: string[]; @@ -140,6 +143,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { saveDevFlag: '--save-dev', noLockfileFlag: '--no-package-lock', ignoreScriptsFlag: '--ignore-scripts', + ignorePeerDependenciesFlag: '--force', getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json=true', '--all=true'], @@ -215,6 +219,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { saveDevFlag: '--save-dev', noLockfileFlag: '--no-lockfile', ignoreScriptsFlag: '--ignore-scripts', + ignorePeerDependenciesFlag: '--strict-peer-dependencies=false', getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json'], diff --git a/packages/angular/cli/src/package-managers/package-manager.ts b/packages/angular/cli/src/package-managers/package-manager.ts index b76831be109c..57b521615273 100644 --- a/packages/angular/cli/src/package-managers/package-manager.ts +++ b/packages/angular/cli/src/package-managers/package-manager.ts @@ -308,11 +308,13 @@ export class PackageManager { force?: boolean; registry?: string; ignoreScripts?: boolean; + ignorePeerDependencies?: boolean; } = { ignoreScripts: true }, ): Promise { const flags = [ options.force ? this.descriptor.forceFlag : '', options.ignoreScripts ? this.descriptor.ignoreScriptsFlag : '', + options.ignorePeerDependencies ? (this.descriptor.ignorePeerDependenciesFlag ?? '') : '', ].filter((flag) => flag); const args = [...this.descriptor.installCommand, ...flags]; From eb3a850c29839b198cafc5bb8f57b254dab8377d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 29 Dec 2025 16:40:18 -0500 Subject: [PATCH 10/68] refactor(@angular/cli): use ignorePeerDependencies option in update command This commit updates the `ng update` command to utilize the `ignorePeerDependencies` abstraction option when installing packages. Previously, the command forced the installation (`--force`) when NPM 7+ was detected to workaround peer dependency issues. Now, it uses the more specific `ignorePeerDependencies` option (mapping to `--force` for NPM). --- packages/angular/cli/src/commands/update/cli.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/angular/cli/src/commands/update/cli.ts b/packages/angular/cli/src/commands/update/cli.ts index 3de979b481e6..9b926cc079a2 100644 --- a/packages/angular/cli/src/commands/update/cli.ts +++ b/packages/angular/cli/src/commands/update/cli.ts @@ -521,7 +521,11 @@ export default class UpdateCommandModule extends CommandModule Date: Wed, 3 Dec 2025 11:02:03 -0800 Subject: [PATCH 11/68] feat(@angular/cli): Add "all" as an experimental tool group --- .../cli/src/commands/mcp/mcp-server.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/angular/cli/src/commands/mcp/mcp-server.ts b/packages/angular/cli/src/commands/mcp/mcp-server.ts index 512398876513..658ae6153151 100644 --- a/packages/angular/cli/src/commands/mcp/mcp-server.ts +++ b/packages/angular/cli/src/commands/mcp/mcp-server.ts @@ -31,15 +31,6 @@ import { type AnyMcpToolDeclaration, registerTools } from './tools/tool-registry */ const DEVSERVER_TOOLS = [DEVSERVER_START_TOOL, DEVSERVER_STOP_TOOL, DEVSERVER_WAIT_FOR_BUILD_TOOL]; -/** - * Experimental tools that are grouped together under a single name. - * - * Used for enabling them as a group. - */ -export const EXPERIMENTAL_TOOL_GROUPS = { - 'devserver': DEVSERVER_TOOLS, -}; - /** * The set of tools that are enabled by default for the MCP server. * These tools are considered stable and suitable for general use. @@ -59,6 +50,16 @@ const STABLE_TOOLS = [ */ export const EXPERIMENTAL_TOOLS = [BUILD_TOOL, MODERNIZE_TOOL, ...DEVSERVER_TOOLS] as const; +/** + * Experimental tools that are grouped together under a single name. + * + * Used for enabling them as a group. + */ +export const EXPERIMENTAL_TOOL_GROUPS = { + 'all': EXPERIMENTAL_TOOLS, + 'devserver': DEVSERVER_TOOLS, +}; + export async function createMcpServer( options: { workspace?: AngularWorkspace; From 772e6efe7acb2d2318a57ba77092a85fc286c51b Mon Sep 17 00:00:00 2001 From: Alon Mishne Date: Tue, 2 Dec 2025 16:20:48 -0800 Subject: [PATCH 12/68] feat(@angular/cli): add 'test' and 'e2e' MCP tools This adds new tools for running unit and end-to-end tests via the MCP server. --- .../cli/src/commands/mcp/mcp-server.ts | 10 +- .../angular/cli/src/commands/mcp/tools/e2e.ts | 121 ++++++++++++++++++ .../cli/src/commands/mcp/tools/e2e_spec.ts | 108 ++++++++++++++++ .../cli/src/commands/mcp/tools/test.ts | 97 ++++++++++++++ .../cli/src/commands/mcp/tools/test_spec.ts | 88 +++++++++++++ 5 files changed, 423 insertions(+), 1 deletion(-) create mode 100644 packages/angular/cli/src/commands/mcp/tools/e2e.ts create mode 100644 packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts create mode 100644 packages/angular/cli/src/commands/mcp/tools/test.ts create mode 100644 packages/angular/cli/src/commands/mcp/tools/test_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 658ae6153151..a2bc1b0f9aeb 100644 --- a/packages/angular/cli/src/commands/mcp/mcp-server.ts +++ b/packages/angular/cli/src/commands/mcp/mcp-server.ts @@ -20,10 +20,12 @@ import { DEVSERVER_START_TOOL } from './tools/devserver/devserver-start'; import { DEVSERVER_STOP_TOOL } from './tools/devserver/devserver-stop'; import { DEVSERVER_WAIT_FOR_BUILD_TOOL } from './tools/devserver/devserver-wait-for-build'; import { DOC_SEARCH_TOOL } from './tools/doc-search'; +import { E2E_TOOL } from './tools/e2e'; import { 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'; +import { TEST_TOOL } from './tools/test'; import { type AnyMcpToolDeclaration, registerTools } from './tools/tool-registry'; /** @@ -48,7 +50,13 @@ 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, MODERNIZE_TOOL, ...DEVSERVER_TOOLS] as const; +export const EXPERIMENTAL_TOOLS = [ + BUILD_TOOL, + E2E_TOOL, + MODERNIZE_TOOL, + TEST_TOOL, + ...DEVSERVER_TOOLS, +] as const; /** * Experimental tools that are grouped together under a single name. diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e.ts b/packages/angular/cli/src/commands/mcp/tools/e2e.ts new file mode 100644 index 000000000000..7e99d57cddce --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/e2e.ts @@ -0,0 +1,121 @@ +/** + * @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 { CommandError, type Host, LocalWorkspaceHost } from '../host'; +import { createStructuredContentOutput } from '../utils'; +import { type McpToolContext, type McpToolDeclaration, declareTool } from './tool-registry'; + +const e2eStatusSchema = z.enum(['success', 'failure']); +type E2eStatus = z.infer; + +const e2eToolInputSchema = z.object({ + project: z + .string() + .optional() + .describe( + 'Which project to test in a monorepo context. If not provided, tests the default project.', + ), +}); + +export type E2eToolInput = z.infer; + +const e2eToolOutputSchema = z.object({ + status: e2eStatusSchema.describe('E2E execution status.'), + logs: z.array(z.string()).optional().describe('Output logs from `ng e2e`.'), +}); + +export type E2eToolOutput = z.infer; + +export async function runE2e(input: E2eToolInput, host: Host, context: McpToolContext) { + const projectName = input.project; + + if (context.workspace) { + let targetProject; + const projects = context.workspace.projects; + + if (projectName) { + targetProject = projects.get(projectName); + } else { + // Try to find default project + const defaultProjectName = context.workspace.extensions['defaultProject'] as + | string + | undefined; + if (defaultProjectName) { + targetProject = projects.get(defaultProjectName); + } else if (projects.size === 1) { + targetProject = Array.from(projects.values())[0]; + } + } + + if (targetProject) { + if (!targetProject.targets.has('e2e')) { + return createStructuredContentOutput({ + status: 'failure', + logs: [ + `No e2e target is defined for project '${projectName ?? 'default'}'. Please setup e2e testing first.`, + ], + }); + } + } + } + + // Build "ng"'s command line. + const args = ['e2e']; + if (input.project) { + args.push(input.project); + } + + let status: E2eStatus = 'success'; + let logs: string[] = []; + + try { + logs = (await host.runCommand('ng', args)).logs; + } catch (e) { + status = 'failure'; + if (e instanceof CommandError) { + logs = e.logs; + } else if (e instanceof Error) { + logs = [e.message]; + } else { + logs = [String(e)]; + } + } + + const structuredContent: E2eToolOutput = { + status, + logs, + }; + + return createStructuredContentOutput(structuredContent); +} + +export const E2E_TOOL: McpToolDeclaration< + typeof e2eToolInputSchema.shape, + typeof e2eToolOutputSchema.shape +> = declareTool({ + name: 'e2e', + title: 'E2E Tool', + description: ` + +Perform an end-to-end test with ng e2e. + + +* Running end-to-end tests for the project. + + +* This tool runs "ng e2e". +* It will error if no "e2e" target is defined in the project, to avoid interactive setup prompts. + +`, + isReadOnly: false, + isLocalOnly: true, + inputSchema: e2eToolInputSchema.shape, + outputSchema: e2eToolOutputSchema.shape, + factory: (context) => (input) => runE2e(input, LocalWorkspaceHost, context), +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts b/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts new file mode 100644 index 000000000000..f525e29f4773 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/e2e_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 { workspaces } from '@angular-devkit/core'; +import { AngularWorkspace } from '../../../utilities/config'; +import { CommandError, Host } from '../host'; +import type { MockHost } from '../testing/mock-host'; +import { runE2e } from './e2e'; +import type { McpToolContext } from './tool-registry'; + +describe('E2E Tool', () => { + let mockHost: MockHost; + let mockContext: McpToolContext; + let mockProjects: workspaces.ProjectDefinitionCollection; + let mockWorkspace: AngularWorkspace; + + beforeEach(() => { + mockHost = { + runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), + } as unknown as MockHost; + + mockProjects = new workspaces.ProjectDefinitionCollection(); + const mockWorkspaceDefinition: workspaces.WorkspaceDefinition = { + projects: mockProjects, + extensions: {}, + }; + + mockWorkspace = new AngularWorkspace(mockWorkspaceDefinition, '/test/angular.json'); + mockContext = { + workspace: mockWorkspace, + } as McpToolContext; + }); + + function addProject(name: string, targets: Record = {}) { + mockProjects.set(name, { + root: `projects/${name}`, + extensions: {}, + targets: new workspaces.TargetDefinitionCollection(targets), + }); + } + + it('should construct the command correctly with defaults', async () => { + await runE2e({}, mockHost, mockContext); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e']); + }); + + it('should construct the command correctly with a specified project', async () => { + addProject('my-app', { e2e: { builder: 'mock-builder' } }); + + await runE2e({ project: 'my-app' }, mockHost, mockContext); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app']); + }); + + it('should error if project does not have e2e target', async () => { + addProject('my-app', { build: { builder: 'mock-builder' } }); + + const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); + + expect(structuredContent.status).toBe('failure'); + expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'my-app'"); + expect(mockHost.runCommand).not.toHaveBeenCalled(); + }); + + it('should error if default project does not have e2e target and no project specified', async () => { + mockWorkspace.extensions['defaultProject'] = 'my-app'; + addProject('my-app', { build: { builder: 'mock-builder' } }); + + const { structuredContent } = await runE2e({}, mockHost, mockContext); + + expect(structuredContent.status).toBe('failure'); + expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'default'"); + expect(mockHost.runCommand).not.toHaveBeenCalled(); + }); + + it('should proceed if no workspace context is available (fallback)', async () => { + // If context.workspace is undefined, it should try to run ng e2e (which might fail or prompt, but tool runs it) + const noWorkspaceContext = {} as McpToolContext; + await runE2e({}, mockHost, noWorkspaceContext); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e']); + }); + + it('should handle a successful e2e run', async () => { + addProject('my-app', { e2e: { builder: 'mock-builder' } }); + const e2eLogs = ['E2E passed']; + mockHost.runCommand.and.resolveTo({ logs: e2eLogs }); + + const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); + + expect(structuredContent.status).toBe('success'); + expect(structuredContent.logs).toEqual(e2eLogs); + }); + + it('should handle a failed e2e run', async () => { + addProject('my-app', { e2e: { builder: 'mock-builder' } }); + const e2eLogs = ['E2E failed']; + mockHost.runCommand.and.rejectWith(new CommandError('Failed', e2eLogs, 1)); + + const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); + + expect(structuredContent.status).toBe('failure'); + expect(structuredContent.logs).toEqual(e2eLogs); + }); +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/test.ts b/packages/angular/cli/src/commands/mcp/tools/test.ts new file mode 100644 index 000000000000..23a978b9d7dc --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/test.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 { z } from 'zod'; +import { CommandError, type Host, LocalWorkspaceHost } from '../host'; +import { createStructuredContentOutput } from '../utils'; +import { type McpToolDeclaration, declareTool } from './tool-registry'; + +const testStatusSchema = z.enum(['success', 'failure']); +type TestStatus = z.infer; + +const testToolInputSchema = z.object({ + project: z + .string() + .optional() + .describe('Which project to test in a monorepo context. If not provided, tests all projects.'), + filter: z.string().optional().describe('Filter the executed tests by spec name.'), +}); + +export type TestToolInput = z.infer; + +const testToolOutputSchema = z.object({ + status: testStatusSchema.describe('Test execution status.'), + logs: z.array(z.string()).optional().describe('Output logs from `ng test`.'), +}); + +export type TestToolOutput = z.infer; + +export async function runTest(input: TestToolInput, host: Host) { + // Build "ng"'s command line. + const args = ['test']; + if (input.project) { + args.push(input.project); + } + + // This is ran by the agent so we want a non-watched, headless test. + args.push('--browsers', 'ChromeHeadless'); + args.push('--watch', 'false'); + + if (input.filter) { + args.push('--filter', input.filter); + } + + let status: TestStatus = 'success'; + let logs: string[] = []; + + try { + logs = (await host.runCommand('ng', args)).logs; + } catch (e) { + status = 'failure'; + if (e instanceof CommandError) { + logs = e.logs; + } else if (e instanceof Error) { + logs = [e.message]; + } else { + logs = [String(e)]; + } + } + + const structuredContent: TestToolOutput = { + status, + logs, + }; + + return createStructuredContentOutput(structuredContent); +} + +export const TEST_TOOL: McpToolDeclaration< + typeof testToolInputSchema.shape, + typeof testToolOutputSchema.shape +> = declareTool({ + name: 'test', + title: 'Test Tool', + description: ` + +Perform a one-off, non-watched unit test execution with ng test. + + +* Running unit tests for the project. +* Verifying code changes with tests. + + +* This tool runs "ng test" with "--watch false". +* It supports filtering by spec name if the underlying builder supports it (e.g., 'unit-test' builder). + +`, + isReadOnly: false, + isLocalOnly: true, + inputSchema: testToolInputSchema.shape, + outputSchema: testToolOutputSchema.shape, + factory: () => (input) => runTest(input, LocalWorkspaceHost), +}); diff --git a/packages/angular/cli/src/commands/mcp/tools/test_spec.ts b/packages/angular/cli/src/commands/mcp/tools/test_spec.ts new file mode 100644 index 000000000000..8c7429417612 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/tools/test_spec.ts @@ -0,0 +1,88 @@ +/** + * @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, Host } from '../host'; +import type { MockHost } from '../testing/mock-host'; +import { runTest } from './test'; + +describe('Test Tool', () => { + let mockHost: MockHost; + + beforeEach(() => { + mockHost = { + runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), + } as unknown as MockHost; + }); + + it('should construct the command correctly with defaults', async () => { + await runTest({}, mockHost); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', [ + 'test', + '--browsers', + 'ChromeHeadless', + '--watch', + 'false', + ]); + }); + + it('should construct the command correctly with a specified project', async () => { + await runTest({ project: 'my-lib' }, mockHost); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', [ + 'test', + 'my-lib', + '--browsers', + 'ChromeHeadless', + '--watch', + 'false', + ]); + }); + + it('should construct the command correctly with filter', async () => { + await runTest({ filter: 'AppComponent' }, mockHost); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', [ + 'test', + '--browsers', + 'ChromeHeadless', + '--watch', + 'false', + '--filter', + 'AppComponent', + ]); + }); + + it('should handle a successful test run and capture logs', async () => { + const testLogs = ['Executed 10 of 10 SUCCESS', 'Total: 10 success']; + mockHost.runCommand.and.resolveTo({ + logs: testLogs, + }); + + const { structuredContent } = await runTest({ project: 'my-app' }, mockHost); + + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', [ + 'test', + 'my-app', + '--browsers', + 'ChromeHeadless', + '--watch', + 'false', + ]); + expect(structuredContent.status).toBe('success'); + expect(structuredContent.logs).toEqual(testLogs); + }); + + it('should handle a failed test run and capture logs', async () => { + const testLogs = ['Executed 10 of 10 FAILED', 'Error: Some test failed']; + const error = new CommandError('Test failed', testLogs, 1); + mockHost.runCommand.and.rejectWith(error); + + const { structuredContent } = await runTest({ project: 'my-failed-app' }, mockHost); + + expect(structuredContent.status).toBe('failure'); + expect(structuredContent.logs).toEqual(testLogs); + }); +}); From be31e7caf9c550323485a23a91353c4ee59d47ff Mon Sep 17 00:00:00 2001 From: Alon Mishne Date: Thu, 4 Dec 2025 13:55:49 -0800 Subject: [PATCH 13/68] refactor(@angular/cli): clean up MCP tests and use real project name for default projects --- .../angular/cli/src/commands/mcp/devserver.ts | 4 - .../src/commands/mcp/testing/test-utils.ts | 91 +++++++++++++ .../cli/src/commands/mcp/tools/build.ts | 10 +- .../cli/src/commands/mcp/tools/build_spec.ts | 11 +- .../mcp/tools/devserver/devserver-start.ts | 20 ++- .../mcp/tools/devserver/devserver-stop.ts | 33 ++++- .../devserver/devserver-wait-for-build.ts | 31 ++++- .../mcp/tools/devserver/devserver_spec.ts | 38 ++++-- .../angular/cli/src/commands/mcp/tools/e2e.ts | 49 +++---- .../cli/src/commands/mcp/tools/e2e_spec.ts | 66 +++++---- .../cli/src/commands/mcp/tools/modernize.ts | 7 +- .../cli/src/commands/mcp/tools/test.ts | 13 +- .../cli/src/commands/mcp/tools/test_spec.ts | 9 +- .../angular/cli/src/commands/mcp/utils.ts | 60 ++++++++- .../cli/src/commands/mcp/utils_spec.ts | 126 ++++++++++++++++++ 15 files changed, 432 insertions(+), 136 deletions(-) create mode 100644 packages/angular/cli/src/commands/mcp/testing/test-utils.ts create mode 100644 packages/angular/cli/src/commands/mcp/utils_spec.ts diff --git a/packages/angular/cli/src/commands/mcp/devserver.ts b/packages/angular/cli/src/commands/mcp/devserver.ts index cf8378294edd..6955f2d512e6 100644 --- a/packages/angular/cli/src/commands/mcp/devserver.ts +++ b/packages/angular/cli/src/commands/mcp/devserver.ts @@ -64,10 +64,6 @@ export interface Devserver { port: number; } -export function devserverKey(project?: string) { - return project ?? ''; -} - /** * A local Angular development server managed by the MCP server. */ diff --git a/packages/angular/cli/src/commands/mcp/testing/test-utils.ts b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts new file mode 100644 index 000000000000..888fe1d0463b --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/testing/test-utils.ts @@ -0,0 +1,91 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { workspaces } from '@angular-devkit/core'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { AngularWorkspace } from '../../../utilities/config'; +import { type Devserver } from '../devserver'; +import { Host } from '../host'; +import { McpToolContext } from '../tools/tool-registry'; +import { MockHost } from './mock-host'; + +/** + * Creates a mock implementation of the Host interface for testing purposes. + * Each method is a Jasmine spy that can be configured. + */ +export function createMockHost(): MockHost { + return { + runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), + stat: jasmine.createSpy('stat'), + existsSync: jasmine.createSpy('existsSync'), + spawn: jasmine.createSpy('spawn'), + getAvailablePort: jasmine + .createSpy('getAvailablePort') + .and.resolveTo(0), + } as unknown as MockHost; +} + +/** + * Options for configuring the mock MCP tool context. + */ +export interface MockContextOptions { + /** An optional pre-configured mock host. If not provided, a default mock host will be created. */ + host?: MockHost; + + /** Initial set of projects to populate the mock workspace with. */ + projects?: Record; +} + +/** + * Creates a comprehensive mock for the McpToolContext, including a mock Host, + * an AngularWorkspace, and a ProjectDefinitionCollection. This simplifies testing + * MCP tools by providing a consistent and configurable testing environment. + * @param options Configuration options for the mock context. + * @returns An object containing the mock host, context, projects collection, and workspace instance. + */ +export function createMockContext(options: MockContextOptions = {}): { + host: MockHost; + context: McpToolContext; + projects: workspaces.ProjectDefinitionCollection; + workspace: AngularWorkspace; +} { + const host = options.host ?? createMockHost(); + const projects = new workspaces.ProjectDefinitionCollection(options.projects); + const workspace = new AngularWorkspace({ projects, extensions: {} }, '/test/angular.json'); + + const context: McpToolContext = { + server: {} as unknown as McpServer, + workspace, + logger: { warn: () => {} }, + devservers: new Map(), + host, + }; + + return { host, context, projects, workspace }; +} + +/** + * Adds a project to the provided mock ProjectDefinitionCollection. + * This is a helper function to easily populate a mock Angular workspace. + * @param projects The ProjectDefinitionCollection to add the project to. + * @param name The name of the project. + * @param targets A record of target definitions for the project (e.g., build, test, e2e). + * @param root The root path of the project, relative to the workspace root. Defaults to `projects/${name}`. + */ +export function addProjectToWorkspace( + projects: workspaces.ProjectDefinitionCollection, + name: string, + targets: Record = {}, + root = `projects/${name}`, +) { + projects.set(name, { + root, + extensions: {}, + targets: new workspaces.TargetDefinitionCollection(targets), + }); +} diff --git a/packages/angular/cli/src/commands/mcp/tools/build.ts b/packages/angular/cli/src/commands/mcp/tools/build.ts index 7984fc864dc6..3faee85ebc90 100644 --- a/packages/angular/cli/src/commands/mcp/tools/build.ts +++ b/packages/angular/cli/src/commands/mcp/tools/build.ts @@ -8,7 +8,7 @@ import { z } from 'zod'; import { CommandError, type Host } from '../host'; -import { createStructuredContentOutput } from '../utils'; +import { createStructuredContentOutput, getCommandErrorLogs } from '../utils'; import { type McpToolDeclaration, declareTool } from './tool-registry'; const DEFAULT_CONFIGURATION = 'development'; @@ -55,13 +55,7 @@ export async function runBuild(input: BuildToolInput, host: Host) { logs = (await host.runCommand('ng', args)).logs; } catch (e) { status = 'failure'; - if (e instanceof CommandError) { - logs = e.logs; - } else if (e instanceof Error) { - logs = [e.message]; - } else { - logs = [String(e)]; - } + logs = getCommandErrorLogs(e); } for (const line of logs) { 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 4ad98e0456b9..387c415d5eb2 100644 --- a/packages/angular/cli/src/commands/mcp/tools/build_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/build_spec.ts @@ -6,19 +6,16 @@ * found in the LICENSE file at https://angular.dev/license */ -import { CommandError, Host } from '../host'; +import { CommandError } from '../host'; import type { MockHost } from '../testing/mock-host'; +import { createMockHost } from '../testing/test-utils'; import { runBuild } from './build'; describe('Build Tool', () => { let mockHost: MockHost; beforeEach(() => { - mockHost = { - runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), - stat: jasmine.createSpy('stat'), - existsSync: jasmine.createSpy('existsSync'), - } as MockHost; + mockHost = createMockHost(); }); it('should construct the command correctly with default configuration', async () => { @@ -82,7 +79,7 @@ describe('Build Tool', () => { 'production', ]); expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs).toEqual(buildLogs); + expect(structuredContent.logs).toEqual([...buildLogs, 'Build failed']); expect(structuredContent.path).toBeUndefined(); }); 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 574a937fe073..44917d612ef1 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 @@ -7,8 +7,8 @@ */ import { z } from 'zod'; -import { LocalDevserver, devserverKey } from '../../devserver'; -import { createStructuredContentOutput } from '../../utils'; +import { LocalDevserver } from '../../devserver'; +import { createStructuredContentOutput, getDefaultProjectName } from '../../utils'; import { type McpToolContext, type McpToolDeclaration, declareTool } from '../tool-registry'; const devserverStartToolInputSchema = z.object({ @@ -39,12 +39,18 @@ function localhostAddress(port: number) { } export async function startDevserver(input: DevserverStartToolInput, context: McpToolContext) { - const projectKey = devserverKey(input.project); + const projectName = input.project ?? getDefaultProjectName(context); - let devserver = context.devservers.get(projectKey); + if (!projectName) { + return createStructuredContentOutput({ + message: ['Project name not provided, and no default project found.'], + }); + } + + let devserver = context.devservers.get(projectName); if (devserver) { return createStructuredContentOutput({ - message: `Development server for project '${projectKey}' is already running.`, + message: `Development server for project '${projectName}' is already running.`, address: localhostAddress(devserver.port), }); } @@ -54,10 +60,10 @@ export async function startDevserver(input: DevserverStartToolInput, context: Mc devserver = new LocalDevserver({ host: context.host, project: input.project, port }); devserver.start(); - context.devservers.set(projectKey, devserver); + context.devservers.set(projectName, devserver); return createStructuredContentOutput({ - message: `Development server for project '${projectKey}' started and watching for workspace changes.`, + message: `Development server for project '${projectName}' started and watching for workspace changes.`, address: localhostAddress(port), }); } 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 203cd1770a7d..4342fafbfb20 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 @@ -7,8 +7,7 @@ */ import { z } from 'zod'; -import { devserverKey } from '../../devserver'; -import { createStructuredContentOutput } from '../../utils'; +import { createStructuredContentOutput, getDefaultProjectName } from '../../utils'; import { type McpToolContext, type McpToolDeclaration, declareTool } from '../tool-registry'; const devserverStopToolInputSchema = z.object({ @@ -30,21 +29,41 @@ const devserverStopToolOutputSchema = z.object({ export type DevserverStopToolOutput = z.infer; export function stopDevserver(input: DevserverStopToolInput, context: McpToolContext) { - const projectKey = devserverKey(input.project); - const devServer = context.devservers.get(projectKey); + if (context.devservers.size === 0) { + return createStructuredContentOutput({ + message: ['No development servers are currently running.'], + logs: undefined, + }); + } + + let projectName = input.project ?? getDefaultProjectName(context); + + if (!projectName) { + // This should not happen. But if there's just a single running devserver, stop it. + if (context.devservers.size === 1) { + projectName = Array.from(context.devservers.keys())[0]; + } else { + return createStructuredContentOutput({ + message: ['Project name not provided, and no default project found.'], + logs: undefined, + }); + } + } + + const devServer = context.devservers.get(projectName); if (!devServer) { return createStructuredContentOutput({ - message: `Development server for project '${projectKey}' was not running.`, + message: `Development server for project '${projectName}' was not running.`, logs: undefined, }); } devServer.stop(); - context.devservers.delete(projectKey); + context.devservers.delete(projectName); return createStructuredContentOutput({ - message: `Development server for project '${projectKey}' stopped.`, + message: `Development server for project '${projectName}' stopped.`, logs: devServer.getServerLogs(), }); } diff --git a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-wait-for-build.ts b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-wait-for-build.ts index 945c38f0c30e..396ca451ba79 100644 --- a/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-wait-for-build.ts +++ b/packages/angular/cli/src/commands/mcp/tools/devserver/devserver-wait-for-build.ts @@ -7,8 +7,7 @@ */ import { z } from 'zod'; -import { devserverKey } from '../../devserver'; -import { createStructuredContentOutput } from '../../utils'; +import { createStructuredContentOutput, getDefaultProjectName } from '../../utils'; import { type McpToolContext, type McpToolDeclaration, declareTool } from '../tool-registry'; /** @@ -60,21 +59,43 @@ export async function waitForDevserverBuild( input: DevserverWaitForBuildToolInput, context: McpToolContext, ) { - const projectKey = devserverKey(input.project); - const devServer = context.devservers.get(projectKey); - const deadline = Date.now() + input.timeout; + if (context.devservers.size === 0) { + return createStructuredContentOutput({ + status: 'no_devserver_found', + logs: undefined, + }); + } + + let projectName = input.project ?? getDefaultProjectName(context); + + if (!projectName) { + // This should not happen. But if there's just a single running devserver, wait for it. + if (context.devservers.size === 1) { + projectName = Array.from(context.devservers.keys())[0]; + } else { + return createStructuredContentOutput({ + status: 'no_devserver_found', + logs: undefined, + }); + } + } + + const devServer = context.devservers.get(projectName); if (!devServer) { return createStructuredContentOutput({ status: 'no_devserver_found', + logs: undefined, }); } + const deadline = Date.now() + input.timeout; await wait(WATCH_DELAY); while (devServer.isBuilding()) { if (Date.now() > deadline) { return createStructuredContentOutput({ status: 'timeout', + logs: undefined, }); } await wait(WATCH_DELAY); 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 ea6449ceeffa..f3b33af417bf 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 @@ -8,7 +8,9 @@ import { EventEmitter } from 'events'; import type { ChildProcess } from 'node:child_process'; +import { AngularWorkspace } from '../../../../utilities/config'; import type { MockHost } from '../../testing/mock-host'; +import { addProjectToWorkspace, createMockContext } from '../../testing/test-utils'; import type { McpToolContext } from '../tool-registry'; import { startDevserver } from './devserver-start'; import { stopDevserver } from './devserver-stop'; @@ -25,33 +27,36 @@ describe('Serve Tools', () => { let mockContext: McpToolContext; let mockProcess: MockChildProcess; let portCounter: number; + let mockWorkspace: AngularWorkspace; beforeEach(() => { portCounter = 12345; mockProcess = new MockChildProcess(); - mockHost = { - spawn: jasmine.createSpy('spawn').and.returnValue(mockProcess as unknown as ChildProcess), - getAvailablePort: jasmine.createSpy('getAvailablePort').and.callFake(() => { - return Promise.resolve(portCounter++); - }), - } as MockHost; - - mockContext = { - devservers: new Map(), - host: mockHost, - } as Partial as McpToolContext; + + const mock = createMockContext(); + mockHost = mock.host; + mockContext = mock.context; + mockWorkspace = mock.workspace; + + // Customize host spies + mockHost.spawn.and.returnValue(mockProcess as unknown as ChildProcess); + mockHost.getAvailablePort.and.callFake(() => Promise.resolve(portCounter++)); + + // Setup default project + addProjectToWorkspace(mock.projects, 'my-app'); + mockWorkspace.extensions['defaultProject'] = 'my-app'; }); it('should start and stop a dev server', async () => { const startResult = await startDevserver({}, mockContext); expect(startResult.structuredContent.message).toBe( - `Development server for project '' started and watching for workspace changes.`, + `Development server for project 'my-app' started and watching for workspace changes.`, ); expect(mockHost.spawn).toHaveBeenCalledWith('ng', ['serve', '--port=12345'], { stdio: 'pipe' }); const stopResult = stopDevserver({}, mockContext); expect(stopResult.structuredContent.message).toBe( - `Development server for project '' stopped.`, + `Development server for project 'my-app' stopped.`, ); expect(mockProcess.kill).toHaveBeenCalled(); }); @@ -78,6 +83,11 @@ describe('Serve Tools', () => { }); it('should handle multiple dev servers', async () => { + // Add extra projects + const projects = mockWorkspace.projects; + addProjectToWorkspace(projects, 'app-one'); + addProjectToWorkspace(projects, 'app-two'); + // Start server for project 1. This uses the basic mockProcess created for the tests. const startResult1 = await startDevserver({ project: 'app-one' }, mockContext); expect(startResult1.structuredContent.message).toBe( @@ -117,6 +127,7 @@ describe('Serve Tools', () => { }); it('should handle server crash', async () => { + addProjectToWorkspace(mockWorkspace.projects, 'crash-app'); await startDevserver({ project: 'crash-app' }, mockContext); // Simulate a crash with exit code 1 @@ -129,6 +140,7 @@ describe('Serve Tools', () => { }); it('wait should timeout if build takes too long', async () => { + addProjectToWorkspace(mockWorkspace.projects, 'timeout-app'); await startDevserver({ project: 'timeout-app' }, mockContext); const waitResult = await waitForDevserverBuild( { project: 'timeout-app', timeout: 10 }, diff --git a/packages/angular/cli/src/commands/mcp/tools/e2e.ts b/packages/angular/cli/src/commands/mcp/tools/e2e.ts index 7e99d57cddce..86b1ee76f2e3 100644 --- a/packages/angular/cli/src/commands/mcp/tools/e2e.ts +++ b/packages/angular/cli/src/commands/mcp/tools/e2e.ts @@ -8,7 +8,12 @@ import { z } from 'zod'; import { CommandError, type Host, LocalWorkspaceHost } from '../host'; -import { createStructuredContentOutput } from '../utils'; +import { + createStructuredContentOutput, + getCommandErrorLogs, + getDefaultProjectName, + getProject, +} from '../utils'; import { type McpToolContext, type McpToolDeclaration, declareTool } from './tool-registry'; const e2eStatusSchema = z.enum(['success', 'failure']); @@ -33,32 +38,19 @@ const e2eToolOutputSchema = z.object({ export type E2eToolOutput = z.infer; export async function runE2e(input: E2eToolInput, host: Host, context: McpToolContext) { - const projectName = input.project; - - if (context.workspace) { - let targetProject; - const projects = context.workspace.projects; - - if (projectName) { - targetProject = projects.get(projectName); - } else { - // Try to find default project - const defaultProjectName = context.workspace.extensions['defaultProject'] as - | string - | undefined; - if (defaultProjectName) { - targetProject = projects.get(defaultProjectName); - } else if (projects.size === 1) { - targetProject = Array.from(projects.values())[0]; - } - } + const projectName = input.project ?? getDefaultProjectName(context); + if (context.workspace && projectName) { + // Verify that if a project can be found, it has an e2e testing already set up. + const targetProject = getProject(context, projectName); if (targetProject) { if (!targetProject.targets.has('e2e')) { return createStructuredContentOutput({ status: 'failure', logs: [ - `No e2e target is defined for project '${projectName ?? 'default'}'. Please setup e2e testing first.`, + `No e2e target is defined for project '${projectName}'. Please set up e2e testing` + + ' first by calling `ng e2e` in an interactive console.' + + ' See https://angular.dev/tools/cli/end-to-end.', ], }); } @@ -78,13 +70,7 @@ export async function runE2e(input: E2eToolInput, host: Host, context: McpToolCo logs = (await host.runCommand('ng', args)).logs; } catch (e) { status = 'failure'; - if (e instanceof CommandError) { - logs = e.logs; - } else if (e instanceof Error) { - logs = [e.message]; - } else { - logs = [String(e)]; - } + logs = getCommandErrorLogs(e); } const structuredContent: E2eToolOutput = { @@ -106,11 +92,12 @@ export const E2E_TOOL: McpToolDeclaration< Perform an end-to-end test with ng e2e. -* Running end-to-end tests for the project. +* When the user requests running end-to-end tests for the project. +* When verifying changes that cross unit boundaries, such as changes to both client and server, changes to shared data types, etc. -* This tool runs "ng e2e". -* It will error if no "e2e" target is defined in the project, to avoid interactive setup prompts. +* This tool uses "ng e2e". +* Important: this relies on e2e tests being already configured for this project. It will error out if no "e2e" target is defined. `, isReadOnly: false, 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 f525e29f4773..852381fc6ee9 100644 --- a/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/e2e_spec.ts @@ -8,8 +8,9 @@ import { workspaces } from '@angular-devkit/core'; import { AngularWorkspace } from '../../../utilities/config'; -import { CommandError, Host } from '../host'; +import { CommandError } from '../host'; import type { MockHost } from '../testing/mock-host'; +import { addProjectToWorkspace, createMockContext } from '../testing/test-utils'; import { runE2e } from './e2e'; import type { McpToolContext } from './tool-registry'; @@ -20,44 +21,27 @@ describe('E2E Tool', () => { let mockWorkspace: AngularWorkspace; beforeEach(() => { - mockHost = { - runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), - } as unknown as MockHost; - - mockProjects = new workspaces.ProjectDefinitionCollection(); - const mockWorkspaceDefinition: workspaces.WorkspaceDefinition = { - projects: mockProjects, - extensions: {}, - }; - - mockWorkspace = new AngularWorkspace(mockWorkspaceDefinition, '/test/angular.json'); - mockContext = { - workspace: mockWorkspace, - } as McpToolContext; + const mock = createMockContext(); + mockHost = mock.host; + mockContext = mock.context; + mockProjects = mock.projects; + mockWorkspace = mock.workspace; }); - function addProject(name: string, targets: Record = {}) { - mockProjects.set(name, { - root: `projects/${name}`, - extensions: {}, - targets: new workspaces.TargetDefinitionCollection(targets), - }); - } - it('should construct the command correctly with defaults', async () => { await runE2e({}, mockHost, mockContext); expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e']); }); it('should construct the command correctly with a specified project', async () => { - addProject('my-app', { e2e: { builder: 'mock-builder' } }); + addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); await runE2e({ project: 'my-app' }, mockHost, mockContext); expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app']); }); it('should error if project does not have e2e target', async () => { - addProject('my-app', { build: { builder: 'mock-builder' } }); + addProjectToWorkspace(mockProjects, 'my-app', { build: { builder: 'mock-builder' } }); const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); @@ -66,43 +50,57 @@ describe('E2E Tool', () => { expect(mockHost.runCommand).not.toHaveBeenCalled(); }); - it('should error if default project does not have e2e target and no project specified', async () => { + it('should error if no project was specified and the default project does not have e2e target', async () => { mockWorkspace.extensions['defaultProject'] = 'my-app'; - addProject('my-app', { build: { builder: 'mock-builder' } }); + addProjectToWorkspace(mockProjects, 'my-app', { build: { builder: 'mock-builder' } }); const { structuredContent } = await runE2e({}, mockHost, mockContext); expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'default'"); + expect(structuredContent.logs?.[0]).toContain("No e2e target is defined for project 'my-app'"); expect(mockHost.runCommand).not.toHaveBeenCalled(); }); it('should proceed if no workspace context is available (fallback)', async () => { - // If context.workspace is undefined, it should try to run ng e2e (which might fail or prompt, but tool runs it) + // If context.workspace is undefined, it should try to run ng e2e. const noWorkspaceContext = {} as McpToolContext; await runE2e({}, mockHost, noWorkspaceContext); expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e']); }); - it('should handle a successful e2e run', async () => { - addProject('my-app', { e2e: { builder: 'mock-builder' } }); - const e2eLogs = ['E2E passed']; + it('should handle a successful e2e run with a specified project', async () => { + addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); + const e2eLogs = ['E2E passed for my-app']; mockHost.runCommand.and.resolveTo({ logs: e2eLogs }); const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); expect(structuredContent.status).toBe('success'); expect(structuredContent.logs).toEqual(e2eLogs); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e', 'my-app']); + }); + + it('should handle a successful e2e run with the default project', async () => { + mockWorkspace.extensions['defaultProject'] = 'default-app'; + addProjectToWorkspace(mockProjects, 'default-app', { e2e: { builder: 'mock-builder' } }); + const e2eLogs = ['E2E passed for default-app']; + mockHost.runCommand.and.resolveTo({ logs: e2eLogs }); + + const { structuredContent } = await runE2e({}, mockHost, mockContext); + + expect(structuredContent.status).toBe('success'); + expect(structuredContent.logs).toEqual(e2eLogs); + expect(mockHost.runCommand).toHaveBeenCalledWith('ng', ['e2e']); }); it('should handle a failed e2e run', async () => { - addProject('my-app', { e2e: { builder: 'mock-builder' } }); + addProjectToWorkspace(mockProjects, 'my-app', { e2e: { builder: 'mock-builder' } }); const e2eLogs = ['E2E failed']; mockHost.runCommand.and.rejectWith(new CommandError('Failed', e2eLogs, 1)); const { structuredContent } = await runE2e({ project: 'my-app' }, mockHost, mockContext); expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs).toEqual(e2eLogs); + expect(structuredContent.logs).toEqual([...e2eLogs, 'Failed']); }); }); diff --git a/packages/angular/cli/src/commands/mcp/tools/modernize.ts b/packages/angular/cli/src/commands/mcp/tools/modernize.ts index 9e85c6f7246b..6864ba2a338c 100644 --- a/packages/angular/cli/src/commands/mcp/tools/modernize.ts +++ b/packages/angular/cli/src/commands/mcp/tools/modernize.ts @@ -9,7 +9,7 @@ import { dirname, join, relative } from 'path'; import { z } from 'zod'; import { CommandError, type Host } from '../host'; -import { createStructuredContentOutput, findAngularJsonDir } from '../utils'; +import { createStructuredContentOutput, findAngularJsonDir, getCommandErrorLogs } from '../utils'; import { type McpToolDeclaration, declareTool } from './tool-registry'; interface Transformation { @@ -152,10 +152,7 @@ export async function runModernization(input: ModernizeInput, host: Host) { `Migration ${transformation.name} on directory ${relativePath} completed successfully.`, ); } catch (e) { - if (e instanceof CommandError) { - logs = e.logs; - } - logs.push((e as Error).message); + logs = getCommandErrorLogs(e); instructions.push( `Migration ${transformation.name} on directory ${relativePath} failed.`, ); diff --git a/packages/angular/cli/src/commands/mcp/tools/test.ts b/packages/angular/cli/src/commands/mcp/tools/test.ts index 23a978b9d7dc..829296d815ad 100644 --- a/packages/angular/cli/src/commands/mcp/tools/test.ts +++ b/packages/angular/cli/src/commands/mcp/tools/test.ts @@ -8,7 +8,7 @@ import { z } from 'zod'; import { CommandError, type Host, LocalWorkspaceHost } from '../host'; -import { createStructuredContentOutput } from '../utils'; +import { createStructuredContentOutput, getCommandErrorLogs } from '../utils'; import { type McpToolDeclaration, declareTool } from './tool-registry'; const testStatusSchema = z.enum(['success', 'failure']); @@ -53,13 +53,7 @@ export async function runTest(input: TestToolInput, host: Host) { logs = (await host.runCommand('ng', args)).logs; } catch (e) { status = 'failure'; - if (e instanceof CommandError) { - logs = e.logs; - } else if (e instanceof Error) { - logs = [e.message]; - } else { - logs = [String(e)]; - } + logs = getCommandErrorLogs(e); } const structuredContent: TestToolOutput = { @@ -85,8 +79,9 @@ Perform a one-off, non-watched unit test execution with ng test. * Verifying code changes with tests. -* This tool runs "ng test" with "--watch false". +* This tool uses "ng test". * It supports filtering by spec name if the underlying builder supports it (e.g., 'unit-test' builder). +* This runs a headless Chrome as a browser, so requires Chrome to be installed. `, isReadOnly: false, 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 8c7429417612..1049e705697d 100644 --- a/packages/angular/cli/src/commands/mcp/tools/test_spec.ts +++ b/packages/angular/cli/src/commands/mcp/tools/test_spec.ts @@ -6,17 +6,16 @@ * found in the LICENSE file at https://angular.dev/license */ -import { CommandError, Host } from '../host'; +import { CommandError } from '../host'; import type { MockHost } from '../testing/mock-host'; +import { createMockHost } from '../testing/test-utils'; import { runTest } from './test'; describe('Test Tool', () => { let mockHost: MockHost; beforeEach(() => { - mockHost = { - runCommand: jasmine.createSpy('runCommand').and.resolveTo({ logs: [] }), - } as unknown as MockHost; + mockHost = createMockHost(); }); it('should construct the command correctly with defaults', async () => { @@ -83,6 +82,6 @@ describe('Test Tool', () => { const { structuredContent } = await runTest({ project: 'my-failed-app' }, mockHost); expect(structuredContent.status).toBe('failure'); - expect(structuredContent.logs).toEqual(testLogs); + expect(structuredContent.logs).toEqual([...testLogs, 'Test failed']); }); }); diff --git a/packages/angular/cli/src/commands/mcp/utils.ts b/packages/angular/cli/src/commands/mcp/utils.ts index f5fdd70ef40e..7a505513341d 100644 --- a/packages/angular/cli/src/commands/mcp/utils.ts +++ b/packages/angular/cli/src/commands/mcp/utils.ts @@ -11,8 +11,10 @@ * Utility functions shared across MCP tools. */ +import { workspaces } from '@angular-devkit/core'; import { dirname, join } from 'node:path'; -import { LocalWorkspaceHost } from './host'; +import { CommandError, LocalWorkspaceHost } from './host'; +import { McpToolContext } from './tools/tool-registry'; /** * Returns simple structured content output from an MCP tool. @@ -52,3 +54,59 @@ export function findAngularJsonDir(startDir: string, host = LocalWorkspaceHost): currentDir = parentDir; } } + +/** + * Searches for a project in the current workspace, by name. + */ +export function getProject( + context: McpToolContext, + name: string, +): workspaces.ProjectDefinition | undefined { + const projects = context.workspace?.projects; + if (!projects) { + return undefined; + } + + return projects.get(name); +} + +/** + * Returns the name of the default project in the current workspace, or undefined if none exists. + * + * If no default project is defined but there's only a single project in the workspace, its name will + * be returned. + */ +export function getDefaultProjectName(context: McpToolContext): string | undefined { + const projects = context.workspace?.projects; + + if (!projects) { + return undefined; + } + + const defaultProjectName = context.workspace?.extensions['defaultProject'] as string | undefined; + if (defaultProjectName) { + return defaultProjectName; + } + + // No default project defined? This might still be salvageable if only a single project exists. + if (projects.size === 1) { + return Array.from(projects.keys())[0]; + } + + return undefined; +} + +/** + * Get the logs of a failing command. + * + * This call has fallbacks in case the exception was thrown from the command-calling code itself. + */ +export function getCommandErrorLogs(e: unknown): string[] { + if (e instanceof CommandError) { + return [...e.logs, e.message]; + } else if (e instanceof Error) { + return [e.message]; + } else { + return [String(e)]; + } +} diff --git a/packages/angular/cli/src/commands/mcp/utils_spec.ts b/packages/angular/cli/src/commands/mcp/utils_spec.ts new file mode 100644 index 000000000000..26dd0798e095 --- /dev/null +++ b/packages/angular/cli/src/commands/mcp/utils_spec.ts @@ -0,0 +1,126 @@ +/** + * @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 { CommandError, LocalWorkspaceHost } from './host'; +import { addProjectToWorkspace, createMockContext } from './testing/test-utils'; +import { + createStructuredContentOutput, + findAngularJsonDir, + getCommandErrorLogs, + getDefaultProjectName, + getProject, +} from './utils'; + +describe('MCP Utils', () => { + describe('createStructuredContentOutput', () => { + it('should create valid structured content output', () => { + const data = { foo: 'bar' }; + const output = createStructuredContentOutput(data); + + expect(output.structuredContent).toEqual(data); + expect(output.content).toEqual([{ type: 'text', text: JSON.stringify(data, null, 2) }]); + }); + }); + + describe('findAngularJsonDir', () => { + let mockHost: typeof LocalWorkspaceHost; + + beforeEach(() => { + mockHost = { + existsSync: jasmine.createSpy('existsSync'), + } as unknown as typeof LocalWorkspaceHost; + }); + + it('should return dir if angular.json exists in it', () => { + (mockHost.existsSync as jasmine.Spy).and.callFake( + (path: string) => path === join('/app', 'angular.json'), + ); + expect(findAngularJsonDir('/app', mockHost)).toBe('/app'); + }); + + it('should traverse up directory tree', () => { + (mockHost.existsSync as jasmine.Spy).and.callFake( + (path: string) => path === join('/app', 'angular.json'), + ); + expect(findAngularJsonDir('/app/src/app', mockHost)).toBe('/app'); + }); + + it('should return null if not found', () => { + (mockHost.existsSync as jasmine.Spy).and.returnValue(false); + expect(findAngularJsonDir('/app', mockHost)).toBeNull(); + }); + }); + + describe('getProject', () => { + it('should return undefined if workspace has no projects', () => { + const { context } = createMockContext(); + const emptyContext = { ...context }; + expect(getProject(emptyContext, 'app')).toBeUndefined(); + }); + + it('should return undefined if project not found', () => { + const { context, projects } = createMockContext(); + addProjectToWorkspace(projects, 'existing-app', {}, 'root'); + expect(getProject(context, 'non-existent')).toBeUndefined(); + }); + + it('should return project definition if found', () => { + const { context, projects } = createMockContext(); + addProjectToWorkspace(projects, 'app', {}, 'root'); + + const project = getProject(context, 'app'); + expect(project).toBeDefined(); + expect(project?.root).toBe('root'); + }); + }); + + describe('getDefaultProjectName', () => { + it('should return undefined if workspace is missing', () => { + const { context } = createMockContext(); + const emptyContext = { ...context, workspace: undefined }; + expect(getDefaultProjectName(emptyContext)).toBeUndefined(); + }); + + it('should return defaultProject from extensions', () => { + const { context, workspace } = createMockContext(); + workspace.extensions['defaultProject'] = 'my-app'; + expect(getDefaultProjectName(context)).toBe('my-app'); + }); + + it('should return single project name if only one exists and no defaultProject', () => { + const { context, projects } = createMockContext(); + addProjectToWorkspace(projects, 'only-app', {}, ''); + expect(getDefaultProjectName(context)).toBe('only-app'); + }); + + it('should return undefined if multiple projects exist and no defaultProject', () => { + const { context, projects } = createMockContext(); + addProjectToWorkspace(projects, 'app1', {}, ''); + addProjectToWorkspace(projects, 'app2', {}, ''); + expect(getDefaultProjectName(context)).toBeUndefined(); + }); + }); + + describe('getCommandErrorLogs', () => { + it('should extract logs from CommandError', () => { + const logs = ['log1', 'log2']; + const err = new CommandError('failed', logs, 1); + expect(getCommandErrorLogs(err)).toEqual([...logs, 'failed']); + }); + + it('should extract message from Error', () => { + const err = new Error('oops'); + expect(getCommandErrorLogs(err)).toEqual(['oops']); + }); + + it('should stringify unknown error', () => { + expect(getCommandErrorLogs('weird error')).toEqual(['weird error']); + }); + }); +}); From d03fa449c1a586dd86c371f68e7b89e287ae0257 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 31 Dec 2025 21:36:20 +0000 Subject: [PATCH 14/68] build: update pnpm to v10.27.0 See associated pull request for more information. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 710de1c9193b..cee4873bb574 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,12 @@ "type": "git", "url": "https://github.com/angular/angular-cli.git" }, - "packageManager": "pnpm@10.26.1", + "packageManager": "pnpm@10.27.0", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "Please use pnpm instead of NPM to install dependencies", "yarn": "Please use pnpm instead of Yarn to install dependencies", - "pnpm": "10.26.1" + "pnpm": "10.27.0" }, "author": "Angular Authors", "license": "MIT", From 286199ba39e342c5df153b72537f458925503ef4 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 6 Jan 2026 17:40:55 +0000 Subject: [PATCH 15/68] build: update all non-major dependencies See associated pull request for more information. --- modules/testing/builder/package.json | 6 +- package.json | 12 +- packages/angular/build/package.json | 14 +- packages/angular/cli/package.json | 6 +- .../angular_devkit/build_angular/package.json | 10 +- .../angular_devkit/build_webpack/package.json | 2 +- packages/ngtools/webpack/package.json | 2 +- pnpm-lock.yaml | 1445 ++++++++++------- 8 files changed, 895 insertions(+), 602 deletions(-) diff --git a/modules/testing/builder/package.json b/modules/testing/builder/package.json index fe92f53c0725..ec43c0d86eb7 100644 --- a/modules/testing/builder/package.json +++ b/modules/testing/builder/package.json @@ -5,9 +5,9 @@ "@angular/ssr": "workspace:*", "@angular-devkit/build-angular": "workspace:*", "browser-sync": "3.0.4", - "@vitest/coverage-v8": "4.0.15", - "jsdom": "27.3.0", + "@vitest/coverage-v8": "4.0.16", + "jsdom": "27.4.0", "rxjs": "7.8.2", - "vitest": "4.0.15" + "vitest": "4.0.16" } } diff --git a/package.json b/package.json index cee4873bb574..25cfd4d8a549 100644 --- a/package.json +++ b/package.json @@ -90,12 +90,12 @@ "@types/yargs": "^17.0.20", "@types/yargs-parser": "^21.0.0", "@types/yarnpkg__lockfile": "^1.1.5", - "@typescript-eslint/eslint-plugin": "8.50.0", - "@typescript-eslint/parser": "8.50.0", + "@typescript-eslint/eslint-plugin": "8.52.0", + "@typescript-eslint/parser": "8.52.0", "ajv": "8.17.1", "buffer": "6.0.3", - "esbuild": "0.27.1", - "esbuild-wasm": "0.27.1", + "esbuild": "0.27.2", + "esbuild-wasm": "0.27.2", "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-header": "3.1.1", @@ -122,7 +122,7 @@ "protractor": "~7.0.0", "puppeteer": "18.2.1", "quicktype-core": "23.2.6", - "rollup": "4.53.5", + "rollup": "4.55.1", "rollup-license-plugin": "~3.1.0", "rollup-plugin-dts": "6.3.0", "rollup-plugin-sourcemaps2": "0.5.4", @@ -131,7 +131,7 @@ "ts-node": "^10.9.1", "tslib": "2.8.1", "typescript": "5.9.3", - "undici": "7.16.0", + "undici": "7.18.0", "unenv": "^1.10.0", "verdaccio": "6.2.4", "verdaccio-auth-memory": "^10.0.0", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index 22e5e6b4b1be..ad2ea1029b51 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -27,7 +27,7 @@ "@vitejs/plugin-basic-ssl": "2.1.0", "beasties": "0.3.5", "browserslist": "^4.26.0", - "esbuild": "0.27.1", + "esbuild": "0.27.2", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", @@ -37,14 +37,14 @@ "parse5-html-rewriting-stream": "8.0.0", "picomatch": "4.0.3", "piscina": "5.1.4", - "rolldown": "1.0.0-beta.54", - "sass": "1.97.0", + "rolldown": "1.0.0-beta.58", + "sass": "1.97.1", "semver": "7.7.3", "source-map-support": "0.5.21", "tinyglobby": "0.2.15", - "undici": "7.16.0", + "undici": "7.18.0", "vite": "7.3.0", - "watchpack": "2.4.4" + "watchpack": "2.5.0" }, "optionalDependencies": { "lmdb": "3.4.4" @@ -52,12 +52,12 @@ "devDependencies": { "@angular-devkit/core": "workspace:*", "@angular/ssr": "workspace:*", - "jsdom": "27.3.0", + "jsdom": "27.4.0", "less": "4.4.2", "ng-packagr": "21.1.0-next.0", "postcss": "8.5.6", "rxjs": "7.8.2", - "vitest": "4.0.15" + "vitest": "4.0.16" }, "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 1fb8b671f261..07829c24b4c2 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -27,10 +27,10 @@ "@angular-devkit/schematics": "workspace:0.0.0-PLACEHOLDER", "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", - "@modelcontextprotocol/sdk": "1.25.0", + "@modelcontextprotocol/sdk": "1.25.1", "@schematics/angular": "workspace:0.0.0-PLACEHOLDER", "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.46.0", + "algoliasearch": "5.46.2", "ini": "6.0.0", "jsonc-parser": "3.3.1", "listr2": "9.0.5", @@ -40,7 +40,7 @@ "resolve": "1.22.11", "semver": "7.7.3", "yargs": "18.0.0", - "zod": "4.2.1" + "zod": "4.3.5" }, "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 35dff92b9d8b..610d05c31c94 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -28,7 +28,7 @@ "browserslist": "^4.26.0", "copy-webpack-plugin": "13.0.1", "css-loader": "7.1.2", - "esbuild-wasm": "0.27.1", + "esbuild-wasm": "0.27.2", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", @@ -46,7 +46,7 @@ "postcss-loader": "8.2.0", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", - "sass": "1.97.0", + "sass": "1.97.1", "sass-loader": "16.0.6", "semver": "7.7.3", "source-map-loader": "5.0.0", @@ -55,21 +55,21 @@ "tinyglobby": "0.2.15", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.104.0", + "webpack": "5.104.1", "webpack-dev-middleware": "7.4.5", "webpack-dev-server": "5.2.2", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "optionalDependencies": { - "esbuild": "0.27.1" + "esbuild": "0.27.2" }, "devDependencies": { "@angular/ssr": "workspace:*", "@web/test-runner": "0.20.2", "browser-sync": "3.0.4", "ng-packagr": "21.1.0-next.0", - "undici": "7.16.0" + "undici": "7.18.0" }, "peerDependencies": { "@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP", diff --git a/packages/angular_devkit/build_webpack/package.json b/packages/angular_devkit/build_webpack/package.json index 5b1d83e5fa20..316b68533bf8 100644 --- a/packages/angular_devkit/build_webpack/package.json +++ b/packages/angular_devkit/build_webpack/package.json @@ -22,7 +22,7 @@ "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", "@ngtools/webpack": "workspace:0.0.0-PLACEHOLDER", - "webpack": "5.104.0", + "webpack": "5.104.1", "webpack-dev-server": "5.2.2" }, "peerDependencies": { diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index daeacb77baba..5947e89fe2b8 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -30,6 +30,6 @@ "@angular/compiler": "21.1.0-next.4", "@angular/compiler-cli": "21.1.0-next.4", "typescript": "5.9.3", - "webpack": "5.104.0" + "webpack": "5.104.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33294bff3eca..07db10eaa799 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,7 +48,7 @@ importers: version: 21.1.0-next.3(5911ac44acdb5e81564606f5886cc827) '@angular/ng-dev': specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#ddc3809c1993612732eaae62d28e828b2ed789e5 - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ddc3809c1993612732eaae62d28e828b2ed789e5(@modelcontextprotocol/sdk@1.25.0(zod@4.2.1)) + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ddc3809c1993612732eaae62d28e828b2ed789e5(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5)) '@angular/platform-browser': specifier: 21.1.0-next.4 version: 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) @@ -81,16 +81,16 @@ importers: version: 9.39.2 '@rollup/plugin-alias': specifier: ^6.0.0 - version: 6.0.0(rollup@4.53.5) + version: 6.0.0(rollup@4.55.1) '@rollup/plugin-commonjs': specifier: ^29.0.0 - version: 29.0.0(rollup@4.53.5) + version: 29.0.0(rollup@4.55.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.53.5) + version: 6.1.0(rollup@4.55.1) '@rollup/plugin-node-resolve': specifier: 16.0.3 - version: 16.0.3(rollup@4.53.5) + version: 16.0.3(rollup@4.55.1) '@stylistic/eslint-plugin': specifier: ^5.0.0 version: 5.6.1(eslint@9.39.2(jiti@2.6.1)) @@ -126,7 +126,7 @@ importers: version: 3.0.8 '@types/loader-utils': specifier: ^3.0.0 - version: 3.0.0(esbuild@0.27.1) + version: 3.0.0(esbuild@0.27.2) '@types/lodash': specifier: ^4.17.0 version: 4.17.21 @@ -164,11 +164,11 @@ importers: specifier: ^1.1.5 version: 1.1.9 '@typescript-eslint/eslint-plugin': - specifier: 8.50.0 - version: 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.52.0 + version: 8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.50.0 - version: 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.52.0 + version: 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) ajv: specifier: 8.17.1 version: 8.17.1 @@ -176,11 +176,11 @@ importers: specifier: 6.0.3 version: 6.0.3 esbuild: - specifier: 0.27.1 - version: 0.27.1 + specifier: 0.27.2 + version: 0.27.2 esbuild-wasm: - specifier: 0.27.1 - version: 0.27.1 + specifier: 0.27.2 + version: 0.27.2 eslint: specifier: 9.39.2 version: 9.39.2(jiti@2.6.1) @@ -192,7 +192,7 @@ importers: version: 3.1.1(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) express: specifier: 5.2.1 version: 5.2.1 @@ -260,17 +260,17 @@ importers: specifier: 23.2.6 version: 23.2.6(encoding@0.1.13) rollup: - specifier: 4.53.5 - version: 4.53.5 + specifier: 4.55.1 + version: 4.55.1 rollup-license-plugin: specifier: ~3.1.0 version: 3.1.0 rollup-plugin-dts: specifier: 6.3.0 - version: 6.3.0(rollup@4.53.5)(typescript@5.9.3) + version: 6.3.0(rollup@4.55.1)(typescript@5.9.3) rollup-plugin-sourcemaps2: specifier: 0.5.4 - version: 0.5.4(@types/node@22.19.3)(rollup@4.53.5) + version: 0.5.4(@types/node@22.19.3)(rollup@4.55.1) semver: specifier: 7.7.3 version: 7.7.3 @@ -287,8 +287,8 @@ importers: specifier: 5.9.3 version: 5.9.3 undici: - specifier: 7.16.0 - version: 7.16.0 + specifier: 7.18.0 + version: 7.18.0 unenv: specifier: ^1.10.0 version: 1.10.0 @@ -317,20 +317,20 @@ importers: specifier: workspace:* version: link:../../../packages/angular/ssr '@vitest/coverage-v8': - specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 4.0.16 + version: 4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) browser-sync: specifier: 3.0.4 version: 3.0.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: - specifier: 27.3.0 - version: 27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 27.4.0 + version: 27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) rxjs: specifier: 7.8.2 version: 7.8.2 vitest: - specifier: 4.0.15 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.16 + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) packages/angular/build: dependencies: @@ -354,7 +354,7 @@ importers: version: 5.1.21(@types/node@24.10.4) '@vitejs/plugin-basic-ssl': specifier: 2.1.0 - version: 2.1.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.1.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) beasties: specifier: 0.3.5 version: 0.3.5 @@ -362,8 +362,8 @@ importers: specifier: ^4.26.0 version: 4.28.1 esbuild: - specifier: 0.27.1 - version: 0.27.1 + specifier: 0.27.2 + version: 0.27.2 https-proxy-agent: specifier: 7.0.6 version: 7.0.6(supports-color@10.2.2) @@ -392,11 +392,11 @@ importers: specifier: 5.1.4 version: 5.1.4 rolldown: - specifier: 1.0.0-beta.54 - version: 1.0.0-beta.54 + specifier: 1.0.0-beta.58 + version: 1.0.0-beta.58 sass: - specifier: 1.97.0 - version: 1.97.0 + specifier: 1.97.1 + version: 1.97.1 semver: specifier: 7.7.3 version: 7.7.3 @@ -407,14 +407,14 @@ importers: specifier: 0.2.15 version: 0.2.15 undici: - specifier: 7.16.0 - version: 7.16.0 + specifier: 7.18.0 + version: 7.18.0 vite: specifier: 7.3.0 - version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) watchpack: - specifier: 2.4.4 - version: 2.4.4 + specifier: 2.5.0 + version: 2.5.0 devDependencies: '@angular-devkit/core': specifier: workspace:* @@ -423,8 +423,8 @@ importers: specifier: workspace:* version: link:../ssr jsdom: - specifier: 27.3.0 - version: 27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 27.4.0 + version: 27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) less: specifier: 4.4.2 version: 4.4.2 @@ -438,8 +438,8 @@ importers: specifier: 7.8.2 version: 7.8.2 vitest: - specifier: 4.0.15 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + specifier: 4.0.16 + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: lmdb: specifier: 3.4.4 @@ -463,8 +463,8 @@ importers: specifier: 3.0.5 version: 3.0.5(@inquirer/prompts@7.10.1(@types/node@24.10.4))(@types/node@24.10.4)(listr2@9.0.5) '@modelcontextprotocol/sdk': - specifier: 1.25.0 - version: 1.25.0(zod@4.2.1) + specifier: 1.25.1 + version: 1.25.1(zod@4.3.5) '@schematics/angular': specifier: workspace:0.0.0-PLACEHOLDER version: link:../../schematics/angular @@ -472,8 +472,8 @@ importers: specifier: 1.1.0 version: 1.1.0 algoliasearch: - specifier: 5.46.0 - version: 5.46.0 + specifier: 5.46.2 + version: 5.46.2 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.2.1 - version: 4.2.1 + specifier: 4.3.5 + version: 4.3.5 packages/angular/pwa: dependencies: @@ -624,19 +624,19 @@ importers: version: 10.4.23(postcss@8.5.6) babel-loader: specifier: 10.0.0 - version: 10.0.0(@babel/core@7.28.5)(webpack@5.104.0(esbuild@0.27.1)) + version: 10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)) browserslist: specifier: ^4.26.0 version: 4.28.1 copy-webpack-plugin: specifier: 13.0.1 - version: 13.0.1(webpack@5.104.0(esbuild@0.27.1)) + version: 13.0.1(webpack@5.104.1(esbuild@0.27.2)) css-loader: specifier: 7.1.2 - version: 7.1.2(webpack@5.104.0(esbuild@0.27.1)) + version: 7.1.2(webpack@5.104.1(esbuild@0.27.2)) esbuild-wasm: - specifier: 0.27.1 - version: 0.27.1 + specifier: 0.27.2 + version: 0.27.2 http-proxy-middleware: specifier: 3.0.5 version: 3.0.5 @@ -654,16 +654,16 @@ importers: version: 4.4.2 less-loader: specifier: 12.3.0 - version: 12.3.0(less@4.4.2)(webpack@5.104.0(esbuild@0.27.1)) + version: 12.3.0(less@4.4.2)(webpack@5.104.1(esbuild@0.27.2)) license-webpack-plugin: specifier: 4.0.2 - version: 4.0.2(webpack@5.104.0(esbuild@0.27.1)) + version: 4.0.2(webpack@5.104.1(esbuild@0.27.2)) loader-utils: specifier: 3.3.1 version: 3.3.1 mini-css-extract-plugin: specifier: 2.9.4 - version: 2.9.4(webpack@5.104.0(esbuild@0.27.1)) + version: 2.9.4(webpack@5.104.1(esbuild@0.27.2)) open: specifier: 11.0.0 version: 11.0.0 @@ -681,7 +681,7 @@ importers: version: 8.5.6 postcss-loader: specifier: 8.2.0 - version: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.0(esbuild@0.27.1)) + version: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -689,17 +689,17 @@ importers: specifier: 7.8.2 version: 7.8.2 sass: - specifier: 1.97.0 - version: 1.97.0 + specifier: 1.97.1 + version: 1.97.1 sass-loader: specifier: 16.0.6 - version: 16.0.6(sass@1.97.0)(webpack@5.104.0(esbuild@0.27.1)) + version: 16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)) semver: specifier: 7.7.3 version: 7.7.3 source-map-loader: specifier: 5.0.0 - version: 5.0.0(webpack@5.104.0(esbuild@0.27.1)) + version: 5.0.0(webpack@5.104.1(esbuild@0.27.2)) source-map-support: specifier: 0.5.21 version: 0.5.21 @@ -716,20 +716,20 @@ importers: specifier: 2.8.1 version: 2.8.1 webpack: - specifier: 5.104.0 - version: 5.104.0(esbuild@0.27.1) + specifier: 5.104.1 + version: 5.104.1(esbuild@0.27.2) webpack-dev-middleware: specifier: 7.4.5 - version: 7.4.5(webpack@5.104.0(esbuild@0.27.1)) + version: 7.4.5(webpack@5.104.1(esbuild@0.27.2)) webpack-dev-server: specifier: 5.2.2 - version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.0(esbuild@0.27.1)) + version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.1(esbuild@0.27.2)) webpack-merge: specifier: 6.0.1 version: 6.0.1 webpack-subresource-integrity: specifier: 5.1.0 - version: 5.1.0(webpack@5.104.0(esbuild@0.27.1)) + version: 5.1.0(webpack@5.104.1(esbuild@0.27.2)) devDependencies: '@angular/ssr': specifier: workspace:* @@ -744,12 +744,12 @@ importers: specifier: 21.1.0-next.0 version: 21.1.0-next.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) undici: - specifier: 7.16.0 - version: 7.16.0 + specifier: 7.18.0 + version: 7.18.0 optionalDependencies: esbuild: - specifier: 0.27.1 - version: 0.27.1 + specifier: 0.27.2 + version: 0.27.2 packages/angular_devkit/build_webpack: dependencies: @@ -767,11 +767,11 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../ngtools/webpack webpack: - specifier: 5.104.0 - version: 5.104.0(esbuild@0.27.1) + specifier: 5.104.1 + version: 5.104.1(esbuild@0.27.2) webpack-dev-server: specifier: 5.2.2 - version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.0(esbuild@0.27.1)) + version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.1(esbuild@0.27.2)) packages/angular_devkit/core: dependencies: @@ -843,8 +843,8 @@ importers: specifier: 5.9.3 version: 5.9.3 webpack: - specifier: 5.104.0 - version: 5.104.0(esbuild@0.27.1) + specifier: 5.104.1 + version: 5.104.1(esbuild@0.27.2) packages/schematics/angular: dependencies: @@ -890,60 +890,60 @@ packages: '@actions/io@2.0.0': resolution: {integrity: sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==} - '@algolia/abtesting@1.12.0': - resolution: {integrity: sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==} + '@algolia/abtesting@1.12.2': + resolution: {integrity: sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-abtesting@5.46.0': - resolution: {integrity: sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==} + '@algolia/client-abtesting@5.46.2': + resolution: {integrity: sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.46.0': - resolution: {integrity: sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==} + '@algolia/client-analytics@5.46.2': + resolution: {integrity: sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.46.0': - resolution: {integrity: sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==} + '@algolia/client-common@5.46.2': + resolution: {integrity: sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.46.0': - resolution: {integrity: sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==} + '@algolia/client-insights@5.46.2': + resolution: {integrity: sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.46.0': - resolution: {integrity: sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==} + '@algolia/client-personalization@5.46.2': + resolution: {integrity: sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.46.0': - resolution: {integrity: sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==} + '@algolia/client-query-suggestions@5.46.2': + resolution: {integrity: sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.46.0': - resolution: {integrity: sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==} + '@algolia/client-search@5.46.2': + resolution: {integrity: sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.46.0': - resolution: {integrity: sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==} + '@algolia/ingestion@1.46.2': + resolution: {integrity: sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.46.0': - resolution: {integrity: sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==} + '@algolia/monitoring@1.46.2': + resolution: {integrity: sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.46.0': - resolution: {integrity: sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==} + '@algolia/recommend@5.46.2': + resolution: {integrity: sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.46.0': - resolution: {integrity: sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==} + '@algolia/requester-browser-xhr@5.46.2': + resolution: {integrity: sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.46.0': - resolution: {integrity: sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==} + '@algolia/requester-fetch@5.46.2': + resolution: {integrity: sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.46.0': - resolution: {integrity: sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==} + '@algolia/requester-node-http@5.46.2': + resolution: {integrity: sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': @@ -1664,158 +1664,158 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.27.1': - resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.1': - resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.1': - resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.1': - resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.1': - resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.1': - resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.1': - resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.1': - resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.1': - resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.1': - resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.1': - resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.1': - resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.1': - resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.1': - resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.1': - resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.1': - resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.1': - resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.1': - resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.1': - resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.1': - resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.1': - resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.1': - resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.1': - resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.1': - resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.1': - resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.1': - resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1826,6 +1826,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -1871,6 +1877,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.8.0': + resolution: {integrity: sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@exodus/crypto': ^1.0.0-rc.4 + peerDependenciesMeta: + '@exodus/crypto': + optional: true + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -2562,8 +2577,8 @@ packages: cpu: [x64] os: [win32] - '@modelcontextprotocol/sdk@1.25.0': - resolution: {integrity: sha512-z0Zhn/LmQ3yz91dEfd5QgS7DpSjA4pk+3z2++zKgn5L6iDFM9QapsVoAQSbKLvlrFsZk9+ru6yHHWNq2lCYJKQ==} + '@modelcontextprotocol/sdk@1.25.1': + resolution: {integrity: sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -2719,8 +2734,8 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.0': - resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2879,8 +2894,8 @@ packages: resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} engines: {node: '>=14'} - '@oxc-project/types@0.102.0': - resolution: {integrity: sha512-8Skrw405g+/UJPKWJ1twIk3BIH2nXdiVlVNtYT23AXVwpsd79es4K+KYt06Fbnkc5BaTvk/COT2JuCLYdwnCdA==} + '@oxc-project/types@0.106.0': + resolution: {integrity: sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==} '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -3032,89 +3047,89 @@ packages: engines: {node: '>=18'} hasBin: true - '@rolldown/binding-android-arm64@1.0.0-beta.54': - resolution: {integrity: sha512-zZRx/ur3Fai3fxiEmVp48+6GCBR48PRWJR1X3TTMn9yiq2bBHlYPgBaQtDOYWXv5H3J5dXujeTyGnuoY+kdGCg==} + '@rolldown/binding-android-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.54': - resolution: {integrity: sha512-zMyFEJmbIs91x22HAA/eUvmZHgjX8tGsD3TJ+WC9aY4bCdl3w84H9vMZmChSHAF1dYvGNH4KQDI2IubeZaCYtg==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.54': - resolution: {integrity: sha512-Ex7QttdaVnEpmE/zroUT5Qm10e2+Vjd9q0LX9eXm59SitxDODMpC8GI1Rct5RrLf4GLU4DzdXBj6DGzuR+6g6w==} + '@rolldown/binding-darwin-x64@1.0.0-beta.58': + resolution: {integrity: sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.54': - resolution: {integrity: sha512-E1XO10ryM/Vxw3Q1wvs9s2mSpVBfbHtzkbJcdu26qh17ZmVwNWLiIoqEcbkXm028YwkReG4Gd2gCZ3NxgTQ28Q==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': + resolution: {integrity: sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.54': - resolution: {integrity: sha512-oS73Uks8jczQR9pg0Bj718vap/x71exyJ5yuxu4X5V4MhwRQnky7ANSPm6ARUfraxOqt49IBfcMeGnw2rTSqdA==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': + resolution: {integrity: sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.54': - resolution: {integrity: sha512-pY8N2X5C+/ZQcy0eRdfOzOP//OFngP1TaIqDjFwfBPws2UNavKS8SpxhPEgUaYIaT0keVBd/TB+eVy9z+CIOtw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.54': - resolution: {integrity: sha512-cgTooAFm2MUmFriB7IYaWBNyqrGlRPKG+yaK2rGFl2rcdOcO24urY4p3eyB0ogqsRLvJbIxwjjYiWiIP7Eo1Cw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.54': - resolution: {integrity: sha512-nGyLT1Qau0W+kEL44V2jhHmvfS3wyJW08E4WEu2E6NuIy+uChKN1X0aoxzFIDi2owDsYaZYez/98/f268EupIQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': + resolution: {integrity: sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.54': - resolution: {integrity: sha512-KH374P0TUjDXssROT/orvzaWrzGOptD13PTrltgKwbDprJTMknoLiYsOD6Ttz92O2VuAcCtFuJ1xbyFM2Uo/Xg==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': + resolution: {integrity: sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.54': - resolution: {integrity: sha512-oMAVO4wbfAbhpBxPsSp8R7ntL2DchpNfO+tGhN8/sI9jsbYwOv78uIW1fTwOBslhjTVFltGJ+l23mubNQcYNaQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': + resolution: {integrity: sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.54': - resolution: {integrity: sha512-MYY/FmY+HehHiQkNx04W5oLy/Fqd1hXYqZmmorSDXvAHnxMbSgmdFicKsSYOg/sVGHBMEP1tTn6kV5sWrS45rA==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + resolution: {integrity: sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.54': - resolution: {integrity: sha512-66o3uKxUmcYskT9exskxs3OVduXf5x0ndlMkYOjSpBgqzhLtkub136yDvZkNT1OkNDET0odSwcU7aWdpnwzAyg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.54': - resolution: {integrity: sha512-FbbbrboChLBXfeEsOfaypBGqzbdJ/CcSA2BPLCggojnIHy58Jo+AXV7HATY8opZk7194rRbokIT8AfPJtZAWtg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': + resolution: {integrity: sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.54': - resolution: {integrity: sha512-AHgcZ+w7RIRZ65ihSQL8YuoKcpD9Scew4sEeP1BBUT9QdTo6KjwHrZZXjID6nL10fhKessCH6OPany2QKwAwTQ==} + '@rolldown/pluginutils@1.0.0-beta.58': + resolution: {integrity: sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -3184,122 +3199,260 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.53.5': resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.53.5': resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.53.5': resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.53.5': resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.53.5': resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} cpu: [arm] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm-musleabihf@4.53.5': resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} cpu: [arm] os: [linux] libc: [musl] + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + cpu: [arm] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-arm64-gnu@4.53.5': resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} cpu: [arm64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm64-musl@4.53.5': resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} cpu: [arm64] os: [linux] libc: [musl] + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-loong64-gnu@4.53.5': resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} cpu: [loong64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-ppc64-gnu@4.53.5': resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} cpu: [ppc64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-riscv64-gnu@4.53.5': resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} cpu: [riscv64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-riscv64-musl@4.53.5': resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} cpu: [riscv64] os: [linux] libc: [musl] + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-s390x-gnu@4.53.5': resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} cpu: [s390x] os: [linux] libc: [glibc] + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.53.5': resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} cpu: [x64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-musl@4.53.5': resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} cpu: [x64] os: [linux] libc: [musl] + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + '@rollup/rollup-openharmony-arm64@4.53.5': resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.53.5': resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.53.5': resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.53.5': resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.53.5': resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] + '@rollup/wasm-node@4.54.0': resolution: {integrity: sha512-CeEdHzNY+ZIR6NWpIOiJuCrr6tTK7cRGeOf6GYg5f73+UwJLqn5a4d5Ovf/hOWDyHM1KcySbxHQESJ9krhe0+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3664,39 +3817,39 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.50.0': - resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} + '@typescript-eslint/eslint-plugin@8.52.0': + resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.50.0 + '@typescript-eslint/parser': ^8.52.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.50.0': - resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} + '@typescript-eslint/parser@8.52.0': + resolution: {integrity: sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.50.0': - resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} + '@typescript-eslint/project-service@8.52.0': + resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.50.0': - resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} + '@typescript-eslint/scope-manager@8.52.0': + resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.50.0': - resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} + '@typescript-eslint/tsconfig-utils@8.52.0': + resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.50.0': - resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} + '@typescript-eslint/type-utils@8.52.0': + resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3706,21 +3859,25 @@ packages: resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.50.0': - resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} + '@typescript-eslint/types@8.52.0': + resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.52.0': + resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.50.0': - resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} + '@typescript-eslint/utils@8.52.0': + resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.50.0': - resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} + '@typescript-eslint/visitor-keys@8.52.0': + resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@verdaccio/auth@8.0.0-next-8.28': @@ -3808,20 +3965,20 @@ packages: peerDependencies: vite: ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@4.0.15': - resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} + '@vitest/coverage-v8@4.0.16': + resolution: {integrity: sha512-2rNdjEIsPRzsdu6/9Eq0AYAzYdpP6Bx9cje9tL3FE5XzXRQF1fNU9pe/1yE8fCrS0HD+fBtt6gLPh6LI57tX7A==} peerDependencies: - '@vitest/browser': 4.0.15 - vitest: 4.0.15 + '@vitest/browser': 4.0.16 + vitest: 4.0.16 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.15': - resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} + '@vitest/expect@4.0.16': + resolution: {integrity: sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA==} - '@vitest/mocker@4.0.15': - resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} + '@vitest/mocker@4.0.16': + resolution: {integrity: sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -3831,20 +3988,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.15': - resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} + '@vitest/pretty-format@4.0.16': + resolution: {integrity: sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA==} - '@vitest/runner@4.0.15': - resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} + '@vitest/runner@4.0.16': + resolution: {integrity: sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q==} - '@vitest/snapshot@4.0.15': - resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} + '@vitest/snapshot@4.0.16': + resolution: {integrity: sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA==} - '@vitest/spy@4.0.15': - resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} + '@vitest/spy@4.0.16': + resolution: {integrity: sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw==} - '@vitest/utils@4.0.15': - resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} + '@vitest/utils@4.0.16': + resolution: {integrity: sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==} '@web/browser-logs@0.4.1': resolution: {integrity: sha512-ypmMG+72ERm+LvP+loj9A64MTXvWMXHUOu773cPO4L1SV/VWg6xA9Pv7vkvkXQX+ItJtCJt+KQ+U6ui2HhSFUw==} @@ -4036,8 +4193,8 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@5.46.0: - resolution: {integrity: sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==} + algoliasearch@5.46.2: + resolution: {integrity: sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q==} engines: {node: '>= 14.0.0'} ansi-colors@4.1.3: @@ -5204,13 +5361,13 @@ packages: es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - esbuild-wasm@0.27.1: - resolution: {integrity: sha512-NjueSyuuMjX6F/mnqQ8g4rkwAFTct7JT/A/oXjXhGTFbWiTm3zU59BMulOrT+KuCHj+oShTBARQCxCDDvVxwFA==} + esbuild-wasm@0.27.2: + resolution: {integrity: sha512-eUTnl8eh+v8UZIZh4MrMOKDAc8Lm7+NqP3pyuTORGFY1s/o9WoiJgKnwXy+te2J3hX7iRbFSHEyig7GsPeeJyw==} engines: {node: '>=18'} hasBin: true - esbuild@0.27.1: - resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true @@ -5831,9 +5988,9 @@ packages: hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} @@ -6397,8 +6554,8 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@27.3.0: - resolution: {integrity: sha512-GtldT42B8+jefDUC4yUKAvsaOrH7PDHmZxZXNgF2xMmymjUbRYJvpAybZAKEmXDGTM0mCsz8duOa4vTm5AY2Kg==} + jsdom@27.4.0: + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -7793,8 +7950,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@1.0.0-beta.54: - resolution: {integrity: sha512-3lIvjCWgjPL3gmiATUdV1NeVBGJZy6FdtwgLPol25tAkn46Q/MsVGfCSNswXwFOxGrxglPaN20IeALSIFuFyEg==} + rolldown@1.0.0-beta.58: + resolution: {integrity: sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7824,6 +7981,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+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'} @@ -7887,8 +8049,8 @@ packages: webpack: optional: true - sass@1.97.0: - resolution: {integrity: sha512-KR0igP1z4avUJetEuIeOdDlwaUDvkH8wSx7FdSjyYBS3dpyX3TzHfAMO0G1Q4/3cdjcmi3r7idh+KCmKqS+KeQ==} + sass@1.97.1: + resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} engines: {node: '>=14.0.0'} hasBin: true @@ -8460,8 +8622,8 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -8593,8 +8755,8 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@7.16.0: - resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + undici@7.18.0: + resolution: {integrity: sha512-CfPufgPFHCYu0W4h1NiKW9+tNJ39o3kWm7Cm29ET1enSJx+AERfz7A2wAr26aY0SZbYzZlTBQtcHy15o60VZfQ==} engines: {node: '>=20.18.1'} unenv@1.10.0: @@ -8762,18 +8924,18 @@ packages: yaml: optional: true - vitest@4.0.15: - resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + vitest@4.0.16: + resolution: {integrity: sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==} 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.0.15 - '@vitest/browser-preview': 4.0.15 - '@vitest/browser-webdriverio': 4.0.15 - '@vitest/ui': 4.0.15 + '@vitest/browser-playwright': 4.0.16 + '@vitest/browser-preview': 4.0.16 + '@vitest/browser-webdriverio': 4.0.16 + '@vitest/ui': 4.0.16 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -8804,8 +8966,8 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + watchpack@2.5.0: + resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -8884,8 +9046,8 @@ packages: html-webpack-plugin: optional: true - webpack@5.104.0: - resolution: {integrity: sha512-5DeICTX8BVgNp6afSPYXAFjskIgWGlygQH58bcozPOXgo2r/6xx39Y1+cULZ3gTxUYQP88jmwLj2anu4Xaq84g==} + webpack@5.104.1: + resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -8902,11 +9064,6 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} @@ -9161,8 +9318,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.2.1: - resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} + zod@4.3.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} zone.js@0.16.0: resolution: {integrity: sha512-LqLPpIQANebrlxY6jKcYKdgN5DTXyyHAKnnWWjE5pPfEQ4n7j5zn7mOEEpwNZVKGqx3kKKmvplEmoBrvpgROTA==} @@ -9187,89 +9344,89 @@ snapshots: '@actions/io@2.0.0': {} - '@algolia/abtesting@1.12.0': + '@algolia/abtesting@1.12.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/client-abtesting@5.46.0': + '@algolia/client-abtesting@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/client-analytics@5.46.0': + '@algolia/client-analytics@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/client-common@5.46.0': {} + '@algolia/client-common@5.46.2': {} - '@algolia/client-insights@5.46.0': + '@algolia/client-insights@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/client-personalization@5.46.0': + '@algolia/client-personalization@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/client-query-suggestions@5.46.0': + '@algolia/client-query-suggestions@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/client-search@5.46.0': + '@algolia/client-search@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/ingestion@1.46.0': + '@algolia/ingestion@1.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/monitoring@1.46.0': + '@algolia/monitoring@1.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/recommend@5.46.0': + '@algolia/recommend@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + '@algolia/client-common': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 - '@algolia/requester-browser-xhr@5.46.0': + '@algolia/requester-browser-xhr@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 + '@algolia/client-common': 5.46.2 - '@algolia/requester-fetch@5.46.0': + '@algolia/requester-fetch@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 + '@algolia/client-common': 5.46.2 - '@algolia/requester-node-http@5.46.0': + '@algolia/requester-node-http@5.46.2': dependencies: - '@algolia/client-common': 5.46.0 + '@algolia/client-common': 5.46.2 '@ampproject/remapping@2.3.0': dependencies: @@ -9354,11 +9511,11 @@ 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/ddc3809c1993612732eaae62d28e828b2ed789e5(@modelcontextprotocol/sdk@1.25.0(zod@4.2.1))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ddc3809c1993612732eaae62d28e828b2ed789e5(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))': dependencies: '@actions/core': 2.0.1 '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.33.0(@modelcontextprotocol/sdk@1.25.0(zod@4.2.1))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5) + '@google/genai': 1.33.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5) '@inquirer/prompts': 8.1.0(@types/node@24.10.4) '@inquirer/type': 4.0.2(@types/node@24.10.4) '@octokit/auth-app': 8.1.2 @@ -10215,82 +10372,82 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.1': + '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/android-arm64@0.27.1': + '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/android-arm@0.27.1': + '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/android-x64@0.27.1': + '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/darwin-arm64@0.27.1': + '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/darwin-x64@0.27.1': + '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.27.1': + '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.27.1': + '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/linux-arm64@0.27.1': + '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/linux-arm@0.27.1': + '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-ia32@0.27.1': + '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-loong64@0.27.1': + '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-mips64el@0.27.1': + '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-ppc64@0.27.1': + '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.27.1': + '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/linux-s390x@0.27.1': + '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/linux-x64@0.27.1': + '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.27.1': + '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/netbsd-x64@0.27.1': + '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.27.1': + '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.27.1': + '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.27.1': + '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/sunos-x64@0.27.1': + '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/win32-arm64@0.27.1': + '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/win32-ia32@0.27.1': + '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-x64@0.27.1': + '@esbuild/win32-x64@0.27.2': optional: true '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': @@ -10298,6 +10455,11 @@ snapshots: eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.2': {} '@eslint/compat@2.0.0(eslint@9.39.2(jiti@2.6.1))': @@ -10349,6 +10511,8 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/bytes@1.8.0': {} + '@fastify/busboy@2.1.1': {} '@firebase/ai@2.6.1(@firebase/app-types@0.9.3)(@firebase/app@0.14.6)': @@ -10730,12 +10894,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@google/genai@1.33.0(@modelcontextprotocol/sdk@1.25.0(zod@4.2.1))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5)': + '@google/genai@1.33.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5)': dependencies: google-auth-library: 10.5.0(supports-color@10.2.2) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) optionalDependencies: - '@modelcontextprotocol/sdk': 1.25.0(zod@4.2.1) + '@modelcontextprotocol/sdk': 1.25.1(zod@4.3.5) transitivePeerDependencies: - bufferutil - supports-color @@ -11143,7 +11307,7 @@ snapshots: '@lmdb/lmdb-win32-x64@3.4.4': optional: true - '@modelcontextprotocol/sdk@1.25.0(zod@4.2.1)': + '@modelcontextprotocol/sdk@1.25.1(zod@4.3.5)': dependencies: '@hono/node-server': 1.19.7 ajv: 8.17.1 @@ -11159,8 +11323,8 @@ snapshots: json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.2.1 - zod-to-json-schema: 3.25.0(zod@4.2.1) + zod: 4.3.5 + zod-to-json-schema: 3.25.0(zod@4.3.5) transitivePeerDependencies: - hono - supports-color @@ -11264,7 +11428,7 @@ snapshots: '@napi-rs/nice-win32-x64-msvc': 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.0': + '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.7.1 '@emnapi/runtime': 1.7.1 @@ -11474,7 +11638,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.38.0': {} - '@oxc-project/types@0.102.0': {} + '@oxc-project/types@0.106.0': {} '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -11600,56 +11764,56 @@ snapshots: - react-native-b4a - supports-color - '@rolldown/binding-android-arm64@1.0.0-beta.54': + '@rolldown/binding-android-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.54': + '@rolldown/binding-darwin-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.54': + '@rolldown/binding-darwin-x64@1.0.0-beta.58': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.54': + '@rolldown/binding-freebsd-x64@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.54': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.54': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.54': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.54': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.54': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.54': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.54': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': dependencies: - '@napi-rs/wasm-runtime': 1.1.0 + '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.54': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.54': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': optional: true - '@rolldown/pluginutils@1.0.0-beta.54': {} + '@rolldown/pluginutils@1.0.0-beta.58': {} - '@rollup/plugin-alias@6.0.0(rollup@4.53.5)': + '@rollup/plugin-alias@6.0.0(rollup@4.55.1)': optionalDependencies: - rollup: 4.53.5 + rollup: 4.55.1 - '@rollup/plugin-commonjs@29.0.0(rollup@4.53.5)': + '@rollup/plugin-commonjs@29.0.0(rollup@4.55.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.5) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -11657,7 +11821,7 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.5 + rollup: 4.55.1 '@rollup/plugin-json@6.1.0(rollup@4.53.5)': dependencies: @@ -11665,33 +11829,39 @@ snapshots: optionalDependencies: rollup: 4.53.5 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.53.5)': + '@rollup/plugin-json@6.1.0(rollup@4.55.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.5) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + optionalDependencies: + rollup: 4.55.1 + + '@rollup/plugin-node-resolve@15.3.1(rollup@4.55.1)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.53.5 + rollup: 4.55.1 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.53.5)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.55.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.5) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.53.5 + rollup: 4.55.1 - '@rollup/pluginutils@5.2.0(rollup@4.53.5)': + '@rollup/pluginutils@5.2.0(rollup@4.55.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.5 + rollup: 4.55.1 '@rollup/pluginutils@5.3.0(rollup@4.53.5)': dependencies: @@ -11701,72 +11871,155 @@ snapshots: optionalDependencies: rollup: 4.53.5 + '@rollup/pluginutils@5.3.0(rollup@4.55.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.55.1 + '@rollup/rollup-android-arm-eabi@4.53.5': optional: true + '@rollup/rollup-android-arm-eabi@4.55.1': + optional: true + '@rollup/rollup-android-arm64@4.53.5': optional: true + '@rollup/rollup-android-arm64@4.55.1': + optional: true + '@rollup/rollup-darwin-arm64@4.53.5': optional: true + '@rollup/rollup-darwin-arm64@4.55.1': + optional: true + '@rollup/rollup-darwin-x64@4.53.5': optional: true + '@rollup/rollup-darwin-x64@4.55.1': + optional: true + '@rollup/rollup-freebsd-arm64@4.53.5': optional: true + '@rollup/rollup-freebsd-arm64@4.55.1': + optional: true + '@rollup/rollup-freebsd-x64@4.53.5': optional: true + '@rollup/rollup-freebsd-x64@4.55.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.53.5': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.53.5': optional: true + '@rollup/rollup-linux-arm64-gnu@4.55.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.53.5': optional: true + '@rollup/rollup-linux-arm64-musl@4.55.1': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.53.5': optional: true + '@rollup/rollup-linux-loong64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.55.1': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.53.5': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.53.5': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.53.5': optional: true + '@rollup/rollup-linux-riscv64-musl@4.55.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.53.5': optional: true + '@rollup/rollup-linux-s390x-gnu@4.55.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.53.5': optional: true + '@rollup/rollup-linux-x64-gnu@4.55.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.53.5': optional: true + '@rollup/rollup-linux-x64-musl@4.55.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.55.1': + optional: true + '@rollup/rollup-openharmony-arm64@4.53.5': optional: true + '@rollup/rollup-openharmony-arm64@4.55.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.53.5': optional: true + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.53.5': optional: true + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + '@rollup/rollup-win32-x64-gnu@4.53.5': optional: true + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.53.5': optional: true + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + '@rollup/wasm-node@4.54.0': dependencies: '@types/estree': 1.0.8 @@ -12053,10 +12306,10 @@ snapshots: '@types/less@3.0.8': {} - '@types/loader-utils@3.0.0(esbuild@0.27.1)': + '@types/loader-utils@3.0.0(esbuild@0.27.2)': dependencies: '@types/node': 22.19.3 - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: - '@swc/core' - esbuild @@ -12210,95 +12463,97 @@ snapshots: '@types/node': 22.19.3 optional: true - '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.50.0 + '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.52.0 eslint: 9.39.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.50.0 + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3(supports-color@10.2.2) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) - '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 debug: 4.4.3(supports-color@10.2.2) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.50.0': + '@typescript-eslint/scope-manager@8.52.0': dependencies: - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/visitor-keys': 8.50.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 - '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3(supports-color@10.2.2) eslint: 9.39.2(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.50.0': {} - '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': + '@typescript-eslint/types@8.52.0': {} + + '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/visitor-keys': 8.50.0 + '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3(supports-color@10.2.2) minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.50.0': + '@typescript-eslint/visitor-keys@8.52.0': dependencies: - '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 '@verdaccio/auth@8.0.0-next-8.28': @@ -12458,14 +12713,14 @@ snapshots: lodash: 4.17.21 minimatch: 7.4.6 - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.15 + '@vitest/utils': 4.0.16 ast-v8-to-istanbul: 0.3.9 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -12475,47 +12730,47 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.15': + '@vitest/expect@4.0.16': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/spy': 4.0.16 + '@vitest/utils': 4.0.16 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 4.0.15 + '@vitest/spy': 4.0.16 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/pretty-format@4.0.15': + '@vitest/pretty-format@4.0.16': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.15': + '@vitest/runner@4.0.16': dependencies: - '@vitest/utils': 4.0.15 + '@vitest/utils': 4.0.16 pathe: 2.0.3 - '@vitest/snapshot@4.0.15': + '@vitest/snapshot@4.0.16': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.16 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.15': {} + '@vitest/spy@4.0.16': {} - '@vitest/utils@4.0.15': + '@vitest/utils@4.0.16': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.16 tinyrainbow: 3.0.3 '@web/browser-logs@0.4.1': @@ -12551,11 +12806,11 @@ snapshots: '@web/dev-server-rollup@0.6.4(bufferutil@4.0.9)': dependencies: - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.53.5) + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.55.1) '@web/dev-server-core': 0.7.5(bufferutil@4.0.9) nanocolors: 0.2.13 parse5: 6.0.1 - rollup: 4.53.5 + rollup: 4.55.1 whatwg-url: 14.2.0 transitivePeerDependencies: - bufferutil @@ -12855,22 +13110,22 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@5.46.0: - dependencies: - '@algolia/abtesting': 1.12.0 - '@algolia/client-abtesting': 5.46.0 - '@algolia/client-analytics': 5.46.0 - '@algolia/client-common': 5.46.0 - '@algolia/client-insights': 5.46.0 - '@algolia/client-personalization': 5.46.0 - '@algolia/client-query-suggestions': 5.46.0 - '@algolia/client-search': 5.46.0 - '@algolia/ingestion': 1.46.0 - '@algolia/monitoring': 1.46.0 - '@algolia/recommend': 5.46.0 - '@algolia/requester-browser-xhr': 5.46.0 - '@algolia/requester-fetch': 5.46.0 - '@algolia/requester-node-http': 5.46.0 + algoliasearch@5.46.2: + dependencies: + '@algolia/abtesting': 1.12.2 + '@algolia/client-abtesting': 5.46.2 + '@algolia/client-analytics': 5.46.2 + '@algolia/client-common': 5.46.2 + '@algolia/client-insights': 5.46.2 + '@algolia/client-personalization': 5.46.2 + '@algolia/client-query-suggestions': 5.46.2 + '@algolia/client-search': 5.46.2 + '@algolia/ingestion': 1.46.2 + '@algolia/monitoring': 1.46.2 + '@algolia/recommend': 5.46.2 + '@algolia/requester-browser-xhr': 5.46.2 + '@algolia/requester-fetch': 5.46.2 + '@algolia/requester-node-http': 5.46.2 ansi-colors@4.1.3: {} @@ -13034,11 +13289,11 @@ snapshots: b4a@1.7.3: {} - babel-loader@10.0.0(@babel/core@7.28.5)(webpack@5.104.0(esbuild@0.27.1)): + babel-loader@10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)): dependencies: '@babel/core': 7.28.5 find-up: 5.0.0 - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: @@ -13644,14 +13899,14 @@ snapshots: dependencies: is-what: 3.14.1 - copy-webpack-plugin@13.0.1(webpack@5.104.0(esbuild@0.27.1)): + copy-webpack-plugin@13.0.1(webpack@5.104.1(esbuild@0.27.2)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) core-js-compat@3.47.0: dependencies: @@ -13695,7 +13950,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-loader@7.1.2(webpack@5.104.0(esbuild@0.27.1)): + css-loader@7.1.2(webpack@5.104.1(esbuild@0.27.2)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -13706,7 +13961,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) css-select@6.0.0: dependencies: @@ -14158,36 +14413,36 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-wasm@0.27.1: {} + esbuild-wasm@0.27.2: {} - esbuild@0.27.1: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.1 - '@esbuild/android-arm': 0.27.1 - '@esbuild/android-arm64': 0.27.1 - '@esbuild/android-x64': 0.27.1 - '@esbuild/darwin-arm64': 0.27.1 - '@esbuild/darwin-x64': 0.27.1 - '@esbuild/freebsd-arm64': 0.27.1 - '@esbuild/freebsd-x64': 0.27.1 - '@esbuild/linux-arm': 0.27.1 - '@esbuild/linux-arm64': 0.27.1 - '@esbuild/linux-ia32': 0.27.1 - '@esbuild/linux-loong64': 0.27.1 - '@esbuild/linux-mips64el': 0.27.1 - '@esbuild/linux-ppc64': 0.27.1 - '@esbuild/linux-riscv64': 0.27.1 - '@esbuild/linux-s390x': 0.27.1 - '@esbuild/linux-x64': 0.27.1 - '@esbuild/netbsd-arm64': 0.27.1 - '@esbuild/netbsd-x64': 0.27.1 - '@esbuild/openbsd-arm64': 0.27.1 - '@esbuild/openbsd-x64': 0.27.1 - '@esbuild/openharmony-arm64': 0.27.1 - '@esbuild/sunos-x64': 0.27.1 - '@esbuild/win32-arm64': 0.27.1 - '@esbuild/win32-ia32': 0.27.1 - '@esbuild/win32-x64': 0.27.1 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 escalade@3.2.0: {} @@ -14217,11 +14472,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -14231,7 +14486,7 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14242,7 +14497,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14254,7 +14509,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14500,7 +14755,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.4 + debug: 4.4.3(supports-color@10.2.2) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -15049,9 +15304,11 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 - html-encoding-sniffer@4.0.0: + html-encoding-sniffer@6.0.0: dependencies: - whatwg-encoding: 3.1.1 + '@exodus/bytes': 1.8.0 + transitivePeerDependencies: + - '@exodus/crypto' html-entities@2.6.0: {} @@ -15611,14 +15868,15 @@ snapshots: jsbn@0.1.1: {} - jsdom@27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): + jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@acemir/cssom': 0.9.29 '@asamuzakjp/dom-selector': 6.7.6 + '@exodus/bytes': 1.8.0 cssstyle: 5.3.5 data-urls: 6.0.0 decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 + html-encoding-sniffer: 6.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6(supports-color@10.2.2) is-potential-custom-element-name: 1.0.1 @@ -15628,12 +15886,12 @@ snapshots: tough-cookie: 6.0.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) xml-name-validator: 5.0.0 transitivePeerDependencies: + - '@exodus/crypto' - bufferutil - supports-color - utf-8-validate @@ -15867,11 +16125,11 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.3 - less-loader@12.3.0(less@4.4.2)(webpack@5.104.0(esbuild@0.27.1)): + less-loader@12.3.0(less@4.4.2)(webpack@5.104.1(esbuild@0.27.2)): dependencies: less: 4.4.2 optionalDependencies: - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) less@4.4.2: dependencies: @@ -15892,11 +16150,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.104.0(esbuild@0.27.1)): + license-webpack-plugin@4.0.2(webpack@5.104.1(esbuild@0.27.2)): dependencies: webpack-sources: 3.3.3 optionalDependencies: - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) lie@3.3.0: dependencies: @@ -16141,11 +16399,11 @@ snapshots: mimic-response@3.1.0: {} - mini-css-extract-plugin@2.9.4(webpack@5.104.0(esbuild@0.27.1)): + mini-css-extract-plugin@2.9.4(webpack@5.104.1(esbuild@0.27.2)): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) minimalistic-assert@1.0.1: {} @@ -16291,7 +16549,7 @@ snapshots: chokidar: 4.0.3 commander: 14.0.2 dependency-graph: 1.0.0 - esbuild: 0.27.1 + esbuild: 0.27.2 find-cache-directory: 6.0.0 injection-js: 2.6.1 jsonc-parser: 3.3.1 @@ -16301,7 +16559,7 @@ snapshots: postcss: 8.5.6 rollup-plugin-dts: 6.3.0(rollup@4.53.5)(typescript@5.9.3) rxjs: 7.8.2 - sass: 1.97.0 + sass: 1.97.1 tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 @@ -16785,14 +17043,14 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.0(esbuild@0.27.1)): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.104.1(esbuild@0.27.2)): dependencies: cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 postcss: 8.5.6 semver: 7.7.3 optionalDependencies: - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: - typescript @@ -17247,24 +17505,24 @@ snapshots: dependencies: glob: 10.5.0 - rolldown@1.0.0-beta.54: + rolldown@1.0.0-beta.58: dependencies: - '@oxc-project/types': 0.102.0 - '@rolldown/pluginutils': 1.0.0-beta.54 + '@oxc-project/types': 0.106.0 + '@rolldown/pluginutils': 1.0.0-beta.58 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.54 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.54 - '@rolldown/binding-darwin-x64': 1.0.0-beta.54 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.54 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.54 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.54 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.54 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.54 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.54 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.54 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.54 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.54 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.54 + '@rolldown/binding-android-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.58 + '@rolldown/binding-darwin-x64': 1.0.0-beta.58 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.58 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 rollup-license-plugin@3.1.0: dependencies: @@ -17281,10 +17539,18 @@ snapshots: optionalDependencies: '@babel/code-frame': 7.27.1 - rollup-plugin-sourcemaps2@0.5.4(@types/node@22.19.3)(rollup@4.53.5): + rollup-plugin-dts@6.3.0(rollup@4.55.1)(typescript@5.9.3): dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.53.5) - rollup: 4.53.5 + magic-string: 0.30.21 + rollup: 4.55.1 + typescript: 5.9.3 + optionalDependencies: + '@babel/code-frame': 7.27.1 + + rollup-plugin-sourcemaps2@0.5.4(@types/node@22.19.3)(rollup@4.55.1): + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.55.1) + rollup: 4.55.1 optionalDependencies: '@types/node': 22.19.3 @@ -17316,6 +17582,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.53.5 fsevents: 2.3.3 + rollup@4.55.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 + fsevents: 2.3.3 + router@2.2.0: dependencies: debug: 4.4.3(supports-color@10.2.2) @@ -17365,14 +17662,14 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.6(sass@1.97.0)(webpack@5.104.0(esbuild@0.27.1)): + sass-loader@16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.97.0 - webpack: 5.104.0(esbuild@0.27.1) + sass: 1.97.1 + webpack: 5.104.1(esbuild@0.27.2) - sass@1.97.0: + sass@1.97.1: dependencies: chokidar: 4.0.3 immutable: 5.1.4 @@ -17690,11 +17987,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.104.0(esbuild@0.27.1)): + source-map-loader@5.0.0(webpack@5.104.1(esbuild@0.27.2)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) source-map-support@0.4.18: dependencies: @@ -17986,16 +18283,16 @@ snapshots: transitivePeerDependencies: - supports-color - terser-webpack-plugin@5.3.16(esbuild@0.27.1)(webpack@5.104.0(esbuild@0.27.1)): + terser-webpack-plugin@5.3.16(esbuild@0.27.2)(webpack@5.104.1(esbuild@0.27.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.1 - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) optionalDependencies: - esbuild: 0.27.1 + esbuild: 0.27.2 terser@5.44.1: dependencies: @@ -18099,7 +18396,7 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.3): + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -18134,7 +18431,7 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.1 + esbuild: 0.27.2 get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -18244,7 +18541,7 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@7.16.0: {} + undici@7.18.0: {} unenv@1.10.0: dependencies: @@ -18410,9 +18707,9 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.27.1 + esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 @@ -18423,20 +18720,20 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 - sass: 1.97.0 + sass: 1.97.1 terser: 5.44.1 tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/expect': 4.0.16 + '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.16 + '@vitest/runner': 4.0.16 + '@vitest/snapshot': 4.0.16 + '@vitest/spy': 4.0.16 + '@vitest/utils': 4.0.16 es-module-lexer: 1.7.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -18448,12 +18745,12 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.10.4 - jsdom: 27.3.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + jsdom: 27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - jiti - less @@ -18473,7 +18770,7 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - watchpack@2.4.4: + watchpack@2.5.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -18516,7 +18813,7 @@ snapshots: webidl-conversions@8.0.0: {} - webpack-dev-middleware@7.4.5(webpack@5.104.0(esbuild@0.27.1)): + webpack-dev-middleware@7.4.5(webpack@5.104.1(esbuild@0.27.2)): dependencies: colorette: 2.0.20 memfs: 4.51.1 @@ -18525,9 +18822,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) - webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.0(esbuild@0.27.1)): + webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.1(esbuild@0.27.2)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -18555,10 +18852,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.0(esbuild@0.27.1)) + webpack-dev-middleware: 7.4.5(webpack@5.104.1(esbuild@0.27.2)) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) optionalDependencies: - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: - bufferutil - debug @@ -18573,12 +18870,12 @@ snapshots: webpack-sources@3.3.3: {} - webpack-subresource-integrity@5.1.0(webpack@5.104.0(esbuild@0.27.1)): + webpack-subresource-integrity@5.1.0(webpack@5.104.1(esbuild@0.27.2)): dependencies: typed-assert: 1.0.9 - webpack: 5.104.0(esbuild@0.27.1) + webpack: 5.104.1(esbuild@0.27.2) - webpack@5.104.0(esbuild@0.27.1): + webpack@5.104.1(esbuild@0.27.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -18602,8 +18899,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.27.1)(webpack@5.104.0(esbuild@0.27.1)) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(esbuild@0.27.2)(webpack@5.104.1(esbuild@0.27.2)) + watchpack: 2.5.0 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' @@ -18618,10 +18915,6 @@ snapshots: websocket-extensions@0.1.4: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-mimetype@4.0.0: {} whatwg-url@14.2.0: @@ -18858,12 +19151,12 @@ snapshots: yoctocolors@2.1.2: {} - zod-to-json-schema@3.25.0(zod@4.2.1): + zod-to-json-schema@3.25.0(zod@4.3.5): dependencies: - zod: 4.2.1 + zod: 4.3.5 zod@3.25.76: {} - zod@4.2.1: {} + zod@4.3.5: {} zone.js@0.16.0: {} From 1638f76154ab53653ffe102548604fb2ad8c6633 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 25 Dec 2025 06:07:40 +0000 Subject: [PATCH 16/68] build: update bazel dependencies See associated pull request for more information. --- MODULE.bazel | 10 ++--- MODULE.bazel.lock | 104 +++++++++++++++++++++++++++------------------- 2 files changed, 67 insertions(+), 47 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index b4bf8a27a1aa..334bb955e55b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,13 +5,13 @@ module( ) bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "yq.bzl", version = "0.3.2") +bazel_dep(name = "yq.bzl", version = "0.3.4") bazel_dep(name = "rules_nodejs", version = "6.6.2") bazel_dep(name = "aspect_rules_js", version = "2.8.3") bazel_dep(name = "aspect_rules_ts", version = "3.8.1") -bazel_dep(name = "rules_pkg", version = "1.1.0") -bazel_dep(name = "rules_cc", version = "0.2.15") -bazel_dep(name = "aspect_bazel_lib", version = "2.22.0") +bazel_dep(name = "rules_pkg", version = "1.2.0") +bazel_dep(name = "rules_cc", version = "0.2.16") +bazel_dep(name = "aspect_bazel_lib", version = "2.22.2") bazel_dep(name = "bazel_skylib", version = "1.9.0") bazel_dep(name = "aspect_rules_esbuild", version = "0.25.0") bazel_dep(name = "aspect_rules_jasmine", version = "2.0.2") @@ -39,7 +39,7 @@ git_override( bazel_dep(name = "rules_browsers") git_override( module_name = "rules_browsers", - commit = "8ef3e996d5fc040a35770f860987d8b9cad8ef3d", + commit = "5f0e50d17d15c70e6ab5546f1659338ae94c4072", remote = "https://github.com/devversion/rules_browsers.git", ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 1f9bb1615d4e..2143d7c6df94 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -15,7 +15,8 @@ "https://bcr.bazel.build/modules/aspect_bazel_lib/2.17.1/MODULE.bazel": "9b027af55f619c7c444cead71061578fab6587e5e1303fa4ed61d49d2b1a7262", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/MODULE.bazel": "7fe0191f047d4fe4a4a46c1107e2350cbb58a8fc2e10913aa4322d3190dec0bf", - "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/source.json": "369df5b7f2eae82f200fff95cf1425f90dee90a0d0948122060b48150ff0e224", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.2/MODULE.bazel": "6b735f3fdd64978e217c9725f4ff0d84bf606554c8e77d20e90977841d7ff2ed", + "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.2/source.json": "58fffa2d722cff47cb8d921c8bbed7701c53f233009d9ca82beb4a0fb8fb9418", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.8.1/MODULE.bazel": "812d2dd42f65dca362152101fbec418029cc8fd34cbad1a2fde905383d705838", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.9.3/MODULE.bazel": "66baf724dbae7aff4787bf2245cc188d50cb08e07789769730151c0943587c14", @@ -120,8 +121,8 @@ "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513", - "https://bcr.bazel.build/modules/rules_cc/0.2.15/MODULE.bazel": "6a0a4a75a57aa6dc888300d848053a58c6b12a29f89d4304e1c41448514ec6e8", - "https://bcr.bazel.build/modules/rules_cc/0.2.15/source.json": "197965c6dcca5c98a9288f93849e2e1c69d622e71b0be8deb524e22d48c88e32", + "https://bcr.bazel.build/modules/rules_cc/0.2.16/MODULE.bazel": "9242fa89f950c6ef7702801ab53922e99c69b02310c39fb6e62b2bd30df2a1d4", + "https://bcr.bazel.build/modules/rules_cc/0.2.16/source.json": "d03d5cde49376d87e14ec14b666c56075e5e3926930327fd5d0484a1ff2ac1cc", "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", "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", @@ -163,7 +164,8 @@ "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", - "https://bcr.bazel.build/modules/rules_pkg/1.1.0/source.json": "fef768df13a92ce6067e1cd0cdc47560dace01354f1d921cfb1d632511f7d608", + "https://bcr.bazel.build/modules/rules_pkg/1.2.0/MODULE.bazel": "c7db3c2b407e673c7a39e3625dc05dc9f12d6682cbd82a3a5924a13b491eda7e", + "https://bcr.bazel.build/modules/rules_pkg/1.2.0/source.json": "9062e00845bf91a4247465d371baa837adf9b6ff44c542f73ba084f07667e1dc", "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", @@ -199,7 +201,8 @@ "https://bcr.bazel.build/modules/yq.bzl/0.1.1/MODULE.bazel": "9039681f9bcb8958ee2c87ffc74bdafba9f4369096a2b5634b88abc0eaefa072", "https://bcr.bazel.build/modules/yq.bzl/0.2.0/MODULE.bazel": "6f3a675677db8885be4d607fde14cc51829715e3a879fb016eb9bf336786ce6d", "https://bcr.bazel.build/modules/yq.bzl/0.3.2/MODULE.bazel": "0384efa70e8033d842ea73aa4b7199fa099709e236a7264345c03937166670b6", - "https://bcr.bazel.build/modules/yq.bzl/0.3.2/source.json": "c4ec3e192477e154f08769e29d69e8fd36e8a4f0f623997f3e1f6f7d328f7d7d", + "https://bcr.bazel.build/modules/yq.bzl/0.3.4/MODULE.bazel": "d3a270662f5d766cd7229732d65a5a5bc485240c3007343dd279edfb60c9ae27", + "https://bcr.bazel.build/modules/yq.bzl/0.3.4/source.json": "786dafdc2843722da3416e4343ee1a05237227f068590779a6e8496a2064c0f9", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806", @@ -209,7 +212,7 @@ "moduleExtensions": { "@@aspect_rules_esbuild+//esbuild:extensions.bzl%esbuild": { "general": { - "bzlTransitiveDigest": "0aod3RK04ALA/OKTExzd7QqyeqcC4O2GWuDwUxhQHp4=", + "bzlTransitiveDigest": "9odiC0alKLq5PUYv/CZiw2yiMHsGpxvEhPsqt//fRRk=", "usagesDigest": "ToTaCONCN/E05krnHXLM1kpV1zrHNxHrGpUip973II4=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -315,6 +318,11 @@ } }, "recordedRepoMappingEntries": [ + [ + "aspect_bazel_lib+", + "bazel_lib", + "bazel_lib+" + ], [ "aspect_bazel_lib+", "bazel_skylib", @@ -405,7 +413,7 @@ }, "@@aspect_rules_js+//npm:extensions.bzl%pnpm": { "general": { - "bzlTransitiveDigest": "tQ+7EwLfQwqi/T4v5/N3NNHTmP6Wu/FqXxRDndEB2OU=", + "bzlTransitiveDigest": "zVV86HvMwDBJ8IsFt27k/Sjq0vCMPr8b8X9OAuprQ6w=", "usagesDigest": "fkR8y929BQ1GFezNYBR/HXJUcMa3NtJvhzsZrG8I9vI=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -464,6 +472,11 @@ } }, "recordedRepoMappingEntries": [ + [ + "aspect_bazel_lib+", + "bazel_lib", + "bazel_lib+" + ], [ "aspect_bazel_lib+", "bazel_skylib", @@ -722,7 +735,7 @@ }, "@@rules_browsers+//browsers:extensions.bzl%browsers": { "general": { - "bzlTransitiveDigest": "ljZlVgWkQJnI6EvlHVfYit2EttUE52gDTbvmota5YO8=", + "bzlTransitiveDigest": "agkaLQ8wE1r/5IX6pkERzFxI/z0M42Em+ICNO6TXsVo=", "usagesDigest": "FS7q5WaIwg3KirS3njhuPFkTIBYvDaTInVGrlzu0XL8=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -731,9 +744,9 @@ "rules_browsers_chrome_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "1419fa328bd7ea2697f26412ec693867516e4ef23c32eb13143a0b0b179b604b", + "sha256": "0a2ff0fc9eb5958b7b420f20e3968f424be7423fef89739e71565a48aa073a57", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/linux64/chrome-headless-shell-linux64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/linux64/chrome-headless-shell-linux64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-linux64/chrome-headless-shell" @@ -749,9 +762,9 @@ "rules_browsers_chrome_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "792cbf9b77219b4476e41c49647bcd15e55f0988002fa1e4e6a720eb430c7eda", + "sha256": "e6076b1201d86f74c5eab982a239d5af83e66b1aa4d780bcb792698790e01d87", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/mac-x64/chrome-headless-shell-mac-x64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-x64/chrome-headless-shell-mac-x64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-x64/chrome-headless-shell" @@ -767,9 +780,9 @@ "rules_browsers_chrome_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "f0c1917769775e826dfa69936381d0d95b06fe67cf631ecd842380d5de0e4c7f", + "sha256": "b74dbcf5543d916b02d0a133e2e7c6a4de251f06733f72c2c15ea8c42213f63b", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/mac-arm64/chrome-headless-shell-mac-arm64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-arm64/chrome-headless-shell-mac-arm64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-mac-arm64/chrome-headless-shell" @@ -785,9 +798,9 @@ "rules_browsers_chrome_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "6ce0f20dd743a804890f45f5349370e1aa7cd3ac3482c04686fcff5fafd01bb3", + "sha256": "df1e612dc3b1615e182a1f11821052995913c39df37caa52699de21a68d030d2", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/win64/chrome-headless-shell-win64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/win64/chrome-headless-shell-win64.zip" ], "named_files": { "CHROME-HEADLESS-SHELL": "chrome-headless-shell-win64/chrome-headless-shell.exe" @@ -803,9 +816,9 @@ "rules_browsers_chromedriver_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "baf4bf9d22881265487732f17d35a49e9aadd0837aa5c1c1eea520c8aa24a97f", + "sha256": "69c504306399d979a2766fea603c3fb9d3d87d46c75bddc9f2a049b4f636d57c", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/linux64/chromedriver-linux64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/linux64/chromedriver-linux64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-linux64/chromedriver" @@ -819,9 +832,9 @@ "rules_browsers_chromedriver_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "87560768d5aa203b37c0a1b8459a35b05e4ece54afee2df530f3bc33de4f63c5", + "sha256": "5fc9d6f594fc5f2568a15145f25116dd8e9c9a60baa8da4bb21a17650fb00e7e", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/mac-x64/chromedriver-mac-x64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-x64/chromedriver-mac-x64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-mac-x64/chromedriver" @@ -835,9 +848,9 @@ "rules_browsers_chromedriver_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "99821795fa7c87eb92fb15248e23b237c83f397486d22ad9a10771622c36a5a0", + "sha256": "14e92294c2c3639ca4e7d27e850588b619d698e2f8905cee368f07db2e1bf1e9", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/mac-arm64/chromedriver-mac-arm64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/mac-arm64/chromedriver-mac-arm64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-mac-arm64/chromedriver" @@ -851,9 +864,9 @@ "rules_browsers_chromedriver_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "6e180e234a710c3cbf69566f64a662ed85473db6ae82275fd359f80ab288df99", + "sha256": "cf641d2e176db95bcc158cd90eafd347ad4928fa0458a5f3bfd56c6d983e70db", "urls": [ - "https://storage.googleapis.com/chrome-for-testing-public/144.0.7531.0/win64/chromedriver-win64.zip" + "https://storage.googleapis.com/chrome-for-testing-public/145.0.7586.0/win64/chromedriver-win64.zip" ], "named_files": { "CHROMEDRIVER": "chromedriver-win64/chromedriver.exe" @@ -867,9 +880,9 @@ "rules_browsers_firefox_linux": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "00fb922cda6bab971e02bcbfb77923b0a234388ed7d77c23506ca0a1a61d4a86", + "sha256": "8d56f479cc398a537a60a3fa20dca92d8a41925113d3a67f534881a4e4d7e344", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/145.0/linux-x86_64/en-US/firefox-145.0.tar.xz" + "https://archive.mozilla.org/pub/firefox/releases/146.0/linux-x86_64/en-US/firefox-146.0.tar.xz" ], "named_files": { "FIREFOX": "firefox/firefox" @@ -883,9 +896,9 @@ "rules_browsers_firefox_mac": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "1c4556480deac8424049f3081a6de1e2c6de619bab3e8ce53e5a497b8d6d919e", + "sha256": "4b1645313887972d466cd82166ea571485c2c40a167f84624e3f3ca739993cc9", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/145.0/mac/en-US/Firefox%20145.0.dmg" + "https://archive.mozilla.org/pub/firefox/releases/146.0/mac/en-US/Firefox%20146.0.dmg" ], "named_files": { "FIREFOX": "Firefox.app/Contents/MacOS/firefox" @@ -899,9 +912,9 @@ "rules_browsers_firefox_mac_arm": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "1c4556480deac8424049f3081a6de1e2c6de619bab3e8ce53e5a497b8d6d919e", + "sha256": "4b1645313887972d466cd82166ea571485c2c40a167f84624e3f3ca739993cc9", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/145.0/mac/en-US/Firefox%20145.0.dmg" + "https://archive.mozilla.org/pub/firefox/releases/146.0/mac/en-US/Firefox%20146.0.dmg" ], "named_files": { "FIREFOX": "Firefox.app/Contents/MacOS/firefox" @@ -915,9 +928,9 @@ "rules_browsers_firefox_win64": { "repoRuleId": "@@rules_browsers+//browsers/private:browser_repo.bzl%browser_repo", "attributes": { - "sha256": "4b0345c113242653d923b369fcbd48e3089c57658f8c1542f887c8a375d50306", + "sha256": "216870c89648f32450cfefb5cec417fcd66d480d5dc83f894bf99f5fd7f38dbb", "urls": [ - "https://archive.mozilla.org/pub/firefox/releases/145.0/win64/en-US/Firefox%20Setup%20145.0.exe" + "https://archive.mozilla.org/pub/firefox/releases/146.0/win64/en-US/Firefox%20Setup%20146.0.exe" ], "named_files": { "FIREFOX": "core/firefox.exe" @@ -4383,8 +4396,8 @@ }, "@@yq.bzl+//yq:extensions.bzl%yq": { "general": { - "bzlTransitiveDigest": "61Uz+o5PnlY0jJfPZEUNqsKxnM/UCLeWsn5VVCc8u5Y=", - "usagesDigest": "iZPDKVC6SAQMLLGWulzoS8hhxbx9Eh5DsJBUjn69u2Q=", + "bzlTransitiveDigest": "tDqk+ntWTdxNAWPDjRY1uITgHbti2jcXR5ZdinltBs0=", + "usagesDigest": "4oq89IijqhFzPJc0F7hJ32lOqQzIvApwF7B2cT0spTc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -4393,56 +4406,63 @@ "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "darwin_amd64", - "version": "4.45.1" + "version": "4.45.2" } }, "yq_darwin_arm64": { "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "darwin_arm64", - "version": "4.45.1" + "version": "4.45.2" } }, "yq_linux_amd64": { "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "linux_amd64", - "version": "4.45.1" + "version": "4.45.2" } }, "yq_linux_arm64": { "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "linux_arm64", - "version": "4.45.1" + "version": "4.45.2" } }, "yq_linux_s390x": { "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "linux_s390x", - "version": "4.45.1" + "version": "4.45.2" } }, "yq_linux_riscv64": { "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "linux_riscv64", - "version": "4.45.1" + "version": "4.45.2" } }, "yq_linux_ppc64le": { "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "linux_ppc64le", - "version": "4.45.1" + "version": "4.45.2" } }, "yq_windows_amd64": { "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", "attributes": { "platform": "windows_amd64", - "version": "4.45.1" + "version": "4.45.2" + } + }, + "yq_windows_arm64": { + "repoRuleId": "@@yq.bzl+//yq/toolchain:platforms.bzl%yq_platform_repo", + "attributes": { + "platform": "windows_arm64", + "version": "4.45.2" } }, "yq_toolchains": { From 1f306631dfec92f130fd15a38dc0cd4053ffad43 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:42:45 -0500 Subject: [PATCH 17/68] test: migrate build and misc E2E tests to Puppeteer Replaces the Protractor-based `ng e2e` execution with the new Puppeteer `executeBrowserTest` utility in various build and misc E2E tests. The following tests were updated: - auto-csp - worker - trusted-types This migration involves implementing custom `checkFn` logic to replicate the assertions previously handled by Protractor, such as verifying server-rendered content, console logs, and service worker states. --- tests/e2e/tests/build/auto-csp.ts | 99 +++++++++++++-------------- tests/e2e/tests/build/worker.ts | 42 +++++++----- tests/e2e/tests/misc/trusted-types.ts | 38 ++++------ 3 files changed, 86 insertions(+), 93 deletions(-) diff --git a/tests/e2e/tests/build/auto-csp.ts b/tests/e2e/tests/build/auto-csp.ts index 1839b160d549..f9e30efe2de9 100644 --- a/tests/e2e/tests/build/auto-csp.ts +++ b/tests/e2e/tests/build/auto-csp.ts @@ -1,9 +1,11 @@ -import assert from 'node:assert'; +import assert from 'node:assert/strict'; +import { setTimeout } from 'node:timers/promises'; import { getGlobalVariable } from '../../utils/env'; import { expectFileToMatch, writeFile, writeMultipleFiles } from '../../utils/fs'; import { findFreePort } from '../../utils/network'; import { execAndWaitForOutputToMatch, ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; +import { executeBrowserTest } from '../../utils/puppeteer'; const CSP_META_TAG = / `, - 'e2e/src/app.e2e-spec.ts': ` - import { browser, by, element } from 'protractor'; - import * as webdriver from 'selenium-webdriver'; - - function allConsoleWarnMessagesAndErrors() { - return browser - .manage() - .logs() - .get('browser') - .then(function (browserLog: any[]) { - const warnMessages: any[] = []; - browserLog.filter((logEntry) => { - const msg = logEntry.message; - console.log('>> ' + msg); - if (logEntry.level.value >= webdriver.logging.Level.INFO.value) { - warnMessages.push(msg); - } - }); - return warnMessages; - }); - } - - describe('Hello world E2E Tests', () => { - beforeAll(async () => { - await browser.waitForAngularEnabled(true); - }); - - it('should display: Welcome and run all scripts in order', async () => { - // Load the page without waiting for Angular since it is not bootstrapped automatically. - await browser.driver.get(browser.baseUrl); - - // Test the contents. - expect(await element(by.css('h1')).getText()).toMatch('Hello'); - - // Make sure all scripts ran and there were no client side errors. - const consoleMessages = await allConsoleWarnMessagesAndErrors(); - expect(consoleMessages.length).toEqual(4); // No additional errors - // Extract just the printed messages from the console data. - const printedMessages = consoleMessages.map(m => m.match(/"(.*?)"/)[1]); - expect(printedMessages).toEqual([ - // All messages printed in order because execution order is preserved. - "Inline Script Head", - "Inline Script Body: 1339", - "First External Script: 1338", - "Second External Script: 1337", - ]); - }); - }); - `, }); async function spawnServer(): Promise { @@ -137,7 +90,49 @@ export default async function () { // Make sure if contains the critical CSS inlining CSP code. await expectFileToMatch('dist/test-project/browser/index.html', 'ngCspMedia'); - // Make sure that our e2e protractor tests run to confirm that our angular project runs. + // Make sure that our e2e tests run to confirm that our angular project runs. const port = await spawnServer(); - await ng('e2e', `--base-url=http://localhost:${port}`, '--dev-server-target='); + await executeBrowserTest({ + baseUrl: `http://localhost:${port}/`, + checkFn: async (page) => { + const warnMessages: string[] = []; + page.on('console', (msg) => { + if (msg.type() === 'warning') { + warnMessages.push(msg.text()); + } + }); + + // Reload to ensure we capture messages from the start if needed, + // although executeBrowserTest already navigated. + await page.reload(); + + // Wait for the expected number of warnings + let retries = 50; + while (warnMessages.length < 4 && retries > 0) { + await setTimeout(100); + retries--; + } + + assert.strictEqual( + warnMessages.length, + 4, + `Expected 4 console warnings, but got ${warnMessages.length}:\n${warnMessages.join('\n')}`, + ); + + const expectedMessages = [ + 'Inline Script Head', + 'Inline Script Body: 1339', + 'First External Script: 1338', + 'Second External Script: 1337', + ]; + + for (let i = 0; i < expectedMessages.length; i++) { + if (!warnMessages[i].includes(expectedMessages[i])) { + assert.fail( + `Expected warning ${i} to include '${expectedMessages[i]}', but got '${warnMessages[i]}'`, + ); + } + } + }, + }); } diff --git a/tests/e2e/tests/build/worker.ts b/tests/e2e/tests/build/worker.ts index 53e60aa34772..be81aae7dfd4 100644 --- a/tests/e2e/tests/build/worker.ts +++ b/tests/e2e/tests/build/worker.ts @@ -8,10 +8,12 @@ import assert from 'node:assert/strict'; import { readdir } from 'node:fs/promises'; +import { setTimeout } from 'node:timers/promises'; import { getGlobalVariable } from '../../utils/env'; import { expectFileToExist, expectFileToMatch, replaceInFile, writeFile } from '../../utils/fs'; import { ng } from '../../utils/process'; import { expectToFail } from '../../utils/utils'; +import { executeBrowserTest } from '../../utils/puppeteer'; export default async function () { const useWebpackBuilder = !getGlobalVariable('argv')['esbuild']; @@ -55,24 +57,32 @@ export default async function () { // https://github.com/angular/protractor/issues/2207 await replaceInFile('src/app/app.ts', 'console.log', 'console.warn'); - await writeFile( - 'e2e/app.e2e-spec.ts', - ` - import { AppPage } from './app.po'; - import { browser, logging } from 'protractor'; - describe('worker bundle', () => { - it('should log worker messages', async () => { - const page = new AppPage();; - page.navigateTo(); - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs.length).toEqual(1); - expect(logs[0].message).toContain('page got message: worker response to hello'); + await executeBrowserTest({ + checkFn: async (page) => { + const messages: string[] = []; + page.on('console', (msg) => { + messages.push(msg.text()); }); - }); - `, - ); - await ng('e2e'); + // Reload to ensure we capture messages from the start if needed, + // although executeBrowserTest already navigated. + await page.reload(); + + // Wait for the worker message + let retries = 50; + while ( + !messages.some((m) => m.includes('page got message: worker response to hello')) && + retries > 0 + ) { + await setTimeout(100); + retries--; + } + + if (!messages.some((m) => m.includes('page got message: worker response to hello'))) { + assert.fail(`Expected worker message not found in console. Got:\n${messages.join('\n')}`); + } + }, + }); } async function getWorkerOutputFile(useWebpackBuilder: boolean): Promise { diff --git a/tests/e2e/tests/misc/trusted-types.ts b/tests/e2e/tests/misc/trusted-types.ts index 325ee521fe6d..21deb03223dd 100644 --- a/tests/e2e/tests/misc/trusted-types.ts +++ b/tests/e2e/tests/misc/trusted-types.ts @@ -6,9 +6,11 @@ * found in the LICENSE file at https://angular.dev/license */ -import { replaceInFile, writeFile } from '../../utils/fs'; +import assert from 'node:assert/strict'; +import { replaceInFile } from '../../utils/fs'; import { ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; +import { executeBrowserTest } from '../../utils/puppeteer'; export default async function () { // Add lazy route. @@ -19,29 +21,6 @@ export default async function () { `routes: Routes = [{path: 'lazy', loadComponent: () => import('./lazy/lazy').then(c => c.Lazy)}];`, ); - // Add lazy route e2e - await writeFile( - 'e2e/src/app.e2e-spec.ts', - ` - import { browser, logging, element, by } from 'protractor'; - - describe('workspace-project App', () => { - it('should display lazy route', async () => { - await browser.get(browser.baseUrl + '/lazy'); - expect(await element(by.css('app-lazy p')).getText()).toEqual('lazy works!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain(jasmine.objectContaining({ - level: logging.Level.SEVERE, - })); - }); - }); - `, - ); - const testCases = [ { aot: false, @@ -64,7 +43,16 @@ export default async function () { }); try { - await ng('e2e'); + await executeBrowserTest({ + checkFn: async (page) => { + const baseUrl = page.url(); + await page.goto(new URL('/lazy', baseUrl).href); + + await page.waitForSelector('app-lazy p'); + const lazyText = await page.$eval('app-lazy p', (el) => el.textContent); + assert.strictEqual(lazyText, 'lazy works!'); + }, + }); } catch (error) { console.error(`Test case AOT ${aot} with CSP header ${csp} failed.`); throw error; From 45e9cff88c6271815c71a72c659d565e8055a902 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 6 Jan 2026 18:07:57 +0000 Subject: [PATCH 18/68] build: lock file maintenance See associated pull request for more information. --- pnpm-lock.yaml | 528 ++++++++++++------------------------------------- 1 file changed, 124 insertions(+), 404 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07db10eaa799..2dae4ae965e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -875,8 +875,8 @@ importers: packages: - '@acemir/cssom@0.9.29': - resolution: {integrity: sha512-G90x0VW+9nW4dFajtjCoT+NM0scAfH9Mb08IcjgFHYbfiL/lU04dTF9JuVOi3/OH+DJCQdcIseSXkdCB9Ky6JA==} + '@acemir/cssom@0.9.30': + resolution: {integrity: sha512-9CnlMCI0LmCIq0olalQqdWrJHPzm0/tw3gzOA9zJSgvFX7Xau3D24mAGa4BtwxwY69nsuJW6kQqqCzf/mEcQgg==} '@actions/core@2.0.1': resolution: {integrity: sha512-oBfqT3GwkvLlo1fjvhQLQxuwZCGTarTE5OuZ2Wg10hvhBj7LRIlF611WT4aZS6fDhO5ZKlY7lCAZTlpmyaHaeg==} @@ -1655,11 +1655,11 @@ packages: resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} engines: {node: '>=14.17.0'} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -1820,12 +1820,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3194,120 +3188,60 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.5': - resolution: {integrity: sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.55.1': resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.5': - resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.55.1': resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.5': - resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.55.1': resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.5': - resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.5': - resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.55.1': resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.5': - resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.55.1': resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.5': - resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} - cpu: [arm] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.53.5': - resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} - cpu: [arm] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm-musleabihf@4.55.1': resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.53.5': - resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-arm64-gnu@4.55.1': resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.53.5': - resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-arm64-musl@4.55.1': resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.53.5': - resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} - cpu: [loong64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-loong64-gnu@4.55.1': resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} cpu: [loong64] @@ -3320,12 +3254,6 @@ packages: os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.53.5': - resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.55.1': resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} cpu: [ppc64] @@ -3338,60 +3266,30 @@ packages: os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.53.5': - resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.55.1': resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.53.5': - resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-riscv64-musl@4.55.1': resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.53.5': - resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.55.1': resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.53.5': - resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.55.1': resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.53.5': - resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} - cpu: [x64] - os: [linux] - libc: [musl] - '@rollup/rollup-linux-x64-musl@4.55.1': resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] @@ -3403,58 +3301,33 @@ packages: cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.53.5': - resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} - cpu: [arm64] - os: [openharmony] - '@rollup/rollup-openharmony-arm64@4.55.1': resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.5': - resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.55.1': resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.5': - resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.1': resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.5': - resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-gnu@4.55.1': resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.5': - resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} cpu: [x64] os: [win32] - '@rollup/wasm-node@4.54.0': - resolution: {integrity: sha512-CeEdHzNY+ZIR6NWpIOiJuCrr6tTK7cRGeOf6GYg5f73+UwJLqn5a4d5Ovf/hOWDyHM1KcySbxHQESJ9krhe0+A==} + '@rollup/wasm-node@4.55.1': + resolution: {integrity: sha512-GD+BSGH7+hVtNreVwv2JVxKImAdaDDrT9Ev0Bbr9CTATPjXjp7pQlRAqyZqNW3RGY37qL/RkF0HyO9ptJDU2pQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3855,10 +3728,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.50.0': - resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.52.0': resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4330,8 +4199,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.9: - resolution: {integrity: sha512-dSC6tJeOJxbZrPzPbv5mMd6CMiQ1ugaVXXPRad2fXUSsy1kstFn9XQWemV9VW7Y7kpxgQ/4WMoZfwdH8XSU48w==} + ast-v8-to-istanbul@0.3.10: + resolution: {integrity: sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==} astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} @@ -4457,8 +4326,8 @@ packages: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + basic-ftp@5.1.0: + resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} engines: {node: '>=10.0.0'} batch@0.6.1: @@ -4625,14 +4494,14 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001761: - resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + caniuse-lite@1.0.30001762: + resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chai@6.2.1: - resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk-template@0.4.0: @@ -4944,8 +4813,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@5.3.5: - resolution: {integrity: sha512-GlsEptulso7Jg0VaOZ8BXQi3AkYM5BOJKEO/rjMidSCq70FkIC5y0eawrCXeYzxgt3OCf4Ls+eoxN+/05vN0Ag==} + cssstyle@5.3.6: + resolution: {integrity: sha512-legscpSpgSAeGEe0TNcai97DKt9Vd9AsAdOL7Uoetb52Ar/8eJm3LIa39qpv8wWzLFlNG4vVvppQM+teaMPj3A==} engines: {node: '>=20'} custom-event@1.0.1: @@ -5014,15 +4883,6 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -5268,15 +5128,15 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - engine.io-client@6.6.3: - resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.4: - resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engine.io@6.6.5: + resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} engines: {node: '>=10.2.0'} enhanced-resolve@5.18.4: @@ -5471,8 +5331,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -5599,8 +5459,8 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} @@ -7353,8 +7213,8 @@ packages: resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} engines: {node: '>=20'} - ordered-binary@1.6.0: - resolution: {integrity: sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==} + ordered-binary@1.6.1: + resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} @@ -7761,6 +7621,10 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + engines: {node: '>=0.6'} + qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} @@ -7976,11 +7840,6 @@ packages: '@types/node': optional: true - rollup@4.53.5: - resolution: {integrity: sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.55.1: resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -8217,19 +8076,19 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-adapter@2.5.5: - resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + socket.io-adapter@2.5.6: + resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} - socket.io-client@4.8.1: - resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} engines: {node: '>=10.0.0'} - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + socket.io-parser@4.2.5: + resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} engines: {node: '>=10.0.0'} - socket.io@4.8.1: - resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + socket.io@4.8.3: + resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} sockjs@0.3.24: @@ -8748,8 +8607,8 @@ packages: unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.0: + resolution: {integrity: sha512-aLO7B+pYKuqcpapWdzhvzrjfm+qeiQNK3OILZAmlXJxgMfCsltOINMvNonA7nMMKiEjY1vAMA02O7u+eWym43w==} undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} @@ -9002,8 +8861,8 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webidl-conversions@8.0.0: - resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} webpack-dev-middleware@7.4.5: @@ -9162,18 +9021,6 @@ packages: utf-8-validate: optional: true - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -9202,8 +9049,8 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} - wsl-utils@0.3.0: - resolution: {integrity: sha512-3sFIGLiaDP7rTO4xh3g+b3AzhYDIUGGywE/WsmqzJWDxus5aJXVnPTNC/6L+r2WzrwXqVOdD262OaO+cEyPMSQ==} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} xhr2@0.2.1: @@ -9310,8 +9157,8 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zod-to-json-schema@3.25.0: - resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: zod: ^3.25 || ^4 @@ -9326,7 +9173,7 @@ packages: snapshots: - '@acemir/cssom@0.9.29': {} + '@acemir/cssom@0.9.30': {} '@actions/core@2.0.1': dependencies: @@ -10356,13 +10203,13 @@ snapshots: '@discoveryjs/json-ext@0.6.3': {} - '@emnapi/core@1.7.1': + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -10450,11 +10297,6 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': - dependencies: - eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': dependencies: eslint: 9.39.2(jiti@2.6.1) @@ -11324,7 +11166,7 @@ snapshots: pkce-challenge: 5.0.1 raw-body: 3.0.2 zod: 4.3.5 - zod-to-json-schema: 3.25.0(zod@4.3.5) + zod-to-json-schema: 3.25.1(zod@4.3.5) transitivePeerDependencies: - hono - supports-color @@ -11430,8 +11272,8 @@ snapshots: '@napi-rs/wasm-runtime@1.1.1': dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -11445,7 +11287,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.20.1 '@npmcli/agent@4.0.0': dependencies: @@ -11823,12 +11665,6 @@ snapshots: optionalDependencies: rollup: 4.55.1 - '@rollup/plugin-json@6.1.0(rollup@4.53.5)': - dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.5) - optionalDependencies: - rollup: 4.53.5 - '@rollup/plugin-json@6.1.0(rollup@4.55.1)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.55.1) @@ -11863,14 +11699,6 @@ snapshots: optionalDependencies: rollup: 4.55.1 - '@rollup/pluginutils@5.3.0(rollup@4.53.5)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.53.5 - '@rollup/pluginutils@5.3.0(rollup@4.55.1)': dependencies: '@types/estree': 1.0.8 @@ -11879,148 +11707,82 @@ snapshots: optionalDependencies: rollup: 4.55.1 - '@rollup/rollup-android-arm-eabi@4.53.5': - optional: true - '@rollup/rollup-android-arm-eabi@4.55.1': optional: true - '@rollup/rollup-android-arm64@4.53.5': - optional: true - '@rollup/rollup-android-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-arm64@4.53.5': - optional: true - '@rollup/rollup-darwin-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-x64@4.53.5': - optional: true - '@rollup/rollup-darwin-x64@4.55.1': optional: true - '@rollup/rollup-freebsd-arm64@4.53.5': - optional: true - '@rollup/rollup-freebsd-arm64@4.55.1': optional: true - '@rollup/rollup-freebsd-x64@4.53.5': - optional: true - '@rollup/rollup-freebsd-x64@4.55.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.5': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.5': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.5': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.5': - optional: true - '@rollup/rollup-linux-arm64-musl@4.55.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.5': - optional: true - '@rollup/rollup-linux-loong64-gnu@4.55.1': optional: true '@rollup/rollup-linux-loong64-musl@4.55.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.5': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.55.1': optional: true '@rollup/rollup-linux-ppc64-musl@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.5': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.5': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.55.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.5': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.5': - optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-musl@4.53.5': - optional: true - '@rollup/rollup-linux-x64-musl@4.55.1': optional: true '@rollup/rollup-openbsd-x64@4.55.1': optional: true - '@rollup/rollup-openharmony-arm64@4.53.5': - optional: true - '@rollup/rollup-openharmony-arm64@4.55.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.5': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.55.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.5': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.55.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.5': - optional: true - '@rollup/rollup-win32-x64-gnu@4.55.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.5': - optional: true - '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true - '@rollup/wasm-node@4.54.0': + '@rollup/wasm-node@4.55.1': dependencies: '@types/estree': 1.0.8 optionalDependencies: @@ -12068,8 +11830,8 @@ snapshots: '@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@2.6.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/types': 8.50.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/types': 8.52.0 eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -12335,11 +12097,11 @@ snapshots: '@types/node@22.19.3': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.0 '@types/node@24.10.4': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.0 '@types/npm-package-arg@6.1.4': {} @@ -12521,8 +12283,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.50.0': {} - '@typescript-eslint/types@8.52.0': {} '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': @@ -12721,7 +12481,7 @@ snapshots: dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.16 - ast-v8-to-istanbul: 0.3.9 + ast-v8-to-istanbul: 0.3.10 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -12740,7 +12500,7 @@ snapshots: '@types/chai': 5.2.3 '@vitest/spy': 4.0.16 '@vitest/utils': 4.0.16 - chai: 6.2.1 + chai: 6.2.2 tinyrainbow: 3.0.3 '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': @@ -13248,7 +13008,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.9: + ast-v8-to-istanbul@0.3.10: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -13273,7 +13033,7 @@ snapshots: autoprefixer@10.4.23(postcss@8.5.6): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001761 + caniuse-lite: 1.0.30001762 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -13364,7 +13124,7 @@ snapshots: baseline-browser-mapping@2.9.11: {} - basic-ftp@5.0.5: {} + basic-ftp@5.1.0: {} batch@0.6.1: {} @@ -13436,7 +13196,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.0 + qs: 6.14.1 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -13451,7 +13211,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.1 on-finished: 2.4.1 - qs: 6.14.0 + qs: 6.14.1 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -13492,7 +13252,7 @@ snapshots: connect-history-api-fallback: 1.6.0 immutable: 3.8.2 server-destroy: 1.0.1 - socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io-client: 4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) stream-throttle: 0.1.3 transitivePeerDependencies: - bufferutil @@ -13526,7 +13286,7 @@ snapshots: serve-index: 1.9.1 serve-static: 1.16.3 server-destroy: 1.0.1 - socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io: 4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) ua-parser-js: 1.0.41 yargs: 17.7.2 transitivePeerDependencies: @@ -13542,7 +13302,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.11 - caniuse-lite: 1.0.30001761 + caniuse-lite: 1.0.30001762 electron-to-chromium: 1.5.267 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -13635,11 +13395,11 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001761: {} + caniuse-lite@1.0.30001762: {} caseless@0.12.0: {} - chai@6.2.1: {} + chai@6.2.2: {} chalk-template@0.4.0: dependencies: @@ -13776,7 +13536,7 @@ snapshots: dependencies: '@hapi/bourne': 3.0.0 inflation: 2.1.0 - qs: 6.14.0 + qs: 6.14.1 raw-body: 2.5.3 type-is: 1.6.18 @@ -13980,11 +13740,12 @@ snapshots: cssesc@3.0.0: {} - cssstyle@5.3.5: + cssstyle@5.3.6: dependencies: '@asamuzakjp/css-color': 4.1.1 '@csstools/css-syntax-patches-for-csstree': 1.0.22 css-tree: 3.1.0 + lru-cache: 11.2.4 custom-event@1.0.1: {} @@ -14037,10 +13798,6 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.4.0(supports-color@10.2.2): dependencies: ms: 2.1.3 @@ -14256,12 +14013,12 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.6.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): + engine.io-client@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 + debug: 4.4.3(supports-color@10.2.2) engine.io-parser: 5.2.3 - ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) xmlhttprequest-ssl: 2.1.2 transitivePeerDependencies: - bufferutil @@ -14270,7 +14027,7 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): + engine.io@6.6.5(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/cors': 2.8.19 '@types/node': 22.19.3 @@ -14278,9 +14035,9 @@ snapshots: base64id: 2.0.0 cookie: 0.7.2 cors: 2.8.5 - debug: 4.3.7 + debug: 4.4.3(supports-color@10.2.2) engine.io-parser: 5.2.3 - ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil - supports-color @@ -14531,7 +14288,7 @@ snapshots: eslint@9.39.2(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 @@ -14551,7 +14308,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -14578,7 +14335,7 @@ snapshots: esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -14705,7 +14462,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.14.1 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.2 @@ -14740,7 +14497,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.14.1 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -14755,7 +14512,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -14785,7 +14542,7 @@ snapshots: fast-uri@3.1.0: {} - fastq@1.19.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -15089,7 +14846,7 @@ snapshots: get-uri@6.0.5: dependencies: - basic-ftp: 5.0.5 + basic-ftp: 5.1.0 data-uri-to-buffer: 6.0.2 debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: @@ -15870,10 +15627,10 @@ snapshots: jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: - '@acemir/cssom': 0.9.29 + '@acemir/cssom': 0.9.30 '@asamuzakjp/dom-selector': 6.7.6 '@exodus/bytes': 1.8.0 - cssstyle: 5.3.5 + cssstyle: 5.3.6 data-urls: 6.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 @@ -15885,7 +15642,7 @@ snapshots: symbol-tree: 3.2.4 tough-cookie: 6.0.0 w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 + webidl-conversions: 8.0.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -16045,7 +15802,7 @@ snapshots: qjobs: 1.2.0 range-parser: 1.2.1 rimraf: 3.0.2 - socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io: 4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) source-map: 0.6.1 tmp: 0.2.5 ua-parser-js: 0.7.41 @@ -16185,7 +15942,7 @@ snapshots: msgpackr: 1.11.8 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.2.2 - ordered-binary: 1.6.0 + ordered-binary: 1.6.1 weak-lru-cache: 1.2.2 optionalDependencies: '@lmdb/lmdb-darwin-arm64': 3.4.4 @@ -16541,8 +16298,8 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@angular/compiler-cli': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3) - '@rollup/plugin-json': 6.1.0(rollup@4.53.5) - '@rollup/wasm-node': 4.54.0 + '@rollup/plugin-json': 6.1.0(rollup@4.55.1) + '@rollup/wasm-node': 4.55.1 ajv: 8.17.1 ansi-colors: 4.1.3 browserslist: 4.28.1 @@ -16557,14 +16314,14 @@ snapshots: ora: 9.0.0 piscina: 5.1.4 postcss: 8.5.6 - rollup-plugin-dts: 6.3.0(rollup@4.53.5)(typescript@5.9.3) + rollup-plugin-dts: 6.3.0(rollup@4.55.1)(typescript@5.9.3) rxjs: 7.8.2 sass: 1.97.1 tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 optionalDependencies: - rollup: 4.53.5 + rollup: 4.55.1 nock@14.0.10: dependencies: @@ -16767,7 +16524,7 @@ snapshots: is-in-ssh: 1.0.0 is-inside-container: 1.0.0 powershell-utils: 0.1.0 - wsl-utils: 0.3.0 + wsl-utils: 0.3.1 open@8.4.2: dependencies: @@ -16800,7 +16557,7 @@ snapshots: string-width: 8.1.0 strip-ansi: 7.1.2 - ordered-binary@1.6.0: + ordered-binary@1.6.1: optional: true os-tmpdir@1.0.2: {} @@ -17260,6 +17017,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.14.1: + dependencies: + side-channel: 1.1.0 + qs@6.5.3: {} queue-microtask@1.2.3: {} @@ -17531,14 +17292,6 @@ snapshots: semver: 7.7.3 spdx-expression-validate: 2.0.0 - rollup-plugin-dts@6.3.0(rollup@4.53.5)(typescript@5.9.3): - dependencies: - magic-string: 0.30.21 - rollup: 4.53.5 - typescript: 5.9.3 - optionalDependencies: - '@babel/code-frame': 7.27.1 - rollup-plugin-dts@6.3.0(rollup@4.55.1)(typescript@5.9.3): dependencies: magic-string: 0.30.21 @@ -17554,34 +17307,6 @@ snapshots: optionalDependencies: '@types/node': 22.19.3 - rollup@4.53.5: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.5 - '@rollup/rollup-android-arm64': 4.53.5 - '@rollup/rollup-darwin-arm64': 4.53.5 - '@rollup/rollup-darwin-x64': 4.53.5 - '@rollup/rollup-freebsd-arm64': 4.53.5 - '@rollup/rollup-freebsd-x64': 4.53.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.5 - '@rollup/rollup-linux-arm-musleabihf': 4.53.5 - '@rollup/rollup-linux-arm64-gnu': 4.53.5 - '@rollup/rollup-linux-arm64-musl': 4.53.5 - '@rollup/rollup-linux-loong64-gnu': 4.53.5 - '@rollup/rollup-linux-ppc64-gnu': 4.53.5 - '@rollup/rollup-linux-riscv64-gnu': 4.53.5 - '@rollup/rollup-linux-riscv64-musl': 4.53.5 - '@rollup/rollup-linux-s390x-gnu': 4.53.5 - '@rollup/rollup-linux-x64-gnu': 4.53.5 - '@rollup/rollup-linux-x64-musl': 4.53.5 - '@rollup/rollup-openharmony-arm64': 4.53.5 - '@rollup/rollup-win32-arm64-msvc': 4.53.5 - '@rollup/rollup-win32-ia32-msvc': 4.53.5 - '@rollup/rollup-win32-x64-gnu': 4.53.5 - '@rollup/rollup-win32-x64-msvc': 4.53.5 - fsevents: 2.3.3 - rollup@4.55.1: dependencies: '@types/estree': 1.0.8 @@ -17917,42 +17642,42 @@ snapshots: smart-buffer@4.2.0: {} - socket.io-adapter@2.5.5(bufferutil@4.0.9)(utf-8-validate@6.0.5): + socket.io-adapter@2.5.6(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: - debug: 4.3.7 - ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + debug: 4.4.3(supports-color@10.2.2) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5): + socket.io-client@4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-client: 6.6.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) - socket.io-parser: 4.2.4 + debug: 4.4.3(supports-color@10.2.2) + engine.io-client: 6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io-parser: 4.2.5 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-parser@4.2.4: + socket.io-parser@4.2.5: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color - socket.io@4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5): + socket.io@4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.7 - engine.io: 6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) - socket.io-adapter: 2.5.5(bufferutil@4.0.9)(utf-8-validate@6.0.5) - socket.io-parser: 4.2.4 + debug: 4.4.3(supports-color@10.2.2) + engine.io: 6.6.5(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io-adapter: 2.5.6(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io-parser: 4.2.5 transitivePeerDependencies: - bufferutil - supports-color @@ -18535,7 +18260,7 @@ snapshots: buffer: 5.7.1 through: 2.3.8 - undici-types@7.16.0: {} + undici-types@7.18.0: {} undici@5.29.0: dependencies: @@ -18713,7 +18438,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.5 + rollup: 4.55.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.4 @@ -18811,7 +18536,7 @@ snapshots: webidl-conversions@7.0.0: {} - webidl-conversions@8.0.0: {} + webidl-conversions@8.0.1: {} webpack-dev-middleware@7.4.5(webpack@5.104.1(esbuild@0.27.2)): dependencies: @@ -18925,7 +18650,7 @@ snapshots: whatwg-url@15.1.0: dependencies: tr46: 6.0.0 - webidl-conversions: 8.0.0 + webidl-conversions: 8.0.1 whatwg-url@5.0.0: dependencies: @@ -19030,11 +18755,6 @@ snapshots: optionalDependencies: bufferutil: 4.0.9 - ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 6.0.5 - ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): optionalDependencies: bufferutil: 4.0.9 @@ -19048,7 +18768,7 @@ snapshots: dependencies: is-wsl: 3.1.0 - wsl-utils@0.3.0: + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.0 powershell-utils: 0.1.0 @@ -19151,7 +18871,7 @@ snapshots: yoctocolors@2.1.2: {} - zod-to-json-schema@3.25.0(zod@4.3.5): + zod-to-json-schema@3.25.1(zod@4.3.5): dependencies: zod: 4.3.5 From 00eb7c3f937578c682ab2c0669af622057f0d5a8 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 09:16:13 -0500 Subject: [PATCH 19/68] refactor(@angular-devkit/build-angular): convert karma builder to AsyncIterable Refactor the Karma builder's `execute` function to return an `AsyncIterable` using a `ReadableStream`. This removes the RxJS dependency and aligns the builder with modern Angular CLI implementation patterns. Additionally, this change fixes a race condition where the Karma server could start even if the builder was cancelled during asynchronous initialization. An `isCancelled` flag is now used to ensure execution stops if a cancellation occurs before the server starts. --- .../src/builders/karma/browser_builder.ts | 104 +++++++++++------- 1 file changed, 63 insertions(+), 41 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts index dc45da558527..1414594d64e5 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts @@ -7,17 +7,16 @@ */ import { purgeStaleBuildCache } from '@angular/build/private'; -import { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; -import type { Config, ConfigOptions } from 'karma'; +import type { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; +import type { Config, ConfigOptions, Server } from 'karma'; import * as path from 'node:path'; -import { Observable, defaultIfEmpty, from, switchMap } from 'rxjs'; -import { Configuration } from 'webpack'; +import type { Configuration } from 'webpack'; import { getCommonConfig, getStylesConfig } from '../../tools/webpack/configs'; -import { ExecutionTransformer } from '../../transforms'; +import type { ExecutionTransformer } from '../../transforms'; import { generateBrowserWebpackConfigFromContext } from '../../utils/webpack-browser-config'; -import { Schema as BrowserBuilderOptions, OutputHashing } from '../browser/schema'; +import { type Schema as BrowserBuilderOptions, OutputHashing } from '../browser/schema'; import { FindTestsPlugin } from './find-tests-plugin'; -import { Schema as KarmaBuilderOptions } from './schema'; +import type { Schema as KarmaBuilderOptions } from './schema'; export type KarmaConfigOptions = ConfigOptions & { buildWebpack?: unknown; @@ -33,9 +32,22 @@ export function execute( // The karma options transform cannot be async without a refactor of the builder implementation karmaOptions?: (options: KarmaConfigOptions) => KarmaConfigOptions; } = {}, -): Observable { - return from(initializeBrowser(options, context, transforms.webpackConfiguration)).pipe( - switchMap(async ([karma, webpackConfig]) => { +): AsyncIterable { + let karmaServer: Server; + let isCancelled = false; + + return new ReadableStream({ + async start(controller) { + const [karma, webpackConfig] = await initializeBrowser( + options, + context, + transforms.webpackConfiguration, + ); + + if (isCancelled) { + return; + } + const projectName = context.target?.project; if (!projectName) { throw new Error(`The 'karma' builder requires a target to be specified.`); @@ -71,44 +83,54 @@ export function execute( logger: context.logger, }; - const parsedKarmaConfig = await karma.config.parseConfig( + const parsedKarmaConfig = (await karma.config.parseConfig( options.karmaConfig && path.resolve(context.workspaceRoot, options.karmaConfig), transforms.karmaOptions ? transforms.karmaOptions(karmaOptions) : karmaOptions, { promiseConfig: true, throwErrors: true }, - ); + )) as KarmaConfigOptions; - return [karma, parsedKarmaConfig] as [typeof karma, KarmaConfigOptions]; - }), - switchMap( - ([karma, karmaConfig]) => - new Observable((subscriber) => { - // Pass onto Karma to emit BuildEvents. - karmaConfig.buildWebpack ??= {}; - if (typeof karmaConfig.buildWebpack === 'object') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (karmaConfig.buildWebpack as any).failureCb ??= () => - subscriber.next({ success: false }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (karmaConfig.buildWebpack as any).successCb ??= () => - subscriber.next({ success: true }); - } + if (isCancelled) { + return; + } - // Complete the observable once the Karma server returns. - const karmaServer = new karma.Server(karmaConfig as Config, (exitCode) => { - subscriber.next({ success: exitCode === 0 }); - subscriber.complete(); - }); + const enqueue = (value: BuilderOutput) => { + try { + controller.enqueue(value); + } catch { + // Controller is already closed + } + }; - const karmaStart = karmaServer.start(); + const close = () => { + try { + controller.close(); + } catch { + // Controller is already closed + } + }; - // Cleanup, signal Karma to exit. - return () => { - void karmaStart.then(() => karmaServer.stop()); - }; - }), - ), - defaultIfEmpty({ success: false }), - ); + // Pass onto Karma to emit BuildEvents. + parsedKarmaConfig.buildWebpack ??= {}; + if (typeof parsedKarmaConfig.buildWebpack === 'object') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (parsedKarmaConfig.buildWebpack as any).failureCb ??= () => enqueue({ success: false }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (parsedKarmaConfig.buildWebpack as any).successCb ??= () => enqueue({ success: true }); + } + + // Close the stream once the Karma server returns. + karmaServer = new karma.Server(parsedKarmaConfig as Config, (exitCode) => { + enqueue({ success: exitCode === 0 }); + close(); + }); + + await karmaServer.start(); + }, + async cancel() { + isCancelled = true; + await karmaServer?.stop(); + }, + }); } async function initializeBrowser( From d5f5b016fe4935509bed52786a0a19c33c9f508f Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 09:55:53 -0500 Subject: [PATCH 20/68] refactor(@angular-devkit/build-angular): decouple karma builder from webpack plugin callbacks Decouples the Karma builder from the Webpack plugin by removing the custom `successCb` and `failureCb` callback mechanism. The builder now idiomaticallly listens to the standard Karma `run_complete` event on the server instance to emit builder results. --- .../src/builders/karma/browser_builder.ts | 21 +++++++------------ .../src/tools/webpack/plugins/karma/karma.ts | 15 ------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts index 1414594d64e5..1ac82fb47c9f 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts @@ -8,7 +8,7 @@ import { purgeStaleBuildCache } from '@angular/build/private'; import type { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; -import type { Config, ConfigOptions, Server } from 'karma'; +import type { ConfigOptions, Server } from 'karma'; import * as path from 'node:path'; import type { Configuration } from 'webpack'; import { getCommonConfig, getStylesConfig } from '../../tools/webpack/configs'; @@ -83,11 +83,11 @@ export function execute( logger: context.logger, }; - const parsedKarmaConfig = (await karma.config.parseConfig( + const parsedKarmaConfig = await karma.config.parseConfig( options.karmaConfig && path.resolve(context.workspaceRoot, options.karmaConfig), transforms.karmaOptions ? transforms.karmaOptions(karmaOptions) : karmaOptions, { promiseConfig: true, throwErrors: true }, - )) as KarmaConfigOptions; + ); if (isCancelled) { return; @@ -109,21 +109,16 @@ export function execute( } }; - // Pass onto Karma to emit BuildEvents. - parsedKarmaConfig.buildWebpack ??= {}; - if (typeof parsedKarmaConfig.buildWebpack === 'object') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (parsedKarmaConfig.buildWebpack as any).failureCb ??= () => enqueue({ success: false }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (parsedKarmaConfig.buildWebpack as any).successCb ??= () => enqueue({ success: true }); - } - // Close the stream once the Karma server returns. - karmaServer = new karma.Server(parsedKarmaConfig as Config, (exitCode) => { + karmaServer = new karma.Server(parsedKarmaConfig, (exitCode) => { enqueue({ success: exitCode === 0 }); close(); }); + karmaServer.on('run_complete', (_, results) => { + enqueue({ success: results.exitCode === 0 }); + }); + await karmaServer.start(); }, async cancel() { diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index 4ce99ea56928..e4aa5ec1edae 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -25,8 +25,6 @@ const KARMA_APPLICATION_PATH = '_karma_webpack_'; let blocked: any[] = []; let isBlocked = false; let webpackMiddleware: any; -let successCb: () => void; -let failureCb: () => void; const init: any = (config: any, emitter: any) => { if (!config.buildWebpack) { @@ -37,8 +35,6 @@ const init: any = (config: any, emitter: any) => { } const options = config.buildWebpack.options as BuildOptions; const logger: logging.Logger = config.buildWebpack.logger || createConsoleLogger(); - successCb = config.buildWebpack.successCb; - failureCb = config.buildWebpack.failureCb; // Add a reporter that fixes sourcemap urls. if (normalizeSourceMaps(options.sourceMap).scripts) { @@ -132,9 +128,6 @@ const init: any = (config: any, emitter: any) => { // Finish Karma run early in case of compilation error. emitter.emit('run_complete', [], { exitCode: 1 }); - - // Emit a failure build event if there are compilation errors. - failureCb(); } }); @@ -224,14 +217,6 @@ const eventReporter: any = function (this: any, baseReporterDecorator: any, conf muteDuplicateReporterLogging(this, config); - this.onRunComplete = function (_browsers: any, results: any) { - if (results.exitCode === 0) { - successCb(); - } else { - failureCb(); - } - }; - // avoid duplicate failure message this.specFailure = () => {}; }; From 997d0e22df0bfd10b7de8e298017849ef9527d91 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 10:43:37 -0500 Subject: [PATCH 21/68] refactor(@angular-devkit/build-angular): convert karma builder entry to AsyncIterable Refactor the Karma builder's main `execute` function to return an `AsyncIterable` instead of an RxJS `Observable`. This continues the effort to reduce RxJS usage in the CLI builders and aligns the implementation with modern Angular CLI patterns. --- .../build_angular/src/builders/karma/index.ts | 59 +++++++++---------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/builders/karma/index.ts b/packages/angular_devkit/build_angular/src/builders/karma/index.ts index ea79a9165771..e6db299395bd 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/index.ts @@ -17,7 +17,6 @@ import { strings } from '@angular-devkit/core'; import type { ConfigOptions } from 'karma'; import { createRequire } from 'node:module'; import * as path from 'node:path'; -import { Observable, from, mergeMap } from 'rxjs'; import { Configuration } from 'webpack'; import { ExecutionTransformer } from '../../transforms'; import { normalizeFileReplacements } from '../../utils'; @@ -31,7 +30,7 @@ export type KarmaConfigOptions = ConfigOptions & { /** * @experimental Direct usage of this function is considered experimental. */ -export function execute( +export async function* execute( options: KarmaBuilderOptions, context: BuilderContext, transforms: { @@ -39,37 +38,35 @@ export function execute( // The karma options transform cannot be async without a refactor of the builder implementation karmaOptions?: (options: KarmaConfigOptions) => KarmaConfigOptions; } = {}, -): Observable { +): AsyncIterable { // Check Angular version. assertCompatibleAngularVersion(context.workspaceRoot); - return from(getExecuteWithBuilder(options, context)).pipe( - mergeMap(([useEsbuild, executeWithBuilder]) => { - if (useEsbuild) { - if (transforms.webpackConfiguration) { - context.logger.warn( - `This build is using the application builder but transforms.webpackConfiguration was provided. The transform will be ignored.`, - ); - } - - if (options.fileReplacements) { - options.fileReplacements = normalizeFileReplacements(options.fileReplacements, './'); - } - - if (typeof options.polyfills === 'string') { - options.polyfills = [options.polyfills]; - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return executeWithBuilder(options as any, context, transforms); - } else { - const karmaOptions = getBaseKarmaOptions(options, context); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return executeWithBuilder(options as any, context, karmaOptions, transforms); - } - }), - ); + const [useEsbuild, executeWithBuilder] = await getExecuteWithBuilder(options, context); + + if (useEsbuild) { + if (transforms.webpackConfiguration) { + context.logger.warn( + `This build is using the application builder but transforms.webpackConfiguration was provided. The transform will be ignored.`, + ); + } + + if (options.fileReplacements) { + options.fileReplacements = normalizeFileReplacements(options.fileReplacements, './'); + } + + if (typeof options.polyfills === 'string') { + options.polyfills = [options.polyfills]; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + yield* executeWithBuilder(options as any, context, transforms); + } else { + const karmaOptions = getBaseKarmaOptions(options, context); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + yield* executeWithBuilder(options as any, context, karmaOptions, transforms); + } } function getBaseKarmaOptions( @@ -169,7 +166,7 @@ function getBuiltInKarmaConfig( } export type { KarmaBuilderOptions }; -export default createBuilder & KarmaBuilderOptions>(execute); +export default createBuilder(execute); async function getExecuteWithBuilder( options: KarmaBuilderOptions, From ce8036d7989a1a19690214e917a3a3c522a62ff5 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 10:50:31 -0500 Subject: [PATCH 22/68] refactor(@angular-devkit/build-angular): remove as any usage in karma builder Refactor the Karma builder's `execute` function to directly handle dynamic imports within conditional blocks. This eliminates the need for `getExecuteWithBuilder` and the resulting union types that required `as any` casting. This improves type safety by allowing TypeScript to verify the arguments passed to the specific builder implementations (Esbuild vs Webpack). --- .../build_angular/src/builders/karma/index.ts | 41 +++++-------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/builders/karma/index.ts b/packages/angular_devkit/build_angular/src/builders/karma/index.ts index e6db299395bd..81c8d1d58a21 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/index.ts @@ -42,9 +42,7 @@ export async function* execute( // Check Angular version. assertCompatibleAngularVersion(context.workspaceRoot); - const [useEsbuild, executeWithBuilder] = await getExecuteWithBuilder(options, context); - - if (useEsbuild) { + if (await checkForEsbuild(options, context)) { if (transforms.webpackConfiguration) { context.logger.warn( `This build is using the application builder but transforms.webpackConfiguration was provided. The transform will be ignored.`, @@ -59,13 +57,18 @@ export async function* execute( options.polyfills = [options.polyfills]; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - yield* executeWithBuilder(options as any, context, transforms); + const { executeKarmaBuilder } = await import('@angular/build'); + + yield* executeKarmaBuilder( + options as unknown as import('@angular/build').KarmaBuilderOptions, + context, + transforms, + ); } else { const karmaOptions = getBaseKarmaOptions(options, context); + const { execute } = await import('./browser_builder'); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - yield* executeWithBuilder(options as any, context, karmaOptions, transforms); + yield* execute(options, context, karmaOptions, transforms); } } @@ -168,30 +171,6 @@ function getBuiltInKarmaConfig( export type { KarmaBuilderOptions }; export default createBuilder(execute); -async function getExecuteWithBuilder( - options: KarmaBuilderOptions, - context: BuilderContext, -): Promise< - [ - boolean, - ( - | (typeof import('@angular/build'))['executeKarmaBuilder'] - | (typeof import('./browser_builder'))['execute'] - ), - ] -> { - const useEsbuild = await checkForEsbuild(options, context); - let execute; - if (useEsbuild) { - const { executeKarmaBuilder } = await import('@angular/build'); - execute = executeKarmaBuilder; - } else { - const browserBuilderModule = await import('./browser_builder'); - execute = browserBuilderModule.execute; - } - - return [useEsbuild, execute]; -} async function checkForEsbuild( options: KarmaBuilderOptions, From d64d0cf506b765122ffc9ced8d804030fc13acf2 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 11:03:32 -0500 Subject: [PATCH 23/68] refactor(@angular-devkit/build-angular): maintain experimental public API for karma builder Adds an `executeKarmaBuilder` wrapper function in the package entry point that returns an RxJS `Observable`. This maintains backward compatibility for the experimental public API while the internal implementation has been migrated to use `AsyncIterable`. --- .../angular_devkit/build_angular/index.api.md | 16 +++++----- .../build_angular/src/builders/karma/index.ts | 1 - .../angular_devkit/build_angular/src/index.ts | 29 +++++++++++++++---- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/goldens/public-api/angular_devkit/build_angular/index.api.md b/goldens/public-api/angular_devkit/build_angular/index.api.md index cb46b4458351..0208e998a300 100644 --- a/goldens/public-api/angular_devkit/build_angular/index.api.md +++ b/goldens/public-api/angular_devkit/build_angular/index.api.md @@ -49,7 +49,7 @@ export type BrowserBuilderOptions = { i18nDuplicateTranslation?: I18NTranslation; i18nMissingTranslation?: I18NTranslation; index: IndexUnion; - inlineStyleLanguage?: InlineStyleLanguage; + inlineStyleLanguage?: InlineStyleLanguage_2; localize?: Localize; main: string; namedChunks?: boolean; @@ -58,16 +58,16 @@ export type BrowserBuilderOptions = { outputHashing?: OutputHashing; outputPath: string; poll?: number; - polyfills?: Polyfills; + polyfills?: Polyfills_2; preserveSymlinks?: boolean; progress?: boolean; resourcesOutputPath?: string; - scripts?: ScriptElement[]; + scripts?: ScriptElement_2[]; serviceWorker?: boolean; sourceMap?: SourceMapUnion; statsJson?: boolean; stylePreprocessorOptions?: StylePreprocessorOptions; - styles?: StyleElement[]; + styles?: StyleElement_2[]; subresourceIntegrity?: boolean; tsConfig: string; vendorChunk?: boolean; @@ -216,18 +216,18 @@ export type KarmaBuilderOptions = { exclude?: string[]; fileReplacements?: FileReplacement_2[]; include?: string[]; - inlineStyleLanguage?: InlineStyleLanguage_2; + inlineStyleLanguage?: InlineStyleLanguage; karmaConfig?: string; main?: string; poll?: number; - polyfills?: Polyfills_2; + polyfills?: Polyfills; preserveSymlinks?: boolean; progress?: boolean; reporters?: string[]; - scripts?: ScriptElement_2[]; + scripts?: ScriptElement[]; sourceMap?: SourceMapUnion_2; stylePreprocessorOptions?: StylePreprocessorOptions_2; - styles?: StyleElement_2[]; + styles?: StyleElement[]; tsConfig: string; watch?: boolean; webWorkerTsConfig?: string; diff --git a/packages/angular_devkit/build_angular/src/builders/karma/index.ts b/packages/angular_devkit/build_angular/src/builders/karma/index.ts index 81c8d1d58a21..ff54a8292ff2 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/index.ts @@ -171,7 +171,6 @@ function getBuiltInKarmaConfig( export type { KarmaBuilderOptions }; export default createBuilder(execute); - async function checkForEsbuild( options: KarmaBuilderOptions, context: BuilderContext, diff --git a/packages/angular_devkit/build_angular/src/index.ts b/packages/angular_devkit/build_angular/src/index.ts index 7f02b7753686..1ba9ce034544 100644 --- a/packages/angular_devkit/build_angular/src/index.ts +++ b/packages/angular_devkit/build_angular/src/index.ts @@ -6,6 +6,15 @@ * found in the LICENSE file at https://angular.dev/license */ +import type { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; +import { type Observable, from } from 'rxjs'; +import { + type KarmaBuilderOptions, + type KarmaConfigOptions, + execute as executeKarmaBuilderInternal, +} from './builders/karma'; +import type { ExecutionTransformer } from './transforms'; + export * from './transforms'; export { CrossOrigin, OutputHashing, Type } from './builders/browser/schema'; @@ -40,11 +49,21 @@ export { type ExtractI18nBuilderOptions, } from './builders/extract-i18n'; -export { - execute as executeKarmaBuilder, - type KarmaBuilderOptions, - type KarmaConfigOptions, -} from './builders/karma'; +/** + * @experimental Direct usage of this function is considered experimental. + */ +export function executeKarmaBuilder( + options: KarmaBuilderOptions, + context: BuilderContext, + transforms?: { + webpackConfiguration?: ExecutionTransformer; + karmaOptions?: (options: KarmaConfigOptions) => KarmaConfigOptions; + }, +): Observable { + return from(executeKarmaBuilderInternal(options, context, transforms)); +} + +export { type KarmaBuilderOptions, type KarmaConfigOptions }; export { execute as executeProtractorBuilder, From 3ffe3ea751236da339d8f0131d2c8d07db42e61c Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 11:19:18 -0500 Subject: [PATCH 24/68] refactor(@angular-devkit/build-angular): move webpack compiler creation to karma builder Moves the instantiation of the Webpack Compiler from the Karma plugin to the Karma builder (`browser_builder`). This allows the builder to have full ownership of the compiler's lifecycle and configuration, including `singleRun` adjustments and output paths. The Karma plugin now receives the `compiler` instance directly instead of the configuration, reducing its responsibility to just integration logic. --- .../src/builders/karma/browser_builder.ts | 26 ++++++++++++-- .../src/tools/webpack/plugins/karma/karma.ts | 35 +++---------------- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts index 1ac82fb47c9f..e9997b67ea0d 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/browser_builder.ts @@ -10,7 +10,7 @@ import { purgeStaleBuildCache } from '@angular/build/private'; import type { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; import type { ConfigOptions, Server } from 'karma'; import * as path from 'node:path'; -import type { Configuration } from 'webpack'; +import webpack, { Configuration } from 'webpack'; import { getCommonConfig, getStylesConfig } from '../../tools/webpack/configs'; import type { ExecutionTransformer } from '../../transforms'; import { generateBrowserWebpackConfigFromContext } from '../../utils/webpack-browser-config'; @@ -77,9 +77,31 @@ export function execute( }), ); + const KARMA_APPLICATION_PATH = '_karma_webpack_'; + webpackConfig.output ??= {}; + webpackConfig.output.path = `/${KARMA_APPLICATION_PATH}/`; + webpackConfig.output.publicPath = `/${KARMA_APPLICATION_PATH}/`; + + if (karmaOptions.singleRun) { + webpackConfig.plugins.unshift({ + apply: (compiler: webpack.Compiler) => { + compiler.hooks.afterEnvironment.tap('karma', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + compiler.watchFileSystem = { watch: () => {} } as any; + }); + }, + }); + } + + // Remove the watch option to avoid the [DEP_WEBPACK_WATCH_WITHOUT_CALLBACK] warning. + // The compiler is initialized in watch mode by webpack-dev-middleware. + delete webpackConfig.watch; + + const compiler = webpack(webpackConfig); + karmaOptions.buildWebpack = { options, - webpackConfig, + compiler, logger: context.logger, }; diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index e4aa5ec1edae..faf611d640c2 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -10,7 +10,7 @@ // TODO: cleanup this file, it's copied as is from Angular CLI. import * as http from 'node:http'; import * as path from 'node:path'; -import webpack from 'webpack'; +import type { Compiler } from 'webpack'; import webpackDevMiddleware from 'webpack-dev-middleware'; import { statsErrorsToString } from '../../utils/stats'; @@ -18,7 +18,6 @@ import { createConsoleLogger } from '@angular-devkit/core/node'; import { logging } from '@angular-devkit/core'; import { BuildOptions } from '../../../../utils/build-options'; import { normalizeSourceMaps } from '../../../../utils/index'; -import assert from 'node:assert'; const KARMA_APPLICATION_PATH = '_karma_webpack_'; @@ -67,16 +66,13 @@ const init: any = (config: any, emitter: any) => { config.reporters.push('coverage'); } - // Add webpack config. - const webpackConfig = config.buildWebpack.webpackConfig; + const compiler = config.buildWebpack.compiler as Compiler; const webpackMiddlewareConfig = { // Hide webpack output because its noisy. stats: false, publicPath: `/${KARMA_APPLICATION_PATH}/`, }; - // Use existing config if any. - config.webpack = { ...webpackConfig, ...config.webpack }; config.webpackMiddleware = { ...webpackMiddlewareConfig, ...config.webpackMiddleware }; // Our custom context and debug files list the webpack bundles directly instead of using @@ -90,29 +86,10 @@ const init: any = (config: any, emitter: any) => { config.middleware = config.middleware || []; config.middleware.push('@angular-devkit/build-angular--fallback'); - if (config.singleRun) { - // There's no option to turn off file watching in webpack-dev-server, but - // we can override the file watcher instead. - webpackConfig.plugins.unshift({ - apply: (compiler: any) => { - compiler.hooks.afterEnvironment.tap('karma', () => { - compiler.watchFileSystem = { watch: () => {} }; - }); - }, - }); - } - // Files need to be served from a custom path for Karma. - webpackConfig.output.path = `/${KARMA_APPLICATION_PATH}/`; - webpackConfig.output.publicPath = `/${KARMA_APPLICATION_PATH}/`; - - const compiler = webpack(webpackConfig, (error, stats) => { - if (error) { - throw error; - } - - if (stats?.hasErrors()) { + compiler.hooks.done.tap('karma', (stats) => { + if (stats.hasErrors()) { // Only generate needed JSON stats and when needed. - const statsJson = stats?.toJson({ + const statsJson = stats.toJson({ all: false, children: true, errors: true, @@ -136,8 +113,6 @@ const init: any = (config: any, emitter: any) => { callback?.(); } - assert(compiler, 'Webpack compiler factory did not return a compiler instance.'); - compiler.hooks.invalid.tap('karma', () => handler()); compiler.hooks.watchRun.tapAsync('karma', (_: any, callback: () => void) => handler(callback)); compiler.hooks.run.tapAsync('karma', (_: any, callback: () => void) => handler(callback)); From 4b129d293f49ab384f11e90ffb46bcc5a53c57e3 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 12:23:57 -0500 Subject: [PATCH 25/68] refactor(@angular-devkit/build-angular): remove createConsoleLogger from karma plugin Removes the `createConsoleLogger` import and its usage as a fallback in the Karma plugin. The logger is now consistently provided by the builder via the `buildWebpack` configuration object. --- .../build_angular/src/tools/webpack/plugins/karma/karma.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index faf611d640c2..5e44b864ff18 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -14,7 +14,6 @@ import type { Compiler } from 'webpack'; import webpackDevMiddleware from 'webpack-dev-middleware'; import { statsErrorsToString } from '../../utils/stats'; -import { createConsoleLogger } from '@angular-devkit/core/node'; import { logging } from '@angular-devkit/core'; import { BuildOptions } from '../../../../utils/build-options'; import { normalizeSourceMaps } from '../../../../utils/index'; @@ -33,7 +32,7 @@ const init: any = (config: any, emitter: any) => { ); } const options = config.buildWebpack.options as BuildOptions; - const logger: logging.Logger = config.buildWebpack.logger || createConsoleLogger(); + const logger: logging.Logger = config.buildWebpack.logger; // Add a reporter that fixes sourcemap urls. if (normalizeSourceMaps(options.sourceMap).scripts) { From e0a165ac43dc7ab91f6e1183dfdae9489e510cec Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 12:46:28 -0500 Subject: [PATCH 26/68] refactor(@angular-devkit/build-angular): optimize karma plugin hooks Consolidates the compiler hooks in the Karma plugin. Merges separate `compiler.hooks.done` taps into a single unified handler that manages error reporting, file refreshing, and blocking logic. --- .../src/tools/webpack/plugins/karma/karma.ts | 56 +++++++++---------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index 5e44b864ff18..a7c0c5dc2e6b 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -85,28 +85,6 @@ const init: any = (config: any, emitter: any) => { config.middleware = config.middleware || []; config.middleware.push('@angular-devkit/build-angular--fallback'); - compiler.hooks.done.tap('karma', (stats) => { - if (stats.hasErrors()) { - // Only generate needed JSON stats and when needed. - const statsJson = stats.toJson({ - all: false, - children: true, - errors: true, - warnings: true, - }); - - logger.error(statsErrorsToString(statsJson, { colors: true })); - - if (config.singleRun) { - // Notify potential listeners of the compile error. - emitter.emit('load_error'); - } - - // Finish Karma run early in case of compilation error. - emitter.emit('run_complete', [], { exitCode: 1 }); - } - }); - function handler(callback?: () => void): void { isBlocked = true; callback?.(); @@ -133,6 +111,32 @@ const init: any = (config: any, emitter: any) => { return new Promise((resolve) => { compiler.hooks.done.tap('karma', (stats) => { + if (stats.hasErrors()) { + lastCompilationHash = undefined; + + // Only generate needed JSON stats and when needed. + const statsJson = stats.toJson({ + all: false, + children: true, + errors: true, + warnings: true, + }); + + logger.error(statsErrorsToString(statsJson, { colors: true })); + + if (config.singleRun) { + // Notify potential listeners of the compile error. + emitter.emit('load_error'); + } + + // Finish Karma run early in case of compilation error. + emitter.emit('run_complete', [], { exitCode: 1 }); + } else if (stats.hash != lastCompilationHash) { + // Refresh karma only when there are no webpack errors, and if the compilation changed. + lastCompilationHash = stats.hash; + emitter.refreshFiles(); + } + if (isFirstRun) { // This is needed to block Karma from launching browsers before Webpack writes the assets in memory. // See the below: @@ -142,14 +146,6 @@ const init: any = (config: any, emitter: any) => { resolve(); } - if (stats.hasErrors()) { - lastCompilationHash = undefined; - } else if (stats.hash != lastCompilationHash) { - // Refresh karma only when there are no webpack errors, and if the compilation changed. - lastCompilationHash = stats.hash; - emitter.refreshFiles(); - } - unblock(); }); }); From c64527ca3865e1e069dced1b865144221b40378c Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 12:56:02 -0500 Subject: [PATCH 27/68] refactor(@angular-devkit/build-angular): remove redundant event reporter from karma plugin Removes the `@angular-devkit/build-angular--event-reporter` and its logic. The reporter was no longer performing significant work after the removal of custom callbacks, and its primary remaining function was a logging hack that is no longer required. --- .../src/tools/webpack/plugins/karma/karma.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index a7c0c5dc2e6b..230e4a99eee1 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -55,8 +55,6 @@ const init: any = (config: any, emitter: any) => { ); } - config.reporters.unshift('@angular-devkit/build-angular--event-reporter'); - // When using code-coverage, auto-add karma-coverage. if ( options.codeCoverage && @@ -181,18 +179,6 @@ function muteDuplicateReporterLogging(context: any, config: any) { } } -// Emits builder events. -const eventReporter: any = function (this: any, baseReporterDecorator: any, config: any) { - baseReporterDecorator(this); - - muteDuplicateReporterLogging(this, config); - - // avoid duplicate failure message - this.specFailure = () => {}; -}; - -eventReporter.$inject = ['baseReporterDecorator', 'config']; - // Strip the server address and webpack scheme (webpack://) from error log. const sourceMapReporter: any = function (this: any, baseReporterDecorator: any, config: any) { baseReporterDecorator(this); @@ -246,7 +232,6 @@ function fallbackMiddleware() { module.exports = { 'framework:@angular-devkit/build-angular': ['factory', init], 'reporter:@angular-devkit/build-angular--sourcemap-reporter': ['type', sourceMapReporter], - 'reporter:@angular-devkit/build-angular--event-reporter': ['type', eventReporter], 'middleware:@angular-devkit/build-angular--blocker': ['factory', requestBlocker], 'middleware:@angular-devkit/build-angular--fallback': ['factory', fallbackMiddleware], }; From 8fc907e165a3c1cb84a110a76ca065bfd8fe66f2 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:15:27 -0500 Subject: [PATCH 28/68] refactor(@angular-devkit/build-angular): apply strict typing and cleanup karma middleware Updates the `requestBlocker` and `fallbackMiddleware` functions in the Karma plugin to use strict `IncomingMessage`, `ServerResponse`, and `NextFunction` types from `node:http`. Also properly types the `webpackMiddleware` variable and ensures its `close` method is called with a callback in the exit handler, resolving a TypeScript error exposed by the stricter typing. --- .../src/tools/webpack/plugins/karma/karma.ts | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index 230e4a99eee1..31387de0cd8d 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -8,7 +8,7 @@ /* eslint-disable */ // TODO: cleanup this file, it's copied as is from Angular CLI. -import * as http from 'node:http'; +import type { IncomingMessage, ServerResponse } from 'node:http'; import * as path from 'node:path'; import type { Compiler } from 'webpack'; import webpackDevMiddleware from 'webpack-dev-middleware'; @@ -20,9 +20,9 @@ import { normalizeSourceMaps } from '../../../../utils/index'; const KARMA_APPLICATION_PATH = '_karma_webpack_'; -let blocked: any[] = []; +let blocked: ((err?: unknown) => void)[] = []; let isBlocked = false; -let webpackMiddleware: any; +let webpackMiddleware: webpackDevMiddleware.API; const init: any = (config: any, emitter: any) => { if (!config.buildWebpack) { @@ -94,8 +94,7 @@ const init: any = (config: any, emitter: any) => { webpackMiddleware = webpackDevMiddleware(compiler, webpackMiddlewareConfig); emitter.on('exit', (done: any) => { - webpackMiddleware.close(); - compiler.close(() => done()); + webpackMiddleware.close(() => compiler.close(() => done())); }); function unblock() { @@ -153,7 +152,11 @@ init.$inject = ['config', 'emitter']; // Block requests until the Webpack compilation is done. function requestBlocker() { - return function (_request: any, _response: any, next: () => void) { + return function ( + _request: IncomingMessage, + _response: ServerResponse, + next: (err?: unknown) => void, + ) { if (isBlocked) { blocked.push(next); } else { @@ -203,7 +206,11 @@ sourceMapReporter.$inject = ['baseReporterDecorator', 'config']; // When a request is not found in the karma server, try looking for it from the webpack server root. function fallbackMiddleware() { - return function (request: http.IncomingMessage, response: http.ServerResponse, next: () => void) { + return function ( + request: IncomingMessage, + response: ServerResponse, + next: (err?: unknown) => void, + ) { if (webpackMiddleware) { if (request.url && !new RegExp(`\\/${KARMA_APPLICATION_PATH}\\/.*`).test(request.url)) { request.url = '/' + KARMA_APPLICATION_PATH + request.url; From fb8d68985b967a6d1874f026cb30c89aa25c09db Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:38:20 -0500 Subject: [PATCH 29/68] refactor(@angular-devkit/build-angular): remove redundant request blocker from karma plugin Removes the custom request blocker middleware and related hooks from the Karma plugin. `webpack-dev-middleware` already handles blocking requests until compilation is valid, making this custom logic redundant and unnecessary. --- .../src/tools/webpack/plugins/karma/karma.ts | 39 +------------------ 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index 31387de0cd8d..4ae968ba41a5 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -20,8 +20,6 @@ import { normalizeSourceMaps } from '../../../../utils/index'; const KARMA_APPLICATION_PATH = '_karma_webpack_'; -let blocked: ((err?: unknown) => void)[] = []; -let isBlocked = false; let webpackMiddleware: webpackDevMiddleware.API; const init: any = (config: any, emitter: any) => { @@ -77,32 +75,15 @@ const init: any = (config: any, emitter: any) => { config.customContextFile = `${__dirname}/karma-context.html`; config.customDebugFile = `${__dirname}/karma-debug.html`; - // Add the request blocker and the webpack server fallback. - config.beforeMiddleware = config.beforeMiddleware || []; - config.beforeMiddleware.push('@angular-devkit/build-angular--blocker'); + // Add the webpack server fallback. config.middleware = config.middleware || []; config.middleware.push('@angular-devkit/build-angular--fallback'); - function handler(callback?: () => void): void { - isBlocked = true; - callback?.(); - } - - compiler.hooks.invalid.tap('karma', () => handler()); - compiler.hooks.watchRun.tapAsync('karma', (_: any, callback: () => void) => handler(callback)); - compiler.hooks.run.tapAsync('karma', (_: any, callback: () => void) => handler(callback)); - webpackMiddleware = webpackDevMiddleware(compiler, webpackMiddlewareConfig); emitter.on('exit', (done: any) => { webpackMiddleware.close(() => compiler.close(() => done())); }); - function unblock() { - isBlocked = false; - blocked.forEach((cb) => cb()); - blocked = []; - } - let lastCompilationHash: string | undefined; let isFirstRun = true; @@ -142,29 +123,12 @@ const init: any = (config: any, emitter: any) => { isFirstRun = false; resolve(); } - - unblock(); }); }); }; init.$inject = ['config', 'emitter']; -// Block requests until the Webpack compilation is done. -function requestBlocker() { - return function ( - _request: IncomingMessage, - _response: ServerResponse, - next: (err?: unknown) => void, - ) { - if (isBlocked) { - blocked.push(next); - } else { - next(); - } - }; -} - // Copied from "karma-jasmine-diff-reporter" source code: // In case, when multiple reporters are used in conjunction // with initSourcemapReporter, they both will show repetitive log @@ -239,6 +203,5 @@ function fallbackMiddleware() { module.exports = { 'framework:@angular-devkit/build-angular': ['factory', init], 'reporter:@angular-devkit/build-angular--sourcemap-reporter': ['type', sourceMapReporter], - 'middleware:@angular-devkit/build-angular--blocker': ['factory', requestBlocker], 'middleware:@angular-devkit/build-angular--fallback': ['factory', fallbackMiddleware], }; From 8d99355dbf9f3ee9f822fccb3d8ed6985d1ea4f7 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:43:07 -0500 Subject: [PATCH 30/68] refactor(@angular-devkit/build-angular): remove redundant isFirstRun check in Karma plugin The Promise resolve function is idempotent. Removing the explicit 'isFirstRun' check simplifies the code as subsequent calls to resolve() after the first compilation will be ignored by the Promise. --- .../src/tools/webpack/plugins/karma/karma.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts index 4ae968ba41a5..dd1336b5e22d 100644 --- a/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts +++ b/packages/angular_devkit/build_angular/src/tools/webpack/plugins/karma/karma.ts @@ -85,7 +85,6 @@ const init: any = (config: any, emitter: any) => { }); let lastCompilationHash: string | undefined; - let isFirstRun = true; return new Promise((resolve) => { compiler.hooks.done.tap('karma', (stats) => { @@ -115,14 +114,11 @@ const init: any = (config: any, emitter: any) => { emitter.refreshFiles(); } - if (isFirstRun) { - // This is needed to block Karma from launching browsers before Webpack writes the assets in memory. - // See the below: - // https://github.com/karma-runner/karma-chrome-launcher/issues/154#issuecomment-986661937 - // https://github.com/angular/angular-cli/issues/22495 - isFirstRun = false; - resolve(); - } + // This is needed to block Karma from launching browsers before Webpack writes the assets in memory. + // See the below: + // https://github.com/karma-runner/karma-chrome-launcher/issues/154#issuecomment-986661937 + // https://github.com/angular/angular-cli/issues/22495 + resolve(); }); }); }; From 0f6153ea5a08a34cabd1217f9d0551e5861a8e34 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 6 Jan 2026 21:38:13 +0000 Subject: [PATCH 31/68] build: update cross-repo angular dependencies See associated pull request for more information. --- .../assistant-to-the-branch-manager.yml | 2 +- .github/workflows/ci.yml | 52 ++--- .github/workflows/dev-infra.yml | 4 +- .github/workflows/feature-requests.yml | 2 +- .github/workflows/perf.yml | 6 +- .github/workflows/pr.yml | 44 ++-- MODULE.bazel | 2 +- MODULE.bazel.lock | 2 - package.json | 2 +- pnpm-lock.yaml | 204 +++++++++--------- tests/e2e/ng-snapshot/package.json | 32 +-- 11 files changed, 175 insertions(+), 177 deletions(-) diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index a30031ce31fd..7b756215a472 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -17,6 +17,6 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@942d738d8f4d65b161d06e6c399fefec318cdbfe + - uses: angular/dev-infra/github-actions/branch-manager@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 000b239cd7a0..730d5368fbaf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Generate JSON schema types @@ -44,11 +44,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -61,11 +61,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -84,13 +84,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -100,11 +100,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -137,7 +137,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -164,13 +164,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -188,13 +188,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -208,13 +208,13 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-cli-${{ github.workflow }}-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run E2E Browser tests @@ -244,11 +244,11 @@ jobs: CIRCLE_BRANCH: ${{ github.ref_name }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - run: pnpm admin snapshots --verbose env: SNAPSHOT_BUILDS_GITHUB_TOKEN: ${{ secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN }} diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index 23811dc9f573..585f2d1bfc8d 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/pull-request-labeling@942d738d8f4d65b161d06e6c399fefec318cdbfe + - uses: angular/dev-infra/github-actions/pull-request-labeling@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/post-approval-changes@942d738d8f4d65b161d06e6c399fefec318cdbfe + - uses: angular/dev-infra/github-actions/post-approval-changes@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml index fae7787a6dff..fa610e65c161 100644 --- a/.github/workflows/feature-requests.yml +++ b/.github/workflows/feature-requests.yml @@ -16,6 +16,6 @@ jobs: if: github.repository == 'angular/angular-cli' runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/feature-request@942d738d8f4d65b161d06e6c399fefec318cdbfe + - uses: angular/dev-infra/github-actions/feature-request@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index abe20d3f3921..28be10bdcd3f 100644 --- a/.github/workflows/perf.yml +++ b/.github/workflows/perf.yml @@ -23,7 +23,7 @@ jobs: workflows: ${{ steps.workflows.outputs.workflows }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - id: workflows @@ -38,9 +38,9 @@ jobs: workflow: ${{ fromJSON(needs.list.outputs.workflows) }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile # We utilize the google-github-actions/auth action to allow us to get an active credential using workflow diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index d103d3f2edcd..e06c3f3a6dbc 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,9 +34,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup ESLint Caching uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: @@ -66,17 +66,17 @@ jobs: # it has been merged. run: pnpm ng-dev format changed --check ${{ github.event.pull_request.base.sha }} - name: Check Package Licenses - uses: angular/dev-infra/github-actions/linting/licenses@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/linting/licenses@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 build: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build release targets @@ -93,11 +93,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Run module and package tests @@ -114,13 +114,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -128,11 +128,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build E2E tests for Windows on Linux @@ -156,7 +156,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -183,13 +183,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=3 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -205,12 +205,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@942d738d8f4d65b161d06e6c399fefec318cdbfe + uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.snapshots.${{ matrix.subset }}_node${{ matrix.node }} diff --git a/MODULE.bazel b/MODULE.bazel index 334bb955e55b..2957ffb4cf2b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -25,7 +25,7 @@ git_override( bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "942d738d8f4d65b161d06e6c399fefec318cdbfe", + commit = "87ed54ddedde42b443be7c6fe36cdaf0a907ea39", remote = "https://github.com/angular/dev-infra.git", ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 2143d7c6df94..dc0bf9948c80 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -14,7 +14,6 @@ "https://bcr.bazel.build/modules/aspect_bazel_lib/2.14.0/MODULE.bazel": "2b31ffcc9bdc8295b2167e07a757dbbc9ac8906e7028e5170a3708cecaac119f", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.17.1/MODULE.bazel": "9b027af55f619c7c444cead71061578fab6587e5e1303fa4ed61d49d2b1a7262", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.19.3/MODULE.bazel": "253d739ba126f62a5767d832765b12b59e9f8d2bc88cc1572f4a73e46eb298ca", - "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.0/MODULE.bazel": "7fe0191f047d4fe4a4a46c1107e2350cbb58a8fc2e10913aa4322d3190dec0bf", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.2/MODULE.bazel": "6b735f3fdd64978e217c9725f4ff0d84bf606554c8e77d20e90977841d7ff2ed", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.22.2/source.json": "58fffa2d722cff47cb8d921c8bbed7701c53f233009d9ca82beb4a0fb8fb9418", "https://bcr.bazel.build/modules/aspect_bazel_lib/2.7.7/MODULE.bazel": "491f8681205e31bb57892d67442ce448cda4f472a8e6b3dc062865e29a64f89c", @@ -163,7 +162,6 @@ "https://bcr.bazel.build/modules/rules_nodejs/6.6.2/source.json": "6e8c1ecc64ff8da147c1620f862ad77d7b19c5d1b52b3aa5e847d5b3d0de4cc3", "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.1.0/MODULE.bazel": "9db8031e71b6ef32d1846106e10dd0ee2deac042bd9a2de22b4761b0c3036453", "https://bcr.bazel.build/modules/rules_pkg/1.2.0/MODULE.bazel": "c7db3c2b407e673c7a39e3625dc05dc9f12d6682cbd82a3a5924a13b491eda7e", "https://bcr.bazel.build/modules/rules_pkg/1.2.0/source.json": "9062e00845bf91a4247465d371baa837adf9b6ff44c542f73ba084f07667e1dc", "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", diff --git a/package.json b/package.json index 25cfd4d8a549..aa01b2d18647 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@angular/forms": "21.1.0-next.4", "@angular/localize": "21.1.0-next.4", "@angular/material": "21.1.0-next.3", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ddc3809c1993612732eaae62d28e828b2ed789e5", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#4877ddbc10c12fb75ef6bc9ff49295021ff2512a", "@angular/platform-browser": "21.1.0-next.4", "@angular/platform-server": "21.1.0-next.4", "@angular/router": "21.1.0-next.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2dae4ae965e9..c3dd14671ea0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,8 +47,8 @@ importers: specifier: 21.1.0-next.3 version: 21.1.0-next.3(5911ac44acdb5e81564606f5886cc827) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#ddc3809c1993612732eaae62d28e828b2ed789e5 - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ddc3809c1993612732eaae62d28e828b2ed789e5(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4877ddbc10c12fb75ef6bc9ff49295021ff2512a + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5)) '@angular/platform-browser': specifier: 21.1.0-next.4 version: 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) @@ -225,7 +225,7 @@ importers: version: 7.0.0 karma: specifier: ~6.4.0 - version: 6.4.4(bufferutil@4.0.9) + version: 6.4.4(bufferutil@4.1.0) karma-chrome-launcher: specifier: ~3.2.0 version: 3.2.0 @@ -234,10 +234,10 @@ importers: version: 2.2.1 karma-jasmine: specifier: ~5.1.0 - version: 5.1.0(karma@6.4.4(bufferutil@4.0.9)) + version: 5.1.0(karma@6.4.4(bufferutil@4.1.0)) karma-jasmine-html-reporter: specifier: ~2.1.0 - version: 2.1.0(jasmine-core@5.13.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.0.9)))(karma@6.4.4(bufferutil@4.0.9)) + version: 2.1.0(jasmine-core@5.13.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)))(karma@6.4.4(bufferutil@4.1.0)) karma-source-map-support: specifier: 1.4.0 version: 1.4.0 @@ -255,7 +255,7 @@ importers: version: 7.0.0 puppeteer: specifier: 18.2.1 - version: 18.2.1(bufferutil@4.0.9)(encoding@0.1.13) + version: 18.2.1(bufferutil@4.1.0)(encoding@0.1.13) quicktype-core: specifier: 23.2.6 version: 23.2.6(encoding@0.1.13) @@ -318,19 +318,19 @@ importers: version: link:../../../packages/angular/ssr '@vitest/coverage-v8': specifier: 4.0.16 - version: 4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) browser-sync: specifier: 3.0.4 - version: 3.0.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) jsdom: specifier: 27.4.0 - version: 27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + version: 27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) rxjs: specifier: 7.8.2 version: 7.8.2 vitest: specifier: 4.0.16 - version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) packages/angular/build: dependencies: @@ -424,7 +424,7 @@ importers: version: link:../ssr jsdom: specifier: 27.4.0 - version: 27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + version: 27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) less: specifier: 4.4.2 version: 4.4.2 @@ -439,7 +439,7 @@ importers: version: 7.8.2 vitest: specifier: 4.0.16 - version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: lmdb: specifier: 3.4.4 @@ -723,7 +723,7 @@ importers: version: 7.4.5(webpack@5.104.1(esbuild@0.27.2)) webpack-dev-server: specifier: 5.2.2 - version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.1(esbuild@0.27.2)) + version: 5.2.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)(webpack@5.104.1(esbuild@0.27.2)) webpack-merge: specifier: 6.0.1 version: 6.0.1 @@ -736,10 +736,10 @@ importers: version: link:../../angular/ssr '@web/test-runner': specifier: 0.20.2 - version: 0.20.2(bufferutil@4.0.9) + version: 0.20.2(bufferutil@4.1.0) browser-sync: specifier: 3.0.4 - version: 3.0.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: specifier: 21.1.0-next.0 version: 21.1.0-next.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) @@ -771,7 +771,7 @@ importers: version: 5.104.1(esbuild@0.27.2) webpack-dev-server: specifier: 5.2.2 - version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.1(esbuild@0.27.2)) + version: 5.2.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)(webpack@5.104.1(esbuild@0.27.2)) packages/angular_devkit/core: dependencies: @@ -1026,9 +1026,9 @@ packages: '@angular/platform-browser': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.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/ddc3809c1993612732eaae62d28e828b2ed789e5': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/ddc3809c1993612732eaae62d28e828b2ed789e5} - version: 0.0.0-942d738d8f4d65b161d06e6c399fefec318cdbfe + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a} + version: 0.0.0-87ed54ddedde42b443be7c6fe36cdaf0a907ea39 hasBin: true '@angular/platform-browser@21.1.0-next.4': @@ -2125,8 +2125,8 @@ packages: resolution: {integrity: sha512-IJn+8A3QZJfe7FUtWqHVNo3xJs7KFpurCWGWCiCz3oEh+BkRymKZ1QxfAbU2yGMDzTytLGQ2IV6T2r3cuo75/w==} engines: {node: '>=18'} - '@google/genai@1.33.0': - resolution: {integrity: sha512-ThUjFZ1N0DU88peFjnQkb8K198EWaW2RmmnDShFQ+O+xkIH9itjpRe358x3L/b4X/A7dimkvq63oz49Vbh7Cog==} + '@google/genai@1.34.0': + resolution: {integrity: sha512-vu53UMPvjmb7PGzlYu6Tzxso8Dfhn+a7eQFaS2uNemVtDZKwzSpJ5+ikqBbXplF7RGB1STcVDqCkPvquiwb2sw==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.24.0 @@ -4442,8 +4442,8 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} bundle-name@4.1.0: @@ -8680,8 +8680,8 @@ packages: urijs@1.19.11: resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} - utf-8-validate@6.0.5: - resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==} + utf-8-validate@6.0.6: + resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} engines: {node: '>=6.14.2'} util-deprecate@1.0.2: @@ -9358,11 +9358,11 @@ 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/ddc3809c1993612732eaae62d28e828b2ed789e5(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))': dependencies: '@actions/core': 2.0.1 '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.33.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5) + '@google/genai': 1.34.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) '@inquirer/prompts': 8.1.0(@types/node@24.10.4) '@inquirer/type': 4.0.2(@types/node@24.10.4) '@octokit/auth-app': 8.1.2 @@ -9388,7 +9388,7 @@ snapshots: '@types/yargs': 17.0.35 '@types/yarnpkg__lockfile': 1.1.9 '@yarnpkg/lockfile': 1.1.0 - bufferutil: 4.0.9 + bufferutil: 4.1.0 cli-progress: 3.12.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.2.1 @@ -9410,7 +9410,7 @@ snapshots: tsx: 4.21.0 typed-graphqlify: 3.1.6 typescript: 5.9.3 - utf-8-validate: 6.0.5 + utf-8-validate: 6.0.6 which: 6.0.0 yaml: 2.8.2 yargs: 18.0.0 @@ -10736,10 +10736,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@google/genai@1.33.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5)': + '@google/genai@1.34.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': dependencies: google-auth-library: 10.5.0(supports-color@10.2.2) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: '@modelcontextprotocol/sdk': 1.25.1(zod@4.3.5) transitivePeerDependencies: @@ -12477,7 +12477,7 @@ snapshots: dependencies: vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/coverage-v8@4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.16 @@ -12490,7 +12490,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -12539,7 +12539,7 @@ snapshots: '@web/config-loader@0.3.3': {} - '@web/dev-server-core@0.7.5(bufferutil@4.0.9)': + '@web/dev-server-core@0.7.5(bufferutil@4.1.0)': dependencies: '@types/koa': 2.15.0 '@types/ws': 7.4.7 @@ -12558,16 +12558,16 @@ snapshots: mime-types: 2.1.35 parse5: 6.0.1 picomatch: 2.3.1 - ws: 7.5.10(bufferutil@4.0.9) + ws: 7.5.10(bufferutil@4.1.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@web/dev-server-rollup@0.6.4(bufferutil@4.0.9)': + '@web/dev-server-rollup@0.6.4(bufferutil@4.1.0)': dependencies: '@rollup/plugin-node-resolve': 15.3.1(rollup@4.55.1) - '@web/dev-server-core': 0.7.5(bufferutil@4.0.9) + '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) nanocolors: 0.2.13 parse5: 6.0.1 rollup: 4.55.1 @@ -12577,13 +12577,13 @@ snapshots: - supports-color - utf-8-validate - '@web/dev-server@0.4.6(bufferutil@4.0.9)': + '@web/dev-server@0.4.6(bufferutil@4.1.0)': dependencies: '@babel/code-frame': 7.27.1 '@types/command-line-args': 5.2.3 '@web/config-loader': 0.3.3 - '@web/dev-server-core': 0.7.5(bufferutil@4.0.9) - '@web/dev-server-rollup': 0.6.4(bufferutil@4.0.9) + '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) + '@web/dev-server-rollup': 0.6.4(bufferutil@4.1.0) camelcase: 6.3.0 command-line-args: 5.2.1 command-line-usage: 7.0.3 @@ -12603,12 +12603,12 @@ snapshots: '@types/parse5': 6.0.3 parse5: 6.0.1 - '@web/test-runner-chrome@0.18.1(bufferutil@4.0.9)': + '@web/test-runner-chrome@0.18.1(bufferutil@4.1.0)': dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.0.9) - '@web/test-runner-coverage-v8': 0.8.0(bufferutil@4.0.9) + '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) + '@web/test-runner-coverage-v8': 0.8.0(bufferutil@4.1.0) chrome-launcher: 0.15.2 - puppeteer-core: 24.34.0(bufferutil@4.0.9) + puppeteer-core: 24.34.0(bufferutil@4.1.0) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -12617,16 +12617,16 @@ snapshots: - supports-color - utf-8-validate - '@web/test-runner-commands@0.9.0(bufferutil@4.0.9)': + '@web/test-runner-commands@0.9.0(bufferutil@4.1.0)': dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.0.9) + '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) mkdirp: 1.0.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@web/test-runner-core@0.13.4(bufferutil@4.0.9)': + '@web/test-runner-core@0.13.4(bufferutil@4.1.0)': dependencies: '@babel/code-frame': 7.27.1 '@types/babel__code-frame': 7.0.6 @@ -12636,7 +12636,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@web/browser-logs': 0.4.1 - '@web/dev-server-core': 0.7.5(bufferutil@4.0.9) + '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) chokidar: 4.0.3 cli-cursor: 3.1.0 co-body: 6.2.0 @@ -12659,9 +12659,9 @@ snapshots: - supports-color - utf-8-validate - '@web/test-runner-coverage-v8@0.8.0(bufferutil@4.0.9)': + '@web/test-runner-coverage-v8@0.8.0(bufferutil@4.1.0)': dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.0.9) + '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) istanbul-lib-coverage: 3.2.2 lru-cache: 8.0.5 picomatch: 2.3.1 @@ -12671,23 +12671,23 @@ snapshots: - supports-color - utf-8-validate - '@web/test-runner-mocha@0.9.0(bufferutil@4.0.9)': + '@web/test-runner-mocha@0.9.0(bufferutil@4.1.0)': dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.0.9) + '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@web/test-runner@0.20.2(bufferutil@4.0.9)': + '@web/test-runner@0.20.2(bufferutil@4.1.0)': dependencies: '@web/browser-logs': 0.4.1 '@web/config-loader': 0.3.3 - '@web/dev-server': 0.4.6(bufferutil@4.0.9) - '@web/test-runner-chrome': 0.18.1(bufferutil@4.0.9) - '@web/test-runner-commands': 0.9.0(bufferutil@4.0.9) - '@web/test-runner-core': 0.13.4(bufferutil@4.0.9) - '@web/test-runner-mocha': 0.9.0(bufferutil@4.0.9) + '@web/dev-server': 0.4.6(bufferutil@4.1.0) + '@web/test-runner-chrome': 0.18.1(bufferutil@4.1.0) + '@web/test-runner-commands': 0.9.0(bufferutil@4.1.0) + '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) + '@web/test-runner-mocha': 0.9.0(bufferutil@4.1.0) camelcase: 6.3.0 command-line-args: 5.2.1 command-line-usage: 7.0.3 @@ -13245,24 +13245,24 @@ snapshots: fresh: 0.5.2 mitt: 1.2.0 - browser-sync-ui@3.0.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): + browser-sync-ui@3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: async-each-series: 0.1.1 chalk: 4.1.2 connect-history-api-fallback: 1.6.0 immutable: 3.8.2 server-destroy: 1.0.1 - socket.io-client: 4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) stream-throttle: 0.1.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - browser-sync@3.0.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): + browser-sync@3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: browser-sync-client: 3.0.4 - browser-sync-ui: 3.0.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + browser-sync-ui: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) bs-recipes: 1.3.4 chalk: 4.1.2 chokidar: 3.6.0 @@ -13286,7 +13286,7 @@ snapshots: serve-index: 1.9.1 serve-static: 1.16.3 server-destroy: 1.0.1 - socket.io: 4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) ua-parser-js: 1.0.41 yargs: 17.7.2 transitivePeerDependencies: @@ -13331,7 +13331,7 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.0.9: + bufferutil@4.1.0: dependencies: node-gyp-build: 4.8.4 @@ -14013,12 +14013,12 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): + engine.io-client@6.6.4(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@10.2.2) engine.io-parser: 5.2.3 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) xmlhttprequest-ssl: 2.1.2 transitivePeerDependencies: - bufferutil @@ -14027,7 +14027,7 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.5(bufferutil@4.0.9)(utf-8-validate@6.0.5): + engine.io@6.6.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@types/cors': 2.8.19 '@types/node': 22.19.3 @@ -14037,7 +14037,7 @@ snapshots: cors: 2.8.5 debug: 4.4.3(supports-color@10.2.2) engine.io-parser: 5.2.3 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color @@ -15625,7 +15625,7 @@ snapshots: jsbn@0.1.1: {} - jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): + jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@acemir/cssom': 0.9.30 '@asamuzakjp/dom-selector': 6.7.6 @@ -15645,7 +15645,7 @@ snapshots: webidl-conversions: 8.0.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) xml-name-validator: 5.0.0 transitivePeerDependencies: - '@exodus/crypto' @@ -15766,22 +15766,22 @@ snapshots: transitivePeerDependencies: - supports-color - karma-jasmine-html-reporter@2.1.0(jasmine-core@5.13.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.0.9)))(karma@6.4.4(bufferutil@4.0.9)): + karma-jasmine-html-reporter@2.1.0(jasmine-core@5.13.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)))(karma@6.4.4(bufferutil@4.1.0)): dependencies: jasmine-core: 5.13.0 - karma: 6.4.4(bufferutil@4.0.9) - karma-jasmine: 5.1.0(karma@6.4.4(bufferutil@4.0.9)) + karma: 6.4.4(bufferutil@4.1.0) + karma-jasmine: 5.1.0(karma@6.4.4(bufferutil@4.1.0)) - karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.0.9)): + karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)): dependencies: jasmine-core: 4.6.1 - karma: 6.4.4(bufferutil@4.0.9) + karma: 6.4.4(bufferutil@4.1.0) karma-source-map-support@1.4.0: dependencies: source-map-support: 0.5.21 - karma@6.4.4(bufferutil@4.0.9): + karma@6.4.4(bufferutil@4.1.0): dependencies: '@colors/colors': 1.5.0 body-parser: 1.20.4 @@ -15802,7 +15802,7 @@ snapshots: qjobs: 1.2.0 range-parser: 1.2.1 rimraf: 3.0.2 - socket.io: 4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io: 4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) source-map: 0.6.1 tmp: 0.2.5 ua-parser-js: 0.7.41 @@ -16958,7 +16958,7 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@18.2.1(bufferutil@4.0.9)(encoding@0.1.13): + puppeteer-core@18.2.1(bufferutil@4.1.0)(encoding@0.1.13): dependencies: cross-fetch: 3.1.5(encoding@0.1.13) debug: 4.3.4 @@ -16969,14 +16969,14 @@ snapshots: rimraf: 3.0.2 tar-fs: 2.1.1 unbzip2-stream: 1.4.3 - ws: 8.9.0(bufferutil@4.0.9) + ws: 8.9.0(bufferutil@4.1.0) transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - puppeteer-core@24.34.0(bufferutil@4.0.9): + puppeteer-core@24.34.0(bufferutil@4.1.0): dependencies: '@puppeteer/browsers': 2.11.0 chromium-bidi: 12.0.1(devtools-protocol@0.0.1534754) @@ -16984,7 +16984,7 @@ snapshots: devtools-protocol: 0.0.1534754 typed-query-selector: 2.12.0 webdriver-bidi-protocol: 0.3.10 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -16993,12 +16993,12 @@ snapshots: - supports-color - utf-8-validate - puppeteer@18.2.1(bufferutil@4.0.9)(encoding@0.1.13): + puppeteer@18.2.1(bufferutil@4.1.0)(encoding@0.1.13): dependencies: https-proxy-agent: 5.0.1(supports-color@10.2.2) progress: 2.0.3 proxy-from-env: 1.1.0 - puppeteer-core: 18.2.1(bufferutil@4.0.9)(encoding@0.1.13) + puppeteer-core: 18.2.1(bufferutil@4.1.0)(encoding@0.1.13) transitivePeerDependencies: - bufferutil - encoding @@ -17642,20 +17642,20 @@ snapshots: smart-buffer@4.2.0: {} - socket.io-adapter@2.5.6(bufferutil@4.0.9)(utf-8-validate@6.0.5): + socket.io-adapter@2.5.6(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: debug: 4.4.3(supports-color@10.2.2) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-client@4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@10.2.2) - engine.io-client: 6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + engine.io-client: 6.6.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) socket.io-parser: 4.2.5 transitivePeerDependencies: - bufferutil @@ -17669,14 +17669,14 @@ snapshots: transitivePeerDependencies: - supports-color - socket.io@4.8.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): + socket.io@4.8.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 debug: 4.4.3(supports-color@10.2.2) - engine.io: 6.6.5(bufferutil@4.0.9)(utf-8-validate@6.0.5) - socket.io-adapter: 2.5.6(bufferutil@4.0.9)(utf-8-validate@6.0.5) + engine.io: 6.6.5(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.5 transitivePeerDependencies: - bufferutil @@ -18327,7 +18327,7 @@ snapshots: urijs@1.19.11: {} - utf-8-validate@6.0.5: + utf-8-validate@6.0.6: dependencies: node-gyp-build: 4.8.4 @@ -18450,7 +18450,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.16 '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) @@ -18475,7 +18475,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.10.4 - jsdom: 27.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + jsdom: 27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - jiti - less @@ -18549,7 +18549,7 @@ snapshots: optionalDependencies: webpack: 5.104.1(esbuild@0.27.2) - webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.104.1(esbuild@0.27.2)): + webpack-dev-server@5.2.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)(webpack@5.104.1(esbuild@0.27.2)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -18578,7 +18578,7 @@ snapshots: sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1(esbuild@0.27.2)) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: @@ -18751,18 +18751,18 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.10(bufferutil@4.0.9): + ws@7.5.10(bufferutil@4.1.0): optionalDependencies: - bufferutil: 4.0.9 + bufferutil: 4.1.0 - ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): + ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 6.0.5 + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 - ws@8.9.0(bufferutil@4.0.9): + ws@8.9.0(bufferutil@4.1.0): optionalDependencies: - bufferutil: 4.0.9 + bufferutil: 4.1.0 wsl-utils@0.1.0: dependencies: diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index a8565caab740..c23398b6a93c 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#80524f5d854b7fdb33104e629ca5e1102255f6f5", - "@angular/cdk": "github:angular/cdk-builds#475fd8d473ba20045b3393423d8a14d93a2da938", - "@angular/common": "github:angular/common-builds#8aafef4ce946a2f96a0203c9b9623c29998995bb", - "@angular/compiler": "github:angular/compiler-builds#205d342032c053a41088e14de00ff14e28e56fce", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#110918badaf4f73a2d20eb58f185fb6c1f8ae54a", - "@angular/core": "github:angular/core-builds#969d56512e639d39092dd3edf736bd7ba19a4c7d", - "@angular/forms": "github:angular/forms-builds#fafffa726c829fd644957e6c76bb5e42f09cbed7", - "@angular/language-service": "github:angular/language-service-builds#41e0bb51496678a972f37cb973ece48e40bc5cd1", - "@angular/localize": "github:angular/localize-builds#ef4c1e3562f99602b38312aabccb4cb5fb6bb53f", - "@angular/material": "github:angular/material-builds#998cd492b05bf024e5bb7a9a21e52a94dec740ef", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#f173ac254a842de20a90694e34628c165989e9b6", - "@angular/platform-browser": "github:angular/platform-browser-builds#90c22fc35fde1feb2bc28435d23062443ddaae68", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#fbb14077cfb88dcdb4e5d1b7a177b3d127e9f8be", - "@angular/platform-server": "github:angular/platform-server-builds#0e40e41e36ffd1d1aa740438f11262542da4cd7e", - "@angular/router": "github:angular/router-builds#ac4ab9493afbfbcb3cb457682d651113938d490b", - "@angular/service-worker": "github:angular/service-worker-builds#4ffbe09669ce6958a3ffb669fa7a059aa9e735c6" + "@angular/animations": "github:angular/animations-builds#52e440a279796075d4a410e8352b6fd1c4cc2a4e", + "@angular/cdk": "github:angular/cdk-builds#1d00da20ec8300d289d74c4826b0b7168aaa9220", + "@angular/common": "github:angular/common-builds#e4e2a940a30841829b62eed596e85c90d9c0e4c5", + "@angular/compiler": "github:angular/compiler-builds#80e0c2e150a40414ee5453789a6805413964d025", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#7ab42f98dcb8d0098c048233ae331863e1cbe823", + "@angular/core": "github:angular/core-builds#8a794f6ee1668004477745d39aaa59efcbdc0376", + "@angular/forms": "github:angular/forms-builds#62f756ab9864e33483da6d3de877e5f50c457993", + "@angular/language-service": "github:angular/language-service-builds#367d12eb7a6967dcd6da6eea10dbb37a5dfc8cf4", + "@angular/localize": "github:angular/localize-builds#1894d4467d5cb4320e774c814d0872a8a7a17430", + "@angular/material": "github:angular/material-builds#4778ddc77ce6ff8e05967f47cee4675da5c6c91c", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#4b9109c754cca1c4f46b4a7aadeb876520a93876", + "@angular/platform-browser": "github:angular/platform-browser-builds#5fcd4a203b69fc7e0d14a774c2cdc96e663602c1", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#27669115b9d40764b8bd704d788076834b82a1c8", + "@angular/platform-server": "github:angular/platform-server-builds#312bb14489ba06ebeb2f437bc114137d81891fdb", + "@angular/router": "github:angular/router-builds#0a1b31fdf935973d3e4c97ddaa43771a13e08846", + "@angular/service-worker": "github:angular/service-worker-builds#3faf8a95e8b00777e37130bb5e1156caf6540aab" } } From bc481637bbc3e54b2239a2bcc85e21880b570b33 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 6 Jan 2026 22:39:08 +0000 Subject: [PATCH 32/68] 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 c23398b6a93c..0f2058a23bf8 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#52e440a279796075d4a410e8352b6fd1c4cc2a4e", + "@angular/animations": "github:angular/animations-builds#23371fccefcb39e6a518e6b5a59690bec18e0ca6", "@angular/cdk": "github:angular/cdk-builds#1d00da20ec8300d289d74c4826b0b7168aaa9220", - "@angular/common": "github:angular/common-builds#e4e2a940a30841829b62eed596e85c90d9c0e4c5", - "@angular/compiler": "github:angular/compiler-builds#80e0c2e150a40414ee5453789a6805413964d025", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#7ab42f98dcb8d0098c048233ae331863e1cbe823", - "@angular/core": "github:angular/core-builds#8a794f6ee1668004477745d39aaa59efcbdc0376", - "@angular/forms": "github:angular/forms-builds#62f756ab9864e33483da6d3de877e5f50c457993", - "@angular/language-service": "github:angular/language-service-builds#367d12eb7a6967dcd6da6eea10dbb37a5dfc8cf4", - "@angular/localize": "github:angular/localize-builds#1894d4467d5cb4320e774c814d0872a8a7a17430", + "@angular/common": "github:angular/common-builds#3589a6da62f899edc0d28f5e8f4a51f5590320b3", + "@angular/compiler": "github:angular/compiler-builds#8414d9435325dfe6051a2a8a3ed725f3802f28e3", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#4cefffa419e345fc344246e8a0bc456bfedab902", + "@angular/core": "github:angular/core-builds#2074453a9188277518aaca6eec69a15f5878e260", + "@angular/forms": "github:angular/forms-builds#03f16af72e540d0622c4fe74b94a1d986449de0e", + "@angular/language-service": "github:angular/language-service-builds#f35f0c54211fc42d833e52249d10290e12b493e6", + "@angular/localize": "github:angular/localize-builds#0cff9a83741c04b28c42b8a9719949da660f9760", "@angular/material": "github:angular/material-builds#4778ddc77ce6ff8e05967f47cee4675da5c6c91c", "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#4b9109c754cca1c4f46b4a7aadeb876520a93876", - "@angular/platform-browser": "github:angular/platform-browser-builds#5fcd4a203b69fc7e0d14a774c2cdc96e663602c1", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#27669115b9d40764b8bd704d788076834b82a1c8", - "@angular/platform-server": "github:angular/platform-server-builds#312bb14489ba06ebeb2f437bc114137d81891fdb", - "@angular/router": "github:angular/router-builds#0a1b31fdf935973d3e4c97ddaa43771a13e08846", - "@angular/service-worker": "github:angular/service-worker-builds#3faf8a95e8b00777e37130bb5e1156caf6540aab" + "@angular/platform-browser": "github:angular/platform-browser-builds#a95c38bb173cd85727a5f481704dcd90e7f559d7", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#22645554d754ec6865e74c74b32e966241b17627", + "@angular/platform-server": "github:angular/platform-server-builds#5ab6fb15a8af6b2af3b600ae3df44bd9f4e21f2a", + "@angular/router": "github:angular/router-builds#63fed7fd2e47a55bdcbf152f38126231f505df8c", + "@angular/service-worker": "github:angular/service-worker-builds#afddddc8c016767de0b5929070a1382542eefd6d" } } From 1e39c77a4fe272ccab1a1d8bd58eef1ce608a6c7 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:48:34 -0500 Subject: [PATCH 33/68] fix(@angular/build): inject source-map-support for Vitest browser tests This change ensures that `source-map-support` is injected into the setup files when running Vitest tests in a browser environment. This allows stack traces from failing tests to correctly map back to the original source files, significantly improving debugging capabilities. A regression test has been added to `tests/vitest/browser-sourcemaps.ts` to verify that a failing test correctly identifies the source file in its stack trace. --- .../unit-test/runners/vitest/plugins.ts | 36 +++++++++++++++++ tests/e2e/tests/vitest/browser-sourcemaps.ts | 40 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 tests/e2e/tests/vitest/browser-sourcemaps.ts 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 e4f3cfd5f810..4bd6666250e7 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 @@ -112,6 +112,12 @@ export async function createVitestConfigPlugin( delete config.plugins; } + // Add browser source map support + if (browser || testConfig?.browser?.enabled) { + projectPlugins.unshift(createSourcemapSupportPlugin()); + setupFiles.unshift('virtual:source-map-support'); + } + const projectResolver = createRequire(projectSourceRoot + '/').resolve; const projectDefaults: UserWorkspaceConfig = { @@ -310,6 +316,36 @@ export function createVitestPlugins(pluginOptions: PluginOptions): VitestPlugins ]; } +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();' + ); + }, + }; +} + async function generateCoverageOption( optionsCoverage: NormalizedUnitTestBuilderOptions['coverage'], configCoverage: VitestCoverageOption | undefined, diff --git a/tests/e2e/tests/vitest/browser-sourcemaps.ts b/tests/e2e/tests/vitest/browser-sourcemaps.ts new file mode 100644 index 000000000000..90c04457c7c8 --- /dev/null +++ b/tests/e2e/tests/vitest/browser-sourcemaps.ts @@ -0,0 +1,40 @@ +import assert from 'node:assert/strict'; +import { applyVitestBuilder } from '../../utils/vitest'; +import { ng, noSilentNg } from '../../utils/process'; +import { installPackage } from '../../utils/packages'; +import { writeFile } from '../../utils/fs'; +import { stripVTControlCharacters } from 'node:util'; + +export default async function (): Promise { + await applyVitestBuilder(); + await installPackage('playwright@1'); + await installPackage('@vitest/browser-playwright@4'); + await ng('generate', 'component', 'my-comp'); + + // Add a failing test to verify source map support + await writeFile( + 'src/app/failing.spec.ts', + ` + describe('Failing Test', () => { + it('should fail', () => { + expect(true).toBe(false); + }); + }); + `, + ); + + try { + await noSilentNg('test', '--no-watch', '--browsers', 'chromiumHeadless'); + throw new Error('Expected "ng test" to fail.'); + } catch (error: any) { + const stdout = stripVTControlCharacters(error.stdout || error.message); + // We expect the failure from failing.spec.ts + assert.match(stdout, /1 failed/, 'Expected 1 test to fail.'); + // Check that the stack trace points to the correct file + assert.match( + stdout, + /\bsrc[\/\\]app[\/\\]failing\.spec\.ts:4:\d+/, + 'Expected stack trace to point to the source file.', + ); + } +} From 31132bc18ab69457e6fe01a26304c33248397aaf Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 7 Jan 2026 13:47:56 +0000 Subject: [PATCH 34/68] refactor: update copyright year in license Update copyright year to current year. --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 48adc1eb1829..5ec8e26b9eec 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2010-2025 Google LLC. https://angular.dev/license +Copyright (c) 2010-2026 Google LLC. https://angular.dev/license Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 87175f9dcdb7349dc8701fa1d5cf61c1b8542d42 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 7 Jan 2026 10:40:47 -0500 Subject: [PATCH 35/68] feat(@angular/build): disable TestBed teardown during debugging in Vitest When running unit tests in debug mode, it is beneficial to keep the component's DOM state intact after the test completes for inspection. This change disables the automatic TestBed teardown (destroyAfterEach) when the 'debug' option is enabled. --- .../src/builders/unit-test/runners/vitest/build-options.ts | 3 +++ 1 file changed, 3 insertions(+) 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 1c65d6fc4d50..7129ea4fff54 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 @@ -17,6 +17,7 @@ import { RunnerOptions } from '../api'; function createTestBedInitVirtualFile( providersFile: string | undefined, projectSourceRoot: string, + teardown: boolean, polyfills: string[] = [], ): string { const usesZoneJS = polyfills.includes('zone.js'); @@ -58,6 +59,7 @@ function createTestBedInitVirtualFile( getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), { errorOnUnknownElements: true, errorOnUnknownProperties: true, + ${teardown === false ? 'teardown: { destroyAfterEach: false },' : ''} }); } `; @@ -133,6 +135,7 @@ export async function getVitestBuildOptions( const testBedInitContents = createTestBedInitVirtualFile( providersFile, projectSourceRoot, + !options.debug, buildOptions.polyfills, ); From 32adc3a757a1e75cf8d44a227c57f7947053ca8c Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 7 Jan 2026 11:28:50 -0500 Subject: [PATCH 36/68] fix(@angular/build): ensure correct project targeting during Vitest debugging This addresses issue #31652 where debugging failed to target the correct project instance. When running browser tests, Vitest appends the browser name to the project identifier. This change updates the CLI to match that naming convention when initiating a debug session, ensuring the correct project is selected. Fixes #31652 --- .../unit-test/runners/vitest/executor.ts | 22 ++++++++++++++++--- .../unit-test/runners/vitest/index.ts | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts index 00782d1704cf..ed754d9f9c30 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/executor.ts @@ -6,9 +6,9 @@ * found in the LICENSE file at https://angular.dev/license */ -import type { BuilderOutput } from '@angular-devkit/architect'; +import type { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; import assert from 'node:assert'; -import path, { join } from 'node:path'; +import path from 'node:path'; import type { Vitest } from 'vitest/node'; import { DevServerExternalResultMetadata, @@ -32,6 +32,7 @@ export class VitestExecutor implements TestExecutor { private normalizePath: ((id: string) => string) | undefined; private readonly projectName: string; private readonly options: NormalizedUnitTestBuilderOptions; + private readonly logger: BuilderContext['logger']; private readonly buildResultFiles = new Map(); private readonly externalMetadata: DevServerExternalResultMetadata = { implicitBrowser: [], @@ -51,9 +52,11 @@ export class VitestExecutor implements TestExecutor { projectName: string, options: NormalizedUnitTestBuilderOptions, testEntryPointMappings: Map | undefined, + logger: BuilderContext['logger'], ) { this.projectName = projectName; this.options = options; + this.logger = logger; if (testEntryPointMappings) { for (const [entryPoint, testFile] of testEntryPointMappings) { @@ -209,13 +212,26 @@ export class VitestExecutor implements TestExecutor { ? await findVitestBaseConfig([projectRoot, workspaceRoot]) : runnerConfig; + let project = projectName; + if (debug && browserOptions.browser?.instances) { + if (browserOptions.browser.instances.length > 1) { + this.logger.warn( + 'Multiple browsers are configured, but only the first browser will be used for debugging.', + ); + } + + // When running browser tests, Vitest appends the browser name to the project identifier. + // The project name must match this augmented name to ensure the correct project is targeted. + project = `${projectName} (${browserOptions.browser.instances[0].browser})`; + } + return startVitest( 'test', undefined, { config: externalConfigPath, root: workspaceRoot, - project: projectName, + project, outputFile, cache: cacheOptions.enabled ? undefined : false, testNamePattern: this.options.filter, diff --git a/packages/angular/build/src/builders/unit-test/runners/vitest/index.ts b/packages/angular/build/src/builders/unit-test/runners/vitest/index.ts index fed814bdd78e..081d635c1a2b 100644 --- a/packages/angular/build/src/builders/unit-test/runners/vitest/index.ts +++ b/packages/angular/build/src/builders/unit-test/runners/vitest/index.ts @@ -67,7 +67,7 @@ const VitestTestRunner: TestRunner = { context.logger.info('Automatically searching for and using Vitest configuration file.'); } - return new VitestExecutor(projectName, options, testEntryPointMappings); + return new VitestExecutor(projectName, options, testEntryPointMappings, context.logger); }, }; From 1ad773671afa2849a966f9974cb30e7c8e8ed7d4 Mon Sep 17 00:00:00 2001 From: Jan Martin Date: Wed, 7 Jan 2026 10:26:27 -0800 Subject: [PATCH 37/68] fix(@angular/cli): update dependency @modelcontextprotocol/sdk to v1.25.2 This is a port of PR angular#32227. --- packages/angular/cli/package.json | 2 +- pnpm-lock.yaml | 20 ++++++++++---------- pnpm-workspace.yaml | 1 + 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json index 07829c24b4c2..8872ceeee5b0 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -27,7 +27,7 @@ "@angular-devkit/schematics": "workspace:0.0.0-PLACEHOLDER", "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", - "@modelcontextprotocol/sdk": "1.25.1", + "@modelcontextprotocol/sdk": "1.25.2", "@schematics/angular": "workspace:0.0.0-PLACEHOLDER", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.46.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c3dd14671ea0..ae5bd2cacaed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,7 +48,7 @@ importers: version: 21.1.0-next.3(5911ac44acdb5e81564606f5886cc827) '@angular/ng-dev': specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4877ddbc10c12fb75ef6bc9ff49295021ff2512a - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5)) + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)) '@angular/platform-browser': specifier: 21.1.0-next.4 version: 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) @@ -463,8 +463,8 @@ importers: specifier: 3.0.5 version: 3.0.5(@inquirer/prompts@7.10.1(@types/node@24.10.4))(@types/node@24.10.4)(listr2@9.0.5) '@modelcontextprotocol/sdk': - specifier: 1.25.1 - version: 1.25.1(zod@4.3.5) + specifier: 1.25.2 + version: 1.25.2(zod@4.3.5) '@schematics/angular': specifier: workspace:0.0.0-PLACEHOLDER version: link:../../schematics/angular @@ -2571,8 +2571,8 @@ packages: cpu: [x64] os: [win32] - '@modelcontextprotocol/sdk@1.25.1': - resolution: {integrity: sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ==} + '@modelcontextprotocol/sdk@1.25.2': + resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -9358,11 +9358,11 @@ 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/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))': dependencies: '@actions/core': 2.0.1 '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) - '@google/genai': 1.34.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) + '@google/genai': 1.34.0(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6) '@inquirer/prompts': 8.1.0(@types/node@24.10.4) '@inquirer/type': 4.0.2(@types/node@24.10.4) '@octokit/auth-app': 8.1.2 @@ -10736,12 +10736,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@google/genai@1.34.0(@modelcontextprotocol/sdk@1.25.1(zod@4.3.5))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': + '@google/genai@1.34.0(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': dependencies: google-auth-library: 10.5.0(supports-color@10.2.2) ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: - '@modelcontextprotocol/sdk': 1.25.1(zod@4.3.5) + '@modelcontextprotocol/sdk': 1.25.2(zod@4.3.5) transitivePeerDependencies: - bufferutil - supports-color @@ -11149,7 +11149,7 @@ snapshots: '@lmdb/lmdb-win32-x64@3.4.4': optional: true - '@modelcontextprotocol/sdk@1.25.1(zod@4.3.5)': + '@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)': dependencies: '@hono/node-server': 1.19.7 ajv: 8.17.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ecfbec6f3cb9..bd4af2e2fc1b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -22,6 +22,7 @@ minimumReleaseAge: 1440 minimumReleaseAgeExclude: - '@angular-devkit/*' - '@angular/*' + - '@modelcontextprotocol/sdk@1.25.2' # Fix: https://www.cve.org/CVERecord?id=CVE-2026-0621 - '@ngtools/webpack' - '@schematics/*' - 'ng-packagr' From 42d4febf4698ac33f9aa5a2d2d6183adca34f7b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Fra=C5=9B?= Date: Mon, 29 Dec 2025 23:22:57 +0100 Subject: [PATCH 38/68] fix(@schematics/angular): update application schematics for module-based apps to use 'provideZoneChangeDetection' Replaces deprecated 'ngZoneEventCoalescing' with 'provideZoneChangeDetection({ eventCoalescing: true })' in 'main.ts.template' in schematics for initial commit --- .../application/files/module-files/src/main.ts.template | 5 +++-- packages/schematics/angular/application/index_spec.ts | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/schematics/angular/application/files/module-files/src/main.ts.template b/packages/schematics/angular/application/files/module-files/src/main.ts.template index 629780834c82..c0601c3aff28 100644 --- a/packages/schematics/angular/application/files/module-files/src/main.ts.template +++ b/packages/schematics/angular/application/files/module-files/src/main.ts.template @@ -1,9 +1,10 @@ <% if(!!viewEncapsulation) { %>import { ViewEncapsulation } from '@angular/core'; +<% }%><% if(!zoneless) { %>import { provideZoneChangeDetection } from '@angular/core'; <% }%>import { platformBrowser } from '@angular/platform-browser'; import { AppModule } from './app/app<%= typeSeparator %>module'; platformBrowser().bootstrapModule(AppModule, { - <% if(!zoneless) { %>ngZoneEventCoalescing: true,<% } %><% if(!!viewEncapsulation) { %> - defaultEncapsulation: ViewEncapsulation.<%= viewEncapsulation %><% } %> + <% if(!zoneless) { %> applicationProviders: [provideZoneChangeDetection({ eventCoalescing: true })], <% } %> + <% if(!!viewEncapsulation) { %> defaultEncapsulation: ViewEncapsulation.<%= viewEncapsulation %><% } %> }) .catch(err => console.error(err)); diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts index c2f91d110f27..841479b06280 100644 --- a/packages/schematics/angular/application/index_spec.ts +++ b/packages/schematics/angular/application/index_spec.ts @@ -687,7 +687,7 @@ describe('Application Schematic', () => { }); describe('standalone=false', () => { - it('should add the ngZoneEventCoalescing option by default with zone.js apps', async () => { + it('should add the provideZoneChangeDetection with event coalescing option by default with zone.js apps', async () => { const tree = await schematicRunner.runSchematic( 'application', { @@ -699,7 +699,9 @@ describe('Application Schematic', () => { ); const content = tree.readContent('/projects/foo/src/main.ts'); - expect(content).toContain('ngZoneEventCoalescing: true'); + expect(content).toContain( + 'applicationProviders: [provideZoneChangeDetection({ eventCoalescing: true })]', + ); }); it(`should set 'defaultEncapsulation' in main.ts when 'ViewEncapsulation' is provided`, async () => { From 9006ec057ced126f1c7822ffd36adee7748819ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Fra=C5=9B?= Date: Tue, 30 Dec 2025 21:27:08 +0100 Subject: [PATCH 39/68] fix(@schematics/angular): move 'provideZoneChangeDetection' to the root module --- .../app/app__typeSeparator__module.ts.template | 5 +++-- .../files/module-files/src/main.ts.template | 2 -- .../angular/application/index_spec.ts | 17 +++++++++++++---- .../angular/utility/standalone/rules_spec.ts | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/schematics/angular/application/files/module-files/src/app/app__typeSeparator__module.ts.template b/packages/schematics/angular/application/files/module-files/src/app/app__typeSeparator__module.ts.template index 06ba3eb2a079..f7ad6f2cb515 100644 --- a/packages/schematics/angular/application/files/module-files/src/app/app__typeSeparator__module.ts.template +++ b/packages/schematics/angular/application/files/module-files/src/app/app__typeSeparator__module.ts.template @@ -1,4 +1,4 @@ -import { NgModule, provideBrowserGlobalErrorListeners } from '@angular/core'; +import { NgModule, provideBrowserGlobalErrorListeners<% if(!zoneless) { %>, provideZoneChangeDetection<% } %> } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; <% if (routing) { %> import { AppRoutingModule } from './app-routing<%= typeSeparator %>module';<% } %> @@ -13,7 +13,8 @@ import { App } from './app<%= suffix %>'; AppRoutingModule<% } %> ], providers: [ - provideBrowserGlobalErrorListeners() + provideBrowserGlobalErrorListeners(),<% if(!zoneless) { %> + provideZoneChangeDetection({ eventCoalescing: true }),<% } %> ], bootstrap: [App] }) diff --git a/packages/schematics/angular/application/files/module-files/src/main.ts.template b/packages/schematics/angular/application/files/module-files/src/main.ts.template index c0601c3aff28..f74887b16867 100644 --- a/packages/schematics/angular/application/files/module-files/src/main.ts.template +++ b/packages/schematics/angular/application/files/module-files/src/main.ts.template @@ -1,10 +1,8 @@ <% if(!!viewEncapsulation) { %>import { ViewEncapsulation } from '@angular/core'; -<% }%><% if(!zoneless) { %>import { provideZoneChangeDetection } from '@angular/core'; <% }%>import { platformBrowser } from '@angular/platform-browser'; import { AppModule } from './app/app<%= typeSeparator %>module'; platformBrowser().bootstrapModule(AppModule, { - <% if(!zoneless) { %> applicationProviders: [provideZoneChangeDetection({ eventCoalescing: true })], <% } %> <% if(!!viewEncapsulation) { %> defaultEncapsulation: ViewEncapsulation.<%= viewEncapsulation %><% } %> }) .catch(err => console.error(err)); diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts index 841479b06280..173a4a0bde56 100644 --- a/packages/schematics/angular/application/index_spec.ts +++ b/packages/schematics/angular/application/index_spec.ts @@ -698,10 +698,8 @@ describe('Application Schematic', () => { workspaceTree, ); - const content = tree.readContent('/projects/foo/src/main.ts'); - expect(content).toContain( - 'applicationProviders: [provideZoneChangeDetection({ eventCoalescing: true })]', - ); + const content = tree.readContent('/projects/foo/src/app/app-module.ts'); + expect(content).toContain('provideZoneChangeDetection({ eventCoalescing: true })'); }); it(`should set 'defaultEncapsulation' in main.ts when 'ViewEncapsulation' is provided`, async () => { @@ -892,6 +890,17 @@ describe('Application Schematic', () => { }); describe('standalone: false', () => { + it('should add the provideZoneChangeDetection with event coalescing option by default with zone.js apps', async () => { + const options = { + ...defaultOptions, + standalone: false, + zoneless: false, + fileNameStyleGuide: '2016' as const, + }; + const tree = await schematicRunner.runSchematic('application', options, workspaceTree); + const content = tree.readContent('/projects/foo/src/app/app.module.ts'); + expect(content).toContain('provideZoneChangeDetection({ eventCoalescing: true })'); + }); it('should create a component with the correct template and style urls', async () => { const options = { ...defaultOptions, diff --git a/packages/schematics/angular/utility/standalone/rules_spec.ts b/packages/schematics/angular/utility/standalone/rules_spec.ts index 3208ed0d6f04..fe67b6adac65 100644 --- a/packages/schematics/angular/utility/standalone/rules_spec.ts +++ b/packages/schematics/angular/utility/standalone/rules_spec.ts @@ -422,7 +422,7 @@ describe('standalone utilities', () => { assertContains(content, `import { SOME_TOKEN } from '@my/module';`); assertContains( content, - `providers: [provideBrowserGlobalErrorListeners(),{ provide: SOME_TOKEN, useValue: 123 }]`, + `providers: [provideBrowserGlobalErrorListeners(),{ provide: SOME_TOKEN, useValue: 123 },]`, ); }); From 99326d3c6341668488cbb965b77d41cbcf5843d8 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 7 Jan 2026 20:40:51 +0000 Subject: [PATCH 40/68] build: update cross-repo angular dependencies See associated pull request for more information. --- packages/angular/build/package.json | 2 +- .../angular_devkit/build_angular/package.json | 2 +- pnpm-lock.yaml | 18 +++++------ tests/e2e/ng-snapshot/package.json | 32 +++++++++---------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index ad2ea1029b51..b912e81ece43 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -54,7 +54,7 @@ "@angular/ssr": "workspace:*", "jsdom": "27.4.0", "less": "4.4.2", - "ng-packagr": "21.1.0-next.0", + "ng-packagr": "21.1.0-rc.0", "postcss": "8.5.6", "rxjs": "7.8.2", "vitest": "4.0.16" diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index 610d05c31c94..35dd3d540076 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -68,7 +68,7 @@ "@angular/ssr": "workspace:*", "@web/test-runner": "0.20.2", "browser-sync": "3.0.4", - "ng-packagr": "21.1.0-next.0", + "ng-packagr": "21.1.0-rc.0", "undici": "7.18.0" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae5bd2cacaed..ccca55414163 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -429,8 +429,8 @@ importers: specifier: 4.4.2 version: 4.4.2 ng-packagr: - specifier: 21.1.0-next.0 - version: 21.1.0-next.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) postcss: specifier: 8.5.6 version: 8.5.6 @@ -741,8 +741,8 @@ importers: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: - specifier: 21.1.0-next.0 - version: 21.1.0-next.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) undici: specifier: 7.18.0 version: 7.18.0 @@ -6997,12 +6997,12 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - ng-packagr@21.1.0-next.0: - resolution: {integrity: sha512-DuNSGSiZVEOiMOWFjNENx04AEXuK6A6d1iOxYFYuAotYXLSnG1ghUSDN83c5lmdE1ISRXLvbnJEGRKu0vqBK7g==} + ng-packagr@21.1.0-rc.0: + resolution: {integrity: sha512-TumrPbeD7qiGULFa2BJEZ0ilG8QPFMzTil9uZm+CDwNvu9tTVP78vBzkK2JxxngDb/mz9VgjBFL2u/lzdz325Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler-cli': ^21.1.0-next || ^21.0.0 + '@angular/compiler-cli': ^21.1.0-next tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 typescript: '>=5.9 <6.0' @@ -16294,7 +16294,7 @@ snapshots: netmask@2.0.2: {} - ng-packagr@21.1.0-next.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): + ng-packagr@21.1.0-rc.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): dependencies: '@ampproject/remapping': 2.3.0 '@angular/compiler-cli': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3) @@ -16303,7 +16303,7 @@ snapshots: ajv: 8.17.1 ansi-colors: 4.1.3 browserslist: 4.28.1 - chokidar: 4.0.3 + chokidar: 5.0.0 commander: 14.0.2 dependency-graph: 1.0.0 esbuild: 0.27.2 diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 0f2058a23bf8..8596480909b7 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#23371fccefcb39e6a518e6b5a59690bec18e0ca6", - "@angular/cdk": "github:angular/cdk-builds#1d00da20ec8300d289d74c4826b0b7168aaa9220", - "@angular/common": "github:angular/common-builds#3589a6da62f899edc0d28f5e8f4a51f5590320b3", - "@angular/compiler": "github:angular/compiler-builds#8414d9435325dfe6051a2a8a3ed725f3802f28e3", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#4cefffa419e345fc344246e8a0bc456bfedab902", - "@angular/core": "github:angular/core-builds#2074453a9188277518aaca6eec69a15f5878e260", - "@angular/forms": "github:angular/forms-builds#03f16af72e540d0622c4fe74b94a1d986449de0e", - "@angular/language-service": "github:angular/language-service-builds#f35f0c54211fc42d833e52249d10290e12b493e6", - "@angular/localize": "github:angular/localize-builds#0cff9a83741c04b28c42b8a9719949da660f9760", - "@angular/material": "github:angular/material-builds#4778ddc77ce6ff8e05967f47cee4675da5c6c91c", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#4b9109c754cca1c4f46b4a7aadeb876520a93876", - "@angular/platform-browser": "github:angular/platform-browser-builds#a95c38bb173cd85727a5f481704dcd90e7f559d7", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#22645554d754ec6865e74c74b32e966241b17627", - "@angular/platform-server": "github:angular/platform-server-builds#5ab6fb15a8af6b2af3b600ae3df44bd9f4e21f2a", - "@angular/router": "github:angular/router-builds#63fed7fd2e47a55bdcbf152f38126231f505df8c", - "@angular/service-worker": "github:angular/service-worker-builds#afddddc8c016767de0b5929070a1382542eefd6d" + "@angular/animations": "github:angular/animations-builds#7d1d574e722bddf23658ba2aecbe90f7a20d3dcb", + "@angular/cdk": "github:angular/cdk-builds#5e4b9d2f2cd548245d09f554364610762a5a2c47", + "@angular/common": "github:angular/common-builds#f3deca7ff0a46c2993c08e875b5881257c8f757a", + "@angular/compiler": "github:angular/compiler-builds#31af18615c849a3ce319a281b00333ba2cf8d641", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#9e3870e2c1eee645d15c561c09fceb18df897ab6", + "@angular/core": "github:angular/core-builds#2838839f900584dd9d556455afbd518bc585a4b2", + "@angular/forms": "github:angular/forms-builds#0b9bdccb4aea204c00a1da591775d1650a5cce1e", + "@angular/language-service": "github:angular/language-service-builds#8dc7bc4d774289732fb4c887a8fbacb234eb2725", + "@angular/localize": "github:angular/localize-builds#2aaeba1a3f84c3593cf8971d8f23ce6275460bb4", + "@angular/material": "github:angular/material-builds#3f6bda06d3e7fcac8a993810b87f79a0b2b83ce3", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#e9656894438ed6fac288b62fc822d2a70a0a4a17", + "@angular/platform-browser": "github:angular/platform-browser-builds#81df68a32060014f1c5e1ab20fddc481e6c293fb", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#09ba5aa26d445ec7f07ef8b21d9fc6a76b15742b", + "@angular/platform-server": "github:angular/platform-server-builds#88c1f8a56e9e78d93b92daa7245958fab732a9d9", + "@angular/router": "github:angular/router-builds#3162b28b4e94c04f52b263291b9b54074b93fc94", + "@angular/service-worker": "github:angular/service-worker-builds#80a6ec33d78fce9ceb1e289f2fe1e35231b441fa" } } From 1f131b4b8e13d73431250c24a11f416630f8a1db Mon Sep 17 00:00:00 2001 From: Jan Martin Date: Wed, 7 Jan 2026 13:28:46 -0800 Subject: [PATCH 41/68] docs: release notes for the v20.3.14 release --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9760339d143..7bd53051779a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ + + +# 20.3.14 (2026-01-07) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | +| [ff366499e](https://github.com/angular/angular-cli/commit/ff366499eff87e9943e25904fd06d109a0fa0075) | fix | update dependency @modelcontextprotocol/sdk to v1.25.2 | + + + # 21.1.0-next.3 (2025-12-18) From 0a00c3e62ad8d650ab3664189f5e240adc7551b8 Mon Sep 17 00:00:00 2001 From: Jan Martin Date: Wed, 7 Jan 2026 13:38:17 -0800 Subject: [PATCH 42/68] docs: release notes for the v21.0.5 release --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bd53051779a..f0fce50666d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,30 @@ + + +# 21.0.5 (2026-01-07) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- | +| [249563749](https://github.com/angular/angular-cli/commit/24956374941f3753a24470bfdafaf6d3645a3ddb) | fix | use narrower types for new MCP TS SDK compatibility | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------------------------- | +| [cbd0718b9](https://github.com/angular/angular-cli/commit/cbd0718b93c0d51331af772f578b6e0dc3dfbe9e) | fix | move 'provideZoneChangeDetection' to the root module | +| [33f7cf761](https://github.com/angular/angular-cli/commit/33f7cf761aa222e1754e039533831c729895e5e6) | fix | update application schematics for module-based apps to use 'provideZoneChangeDetection' | +| [37b14d1f7](https://github.com/angular/angular-cli/commit/37b14d1f7b18a607ada3e9a113c16f5e8a7669ef) | fix | update default app component message | +| [c37dccb09](https://github.com/angular/angular-cli/commit/c37dccb093f7b48027fac27bd78abe7f3e3e15ad) | fix | update default app component welcome message | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------- | +| [2b9be3a7c](https://github.com/angular/angular-cli/commit/2b9be3a7cadc444e67d629c2a74c54f0c65f4a54) | fix | ensure correct project targeting during Vitest debugging | + + + # 20.3.14 (2026-01-07) From 1eda0a99f89f625f8db1ecfe4873a7672e625401 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 7 Jan 2026 12:15:07 -0500 Subject: [PATCH 43/68] feat(@angular/build): directly support ng-packagr in unit-test builder This change enables the `unit-test` builder to correctly extract base build options from `@angular/build:ng-packagr` targets. It parses the `ng-package.json` file to retrieve configuration for `assets`, `inlineStyleLanguage`, and `stylePreprocessorOptions`, ensuring that libraries can be unit-tested effectively. --- .../build/src/builders/unit-test/builder.ts | 75 ++++++++++++++++--- tests/e2e/tests/vitest/library.ts | 50 +++++++++++++ 2 files changed, 113 insertions(+), 12 deletions(-) create mode 100644 tests/e2e/tests/vitest/library.ts diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts index 122039595bd9..6f2edd0281d7 100644 --- a/packages/angular/build/src/builders/unit-test/builder.ts +++ b/packages/angular/build/src/builders/unit-test/builder.ts @@ -12,7 +12,7 @@ import { targetStringFromTarget, } from '@angular-devkit/architect'; import assert from 'node:assert'; -import { rm } from 'node:fs/promises'; +import { readFile, rm } from 'node:fs/promises'; import path from 'node:path'; import { createVirtualModulePlugin } from '../../tools/esbuild/virtual-module-plugin'; import { assertIsError } from '../../utils/error'; @@ -244,22 +244,34 @@ export async function* execute( let buildTargetOptions: ApplicationBuilderInternalOptions; try { const builderName = await context.getBuilderNameForTarget(normalizedOptions.buildTarget); - if ( - builderName !== '@angular/build:application' && - // TODO: Add comprehensive support for ng-packagr. - builderName !== '@angular/build:ng-packagr' - ) { + if (builderName === '@angular/build:application') { + buildTargetOptions = (await context.validateOptions( + await context.getTargetOptions(normalizedOptions.buildTarget), + builderName, + )) as unknown as ApplicationBuilderInternalOptions; + } else if (builderName === '@angular/build:ng-packagr') { + const ngPackagrOptions = await context.validateOptions( + await context.getTargetOptions(normalizedOptions.buildTarget), + builderName, + ); + + buildTargetOptions = await transformNgPackagrOptions( + context, + ngPackagrOptions, + normalizedOptions.projectRoot, + ); + } else { context.logger.warn( `The 'buildTarget' is configured to use '${builderName}', which is not supported. ` + - `The 'unit-test' builder is designed to work with '@angular/build:application'. ` + + `The 'unit-test' builder is designed to work with '@angular/build:application' or '@angular/build:ng-packagr'. ` + 'Unexpected behavior or build failures may occur.', ); - } - buildTargetOptions = (await context.validateOptions( - await context.getTargetOptions(normalizedOptions.buildTarget), - builderName, - )) as unknown as ApplicationBuilderInternalOptions; + buildTargetOptions = (await context.validateOptions( + await context.getTargetOptions(normalizedOptions.buildTarget), + builderName, + )) as unknown as ApplicationBuilderInternalOptions; + } } catch (e) { assertIsError(e); context.logger.error( @@ -335,3 +347,42 @@ export async function* execute( yield { success: false }; } } + +async function transformNgPackagrOptions( + context: BuilderContext, + options: Record, + projectRoot: string, +): Promise { + const projectPath = options['project']; + + let ngPackagePath: string; + if (projectPath) { + if (typeof projectPath !== 'string') { + throw new Error('ng-packagr builder options "project" property must be a string.'); + } + ngPackagePath = path.join(context.workspaceRoot, projectPath); + } else { + ngPackagePath = path.join(projectRoot, 'ng-package.json'); + } + + let ngPackageJson; + try { + ngPackageJson = JSON.parse(await readFile(ngPackagePath, 'utf-8')); + } catch (e) { + assertIsError(e); + throw new Error(`Could not read ng-package.json at ${ngPackagePath}: ${e.message}`); + } + + const lib = ngPackageJson['lib'] || {}; + const styleIncludePaths = lib['styleIncludePaths'] || []; + const assets = ngPackageJson['assets'] || []; + const inlineStyleLanguage = ngPackageJson['inlineStyleLanguage']; + + return { + stylePreprocessorOptions: styleIncludePaths.length + ? { includePaths: styleIncludePaths } + : undefined, + assets: assets.length ? assets : undefined, + inlineStyleLanguage: typeof inlineStyleLanguage === 'string' ? inlineStyleLanguage : undefined, + } as ApplicationBuilderInternalOptions; +} diff --git a/tests/e2e/tests/vitest/library.ts b/tests/e2e/tests/vitest/library.ts new file mode 100644 index 000000000000..ba1e31dc38f8 --- /dev/null +++ b/tests/e2e/tests/vitest/library.ts @@ -0,0 +1,50 @@ +import assert from 'node:assert/strict'; +import { updateJsonFile } from '../../utils/project'; +import { ng, silentNpm } from '../../utils/process'; +import { createDir, writeFile } from '../../utils/fs'; + +export default async function (): Promise { + // Install Vitest deps + await silentNpm('install', 'vitest@^4.0.8', 'jsdom@^27.1.0', '--save-dev'); + + // Generate a library + await ng('generate', 'library', 'my-lib', '--test-runner', 'vitest'); + + // Setup Style Include Paths test + // 1. Create a shared SCSS file + await createDir('projects/my-lib/src/styles'); + await writeFile('projects/my-lib/src/styles/_vars.scss', '$primary-color: red;'); + + // 2. Update ng-package.json to include the styles directory + await updateJsonFile('projects/my-lib/ng-package.json', (json) => { + json['lib'] = { + ...json['lib'], + styleIncludePaths: ['./src/styles'], + }; + }); + + // 3. Update the component to use SCSS and import the shared file + // Rename CSS to SCSS + await ng( + 'generate', + 'component', + 'styled-comp', + '--project=my-lib', + '--style=scss', + '--skip-import', + ); + + await writeFile( + 'projects/my-lib/src/lib/styled-comp/styled-comp.component.scss', + ` + @use 'vars'; + p { color: vars.$primary-color; } + `, + ); + + // Run the library tests + const { stdout } = await ng('test', 'my-lib'); + + // Expect tests to pass + assert.match(stdout, /passed/, 'Expected library tests to pass.'); +} From 87fae1b3a756fc527169db8766d6b8718a694ef1 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Thu, 8 Jan 2026 08:00:24 +0000 Subject: [PATCH 44/68] build: remove `@modelcontextprotocol/sdk` from the `minimumReleaseAgeExclude` list in `pnpm-workspace.yaml` This is no longer needed. --- pnpm-workspace.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bd4af2e2fc1b..ecfbec6f3cb9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -22,7 +22,6 @@ minimumReleaseAge: 1440 minimumReleaseAgeExclude: - '@angular-devkit/*' - '@angular/*' - - '@modelcontextprotocol/sdk@1.25.2' # Fix: https://www.cve.org/CVERecord?id=CVE-2026-0621 - '@ngtools/webpack' - '@schematics/*' - 'ng-packagr' From c728ea65db6eeacee19aa4f119d9d72ed0ba2b00 Mon Sep 17 00:00:00 2001 From: Jan Martin Date: Thu, 8 Jan 2026 12:07:58 -0800 Subject: [PATCH 45/68] release: bump the next branch to v21.2.0-next.0 --- package.json | 2 +- renovate.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index aa01b2d18647..e1454991deb0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "21.1.0-next.3", + "version": "21.2.0-next.0", "private": true, "description": "Software Development Kit for Angular", "keywords": [ diff --git a/renovate.json b/renovate.json index 3b2c5ab2f6a6..293a1aa46277 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "baseBranchPatterns": ["main", "21.0.x"], + "baseBranchPatterns": ["main", "21.1.x"], "extends": ["github>angular/dev-infra//renovate-presets/default.json5"], "ignoreDeps": ["less"], "ignorePaths": ["tests/e2e/assets/**", "tests/schematics/update/packages/**"], From 937c71bba3b80e9466a2ac4d29607c6191607d2d Mon Sep 17 00:00:00 2001 From: Jan Martin Date: Thu, 8 Jan 2026 12:07:59 -0800 Subject: [PATCH 46/68] docs: release notes for the v21.1.0-rc.0 release --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0fce50666d1..24e453dbe2a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,39 @@ + + +# 21.1.0-rc.0 (2026-01-08) + +### @angular/cli + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | +| [772e6efe7](https://github.com/angular/angular-cli/commit/772e6efe7acb2d2318a57ba77092a85fc286c51b) | feat | add 'test' and 'e2e' MCP tools | +| [8efb86318](https://github.com/angular/angular-cli/commit/8efb8631842401e219e20dd7955512d4a90a28a3) | feat | Add "all" as an experimental tool group | +| [316fca862](https://github.com/angular/angular-cli/commit/316fca8626d51b28ea8cd840f3815b7c6dfcfffa) | fix | handle array output from npm view in manifest parser | +| [1ad773671](https://github.com/angular/angular-cli/commit/1ad773671afa2849a966f9974cb30e7c8e8ed7d4) | fix | update dependency @modelcontextprotocol/sdk to v1.25.2 | +| [45d4f5668](https://github.com/angular/angular-cli/commit/45d4f5668018362f90fcc4cdc487470286f03c02) | fix | update yarn berry package manager configuration | + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------------------------- | +| [9006ec057](https://github.com/angular/angular-cli/commit/9006ec057ced126f1c7822ffd36adee7748819ed) | fix | move 'provideZoneChangeDetection' to the root module | +| [42d4febf4](https://github.com/angular/angular-cli/commit/42d4febf4698ac33f9aa5a2d2d6183adca34f7b5) | fix | update application schematics for module-based apps to use 'provideZoneChangeDetection' | +| [5dfc0eea0](https://github.com/angular/angular-cli/commit/5dfc0eea03c1faecd636fac775b0f5bc5f0ed430) | fix | update default app component message | +| [424a465df](https://github.com/angular/angular-cli/commit/424a465df7fa131803de4184f787ad9573a65090) | fix | update default app component welcome message | + +### @angular/build + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------------------------------------- | +| [1eda0a99f](https://github.com/angular/angular-cli/commit/1eda0a99f89f625f8db1ecfe4873a7672e625401) | feat | directly support ng-packagr in unit-test builder | +| [87175f9dc](https://github.com/angular/angular-cli/commit/87175f9dcdb7349dc8701fa1d5cf61c1b8542d42) | feat | disable TestBed teardown during debugging in Vitest | +| [32adc3a75](https://github.com/angular/angular-cli/commit/32adc3a757a1e75cf8d44a227c57f7947053ca8c) | fix | ensure correct project targeting during Vitest debugging | +| [1e39c77a4](https://github.com/angular/angular-cli/commit/1e39c77a4fe272ccab1a1d8bd58eef1ce608a6c7) | fix | inject source-map-support for Vitest browser tests | +| [3fd7dcd76](https://github.com/angular/angular-cli/commit/3fd7dcd764be0d0afb9cd792d53268d6f314df83) | fix | normalize roots to POSIX in test discovery for Windows compatibility | +| [164e7dbbc](https://github.com/angular/angular-cli/commit/164e7dbbc2b06bbd5aab84937c903e0590591c60) | fix | resolve test files correctly on Windows when using non-C drives | + + + # 21.0.5 (2026-01-07) From 27c55089c3674339979303dc24b527b37f9a366e Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 8 Jan 2026 09:09:04 +0000 Subject: [PATCH 47/68] build: update all non-major dependencies See associated pull request for more information. --- package.json | 2 +- packages/angular/build/package.json | 8 +- .../angular_devkit/build_angular/package.json | 4 +- pnpm-lock.yaml | 262 +++++++++++------- 4 files changed, 167 insertions(+), 109 deletions(-) diff --git a/package.json b/package.json index e1454991deb0..a128a8bbe6f2 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "ts-node": "^10.9.1", "tslib": "2.8.1", "typescript": "5.9.3", - "undici": "7.18.0", + "undici": "7.18.2", "unenv": "^1.10.0", "verdaccio": "6.2.4", "verdaccio-auth-memory": "^10.0.0", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index b912e81ece43..73ae171a82e1 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -37,13 +37,13 @@ "parse5-html-rewriting-stream": "8.0.0", "picomatch": "4.0.3", "piscina": "5.1.4", - "rolldown": "1.0.0-beta.58", - "sass": "1.97.1", + "rolldown": "1.0.0-beta.59", + "sass": "1.97.2", "semver": "7.7.3", "source-map-support": "0.5.21", "tinyglobby": "0.2.15", - "undici": "7.18.0", - "vite": "7.3.0", + "undici": "7.18.2", + "vite": "7.3.1", "watchpack": "2.5.0" }, "optionalDependencies": { diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index 35dd3d540076..33ba53ba4330 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -46,7 +46,7 @@ "postcss-loader": "8.2.0", "resolve-url-loader": "5.0.0", "rxjs": "7.8.2", - "sass": "1.97.1", + "sass": "1.97.2", "sass-loader": "16.0.6", "semver": "7.7.3", "source-map-loader": "5.0.0", @@ -69,7 +69,7 @@ "@web/test-runner": "0.20.2", "browser-sync": "3.0.4", "ng-packagr": "21.1.0-rc.0", - "undici": "7.18.0" + "undici": "7.18.2" }, "peerDependencies": { "@angular/core": "0.0.0-ANGULAR-FW-PEER-DEP", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ccca55414163..b7d989a2eb70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -287,8 +287,8 @@ importers: specifier: 5.9.3 version: 5.9.3 undici: - specifier: 7.18.0 - version: 7.18.0 + specifier: 7.18.2 + version: 7.18.2 unenv: specifier: ^1.10.0 version: 1.10.0 @@ -318,7 +318,7 @@ importers: version: link:../../../packages/angular/ssr '@vitest/coverage-v8': specifier: 4.0.16 - version: 4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) browser-sync: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) @@ -330,7 +330,7 @@ importers: version: 7.8.2 vitest: specifier: 4.0.16 - version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) packages/angular/build: dependencies: @@ -354,7 +354,7 @@ importers: version: 5.1.21(@types/node@24.10.4) '@vitejs/plugin-basic-ssl': specifier: 2.1.0 - version: 2.1.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.1.0(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) beasties: specifier: 0.3.5 version: 0.3.5 @@ -392,11 +392,11 @@ importers: specifier: 5.1.4 version: 5.1.4 rolldown: - specifier: 1.0.0-beta.58 - version: 1.0.0-beta.58 + specifier: 1.0.0-beta.59 + version: 1.0.0-beta.59 sass: - specifier: 1.97.1 - version: 1.97.1 + specifier: 1.97.2 + version: 1.97.2 semver: specifier: 7.7.3 version: 7.7.3 @@ -407,11 +407,11 @@ importers: specifier: 0.2.15 version: 0.2.15 undici: - specifier: 7.18.0 - version: 7.18.0 + specifier: 7.18.2 + version: 7.18.2 vite: - specifier: 7.3.0 - version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + specifier: 7.3.1 + version: 7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) watchpack: specifier: 2.5.0 version: 2.5.0 @@ -439,7 +439,7 @@ importers: version: 7.8.2 vitest: specifier: 4.0.16 - version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: lmdb: specifier: 3.4.4 @@ -689,11 +689,11 @@ importers: specifier: 7.8.2 version: 7.8.2 sass: - specifier: 1.97.1 - version: 1.97.1 + specifier: 1.97.2 + version: 1.97.2 sass-loader: specifier: 16.0.6 - version: 16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)) + version: 16.0.6(sass@1.97.2)(webpack@5.104.1(esbuild@0.27.2)) semver: specifier: 7.7.3 version: 7.7.3 @@ -744,8 +744,8 @@ importers: specifier: 21.1.0-rc.0 version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) undici: - specifier: 7.18.0 - version: 7.18.0 + specifier: 7.18.2 + version: 7.18.2 optionalDependencies: esbuild: specifier: 0.27.2 @@ -2888,8 +2888,8 @@ packages: resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} engines: {node: '>=14'} - '@oxc-project/types@0.106.0': - resolution: {integrity: sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==} + '@oxc-project/types@0.107.0': + resolution: {integrity: sha512-QFDRbYfV2LVx8tyqtyiah3jQPUj1mK2+RYwxyFWyGoys6XJnwTdlzO6rdNNHOPorHAu5Uo34oWRKcvNpbJarmQ==} '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -3041,89 +3041,89 @@ packages: engines: {node: '>=18'} hasBin: true - '@rolldown/binding-android-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==} + '@rolldown/binding-android-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-6yLLgyswYwiCfls9+hoNFY9F8TQdwo15hpXDHzlAR0X/GojeKF+AuNcXjYNbOJ4zjl/5D6lliE8CbpB5t1OWIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-hqGXRc162qCCIOAcHN2Cw4eXiVTwYsMFLOhAy1IG2CxY+dwc/l4Ga+dLPkLor3Ikqy5WDn+7kxHbbh6EmshEpQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.58': - resolution: {integrity: sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==} + '@rolldown/binding-darwin-x64@1.0.0-beta.59': + resolution: {integrity: sha512-ezvvGuhteE15JmMhJW0wS7BaXmhwLy1YHeEwievYaPC1PgGD86wgBKfOpHr9tSKllAXbCe0BeeMvasscWLhKdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.58': - resolution: {integrity: sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': + resolution: {integrity: sha512-4fhKVJiEYVd5n6no/mrL3LZ9kByfCGwmONOrdtvx8DJGDQhehH/q3RfhG3V/4jGKhpXgbDjpIjkkFdybCTcgew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': - resolution: {integrity: sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': + resolution: {integrity: sha512-T3Y52sW6JAhvIqArBw+wtjNU1Ieaz4g0NBxyjSJoW971nZJBZygNlSYx78G4cwkCmo1dYTciTPDOnQygLV23pA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': - resolution: {integrity: sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-NIW40jQDSQap2KDdmm9z3B/4OzWJ6trf8dwx3FD74kcQb3v34ThsBFTtzE5KjDuxnxgUlV+DkAu+XgSMKrgufw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': - resolution: {integrity: sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-CCKEk+H+8c0WGe/8n1E20n85Tq4Pv+HNAbjP1KfUXW+01aCWSMjU56ChNrM2tvHnXicfm7QRNoZyfY8cWh7jLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': - resolution: {integrity: sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-VlfwJ/HCskPmQi8R0JuAFndySKVFX7yPhE658o27cjSDWWbXVtGkSbwaxstii7Q+3Rz87ZXN+HLnb1kd4R9Img==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': - resolution: {integrity: sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-kuO92hTRyGy0Ts3Nsqll0rfO8eFsEJe9dGQGktkQnZ2hrJrDVN0y419dMgKy/gB2S2o7F2dpWhpfQOBehZPwVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-PXAebvNL4sYfCqi8LdY4qyFRacrRoiPZLo3NoUmiTxm7MPtYYR8CNtBGNokqDmMuZIQIecRaD/jbmFAIDz7DxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': - resolution: {integrity: sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': + resolution: {integrity: sha512-yJoklQg7XIZq8nAg0bbkEXcDK6sfpjxQGxpg2Nd6ERNtvg+eOaEBRgPww0BVTrYFQzje1pB5qPwC2VnJHT3koQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': - resolution: {integrity: sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-ljZ4+McmCbIuZwEBaoGtiG8Rq2nJjaXEnLEIx+usWetXn1ECjXY0LAhkELxOV6ytv4ensEmoJJ8nXg47hRMjlw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': - resolution: {integrity: sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-bMY4tTIwbdZljW+xe/ln1hvs0SRitahQSXfWtvgAtIzgSX9Ar7KqJzU7lRm33YTRFIHLULRi53yNjw9nJGd6uQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.58': - resolution: {integrity: sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==} + '@rolldown/pluginutils@1.0.0-beta.59': + resolution: {integrity: sha512-aoh6LAJRyhtazs98ydgpNOYstxUlsOV1KJXcpf/0c0vFcUA8uyd/hwKRhqE/AAPNqAho9RliGsvitCoOzREoVA==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -7814,8 +7814,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@1.0.0-beta.58: - resolution: {integrity: sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==} + rolldown@1.0.0-beta.59: + resolution: {integrity: sha512-Slm000Gd8/AO9z4Kxl4r8mp/iakrbAuJ1L+7ddpkNxgQ+Vf37WPvY63l3oeyZcfuPD1DRrUYBsRPIXSOhvOsmw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7908,8 +7908,8 @@ packages: webpack: optional: true - sass@1.97.1: - resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} + sass@1.97.2: + resolution: {integrity: sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==} engines: {node: '>=14.0.0'} hasBin: true @@ -8614,8 +8614,8 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@7.18.0: - resolution: {integrity: sha512-CfPufgPFHCYu0W4h1NiKW9+tNJ39o3kWm7Cm29ET1enSJx+AERfz7A2wAr26aY0SZbYzZlTBQtcHy15o60VZfQ==} + undici@7.18.2: + resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} engines: {node: '>=20.18.1'} unenv@1.10.0: @@ -8783,6 +8783,46 @@ packages: yaml: optional: true + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + 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.0.16: resolution: {integrity: sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -11480,7 +11520,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.38.0': {} - '@oxc-project/types@0.106.0': {} + '@oxc-project/types@0.107.0': {} '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -11606,48 +11646,48 @@ snapshots: - react-native-b4a - supports-color - '@rolldown/binding-android-arm64@1.0.0-beta.58': + '@rolldown/binding-android-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.58': + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.58': + '@rolldown/binding-darwin-x64@1.0.0-beta.59': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.58': + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': optional: true - '@rolldown/pluginutils@1.0.0-beta.58': {} + '@rolldown/pluginutils@1.0.0-beta.59': {} '@rollup/plugin-alias@6.0.0(rollup@4.55.1)': optionalDependencies: @@ -12473,11 +12513,11 @@ snapshots: lodash: 4.17.21 minimatch: 7.4.6 - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/coverage-v8@4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.16(vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.16 @@ -12490,7 +12530,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -12503,13 +12543,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.16 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.16': dependencies: @@ -16316,7 +16356,7 @@ snapshots: postcss: 8.5.6 rollup-plugin-dts: 6.3.0(rollup@4.55.1)(typescript@5.9.3) rxjs: 7.8.2 - sass: 1.97.1 + sass: 1.97.2 tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 @@ -17266,24 +17306,24 @@ snapshots: dependencies: glob: 10.5.0 - rolldown@1.0.0-beta.58: + rolldown@1.0.0-beta.59: dependencies: - '@oxc-project/types': 0.106.0 - '@rolldown/pluginutils': 1.0.0-beta.58 + '@oxc-project/types': 0.107.0 + '@rolldown/pluginutils': 1.0.0-beta.59 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.58 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.58 - '@rolldown/binding-darwin-x64': 1.0.0-beta.58 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.58 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.58 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.58 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.58 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 + '@rolldown/binding-android-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-x64': 1.0.0-beta.59 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.59 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.59 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.59 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.59 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.59 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.59 rollup-license-plugin@3.1.0: dependencies: @@ -17387,14 +17427,14 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)): + sass-loader@16.0.6(sass@1.97.2)(webpack@5.104.1(esbuild@0.27.2)): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.97.1 + sass: 1.97.2 webpack: 5.104.1(esbuild@0.27.2) - sass@1.97.1: + sass@1.97.2: dependencies: chokidar: 4.0.3 immutable: 5.1.4 @@ -18266,7 +18306,7 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@7.18.0: {} + undici@7.18.2: {} unenv@1.10.0: dependencies: @@ -18432,7 +18472,25 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.4 + fsevents: 2.3.3 + jiti: 2.6.1 + less: 4.4.2 + sass: 1.97.2 + terser: 5.44.1 + tsx: 4.21.0 + yaml: 2.8.2 + + vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -18445,15 +18503,15 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 - sass: 1.97.1 + sass: 1.97.2 terser: 5.44.1 tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.16 - '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.16 '@vitest/runner': 4.0.16 '@vitest/snapshot': 4.0.16 @@ -18470,7 +18528,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 From f2917f5ab03deabaee6d8eea3de844bc930a6e9e Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 9 Jan 2026 19:37:03 +0000 Subject: [PATCH 48/68] build: update cross-repo angular dependencies See associated pull request for more information. --- .../assistant-to-the-branch-manager.yml | 2 +- .github/workflows/ci.yml | 52 ++-- .github/workflows/dev-infra.yml | 4 +- .github/workflows/feature-requests.yml | 2 +- .github/workflows/perf.yml | 6 +- .github/workflows/pr.yml | 44 +-- MODULE.bazel | 2 +- MODULE.bazel.lock | 4 +- package.json | 28 +- packages/angular/ssr/package.json | 12 +- packages/ngtools/webpack/package.json | 4 +- pnpm-lock.yaml | 282 +++++++++--------- tests/e2e/ng-snapshot/package.json | 32 +- 13 files changed, 237 insertions(+), 237 deletions(-) diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index 7b756215a472..105c9331f9e8 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -17,6 +17,6 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + - uses: angular/dev-infra/github-actions/branch-manager@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 730d5368fbaf..649eee44045d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Generate JSON schema types @@ -44,11 +44,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -61,11 +61,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -84,13 +84,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -100,11 +100,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -137,7 +137,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -164,13 +164,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -188,13 +188,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -208,13 +208,13 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-cli-${{ github.workflow }}-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run E2E Browser tests @@ -244,11 +244,11 @@ jobs: CIRCLE_BRANCH: ${{ github.ref_name }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - run: pnpm admin snapshots --verbose env: SNAPSHOT_BUILDS_GITHUB_TOKEN: ${{ secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN }} diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index 585f2d1bfc8d..8241492b2036 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/pull-request-labeling@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + - uses: angular/dev-infra/github-actions/pull-request-labeling@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/post-approval-changes@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + - uses: angular/dev-infra/github-actions/post-approval-changes@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml index fa610e65c161..b60cc72aa240 100644 --- a/.github/workflows/feature-requests.yml +++ b/.github/workflows/feature-requests.yml @@ -16,6 +16,6 @@ jobs: if: github.repository == 'angular/angular-cli' runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/feature-request@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + - uses: angular/dev-infra/github-actions/feature-request@977bc9d747d9ddfe610fc96009212dd14c645ef6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 28be10bdcd3f..0e92e0a62c82 100644 --- a/.github/workflows/perf.yml +++ b/.github/workflows/perf.yml @@ -23,7 +23,7 @@ jobs: workflows: ${{ steps.workflows.outputs.workflows }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - id: workflows @@ -38,9 +38,9 @@ jobs: workflow: ${{ fromJSON(needs.list.outputs.workflows) }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile # We utilize the google-github-actions/auth action to allow us to get an active credential using workflow diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index e06c3f3a6dbc..7d0ca76bcc47 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,9 +34,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup ESLint Caching uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: @@ -66,17 +66,17 @@ jobs: # it has been merged. run: pnpm ng-dev format changed --check ${{ github.event.pull_request.base.sha }} - name: Check Package Licenses - uses: angular/dev-infra/github-actions/linting/licenses@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/linting/licenses@977bc9d747d9ddfe610fc96009212dd14c645ef6 build: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build release targets @@ -93,11 +93,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Run module and package tests @@ -114,13 +114,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -128,11 +128,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build E2E tests for Windows on Linux @@ -156,7 +156,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -183,13 +183,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=3 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -205,12 +205,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.snapshots.${{ matrix.subset }}_node${{ matrix.node }} diff --git a/MODULE.bazel b/MODULE.bazel index 2957ffb4cf2b..091427bd52b0 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -25,7 +25,7 @@ git_override( bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "87ed54ddedde42b443be7c6fe36cdaf0a907ea39", + commit = "977bc9d747d9ddfe610fc96009212dd14c645ef6", remote = "https://github.com/angular/dev-infra.git", ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index dc0bf9948c80..f78ddeb904ea 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -412,7 +412,7 @@ "@@aspect_rules_js+//npm:extensions.bzl%pnpm": { "general": { "bzlTransitiveDigest": "zVV86HvMwDBJ8IsFt27k/Sjq0vCMPr8b8X9OAuprQ6w=", - "usagesDigest": "fkR8y929BQ1GFezNYBR/HXJUcMa3NtJvhzsZrG8I9vI=", + "usagesDigest": "eBdoLuun2Ll2wMv7+g0B3OCtLdHCLOA3bqzuEktDxvU=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -1093,7 +1093,7 @@ "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "NwcLXHrbh2hoorA/Ybmcpjxsn/6avQmewDglodkDrgo=", - "usagesDigest": "S8pbOD3W4rSYjK/dNi5FSVLmT25mLbwVs9g/9fC2SN8=", + "usagesDigest": "WnPwx+ah3/p5VnBg2wk1me0H73eqUa7y8C5BV/XVZbg=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/package.json b/package.json index a128a8bbe6f2..020c3ec315e0 100644 --- a/package.json +++ b/package.json @@ -42,20 +42,20 @@ }, "homepage": "https://github.com/angular/angular-cli", "devDependencies": { - "@angular/animations": "21.1.0-next.4", - "@angular/cdk": "21.1.0-next.3", - "@angular/common": "21.1.0-next.4", - "@angular/compiler": "21.1.0-next.4", - "@angular/compiler-cli": "21.1.0-next.4", - "@angular/core": "21.1.0-next.4", - "@angular/forms": "21.1.0-next.4", - "@angular/localize": "21.1.0-next.4", - "@angular/material": "21.1.0-next.3", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#4877ddbc10c12fb75ef6bc9ff49295021ff2512a", - "@angular/platform-browser": "21.1.0-next.4", - "@angular/platform-server": "21.1.0-next.4", - "@angular/router": "21.1.0-next.4", - "@angular/service-worker": "21.1.0-next.4", + "@angular/animations": "21.1.0-rc.0", + "@angular/cdk": "21.1.0-next.4", + "@angular/common": "21.1.0-rc.0", + "@angular/compiler": "21.1.0-rc.0", + "@angular/compiler-cli": "21.1.0-rc.0", + "@angular/core": "21.1.0-rc.0", + "@angular/forms": "21.1.0-rc.0", + "@angular/localize": "21.1.0-rc.0", + "@angular/material": "21.1.0-next.4", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#5e6b5c157aa13f92ef88a51d87874607f517d30c", + "@angular/platform-browser": "21.1.0-rc.0", + "@angular/platform-server": "21.1.0-rc.0", + "@angular/router": "21.1.0-rc.0", + "@angular/service-worker": "21.1.0-rc.0", "@babel/core": "7.28.5", "@bazel/bazelisk": "1.26.0", "@bazel/buildifier": "8.2.1", diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index b3ca917e1b08..dc4d51362b31 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -29,12 +29,12 @@ }, "devDependencies": { "@angular-devkit/schematics": "workspace:*", - "@angular/common": "21.1.0-next.4", - "@angular/compiler": "21.1.0-next.4", - "@angular/core": "21.1.0-next.4", - "@angular/platform-browser": "21.1.0-next.4", - "@angular/platform-server": "21.1.0-next.4", - "@angular/router": "21.1.0-next.4", + "@angular/common": "21.1.0-rc.0", + "@angular/compiler": "21.1.0-rc.0", + "@angular/core": "21.1.0-rc.0", + "@angular/platform-browser": "21.1.0-rc.0", + "@angular/platform-server": "21.1.0-rc.0", + "@angular/router": "21.1.0-rc.0", "@schematics/angular": "workspace:*", "beasties": "0.3.5" }, diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 5947e89fe2b8..819cffa5f205 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": "21.1.0-next.4", - "@angular/compiler-cli": "21.1.0-next.4", + "@angular/compiler": "21.1.0-rc.0", + "@angular/compiler-cli": "21.1.0-rc.0", "typescript": "5.9.3", "webpack": "5.104.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7d989a2eb70..d10b7589a173 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,47 +20,47 @@ importers: built: true devDependencies: '@angular/animations': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) '@angular/cdk': - specifier: 21.1.0-next.3 - version: 21.1.0-next.3(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) - '@angular/common': specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + version: 21.1.0-next.4(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + '@angular/common': + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) '@angular/compiler': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4 + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0 '@angular/compiler-cli': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3) '@angular/core': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) '@angular/forms': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) '@angular/localize': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(@angular/compiler@21.1.0-next.4) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3))(@angular/compiler@21.1.0-rc.0) '@angular/material': - specifier: 21.1.0-next.3 - version: 21.1.0-next.3(5911ac44acdb5e81564606f5886cc827) + specifier: 21.1.0-next.4 + version: 21.1.0-next.4(b051653d7cc612357511ba8a2f98a625) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#4877ddbc10c12fb75ef6bc9ff49295021ff2512a - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#5e6b5c157aa13f92ef88a51d87874607f517d30c + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/5e6b5c157aa13f92ef88a51d87874607f517d30c(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)) '@angular/platform-browser': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) '@angular/platform-server': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.1.0-next.4)(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.1.0-rc.0)(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) '@angular/router': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) '@angular/service-worker': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) '@babel/core': specifier: 7.28.5 version: 7.28.5 @@ -430,7 +430,7 @@ importers: version: 4.4.2 ng-packagr: specifier: 21.1.0-rc.0 - version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) postcss: specifier: 8.5.6 version: 8.5.6 @@ -527,23 +527,23 @@ importers: specifier: workspace:* version: link:../../angular_devkit/schematics '@angular/common': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) '@angular/compiler': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4 + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0 '@angular/core': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) '@angular/platform-browser': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) '@angular/platform-server': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.1.0-next.4)(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.1.0-rc.0)(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) '@angular/router': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular @@ -742,7 +742,7 @@ importers: version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: specifier: 21.1.0-rc.0 - version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + version: 21.1.0-rc.0(@angular/compiler-cli@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) undici: specifier: 7.18.2 version: 7.18.2 @@ -834,11 +834,11 @@ importers: specifier: workspace:0.0.0-PLACEHOLDER version: link:../../angular_devkit/core '@angular/compiler': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4 + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0 '@angular/compiler-cli': - specifier: 21.1.0-next.4 - version: 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3) + specifier: 21.1.0-rc.0 + version: 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -950,47 +950,47 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular/animations@21.1.0-next.4': - resolution: {integrity: sha512-GtbawUvSBiUX5/DPLJh0iQcsdqLaNhrs0X7XET/6DyKDK39dlWjOLc/etBPQc7RlbP1QzlbpsISb/Gu0rcbv5A==} + '@angular/animations@21.1.0-rc.0': + resolution: {integrity: sha512-Vk7+xhoM+pSmIjZsVJ9Vw5pg14tSS06xe9eEil1mWqmfZf/LmoKXvc6BQ7wUa1ueynI1xbspc3tPuC26792ljQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 21.1.0-next.4 + '@angular/core': 21.1.0-rc.0 - '@angular/cdk@21.1.0-next.3': - resolution: {integrity: sha512-1NxzybXwBefUdOX5HzffjgZg4AwYuogDfRDgViTSzM4yZsVPup5+dDafwZAjYu90qdjriH5d/Lf6PUxhp2rLtA==} + '@angular/cdk@21.1.0-next.4': + resolution: {integrity: sha512-hF4ZIgMhG1TFT6XnOcK7G00IsOqMPmXkcMgVHz2bmwoSXlqfpUCVQKAhGHRHrMLQqUMckecYiWYG0njeWrsHkw==} peerDependencies: '@angular/common': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 '@angular/core': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 '@angular/platform-browser': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/common@21.1.0-next.4': - resolution: {integrity: sha512-HNM0eaZ86pXQZnmI6MlVj0FvvI3wF5mBkGyMN8Ktuswf9DUq04xBkliLiMwkb5UFmeSibxE3mUaMymw92Nn4fA==} + '@angular/common@21.1.0-rc.0': + resolution: {integrity: sha512-wz7wwrU3SZv9UMrxS1QhtJGLg6MXkucHztrqQzj+IBsetnHZiaQo+Basycgx17xUUFNCMH0B/NXt+iK3yHp04A==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 21.1.0-next.4 + '@angular/core': 21.1.0-rc.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@21.1.0-next.4': - resolution: {integrity: sha512-iW+8gnGSUqCv4WdN3LMv9ikh9vHfKnbfaG01Hvzxs+q4tL3xVRDezeL+EnpaIdmKsCOIfsYrWwAXNfMd48S4Lw==} + '@angular/compiler-cli@21.1.0-rc.0': + resolution: {integrity: sha512-a8ibvejDuviw5XwLBJDPE1JStCakGftJNKU/UDz73ob+OTaM3yHB7jvFwCdOhrjkPL5tJKpEoUxe8wQvmLrksA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.1.0-next.4 + '@angular/compiler': 21.1.0-rc.0 typescript: '>=5.9 <6.0' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@21.1.0-next.4': - resolution: {integrity: sha512-uY4Yg3OJ/DL6AlqMjO8VXgKiFHJK3QspFJzslkJKys2d8I7a7YIoWxYRJ9ZUfWW++8Swig17pL9NOrRLXx+iQg==} + '@angular/compiler@21.1.0-rc.0': + resolution: {integrity: sha512-rrsuuN6/2WtAT82liJXY1XOreonM3VcrOr/ouS38OoZ1NDIEgfv97RKW14It8+1pgpJeXAGsSzkfF3gqwVp2Ig==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular/core@21.1.0-next.4': - resolution: {integrity: sha512-aJAGd+8o/8vle68hAJGah/DMQVD4/vFf/lDhnqe69sFLY7HLeq5UdBjIu00nZ1DUVeL0n/QOA97bLRICINhVrg==} + '@angular/core@21.1.0-rc.0': + resolution: {integrity: sha512-uXNWMDCiz+g05yfH1Qjdy6goMe4wbRZ+hAsQWxQtnVNdLUvnLsUUdTAAazQvPQpcJUq4jOeu/Wv9nrqrJPDoCA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler': 21.1.0-next.4 + '@angular/compiler': 21.1.0-rc.0 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -999,74 +999,74 @@ packages: zone.js: optional: true - '@angular/forms@21.1.0-next.4': - resolution: {integrity: sha512-GluP6ZCId5DSukrgx/RlJX2CsVwHsRTSO8wAdYsqk2JIQpSPDtJk14RzvdHnMGeuBHrWn2dy88hq8G6W0SlQDA==} + '@angular/forms@21.1.0-rc.0': + resolution: {integrity: sha512-3/F6J62Oq9/DiSI39ePvA7YMtZ2pFOk5vMi2FWqPrcOFJ34HxnVTMoxFKpktsrz4mStBvi6DSm0o788I6ImDbw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.1.0-next.4 - '@angular/core': 21.1.0-next.4 - '@angular/platform-browser': 21.1.0-next.4 + '@angular/common': 21.1.0-rc.0 + '@angular/core': 21.1.0-rc.0 + '@angular/platform-browser': 21.1.0-rc.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/localize@21.1.0-next.4': - resolution: {integrity: sha512-awaQi5ib3UteQrIpxZmVrPBLnpAiPFeqVaogj0+hbn5dIvcQ4qbnjq3aTT/eR64aDGL6hByJ2e0Ac5fmVKUAEw==} + '@angular/localize@21.1.0-rc.0': + resolution: {integrity: sha512-qUMTFo/Ujtjf1hbElA1cT9v6LXiZ3BScdM9H8RH5VbnhjhOGculTV5IDy0KzZ6RMVS2z71vl2XzNoaFe7Dd4Ag==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.1.0-next.4 - '@angular/compiler-cli': 21.1.0-next.4 + '@angular/compiler': 21.1.0-rc.0 + '@angular/compiler-cli': 21.1.0-rc.0 - '@angular/material@21.1.0-next.3': - resolution: {integrity: sha512-m59JnFOUpTk5yLAYpJnk+nfvhzUO7tIG/WHFFOD2VmqWuadyZ+k6M4bQPy0ereumUcLue1QN7ZM6UpJWlgRqVQ==} + '@angular/material@21.1.0-next.4': + resolution: {integrity: sha512-ykfaHuScS98Aexo5x8WN+LrbGxBIhYnEtNw0ba5bdL1jNoWZI3iFANk9wLb3u9Mw+G1qrbO4B+60VPKdp7jVbw==} peerDependencies: - '@angular/cdk': 21.1.0-next.3 + '@angular/cdk': 21.1.0-next.4 '@angular/common': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 '@angular/core': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 '@angular/forms': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.0.0-0 '@angular/platform-browser': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.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/4877ddbc10c12fb75ef6bc9ff49295021ff2512a': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a} - version: 0.0.0-87ed54ddedde42b443be7c6fe36cdaf0a907ea39 + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/5e6b5c157aa13f92ef88a51d87874607f517d30c': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/5e6b5c157aa13f92ef88a51d87874607f517d30c} + version: 0.0.0-977bc9d747d9ddfe610fc96009212dd14c645ef6 hasBin: true - '@angular/platform-browser@21.1.0-next.4': - resolution: {integrity: sha512-3Tntq39GTw6wWsp92FZ438mz0eILW+9aXh/r0BzRTFnr2QtDrpEOnLqTNfdxJlS/NEYyrSmP7XzkmAlt13zu2g==} + '@angular/platform-browser@21.1.0-rc.0': + resolution: {integrity: sha512-igb4Y7rtZtfltNdA/+p57EcFD9rrH8YMDdVSGXSCiJD+rmQKelmwzjRfpRu1fTBjLWYt9KdS+jUIO1x6IljsuQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/animations': 21.1.0-next.4 - '@angular/common': 21.1.0-next.4 - '@angular/core': 21.1.0-next.4 + '@angular/animations': 21.1.0-rc.0 + '@angular/common': 21.1.0-rc.0 + '@angular/core': 21.1.0-rc.0 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/platform-server@21.1.0-next.4': - resolution: {integrity: sha512-R+FzXYCjNV6T7iMDPZ18FrSsTBZx200DU+ivKCMwUR9nwPYnA4oD+YwZKd+OgZrQqo4p5T/seXWScnqROopvQg==} + '@angular/platform-server@21.1.0-rc.0': + resolution: {integrity: sha512-+iKbNPXYqUktufLsVKI+dYg9U+ywbFhXOR5BSG4blN8QkyGqY80Dnt6pn7wMJSmrsz25+aUf9+8wSZkfBEkZWA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.1.0-next.4 - '@angular/compiler': 21.1.0-next.4 - '@angular/core': 21.1.0-next.4 - '@angular/platform-browser': 21.1.0-next.4 + '@angular/common': 21.1.0-rc.0 + '@angular/compiler': 21.1.0-rc.0 + '@angular/core': 21.1.0-rc.0 + '@angular/platform-browser': 21.1.0-rc.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/router@21.1.0-next.4': - resolution: {integrity: sha512-2ZLGbA57w9zA+yO6iXMuSaORJbD2jMoFRrKcMHamDhw81rpbJ3zcBjQ+I8GeAVgus5irWRr/6dYOmgy9kSldkg==} + '@angular/router@21.1.0-rc.0': + resolution: {integrity: sha512-PWh7Q9EHed137PdlFtbt7RIpcH6+PY9bpXhdU2B1KkzlOFV0nOjbn4lYSMQjARGp42KgjlSoZd9LSLl02Dg6UQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.1.0-next.4 - '@angular/core': 21.1.0-next.4 - '@angular/platform-browser': 21.1.0-next.4 + '@angular/common': 21.1.0-rc.0 + '@angular/core': 21.1.0-rc.0 + '@angular/platform-browser': 21.1.0-rc.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/service-worker@21.1.0-next.4': - resolution: {integrity: sha512-RadEpo+xp7hzv2qgpNRmsFsILX5ZY7AYGLHTVvEu4j5DUI9LUJllnmlEz/U5HHz/99h8eEPZPlUZ/H0OMMmUfw==} + '@angular/service-worker@21.1.0-rc.0': + resolution: {integrity: sha512-xQgTjQDQIZyAyrJzs9AUCAcnrsaTArf4/hYiO8mCdNzcXPUwdA0TEL9gKX7rJMPRrxMfwG7DHobpyj4zJBaR+Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} hasBin: true peerDependencies: - '@angular/core': 21.1.0-next.4 + '@angular/core': 21.1.0-rc.0 rxjs: ^6.5.3 || ^7.4.0 '@asamuzakjp/css-color@4.1.1': @@ -9320,29 +9320,29 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))': + '@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))': dependencies: - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) tslib: 2.8.1 - '@angular/cdk@21.1.0-next.3(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/cdk@21.1.0-next.4(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/platform-browser': 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) parse5: 8.0.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2)': + '@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3)': + '@angular/compiler-cli@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3)': dependencies: - '@angular/compiler': 21.1.0-next.4 + '@angular/compiler': 21.1.0-rc.0 '@babel/core': 7.28.5 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 @@ -9356,31 +9356,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@21.1.0-next.4': + '@angular/compiler@21.1.0-rc.0': dependencies: tslib: 2.8.1 - '@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)': + '@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 21.1.0-next.4 + '@angular/compiler': 21.1.0-rc.0 zone.js: 0.16.0 - '@angular/forms@21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/forms@21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/platform-browser': 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/localize@21.1.0-next.4(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(@angular/compiler@21.1.0-next.4)': + '@angular/localize@21.1.0-rc.0(@angular/compiler-cli@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3))(@angular/compiler@21.1.0-rc.0)': dependencies: - '@angular/compiler': 21.1.0-next.4 - '@angular/compiler-cli': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3) + '@angular/compiler': 21.1.0-rc.0 + '@angular/compiler-cli': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3) '@babel/core': 7.28.5 '@types/babel__core': 7.20.5 tinyglobby: 0.2.15 @@ -9388,17 +9388,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/material@21.1.0-next.3(5911ac44acdb5e81564606f5886cc827)': + '@angular/material@21.1.0-next.4(b051653d7cc612357511ba8a2f98a625)': dependencies: - '@angular/cdk': 21.1.0-next.3(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) - '@angular/common': 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/forms': 21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) - '@angular/platform-browser': 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/cdk': 21.1.0-next.4(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + '@angular/common': 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/forms': 21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2) + '@angular/platform-browser': 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/4877ddbc10c12fb75ef6bc9ff49295021ff2512a(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/5e6b5c157aa13f92ef88a51d87874607f517d30c(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))': dependencies: '@actions/core': 2.0.1 '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) @@ -9458,35 +9458,35 @@ snapshots: - '@modelcontextprotocol/sdk' - '@react-native-async-storage/async-storage' - '@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))': + '@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))': dependencies: - '@angular/common': 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/common': 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/animations': 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) - '@angular/platform-server@21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.1.0-next.4)(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/platform-server@21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@21.1.0-rc.0)(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/compiler': 21.1.0-next.4 - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + '@angular/compiler': 21.1.0-rc.0 + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/platform-browser': 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) rxjs: 7.8.2 tslib: 2.8.1 xhr2: 0.2.1 - '@angular/router@21.1.0-next.4(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': + '@angular/router@21.1.0-rc.0(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) - '@angular/platform-browser': 21.1.0-next.4(@angular/animations@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0)) + '@angular/common': 21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/platform-browser': 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/service-worker@21.1.0-next.4(@angular/core@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2)': + '@angular/service-worker@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(rxjs@7.8.2)(zone.js@0.16.0) + '@angular/core': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0) rxjs: 7.8.2 tslib: 2.8.1 @@ -14552,7 +14552,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.4 + debug: 4.4.3(supports-color@10.2.2) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -16334,10 +16334,10 @@ snapshots: netmask@2.0.2: {} - ng-packagr@21.1.0-rc.0(@angular/compiler-cli@21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): + ng-packagr@21.1.0-rc.0(@angular/compiler-cli@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 21.1.0-next.4(@angular/compiler@21.1.0-next.4)(typescript@5.9.3) + '@angular/compiler-cli': 21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(typescript@5.9.3) '@rollup/plugin-json': 6.1.0(rollup@4.55.1) '@rollup/wasm-node': 4.55.1 ajv: 8.17.1 diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 8596480909b7..541135822f83 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#7d1d574e722bddf23658ba2aecbe90f7a20d3dcb", - "@angular/cdk": "github:angular/cdk-builds#5e4b9d2f2cd548245d09f554364610762a5a2c47", - "@angular/common": "github:angular/common-builds#f3deca7ff0a46c2993c08e875b5881257c8f757a", - "@angular/compiler": "github:angular/compiler-builds#31af18615c849a3ce319a281b00333ba2cf8d641", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#9e3870e2c1eee645d15c561c09fceb18df897ab6", - "@angular/core": "github:angular/core-builds#2838839f900584dd9d556455afbd518bc585a4b2", - "@angular/forms": "github:angular/forms-builds#0b9bdccb4aea204c00a1da591775d1650a5cce1e", - "@angular/language-service": "github:angular/language-service-builds#8dc7bc4d774289732fb4c887a8fbacb234eb2725", - "@angular/localize": "github:angular/localize-builds#2aaeba1a3f84c3593cf8971d8f23ce6275460bb4", - "@angular/material": "github:angular/material-builds#3f6bda06d3e7fcac8a993810b87f79a0b2b83ce3", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#e9656894438ed6fac288b62fc822d2a70a0a4a17", - "@angular/platform-browser": "github:angular/platform-browser-builds#81df68a32060014f1c5e1ab20fddc481e6c293fb", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#09ba5aa26d445ec7f07ef8b21d9fc6a76b15742b", - "@angular/platform-server": "github:angular/platform-server-builds#88c1f8a56e9e78d93b92daa7245958fab732a9d9", - "@angular/router": "github:angular/router-builds#3162b28b4e94c04f52b263291b9b54074b93fc94", - "@angular/service-worker": "github:angular/service-worker-builds#80a6ec33d78fce9ceb1e289f2fe1e35231b441fa" + "@angular/animations": "github:angular/animations-builds#35218f05b11fafedee25dcc8c400f846d8103d17", + "@angular/cdk": "github:angular/cdk-builds#ba106366ba38e32d0f63d7a64b8ca3c79c63933a", + "@angular/common": "github:angular/common-builds#ae646bb42174f17f68e12633e4f08d164d0e03d7", + "@angular/compiler": "github:angular/compiler-builds#46335e926db79b2550ca5f45b76e248b9d6be1c2", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#4747bbf15c9a8552982a847ffe1c377c99ef73b8", + "@angular/core": "github:angular/core-builds#ea2364b98187d965a539d31a40b202c5e4b9f526", + "@angular/forms": "github:angular/forms-builds#fb9292dd410c00b0a9101fbfc180231ff278fbe0", + "@angular/language-service": "github:angular/language-service-builds#6914eb34e7993144c3028627a9552a5f6f0e47ee", + "@angular/localize": "github:angular/localize-builds#875351ca7ab43faa9433c76c45725daf61736c57", + "@angular/material": "github:angular/material-builds#987afc6ac394c32d799ae2f73e0fff6393525c70", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#78385e21fc883279b332556d86f80a0fab8ef6eb", + "@angular/platform-browser": "github:angular/platform-browser-builds#1c0ca1e915fd01e9ee8b17fe0e2240c0969e3dee", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#544708d382fa3456caf671525ded44f2ea4fd827", + "@angular/platform-server": "github:angular/platform-server-builds#a52143698f47d2381934d0d89a51520513fa99ad", + "@angular/router": "github:angular/router-builds#85fd95f72ad5fc57d5a5e40c897a64f9edfcdb4a", + "@angular/service-worker": "github:angular/service-worker-builds#abe3c89f12ea854e6de57dcc44bfa31ba78ecbbf" } } From 1944008bc8f7575b7bcffb91f67ec7cd3c1e0649 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 12 Jan 2026 08:46:27 +0000 Subject: [PATCH 49/68] build: update cross-repo angular dependencies See associated pull request for more information. --- .../assistant-to-the-branch-manager.yml | 2 +- .github/workflows/ci.yml | 52 +++++++++---------- .github/workflows/dev-infra.yml | 4 +- .github/workflows/feature-requests.yml | 2 +- .github/workflows/perf.yml | 6 +-- .github/workflows/pr.yml | 44 ++++++++-------- MODULE.bazel | 2 +- package.json | 2 +- pnpm-lock.yaml | 12 ++--- tests/e2e/ng-snapshot/package.json | 32 ++++++------ 10 files changed, 79 insertions(+), 79 deletions(-) diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index 105c9331f9e8..1e2ae380b05e 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -17,6 +17,6 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@977bc9d747d9ddfe610fc96009212dd14c645ef6 + - uses: angular/dev-infra/github-actions/branch-manager@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 649eee44045d..357f70cb18bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Generate JSON schema types @@ -44,11 +44,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -61,11 +61,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -84,13 +84,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -100,11 +100,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -137,7 +137,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -164,13 +164,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -188,13 +188,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -208,13 +208,13 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-cli-${{ github.workflow }}-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run E2E Browser tests @@ -244,11 +244,11 @@ jobs: CIRCLE_BRANCH: ${{ github.ref_name }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - run: pnpm admin snapshots --verbose env: SNAPSHOT_BUILDS_GITHUB_TOKEN: ${{ secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN }} diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index 8241492b2036..f35ed269e8bf 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/pull-request-labeling@977bc9d747d9ddfe610fc96009212dd14c645ef6 + - uses: angular/dev-infra/github-actions/pull-request-labeling@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/post-approval-changes@977bc9d747d9ddfe610fc96009212dd14c645ef6 + - uses: angular/dev-infra/github-actions/post-approval-changes@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml index b60cc72aa240..588c3ee3fe2a 100644 --- a/.github/workflows/feature-requests.yml +++ b/.github/workflows/feature-requests.yml @@ -16,6 +16,6 @@ jobs: if: github.repository == 'angular/angular-cli' runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/feature-request@977bc9d747d9ddfe610fc96009212dd14c645ef6 + - uses: angular/dev-infra/github-actions/feature-request@3ec78dc98edefbf3a324b84d093e66577ea30b29 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 0e92e0a62c82..8d5897b8cc29 100644 --- a/.github/workflows/perf.yml +++ b/.github/workflows/perf.yml @@ -23,7 +23,7 @@ jobs: workflows: ${{ steps.workflows.outputs.workflows }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - id: workflows @@ -38,9 +38,9 @@ jobs: workflow: ${{ fromJSON(needs.list.outputs.workflows) }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile # We utilize the google-github-actions/auth action to allow us to get an active credential using workflow diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 7d0ca76bcc47..2312edca0c64 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,9 +34,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup ESLint Caching uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: @@ -66,17 +66,17 @@ jobs: # it has been merged. run: pnpm ng-dev format changed --check ${{ github.event.pull_request.base.sha }} - name: Check Package Licenses - uses: angular/dev-infra/github-actions/linting/licenses@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/linting/licenses@3ec78dc98edefbf3a324b84d093e66577ea30b29 build: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build release targets @@ -93,11 +93,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Run module and package tests @@ -114,13 +114,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -128,11 +128,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Build E2E tests for Windows on Linux @@ -156,7 +156,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -183,13 +183,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=3 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -205,12 +205,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@977bc9d747d9ddfe610fc96009212dd14c645ef6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.snapshots.${{ matrix.subset }}_node${{ matrix.node }} diff --git a/MODULE.bazel b/MODULE.bazel index 091427bd52b0..22d5d4388113 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -25,7 +25,7 @@ git_override( bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "977bc9d747d9ddfe610fc96009212dd14c645ef6", + commit = "3ec78dc98edefbf3a324b84d093e66577ea30b29", remote = "https://github.com/angular/dev-infra.git", ) diff --git a/package.json b/package.json index 020c3ec315e0..92ba21bbdf4b 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@angular/forms": "21.1.0-rc.0", "@angular/localize": "21.1.0-rc.0", "@angular/material": "21.1.0-next.4", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#5e6b5c157aa13f92ef88a51d87874607f517d30c", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#50fe5451525482cef45fa98d953f899e92d618ce", "@angular/platform-browser": "21.1.0-rc.0", "@angular/platform-server": "21.1.0-rc.0", "@angular/router": "21.1.0-rc.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d10b7589a173..1d26335523ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,8 +47,8 @@ importers: specifier: 21.1.0-next.4 version: 21.1.0-next.4(b051653d7cc612357511ba8a2f98a625) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#5e6b5c157aa13f92ef88a51d87874607f517d30c - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/5e6b5c157aa13f92ef88a51d87874607f517d30c(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#50fe5451525482cef45fa98d953f899e92d618ce + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/50fe5451525482cef45fa98d953f899e92d618ce(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)) '@angular/platform-browser': specifier: 21.1.0-rc.0 version: 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) @@ -1026,9 +1026,9 @@ packages: '@angular/platform-browser': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.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/5e6b5c157aa13f92ef88a51d87874607f517d30c': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/5e6b5c157aa13f92ef88a51d87874607f517d30c} - version: 0.0.0-977bc9d747d9ddfe610fc96009212dd14c645ef6 + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/50fe5451525482cef45fa98d953f899e92d618ce': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/50fe5451525482cef45fa98d953f899e92d618ce} + version: 0.0.0-3ec78dc98edefbf3a324b84d093e66577ea30b29 hasBin: true '@angular/platform-browser@21.1.0-rc.0': @@ -9398,7 +9398,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/5e6b5c157aa13f92ef88a51d87874607f517d30c(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/50fe5451525482cef45fa98d953f899e92d618ce(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))': dependencies: '@actions/core': 2.0.1 '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index 541135822f83..df29d91efd90 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#35218f05b11fafedee25dcc8c400f846d8103d17", - "@angular/cdk": "github:angular/cdk-builds#ba106366ba38e32d0f63d7a64b8ca3c79c63933a", - "@angular/common": "github:angular/common-builds#ae646bb42174f17f68e12633e4f08d164d0e03d7", - "@angular/compiler": "github:angular/compiler-builds#46335e926db79b2550ca5f45b76e248b9d6be1c2", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#4747bbf15c9a8552982a847ffe1c377c99ef73b8", - "@angular/core": "github:angular/core-builds#ea2364b98187d965a539d31a40b202c5e4b9f526", - "@angular/forms": "github:angular/forms-builds#fb9292dd410c00b0a9101fbfc180231ff278fbe0", - "@angular/language-service": "github:angular/language-service-builds#6914eb34e7993144c3028627a9552a5f6f0e47ee", - "@angular/localize": "github:angular/localize-builds#875351ca7ab43faa9433c76c45725daf61736c57", - "@angular/material": "github:angular/material-builds#987afc6ac394c32d799ae2f73e0fff6393525c70", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#78385e21fc883279b332556d86f80a0fab8ef6eb", - "@angular/platform-browser": "github:angular/platform-browser-builds#1c0ca1e915fd01e9ee8b17fe0e2240c0969e3dee", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#544708d382fa3456caf671525ded44f2ea4fd827", - "@angular/platform-server": "github:angular/platform-server-builds#a52143698f47d2381934d0d89a51520513fa99ad", - "@angular/router": "github:angular/router-builds#85fd95f72ad5fc57d5a5e40c897a64f9edfcdb4a", - "@angular/service-worker": "github:angular/service-worker-builds#abe3c89f12ea854e6de57dcc44bfa31ba78ecbbf" + "@angular/animations": "github:angular/animations-builds#a38f6fed777c7b80473492aba0261acbbe2e9f4b", + "@angular/cdk": "github:angular/cdk-builds#0539dd4d010c119630e6bcf597393489e1313bb4", + "@angular/common": "github:angular/common-builds#754de52e5f6c2ede77d0378aa889a97d559a8113", + "@angular/compiler": "github:angular/compiler-builds#21cd4a684b6b9ba607b4ec019fd3f8d1847d4e63", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#08a43ed0320a6d0d5b268eaf43ccbafed860ed2b", + "@angular/core": "github:angular/core-builds#38b7649e2928eac9bb5dbb9593b2880d7f93e193", + "@angular/forms": "github:angular/forms-builds#5ff7e657d34956067dde22c829a7d2f3e1628408", + "@angular/language-service": "github:angular/language-service-builds#68142b174eb7dd296da6f412b5d31bbcc7d57456", + "@angular/localize": "github:angular/localize-builds#76d4cf0295505b71b0bf61e4d8818488128d9765", + "@angular/material": "github:angular/material-builds#ea5a6e2304c661907a9954ad860da7bbaf6fd86b", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#321361b3180f82f1553cd1a8a72756c00d48ec9d", + "@angular/platform-browser": "github:angular/platform-browser-builds#ef8b35329b869ab3d9adac11a4025071eaf075c5", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#25e46ca0513f02ae562317dad3ec45497f0d0787", + "@angular/platform-server": "github:angular/platform-server-builds#249b09bc45577772ff5349a2b99ccc7cab5b2080", + "@angular/router": "github:angular/router-builds#6cba1b408d9015fb8771a3bd00d1b00d097e7fa6", + "@angular/service-worker": "github:angular/service-worker-builds#d6355eef029449edec0c401eaf8053b7e384cb5d" } } From 66ffafd87c35684a26e73133621022f550189294 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 12 Jan 2026 09:10:02 +0000 Subject: [PATCH 50/68] build: update pnpm to v10.28.0 See associated pull request for more information. --- MODULE.bazel | 17 ++- MODULE.bazel.lock | 338 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 4 +- 3 files changed, 325 insertions(+), 34 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 22d5d4388113..ec01b276af8d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -44,7 +44,18 @@ git_override( ) node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") -node.toolchain(node_version_from_nvmrc = "//:.nvmrc") +node.toolchain( + node_repositories = { + "22.21.1-darwin_arm64": ("node-v22.21.1-darwin-arm64.tar.gz", "node-v22.21.1-darwin-arm64", "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af"), + "22.21.1-darwin_amd64": ("node-v22.21.1-darwin-x64.tar.gz", "node-v22.21.1-darwin-x64", "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd"), + "22.21.1-linux_arm64": ("node-v22.21.1-linux-arm64.tar.xz", "node-v22.21.1-linux-arm64", "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1"), + "22.21.1-linux_ppc64le": ("node-v22.21.1-linux-ppc64le.tar.xz", "node-v22.21.1-linux-ppc64le", "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845"), + "22.21.1-linux_s390x": ("node-v22.21.1-linux-s390x.tar.xz", "node-v22.21.1-linux-s390x", "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211"), + "22.21.1-linux_amd64": ("node-v22.21.1-linux-x64.tar.xz", "node-v22.21.1-linux-x64", "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88"), + "22.21.1-windows_amd64": ("node-v22.21.1-win-x64.zip", "node-v22.21.1-win-x64", "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf"), + }, + node_version = "22.21.1", +) use_repo( node, "nodejs_darwin_amd64", @@ -99,8 +110,8 @@ use_repo( pnpm = use_extension("@aspect_rules_js//npm:extensions.bzl", "pnpm") pnpm.pnpm( name = "pnpm", - pnpm_version = "10.26.0", - pnpm_version_integrity = "sha512-Oz9scl6+cSUGwKsa1BM8+GsfS2h+/85iqbOLTXLjlUJC5kMZD8UfoWQpScc19APevUT1yw7dZXq+Y6i2p+HkAg==", + pnpm_version = "10.28.0", + pnpm_version_integrity = "sha512-Bd9x0UIfITmeBT/eVnzqNNRG+gLHZXFEG/wceVbpjjYwiJgtlARl/TRIDU2QoGaLwSNi+KqIAApk6D0LDke+SA==", ) use_repo(pnpm, "pnpm") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index f78ddeb904ea..5c2a55ab267c 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -412,7 +412,7 @@ "@@aspect_rules_js+//npm:extensions.bzl%pnpm": { "general": { "bzlTransitiveDigest": "zVV86HvMwDBJ8IsFt27k/Sjq0vCMPr8b8X9OAuprQ6w=", - "usagesDigest": "eBdoLuun2Ll2wMv7+g0B3OCtLdHCLOA3bqzuEktDxvU=", + "usagesDigest": "joQrwYZve0LRGQcA0w659tYcDgO7i285JhM3m8ojguc=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -421,11 +421,11 @@ "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_rule", "attributes": { "package": "pnpm", - "version": "10.26.0", + "version": "10.28.0", "root_package": "", "link_workspace": "", "link_packages": {}, - "integrity": "sha512-Oz9scl6+cSUGwKsa1BM8+GsfS2h+/85iqbOLTXLjlUJC5kMZD8UfoWQpScc19APevUT1yw7dZXq+Y6i2p+HkAg==", + "integrity": "sha512-Bd9x0UIfITmeBT/eVnzqNNRG+gLHZXFEG/wceVbpjjYwiJgtlARl/TRIDU2QoGaLwSNi+KqIAApk6D0LDke+SA==", "url": "", "commit": "", "patch_args": [ @@ -448,7 +448,7 @@ "repoRuleId": "@@aspect_rules_js+//npm/private:npm_import.bzl%npm_import_links", "attributes": { "package": "pnpm", - "version": "10.26.0", + "version": "10.28.0", "dev": false, "root_package": "", "link_packages": {}, @@ -1093,7 +1093,7 @@ "@@rules_nodejs+//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "NwcLXHrbh2hoorA/Ybmcpjxsn/6avQmewDglodkDrgo=", - "usagesDigest": "WnPwx+ah3/p5VnBg2wk1me0H73eqUa7y8C5BV/XVZbg=", + "usagesDigest": "gh1vecRgu60cNLf3obzWE7eYVlWEqZwguWf1BbCfbNQ=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -1102,12 +1102,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "linux_amd64" } @@ -1116,12 +1151,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "linux_arm64" } @@ -1130,12 +1200,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "linux_s390x" } @@ -1144,12 +1249,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "linux_ppc64le" } @@ -1158,12 +1298,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "darwin_amd64" } @@ -1172,12 +1347,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "darwin_arm64" } @@ -1186,12 +1396,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "windows_amd64" } @@ -1200,12 +1445,47 @@ "repoRuleId": "@@rules_nodejs+//nodejs:repositories.bzl%_nodejs_repositories", "attributes": { "node_download_auth": {}, - "node_repositories": {}, + "node_repositories": { + "22.21.1-darwin_arm64": [ + "node-v22.21.1-darwin-arm64.tar.gz", + "node-v22.21.1-darwin-arm64", + "c170d6554fba83d41d25a76cdbad85487c077e51fa73519e41ac885aa429d8af" + ], + "22.21.1-darwin_amd64": [ + "node-v22.21.1-darwin-x64.tar.gz", + "node-v22.21.1-darwin-x64", + "8e3dc89614debe66c2a6ad2313a1adb06eb37db6cd6c40d7de6f7d987f7d1afd" + ], + "22.21.1-linux_arm64": [ + "node-v22.21.1-linux-arm64.tar.xz", + "node-v22.21.1-linux-arm64", + "e660365729b434af422bcd2e8e14228637ecf24a1de2cd7c916ad48f2a0521e1" + ], + "22.21.1-linux_ppc64le": [ + "node-v22.21.1-linux-ppc64le.tar.xz", + "node-v22.21.1-linux-ppc64le", + "6f2b6aa1519a8f50a66b0ae7e94d2feeadfe9aa98095c737c2fc67df25012845" + ], + "22.21.1-linux_s390x": [ + "node-v22.21.1-linux-s390x.tar.xz", + "node-v22.21.1-linux-s390x", + "c473e8e7eb46aa93e1580736ce240ba4cf3b22dc45a47118359e85508b63e211" + ], + "22.21.1-linux_amd64": [ + "node-v22.21.1-linux-x64.tar.xz", + "node-v22.21.1-linux-x64", + "680d3f30b24a7ff24b98db5e96f294c0070f8f9078df658da1bce1b9c9873c88" + ], + "22.21.1-windows_amd64": [ + "node-v22.21.1-win-x64.zip", + "node-v22.21.1-win-x64", + "3c624e9fbe07e3217552ec52a0f84e2bdc2e6ffa7348f3fdfb9fbf8f42e23fcf" + ] + }, "node_urls": [ "https://nodejs.org/dist/v{version}/{filename}" ], - "node_version": "20.19.5", - "node_version_from_nvmrc": "@@//:.nvmrc", + "node_version": "22.21.1", "include_headers": false, "platform": "windows_arm64" } diff --git a/package.json b/package.json index 92ba21bbdf4b..ac935c4ead6a 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,12 @@ "type": "git", "url": "https://github.com/angular/angular-cli.git" }, - "packageManager": "pnpm@10.27.0", + "packageManager": "pnpm@10.28.0", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": "Please use pnpm instead of NPM to install dependencies", "yarn": "Please use pnpm instead of Yarn to install dependencies", - "pnpm": "10.27.0" + "pnpm": "10.28.0" }, "author": "Angular Authors", "license": "MIT", From f80db6fb714aa326f6ed03a8a51090ca59ad0955 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 8 Jan 2026 12:07:57 -0500 Subject: [PATCH 51/68] feat(@schematics/angular): add ng-add support for Vitest browser providers This commit adds a new internal schematic `vitest-browser` to `@schematics/angular` which streamlines the setup of Vitest browser testing by handling `ng add` for the following packages: - `@vitest/browser-playwright` - `@vitest/browser-webdriverio` - `@vitest/browser-preview` The schematic performs the following actions: - Verifies the project is using the `@angular/build:unit-test` builder. - Updates `tsconfig.spec.json` to include `vitest/globals` and the respective browser provider package in `compilerOptions.types`. - Installs the requested package along with necessary peer dependencies (e.g., `playwright` or `webdriverio`). Additionally, the `ng add` command implementation in the CLI has been updated to support passing the package name to built-in schematics, allowing the `vitest-browser` schematic to know which package was requested. --- packages/angular/cli/src/commands/add/cli.ts | 13 +++ packages/schematics/angular/collection.json | 7 ++ .../schematics/angular/tailwind/schema.json | 4 + .../utility/latest-versions/package.json | 5 + .../angular/vitest-browser/index.ts | 103 ++++++++++++++++++ .../angular/vitest-browser/schema.json | 24 ++++ tests/e2e.bzl | 1 + .../tests/commands/add/add-vitest-browser.ts | 20 ++++ tests/e2e/utils/vitest.ts | 5 +- 9 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 packages/schematics/angular/vitest-browser/index.ts create mode 100644 packages/schematics/angular/vitest-browser/schema.json create mode 100644 tests/e2e/tests/commands/add/add-vitest-browser.ts diff --git a/packages/angular/cli/src/commands/add/cli.ts b/packages/angular/cli/src/commands/add/cli.ts index 0dae016fba12..10361ece6b2b 100644 --- a/packages/angular/cli/src/commands/add/cli.ts +++ b/packages/angular/cli/src/commands/add/cli.ts @@ -84,6 +84,18 @@ const BUILT_IN_SCHEMATICS = { collection: '@schematics/angular', name: 'tailwind', }, + '@vitest/browser-playwright': { + collection: '@schematics/angular', + name: 'vitest-browser', + }, + '@vitest/browser-webdriverio': { + collection: '@schematics/angular', + name: 'vitest-browser', + }, + '@vitest/browser-preview': { + collection: '@schematics/angular', + name: 'vitest-browser', + }, } as const; export default class AddCommandModule @@ -260,6 +272,7 @@ export default class AddCommandModule ...options, collection: builtInSchematic.collection, schematicName: builtInSchematic.name, + package: packageName, }); } } diff --git a/packages/schematics/angular/collection.json b/packages/schematics/angular/collection.json index 8d876cf7cb5b..c275bc40144f 100755 --- a/packages/schematics/angular/collection.json +++ b/packages/schematics/angular/collection.json @@ -149,6 +149,13 @@ "schema": "./refactor/jasmine-vitest/schema.json", "description": "[EXPERIMENTAL] Refactors Jasmine tests to use Vitest APIs.", "hidden": true + }, + "vitest-browser": { + "factory": "./vitest-browser", + "schema": "./vitest-browser/schema.json", + "hidden": true, + "private": true, + "description": "[INTERNAL] Adds a Vitest browser provider to a project. Intended for use for ng add." } } } diff --git a/packages/schematics/angular/tailwind/schema.json b/packages/schematics/angular/tailwind/schema.json index 3b52fc71c26d..801c6ebc45d7 100644 --- a/packages/schematics/angular/tailwind/schema.json +++ b/packages/schematics/angular/tailwind/schema.json @@ -10,6 +10,10 @@ "$source": "projectName" } }, + "package": { + "type": "string", + "description": "The package to be added." + }, "skipInstall": { "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later.", "type": "boolean", diff --git a/packages/schematics/angular/utility/latest-versions/package.json b/packages/schematics/angular/utility/latest-versions/package.json index 29ef3658f23b..0922fb6dc705 100644 --- a/packages/schematics/angular/utility/latest-versions/package.json +++ b/packages/schematics/angular/utility/latest-versions/package.json @@ -26,6 +26,11 @@ "ts-node": "~10.9.0", "typescript": "~5.9.2", "vitest": "^4.0.8", + "@vitest/browser-playwright": "^4.0.8", + "@vitest/browser-webdriverio": "^4.0.8", + "@vitest/browser-preview": "^4.0.8", + "playwright": "^1.48.0", + "webdriverio": "^9.0.0", "zone.js": "~0.16.0" } } diff --git a/packages/schematics/angular/vitest-browser/index.ts b/packages/schematics/angular/vitest-browser/index.ts new file mode 100644 index 000000000000..bdc366bf4423 --- /dev/null +++ b/packages/schematics/angular/vitest-browser/index.ts @@ -0,0 +1,103 @@ +/** + * @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, + SchematicContext, + SchematicsException, + Tree, + chain, +} from '@angular-devkit/schematics'; +import { join } from 'node:path/posix'; +import { + DependencyType, + ExistingBehavior, + InstallBehavior, + addDependency, +} from '../utility/dependency'; +import { JSONFile } from '../utility/json-file'; +import { latestVersions } from '../utility/latest-versions'; +import { getWorkspace } from '../utility/workspace'; +import { Builders } from '../utility/workspace-models'; +import { Schema as VitestBrowserOptions } from './schema'; + +export default function (options: VitestBrowserOptions): Rule { + return async (host: Tree, _context: SchematicContext) => { + const workspace = await getWorkspace(host); + const project = workspace.projects.get(options.project); + + if (!project) { + throw new SchematicsException(`Project "${options.project}" does not exist.`); + } + + const testTarget = project.targets.get('test'); + if (testTarget?.builder !== Builders.BuildUnitTest) { + throw new SchematicsException( + `Project "${options.project}" does not have a "test" target with a supported builder.`, + ); + } + + if (testTarget.options?.['runner'] === 'karma') { + throw new SchematicsException( + `Project "${options.project}" is configured to use Karma. ` + + 'Please migrate to Vitest before adding browser testing support.', + ); + } + + const packageName = options.package; + if (!packageName) { + return; + } + + const dependencies = [packageName]; + if (packageName === '@vitest/browser-playwright') { + dependencies.push('playwright'); + } else if (packageName === '@vitest/browser-webdriverio') { + dependencies.push('webdriverio'); + } + + // Update tsconfig.spec.json + const tsConfigPath = + (testTarget.options?.['tsConfig'] as string | undefined) ?? + join(project.root, 'tsconfig.spec.json'); + const updateTsConfigRule: Rule = (host) => { + if (host.exists(tsConfigPath)) { + const json = new JSONFile(host, 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 (packageName && !newTypes.includes(packageName)) { + newTypes.push(packageName); + } + + if ( + newTypes.length !== existingTypes.length || + newTypes.some((t, i) => t !== existingTypes[i]) + ) { + json.modify(typesPath, newTypes); + } + } + }; + + return chain([ + updateTsConfigRule, + ...dependencies.map((name) => + addDependency(name, latestVersions[name], { + type: DependencyType.Dev, + existing: ExistingBehavior.Skip, + install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto, + }), + ), + ]); + }; +} diff --git a/packages/schematics/angular/vitest-browser/schema.json b/packages/schematics/angular/vitest-browser/schema.json new file mode 100644 index 000000000000..6d65b6d0d5fe --- /dev/null +++ b/packages/schematics/angular/vitest-browser/schema.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "title": "Vitest Browser Provider Schematic", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "The name of the project.", + "$default": { + "$source": "projectName" + } + }, + "package": { + "type": "string", + "description": "The package to be added." + }, + "skipInstall": { + "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later.", + "type": "boolean", + "default": false + } + }, + "required": ["project", "package"] +} diff --git a/tests/e2e.bzl b/tests/e2e.bzl index 07004fcb09d0..34ae2452a0fb 100644 --- a/tests/e2e.bzl +++ b/tests/e2e.bzl @@ -47,6 +47,7 @@ WEBPACK_IGNORE_TESTS = [ "tests/build/app-shell/**", "tests/i18n/ivy-localize-app-shell.js", "tests/i18n/ivy-localize-app-shell-service-worker.js", + "tests/commands/add/add-vitest-browser.js", "tests/commands/serve/ssr-http-requests-assets.js", "tests/build/styles/sass-pkg-importer.js", "tests/build/prerender/http-requests-assets.js", diff --git a/tests/e2e/tests/commands/add/add-vitest-browser.ts b/tests/e2e/tests/commands/add/add-vitest-browser.ts new file mode 100644 index 000000000000..4e7aaf1a4044 --- /dev/null +++ b/tests/e2e/tests/commands/add/add-vitest-browser.ts @@ -0,0 +1,20 @@ +import { expectFileToMatch } from '../../../utils/fs'; +import { uninstallPackage } from '../../../utils/packages'; +import { ng } from '../../../utils/process'; +import { applyVitestBuilder } from '../../../utils/vitest'; + +export default async function () { + await applyVitestBuilder(); + + try { + await ng('add', '@vitest/browser-playwright', '--skip-confirmation'); + + await expectFileToMatch('package.json', /"@vitest\/browser-playwright":/); + await expectFileToMatch('package.json', /"playwright":/); + await expectFileToMatch('tsconfig.spec.json', /"vitest\/globals"/); + await expectFileToMatch('tsconfig.spec.json', /"@vitest\/browser-playwright"/); + } finally { + await uninstallPackage('@vitest/browser-playwright'); + await uninstallPackage('playwright'); + } +} diff --git a/tests/e2e/utils/vitest.ts b/tests/e2e/utils/vitest.ts index af40e66b18b1..471ca030169e 100644 --- a/tests/e2e/utils/vitest.ts +++ b/tests/e2e/utils/vitest.ts @@ -1,10 +1,11 @@ -import { silentNpm } from './process'; +import { installPackage } from './packages'; import { updateJsonFile } from './project'; /** Updates the `test` builder in the current workspace to use Vitest. */ export async function applyVitestBuilder(): Promise { // These deps matches the deps in `@schematics/angular` - await silentNpm('install', 'vitest@^4.0.8', 'jsdom@^27.1.0', '--save-dev'); + await installPackage('vitest@^4.0.8'); + await installPackage('jsdom@^27.1.0'); await updateJsonFile('angular.json', (json) => { const projects = Object.values(json['projects']); From 5fb3af0ae6a9f7019acc749bd313646e780d691d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 9 Jan 2026 10:49:00 -0500 Subject: [PATCH 52/68] refactor(@angular/cli): support custom temporary directory in package manager abstraction This change introduces the ability to specify a base temporary directory when creating a `PackageManager` instance. This allows for creating temporary directories within the project structure (e.g., `node_modules/.tmp`), which enables package managers to correctly inherit project-specific configurations like `.npmrc` or `.yarnrc` during operations like `acquireTempPackage`. --- packages/angular/cli/src/package-managers/factory.ts | 9 +++++++-- packages/angular/cli/src/package-managers/host.ts | 5 +++-- .../angular/cli/src/package-managers/package-manager.ts | 8 +++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/angular/cli/src/package-managers/factory.ts b/packages/angular/cli/src/package-managers/factory.ts index 19ec32f7f886..1cd3d2462edc 100644 --- a/packages/angular/cli/src/package-managers/factory.ts +++ b/packages/angular/cli/src/package-managers/factory.ts @@ -110,8 +110,9 @@ export async function createPackageManager(options: { configuredPackageManager?: PackageManagerName; logger?: Logger; dryRun?: boolean; + tempDirectory?: string; }): Promise { - const { cwd, configuredPackageManager, logger, dryRun } = options; + const { cwd, configuredPackageManager, logger, dryRun, tempDirectory } = options; const host = NodeJS_HOST; const { name, source } = await determinePackageManager( @@ -127,7 +128,11 @@ export async function createPackageManager(options: { throw new Error(`Unsupported package manager: "${name}"`); } - const packageManager = new PackageManager(host, cwd, descriptor, { dryRun, logger }); + const packageManager = new PackageManager(host, cwd, descriptor, { + dryRun, + logger, + tempDirectory, + }); // Do not verify if the package manager is installed during a dry run. if (!dryRun) { diff --git a/packages/angular/cli/src/package-managers/host.ts b/packages/angular/cli/src/package-managers/host.ts index 82d61031d147..e063a97de03d 100644 --- a/packages/angular/cli/src/package-managers/host.ts +++ b/packages/angular/cli/src/package-managers/host.ts @@ -47,9 +47,10 @@ export interface Host { /** * Creates a new, unique temporary directory. + * @param baseDir The base directory in which to create the temporary directory. * @returns A promise that resolves to the absolute path of the created directory. */ - createTempDirectory(): Promise; + createTempDirectory(baseDir?: string): Promise; /** * Deletes a directory recursively. @@ -94,7 +95,7 @@ export const NodeJS_HOST: Host = { readdir, readFile: (path: string) => readFile(path, { encoding: 'utf8' }), writeFile, - createTempDirectory: () => mkdtemp(join(tmpdir(), 'angular-cli-')), + createTempDirectory: (baseDir?: string) => mkdtemp(join(baseDir ?? tmpdir(), 'angular-cli-')), deleteDirectory: (path: string) => rm(path, { recursive: true, force: true }), runCommand: async ( command: string, diff --git a/packages/angular/cli/src/package-managers/package-manager.ts b/packages/angular/cli/src/package-managers/package-manager.ts index 57b521615273..55444266ffb9 100644 --- a/packages/angular/cli/src/package-managers/package-manager.ts +++ b/packages/angular/cli/src/package-managers/package-manager.ts @@ -59,6 +59,12 @@ export interface PackageManagerOptions { /** A logger instance for debugging and dry run output. */ logger?: Logger; + + /** + * The path to use as the base for temporary directories. + * If not specified, the system's temporary directory will be used. + */ + tempDirectory?: string; } /** @@ -538,7 +544,7 @@ export class PackageManager { specifier: string, options: { registry?: string; ignoreScripts?: boolean } = {}, ): Promise<{ workingDirectory: string; cleanup: () => Promise }> { - const workingDirectory = await this.host.createTempDirectory(); + const workingDirectory = await this.host.createTempDirectory(this.options.tempDirectory); const cleanup = () => this.host.deleteDirectory(workingDirectory); // Some package managers, like yarn classic, do not write a package.json when adding a package. From 2cd4f2d3634888f32b3924c3e12591c9c74ab1e1 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:06:56 -0500 Subject: [PATCH 53/68] fix(@angular/cli): use project-local temporary directory in ng add The 'ng add' command now attempts to use '.angular/cache' or 'node_modules' as the base for temporary directories when acquiring packages. This ensures that the package manager can inherit project-specific configuration (like '.npmrc' or '.yarnrc') during the installation of temporary packages. The implementation uses a fallback strategy, checking for candidate directories and defaulting to the system's temporary directory if none are found. --- packages/angular/cli/src/commands/add/cli.ts | 25 +++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/angular/cli/src/commands/add/cli.ts b/packages/angular/cli/src/commands/add/cli.ts index 10361ece6b2b..1ffc5ae29258 100644 --- a/packages/angular/cli/src/commands/add/cli.ts +++ b/packages/angular/cli/src/commands/add/cli.ts @@ -10,7 +10,7 @@ import { Listr, ListrRenderer, ListrTaskWrapper, color, figures } from 'listr2'; import assert from 'node:assert'; import fs from 'node:fs/promises'; import { createRequire } from 'node:module'; -import { dirname, join } from 'node:path'; +import { dirname, join, relative, resolve } from 'node:path'; import npa from 'npm-package-arg'; import semver, { Range, compare, intersects, prerelease, satisfies, valid } from 'semver'; import { Argv } from 'yargs'; @@ -33,6 +33,7 @@ import { import { assertIsError } from '../../utilities/error'; import { isTTY } from '../../utilities/tty'; import { VERSION } from '../../utilities/version'; +import { getCacheConfig } from '../cache/utilities'; class CommandError extends Error {} @@ -311,10 +312,32 @@ export default class AddCommandModule context: AddCommandTaskContext, task: AddCommandTaskWrapper, ): Promise { + let tempDirectory: string | undefined; + const tempOptions = ['node_modules']; + + const cacheConfig = getCacheConfig(this.context.workspace); + if (cacheConfig.enabled) { + const cachePath = resolve(this.context.root, cacheConfig.path); + if (!relative(this.context.root, cachePath).startsWith('..')) { + tempOptions.push(cachePath); + } + } + + for (const tempOption of tempOptions) { + try { + const directory = resolve(this.context.root, tempOption); + if ((await fs.stat(directory)).isDirectory()) { + tempDirectory = directory; + break; + } + } catch {} + } + context.packageManager = await createPackageManager({ cwd: this.context.root, logger: this.context.logger, dryRun: context.dryRun, + tempDirectory, }); task.output = `Using package manager: ${color.dim(context.packageManager.name)}`; } From 158d7155b4b605293e2e933bb00314de9c59cb66 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:24:48 -0500 Subject: [PATCH 54/68] refactor(@angular/cli): improve error handling for package installation in ng add This change enhances the error handling in the 'ng add' command's 'installPackageTask'. It now specifically catches 'PackageManagerError' exceptions and surfaces the standard output or standard error from the underlying package manager process. This provides users with more actionable information when a package installation fails. --- packages/angular/cli/src/commands/add/cli.ts | 70 +++++++++++-------- .../angular/cli/src/package-managers/index.ts | 1 + 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/packages/angular/cli/src/commands/add/cli.ts b/packages/angular/cli/src/commands/add/cli.ts index 1ffc5ae29258..0531604d63d1 100644 --- a/packages/angular/cli/src/commands/add/cli.ts +++ b/packages/angular/cli/src/commands/add/cli.ts @@ -26,6 +26,7 @@ import { import { NgAddSaveDependency, PackageManager, + PackageManagerError, PackageManifest, PackageMetadata, createPackageManager, @@ -589,36 +590,47 @@ export default class AddCommandModule // Only show if installation will actually occur task.title = 'Installing package'; - if (context.savePackage === false) { - task.title += ' in temporary location'; - - // Temporary packages are located in a different directory - // Hence we need to resolve them using the temp path - const { workingDirectory } = await packageManager.acquireTempPackage( - packageIdentifier.toString(), - { - registry, - }, - ); - - const tempRequire = createRequire(workingDirectory + '/'); - assert(context.collectionName, 'Collection name should always be available'); - const resolvedCollectionPath = tempRequire.resolve( - join(context.collectionName, 'package.json'), - ); + try { + if (context.savePackage === false) { + task.title += ' in temporary location'; + + // Temporary packages are located in a different directory + // Hence we need to resolve them using the temp path + const { workingDirectory } = await packageManager.acquireTempPackage( + packageIdentifier.toString(), + { + registry, + }, + ); + + const tempRequire = createRequire(workingDirectory + '/'); + assert(context.collectionName, 'Collection name should always be available'); + const resolvedCollectionPath = tempRequire.resolve( + join(context.collectionName, 'package.json'), + ); + + context.collectionName = dirname(resolvedCollectionPath); + } else { + await packageManager.add( + packageIdentifier.toString(), + 'none', + savePackage !== 'dependencies', + false, + true, + { + registry, + }, + ); + } + } catch (e) { + if (e instanceof PackageManagerError) { + const output = e.stderr || e.stdout; + if (output) { + throw new CommandError(`Package installation failed: ${e.message}\nOutput: ${output}`); + } + } - context.collectionName = dirname(resolvedCollectionPath); - } else { - await packageManager.add( - packageIdentifier.toString(), - 'none', - savePackage !== 'dependencies', - false, - true, - { - registry, - }, - ); + throw e; } } diff --git a/packages/angular/cli/src/package-managers/index.ts b/packages/angular/cli/src/package-managers/index.ts index 002ade0cdb01..c622539fec2f 100644 --- a/packages/angular/cli/src/package-managers/index.ts +++ b/packages/angular/cli/src/package-managers/index.ts @@ -9,5 +9,6 @@ export { createPackageManager } from './factory'; export type { PackageManagerName } from './package-manager-descriptor'; export { PackageManager } from './package-manager'; +export { PackageManagerError } from './error'; export type * from './package-metadata'; export type { InstalledPackage } from './package-tree'; From d58c71416abbb8f4efaac9acd7d0183b16d37e0c Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 12 Jan 2026 12:54:51 -0500 Subject: [PATCH 55/68] refactor(@angular/cli): support copying config files to temp package directory This change adds support for copying package manager configuration files (like `bunfig.toml`) from the project root to the temporary directory used for acquiring packages. This is particularly necessary for Bun, which does not automatically inherit configuration from parent directories when running in a separate temporary location. --- packages/angular/cli/src/package-managers/host.ts | 13 +++++++++++-- .../package-manager-descriptor.ts | 15 +++++++++++++++ .../cli/src/package-managers/package-manager.ts | 12 ++++++++++++ .../cli/src/package-managers/testing/mock-host.ts | 4 ++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/angular/cli/src/package-managers/host.ts b/packages/angular/cli/src/package-managers/host.ts index e063a97de03d..4c8744fd8781 100644 --- a/packages/angular/cli/src/package-managers/host.ts +++ b/packages/angular/cli/src/package-managers/host.ts @@ -14,8 +14,8 @@ */ import { type SpawnOptions, spawn } from 'node:child_process'; -import { Stats } from 'node:fs'; -import { mkdtemp, readFile, readdir, rm, stat, writeFile } from 'node:fs/promises'; +import { Stats, constants } from 'node:fs'; +import { copyFile, mkdtemp, readFile, readdir, rm, stat, writeFile } from 'node:fs/promises'; import { platform, tmpdir } from 'node:os'; import { join } from 'node:path'; import { PackageManagerError } from './error'; @@ -45,6 +45,14 @@ export interface Host { */ readFile(path: string): Promise; + /** + * Copies a file from the source path to the destination path. + * @param src The path to the source file. + * @param dest The path to the destination file. + * @returns A promise that resolves when the copy is complete. + */ + copyFile(src: string, dest: string): Promise; + /** * Creates a new, unique temporary directory. * @param baseDir The base directory in which to create the temporary directory. @@ -94,6 +102,7 @@ export const NodeJS_HOST: Host = { stat, readdir, readFile: (path: string) => readFile(path, { encoding: 'utf8' }), + copyFile: (src, dest) => copyFile(src, dest, constants.COPYFILE_FICLONE), writeFile, createTempDirectory: (baseDir?: string) => mkdtemp(join(baseDir ?? tmpdir(), 'angular-cli-')), deleteDirectory: (path: string) => rm(path, { recursive: true, force: true }), diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index 631d444db93d..4bcc2f6afeed 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -65,6 +65,15 @@ export interface PackageManagerDescriptor { /** The flag to ignore peer dependency warnings/errors. */ readonly ignorePeerDependenciesFlag?: string; + /** The configuration files used by the package manager. */ + readonly configFiles: readonly string[]; + + /** + * Whether to copy configuration files from the project root to the temporary directory. + * This is necessary for package managers that do not inherit configuration from parent directories (e.g., bun). + */ + readonly copyConfigFromProject?: boolean; + /** A function that returns the arguments and environment variables to use a custom registry. */ readonly getRegistryOptions?: (registry: string) => { args?: string[]; @@ -144,6 +153,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { noLockfileFlag: '--no-package-lock', ignoreScriptsFlag: '--ignore-scripts', ignorePeerDependenciesFlag: '--force', + configFiles: ['.npmrc'], getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json=true', '--all=true'], @@ -168,6 +178,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { saveDevFlag: '--dev', noLockfileFlag: '', ignoreScriptsFlag: '--mode=skip-build', + configFiles: ['.yarnrc.yml', '.yarnrc.yaml'], getRegistryOptions: (registry: string) => ({ env: { YARN_NPM_REGISTRY_SERVER: registry } }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json', '--recursive=false'], @@ -195,6 +206,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { saveDevFlag: '--dev', noLockfileFlag: '--no-lockfile', ignoreScriptsFlag: '--ignore-scripts', + configFiles: ['.yarnrc', '.npmrc'], getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json'], @@ -220,6 +232,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { noLockfileFlag: '--no-lockfile', ignoreScriptsFlag: '--ignore-scripts', ignorePeerDependenciesFlag: '--strict-peer-dependencies=false', + configFiles: ['.npmrc', 'pnpm-workspace.yaml'], getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), versionCommand: ['--version'], listDependenciesCommand: ['list', '--depth=0', '--json'], @@ -244,6 +257,8 @@ export const SUPPORTED_PACKAGE_MANAGERS = { saveDevFlag: '--development', noLockfileFlag: '', // Bun does not have a flag for this. ignoreScriptsFlag: '--ignore-scripts', + configFiles: ['bunfig.toml', '.npmrc'], + copyConfigFromProject: true, getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), versionCommand: ['--version'], listDependenciesCommand: ['pm', 'ls', '--json'], diff --git a/packages/angular/cli/src/package-managers/package-manager.ts b/packages/angular/cli/src/package-managers/package-manager.ts index 55444266ffb9..1faedc5b155e 100644 --- a/packages/angular/cli/src/package-managers/package-manager.ts +++ b/packages/angular/cli/src/package-managers/package-manager.ts @@ -552,6 +552,18 @@ export class PackageManager { // Writing an empty package.json file beforehand prevents this. await this.host.writeFile(join(workingDirectory, 'package.json'), '{}'); + // Copy configuration files if the package manager requires it (e.g., bun). + if (this.descriptor.copyConfigFromProject) { + for (const configFile of this.descriptor.configFiles) { + try { + const configPath = join(this.cwd, configFile); + await this.host.copyFile(configPath, join(workingDirectory, configFile)); + } catch { + // Ignore missing config files. + } + } + } + const flags = [options.ignoreScripts ? this.descriptor.ignoreScriptsFlag : ''].filter( (flag) => flag, ); diff --git a/packages/angular/cli/src/package-managers/testing/mock-host.ts b/packages/angular/cli/src/package-managers/testing/mock-host.ts index af518553a61d..2411c8917318 100644 --- a/packages/angular/cli/src/package-managers/testing/mock-host.ts +++ b/packages/angular/cli/src/package-managers/testing/mock-host.ts @@ -62,4 +62,8 @@ export class MockHost implements Host { readFile(): Promise { throw new Error('Method not implemented.'); } + + copyFile(): Promise { + throw new Error('Method not implemented.'); + } } From 4330501d415489727b5113639695d9bae66e1de7 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 30 Dec 2025 13:09:08 -0500 Subject: [PATCH 56/68] test: skip unscoped auth E2E update tests on unsupported package managers This commit updates the `update-secure-registry` E2E test to skip unscoped authentication test cases when the active package manager is not Yarn, as other package managers may not support or correctly handle this setup in the test environment. --- .../tests/update/update-secure-registry.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tests/e2e/tests/update/update-secure-registry.ts b/tests/e2e/tests/update/update-secure-registry.ts index 27b772799566..b52d311a622f 100644 --- a/tests/e2e/tests/update/update-secure-registry.ts +++ b/tests/e2e/tests/update/update-secure-registry.ts @@ -6,6 +6,9 @@ import { getActivePackageManager } from '../../utils/packages'; import assert from 'node:assert'; export default async function () { + const packageManager = getActivePackageManager(); + const supportsUnscopedAuth = packageManager === 'yarn'; + // The environment variable has priority over the .npmrc delete process.env['NPM_CONFIG_REGISTRY']; const worksMessage = 'We analyzed your package.json'; @@ -16,10 +19,13 @@ export default async function () { } // Valid authentication token - await createNpmConfigForAuthentication(false); - const { stdout: stdout1 } = await ng('update', ...extraArgs); - if (!stdout1.includes(worksMessage)) { - throw new Error(`Expected stdout to contain "${worksMessage}"`); + + if (supportsUnscopedAuth) { + await createNpmConfigForAuthentication(false); + const { stdout: stdout1 } = await ng('update', ...extraArgs); + if (!stdout1.includes(worksMessage)) { + throw new Error(`Expected stdout to contain "${worksMessage}"`); + } } await createNpmConfigForAuthentication(true); @@ -29,8 +35,11 @@ export default async function () { } // Invalid authentication token - await createNpmConfigForAuthentication(false, true); - await expectToFail(() => ng('update', ...extraArgs)); + + if (supportsUnscopedAuth) { + await createNpmConfigForAuthentication(false, true); + await expectToFail(() => ng('update', ...extraArgs)); + } await createNpmConfigForAuthentication(true, true); await expectToFail(() => ng('update', ...extraArgs)); From a03098c8a9c2a0f7e87de867db54b064fcee93f7 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 30 Dec 2025 12:13:52 -0500 Subject: [PATCH 57/68] refactor(@angular/cli): add custom parser for bun pm ls Bun does not support JSON output for the `pm ls` command. This commit introduces a custom parser to interpret Bun's tree-like output format, allowing the package manager abstraction to correctly discover installed dependencies when using Bun. --- .../package-manager-descriptor.ts | 5 +- .../cli/src/package-managers/parsers.ts | 54 +++++++++++++++++++ .../cli/src/package-managers/parsers_spec.ts | 44 ++++++++++++++- 3 files changed, 100 insertions(+), 3 deletions(-) diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index 4bcc2f6afeed..ae49fe0c0f3e 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -17,6 +17,7 @@ import { Logger } from './logger'; import { PackageManifest, PackageMetadata } from './package-metadata'; import { InstalledPackage } from './package-tree'; import { + parseBunDependencies, parseNpmLikeDependencies, parseNpmLikeError, parseNpmLikeManifest, @@ -261,10 +262,10 @@ export const SUPPORTED_PACKAGE_MANAGERS = { copyConfigFromProject: true, getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), versionCommand: ['--version'], - listDependenciesCommand: ['pm', 'ls', '--json'], + listDependenciesCommand: ['pm', 'ls'], getManifestCommand: ['pm', 'view', '--json'], outputParsers: { - listDependencies: parseNpmLikeDependencies, + listDependencies: parseBunDependencies, getRegistryManifest: parseNpmLikeManifest, getRegistryMetadata: parseNpmLikeMetadata, getError: parseNpmLikeError, diff --git a/packages/angular/cli/src/package-managers/parsers.ts b/packages/angular/cli/src/package-managers/parsers.ts index ca52fd49d817..fb7084edbc4e 100644 --- a/packages/angular/cli/src/package-managers/parsers.ts +++ b/packages/angular/cli/src/package-managers/parsers.ts @@ -521,3 +521,57 @@ export function parseYarnClassicError(output: string, logger?: Logger): ErrorInf return null; } + +/** + * Parses the output of `bun pm ls`. + * + * Bun does not support JSON output for `pm ls`. The output is a tree structure: + * ``` + * /path/to/project node_modules (1084) + * ├── @angular/core@20.3.15 + * ├── rxjs @7.8.2 + * └── zone.js @0.15.1 + * ``` + * + * @param stdout The standard output of the command. + * @param logger An optional logger instance. + * @returns A map of package names to their installed package details. + */ +export function parseBunDependencies( + stdout: string, + logger?: Logger, +): Map { + logger?.debug('Parsing Bun dependency list...'); + logStdout(stdout, logger); + + const dependencies = new Map(); + if (!stdout) { + return dependencies; + } + + const lines = stdout.split('\n'); + // Skip the first line (project info) + for (let i = 1; i < lines.length; i++) { + const line = lines[i].trim(); + if (!line) { + continue; + } + + // Remove tree structure characters + const cleanLine = line.replace(/^[└├]──\s*/, ''); + + // Parse name and version + // Scoped: @angular/core@20.3.15 + // Unscoped: rxjs @7.8.2 + const match = cleanLine.match(/^(.+?)\s?@([^@\s]+)$/); + if (match) { + const name = match[1]; + const version = match[2]; + dependencies.set(name, { name, version }); + } + } + + logger?.debug(` Found ${dependencies.size} dependencies.`); + + return dependencies; +} diff --git a/packages/angular/cli/src/package-managers/parsers_spec.ts b/packages/angular/cli/src/package-managers/parsers_spec.ts index 3b831d71a286..524f376a8846 100644 --- a/packages/angular/cli/src/package-managers/parsers_spec.ts +++ b/packages/angular/cli/src/package-managers/parsers_spec.ts @@ -6,7 +6,12 @@ * found in the LICENSE file at https://angular.dev/license */ -import { parseNpmLikeError, parseNpmLikeManifest, parseYarnClassicError } from './parsers'; +import { + parseBunDependencies, + parseNpmLikeError, + parseNpmLikeManifest, + parseYarnClassicError, +} from './parsers'; describe('parsers', () => { describe('parseNpmLikeError', () => { @@ -128,4 +133,41 @@ describe('parsers', () => { expect(error).toBeNull(); }); }); + + describe('parseBunDependencies', () => { + it('should parse bun pm ls output', () => { + const stdout = ` +/tmp/angular-cli-e2e-PiL5n3/e2e-test/assets/19.0-project-1767113081927 node_modules (1084) +├── @angular-devkit/build-angular@20.3.13 +├── @angular/cli@20.3.13 +├── jasmine-core @5.6.0 +├── rxjs @7.8.2 +└── zone.js @0.15.1 +`.trim(); + + const deps = parseBunDependencies(stdout); + expect(deps.size).toBe(5); + expect(deps.get('@angular-devkit/build-angular')).toEqual({ + name: '@angular-devkit/build-angular', + version: '20.3.13', + }); + expect(deps.get('@angular/cli')).toEqual({ name: '@angular/cli', version: '20.3.13' }); + expect(deps.get('jasmine-core')).toEqual({ name: 'jasmine-core', version: '5.6.0' }); + expect(deps.get('rxjs')).toEqual({ name: 'rxjs', version: '7.8.2' }); + expect(deps.get('zone.js')).toEqual({ name: 'zone.js', version: '0.15.1' }); + }); + + it('should return empty map for empty stdout', () => { + expect(parseBunDependencies('').size).toBe(0); + }); + + it('should skip lines that do not match the pattern', () => { + const stdout = ` +project node_modules +├── invalid-line +└── another-invalid +`.trim(); + expect(parseBunDependencies(stdout).size).toBe(0); + }); + }); }); From 60a16dc0d6bd601a89c20abda82509e1441cd5fd Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 30 Dec 2025 10:55:26 -0500 Subject: [PATCH 58/68] refactor(@angular/cli): use package manager abstraction for update command dependencies This commit refactors the `ng update` command to use the `PackageManager` abstraction for discovering installed dependencies, replacing the previous file-system-based resolution logic. This change improves correctness (respecting package manager resolution strategies like PnP and workspaces) and performance (reducing initial file I/O). --- .../angular/cli/src/commands/update/cli.ts | 86 ++++++++++++------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/packages/angular/cli/src/commands/update/cli.ts b/packages/angular/cli/src/commands/update/cli.ts index 9b926cc079a2..b5f0be73539e 100644 --- a/packages/angular/cli/src/commands/update/cli.ts +++ b/packages/angular/cli/src/commands/update/cli.ts @@ -20,16 +20,16 @@ import { Options, } from '../../command-builder/command-module'; import { SchematicEngineHost } from '../../command-builder/utilities/schematic-engine-host'; -import { PackageManager, PackageManifest, createPackageManager } from '../../package-managers'; +import { + InstalledPackage, + PackageManager, + PackageManifest, + createPackageManager, +} from '../../package-managers'; import { colors } from '../../utilities/color'; import { disableVersionCheck } from '../../utilities/environment-options'; import { assertIsError } from '../../utilities/error'; -import { - PackageTreeNode, - findPackageJson, - getProjectDependencies, - readPackageJson, -} from '../../utilities/package-tree'; +import { findPackageJson } from '../../utilities/package-tree'; import { checkCLIVersion, coerceVersionNumber, @@ -242,7 +242,7 @@ export default class UpdateCommandModule extends CommandModule, + rootDependencies: Map, options: Options, + packageManager: PackageManager, ): Promise { const { logger } = this.context; - const packageDependency = rootDependencies.get(packageName); + let packageDependency = rootDependencies.get(packageName); let packagePath = packageDependency?.path; - let packageNode = packageDependency?.package; - if (packageDependency && !packageNode) { - logger.error('Package found in package.json but is not installed.'); + let packageNode: PackageManifest | undefined; - return 1; - } else if (!packageDependency) { - // Allow running migrations on transitively installed dependencies - // There can technically be nested multiple versions - // TODO: If multiple, this should find all versions and ask which one to use - const packageJson = findPackageJson(this.context.root, packageName); - if (packageJson) { - packagePath = path.dirname(packageJson); - packageNode = await readPackageJson(packageJson); + if (!packageDependency) { + const installed = await packageManager.getInstalledPackage(packageName); + if (installed) { + packageDependency = installed; + packagePath = installed.path; + } + } + + if (packagePath) { + packageNode = await readPackageManifest(path.join(packagePath, 'package.json')); + } + + if (!packageNode) { + const jsonPath = findPackageJson(this.context.root, packageName); + if (jsonPath) { + packageNode = await readPackageManifest(jsonPath); + + if (!packagePath) { + packagePath = path.dirname(jsonPath); + } } } @@ -399,7 +415,7 @@ export default class UpdateCommandModule extends CommandModule, + rootDependencies: Map, options: Options, packages: npa.Result[], packageManager: PackageManager, @@ -414,21 +430,21 @@ export default class UpdateCommandModule extends CommandModule { + try { + const content = await fs.readFile(manifestPath, 'utf8'); + + return JSON.parse(content) as PackageManifest; + } catch { + return undefined; + } +} From a4573779449b33467b7ba698cd9e314fe30b2a43 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:11:28 -0500 Subject: [PATCH 59/68] refactor(@angular/cli): update yarn modern dependency parsing This commit updates the dependency discovery logic for Yarn Modern (Berry) to use the `yarn info --name-only --json` command, as the `list` command is not available in newer versions of Yarn. --- .../package-manager-descriptor.ts | 2 +- .../cli/src/package-managers/parsers.ts | 124 ++++++++---------- .../cli/src/package-managers/parsers_spec.ts | 35 +++++ 3 files changed, 92 insertions(+), 69 deletions(-) diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index ae49fe0c0f3e..34db06b64c99 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -182,7 +182,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { configFiles: ['.yarnrc.yml', '.yarnrc.yaml'], getRegistryOptions: (registry: string) => ({ env: { YARN_NPM_REGISTRY_SERVER: registry } }), versionCommand: ['--version'], - listDependenciesCommand: ['list', '--depth=0', '--json', '--recursive=false'], + listDependenciesCommand: ['info', '--name-only', '--json'], getManifestCommand: ['npm', 'info', '--json'], viewCommandFieldArgFormatter: (fields) => ['--fields', fields.join(',')], outputParsers: { diff --git a/packages/angular/cli/src/package-managers/parsers.ts b/packages/angular/cli/src/package-managers/parsers.ts index fb7084edbc4e..3c64cb4a7856 100644 --- a/packages/angular/cli/src/package-managers/parsers.ts +++ b/packages/angular/cli/src/package-managers/parsers.ts @@ -170,74 +170,6 @@ export function parseYarnClassicDependencies( return dependencies; } -/** - * Parses the output of `yarn list` (modern). - * - * The expected JSON structure is a single object. - * Yarn modern does not provide a path, so the `path` property will be `undefined`. - * - * ```json - * { - * "trees": [ - * { "name": "@angular/cli@18.0.0", "children": [] } - * ] - * } - * ``` - * - * @param stdout The standard output of the command. - * @param logger An optional logger instance. - * @returns A map of package names to their installed package details. - */ -export function parseYarnModernDependencies( - stdout: string, - logger?: Logger, -): Map { - logger?.debug(`Parsing yarn modern dependency list...`); - logStdout(stdout, logger); - - const dependencies = new Map(); - if (!stdout) { - logger?.debug(' stdout is empty. No dependencies found.'); - - return dependencies; - } - - // Modern yarn `list` command outputs a single JSON object with a `trees` property. - // Each line is not a separate JSON object. - try { - const data = JSON.parse(stdout); - for (const info of data.trees) { - const name = info.name.split('@')[0]; - const version = info.name.split('@').pop(); - dependencies.set(name, { - name, - version, - }); - } - } catch (e) { - logger?.debug( - ` Failed to parse as single JSON object: ${e}. Falling back to line-by-line parsing.`, - ); - // Fallback for older versions of yarn berry that might still output json lines - for (const json of parseJsonLines(stdout, logger)) { - if (json.type === 'tree' && json.data?.trees) { - for (const info of json.data.trees) { - const name = info.name.split('@')[0]; - const version = info.name.split('@').pop(); - dependencies.set(name, { - name, - version, - }); - } - } - } - } - - logger?.debug(` Found ${dependencies.size} dependencies.`); - - return dependencies; -} - /** * Parses the output of `npm view` or a compatible command to get a package manifest. * @param stdout The standard output of the command. @@ -575,3 +507,59 @@ export function parseBunDependencies( return dependencies; } + +/** + * Parses the output of `yarn info --name-only --json`. + * + * The expected output is a JSON stream (JSONL) of strings. + * Each string represents a package locator. + * + * ``` + * "karma@npm:6.4.4" + * "@angular/core@npm:20.3.15" + * ``` + * + * @param stdout The standard output of the command. + * @param logger An optional logger instance. + * @returns A map of package names to their installed package details. + */ +export function parseYarnModernDependencies( + stdout: string, + logger?: Logger, +): Map { + logger?.debug('Parsing Yarn Berry dependency list...'); + logStdout(stdout, logger); + + const dependencies = new Map(); + if (!stdout) { + return dependencies; + } + + for (const json of parseJsonLines(stdout, logger)) { + if (typeof json === 'string') { + const match = json.match(/^(@?[^@]+)@(.+)$/); + if (match) { + const name = match[1]; + let version = match[2]; + + // Handle "npm:" prefix + if (version.startsWith('npm:')) { + version = version.slice(4); + } + + // Handle complex locators with embedded version metadata (e.g., "patch:...", "virtual:...") + // Yarn Berry often appends metadata like "::version=x.y.z" + const versionParamMatch = version.match(/::version=([^&]+)/); + if (versionParamMatch) { + version = versionParamMatch[1]; + } + + dependencies.set(name, { name, version }); + } + } + } + + logger?.debug(` Found ${dependencies.size} dependencies.`); + + return dependencies; +} diff --git a/packages/angular/cli/src/package-managers/parsers_spec.ts b/packages/angular/cli/src/package-managers/parsers_spec.ts index 524f376a8846..aec708c00360 100644 --- a/packages/angular/cli/src/package-managers/parsers_spec.ts +++ b/packages/angular/cli/src/package-managers/parsers_spec.ts @@ -11,6 +11,7 @@ import { parseNpmLikeError, parseNpmLikeManifest, parseYarnClassicError, + parseYarnModernDependencies, } from './parsers'; describe('parsers', () => { @@ -170,4 +171,38 @@ project node_modules expect(parseBunDependencies(stdout).size).toBe(0); }); }); + + describe('parseYarnModernDependencies', () => { + it('should parse yarn info --name-only --json output', () => { + const stdout = ` +"karma@npm:6.4.4" +"rxjs@npm:7.8.2" +"tslib@npm:2.8.1" +"typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" +`.trim(); + + const deps = parseYarnModernDependencies(stdout); + expect(deps.size).toBe(4); + expect(deps.get('karma')).toEqual({ name: 'karma', version: '6.4.4' }); + expect(deps.get('rxjs')).toEqual({ name: 'rxjs', version: '7.8.2' }); + expect(deps.get('tslib')).toEqual({ name: 'tslib', version: '2.8.1' }); + expect(deps.get('typescript')).toEqual({ + name: 'typescript', + version: '5.9.3', + }); + }); + + it('should handle scoped packages', () => { + const stdout = '"@angular/core@npm:20.3.15"'; + const deps = parseYarnModernDependencies(stdout); + expect(deps.get('@angular/core')).toEqual({ + name: '@angular/core', + version: '20.3.15', + }); + }); + + it('should return empty map for empty stdout', () => { + expect(parseYarnModernDependencies('').size).toBe(0); + }); + }); }); From d9cd609c5d13fe492b1f31973d9be518f8529387 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:25:47 -0500 Subject: [PATCH 60/68] fix(@angular/cli): correctly parse scoped packages in yarn classic list output The `parseYarnClassicDependencies` function incorrectly parsed scoped packages (e.g., `@angular/core@18.0.0`) by splitting at the first `@`, resulting in an empty name. This commit updates the logic to split at the last `@`, ensuring scoped package names are correctly identified. --- .../cli/src/package-managers/parsers.ts | 6 ++-- .../cli/src/package-managers/parsers_spec.ts | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/angular/cli/src/package-managers/parsers.ts b/packages/angular/cli/src/package-managers/parsers.ts index 3c64cb4a7856..c9f7fb235087 100644 --- a/packages/angular/cli/src/package-managers/parsers.ts +++ b/packages/angular/cli/src/package-managers/parsers.ts @@ -155,8 +155,10 @@ export function parseYarnClassicDependencies( for (const json of parseJsonLines(stdout, logger)) { if (json.type === 'tree' && json.data?.trees) { for (const info of json.data.trees) { - const name = info.name.split('@')[0]; - const version = info.name.split('@').pop(); + const lastAtIndex = info.name.lastIndexOf('@'); + const name = info.name.slice(0, lastAtIndex); + const version = info.name.slice(lastAtIndex + 1); + dependencies.set(name, { name, version, diff --git a/packages/angular/cli/src/package-managers/parsers_spec.ts b/packages/angular/cli/src/package-managers/parsers_spec.ts index aec708c00360..2fa8abdc1e32 100644 --- a/packages/angular/cli/src/package-managers/parsers_spec.ts +++ b/packages/angular/cli/src/package-managers/parsers_spec.ts @@ -10,6 +10,7 @@ import { parseBunDependencies, parseNpmLikeError, parseNpmLikeManifest, + parseYarnClassicDependencies, parseYarnClassicError, parseYarnModernDependencies, } from './parsers'; @@ -135,6 +136,38 @@ describe('parsers', () => { }); }); + describe('parseYarnClassicDependencies', () => { + it('should parse yarn classic list output', () => { + const stdout = JSON.stringify({ + type: 'tree', + data: { + trees: [{ name: 'rxjs@7.8.2', children: [] }], + }, + }); + + const deps = parseYarnClassicDependencies(stdout); + expect(deps.size).toBe(1); + expect(deps.get('rxjs')).toEqual({ name: 'rxjs', version: '7.8.2' }); + }); + + it('should handle scoped packages', () => { + const stdout = JSON.stringify({ + type: 'tree', + data: { + trees: [{ name: '@angular/core@18.0.0', children: [] }], + }, + }); + + const deps = parseYarnClassicDependencies(stdout); + expect(deps.size).toBe(1); + expect(deps.get('@angular/core')).toEqual({ name: '@angular/core', version: '18.0.0' }); + }); + + it('should return empty map for empty stdout', () => { + expect(parseYarnClassicDependencies('').size).toBe(0); + }); + }); + describe('parseBunDependencies', () => { it('should parse bun pm ls output', () => { const stdout = ` From 8ba696742dcc7ba874970c6bb1b41b80e1c5c3c3 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 12 Jan 2026 12:54:51 -0500 Subject: [PATCH 61/68] refactor: improve `findUp` utility correctness and performance This change modernizes the `findUp` utility across the codebase. Replaced `path.parse().root` with `path.dirname(dir) === dir` check. Introduced an asynchronous version (`findUp`) in the CLI utility and renamed the synchronous version to `findUpSync` to align with Node.js conventions. Updated `packages/angular/cli/src/utilities/config.ts` to use the asynchronous `findUp` for non-blocking configuration discovery. --- packages/angular/cli/src/utilities/config.ts | 14 ++--- packages/angular/cli/src/utilities/find-up.ts | 62 ++++++++++++++++--- packages/angular/cli/src/utilities/project.ts | 4 +- .../angular_devkit/architect/bin/architect.ts | 18 +++--- .../schematics_cli/bin/schematics.ts | 18 +++--- 5 files changed, 81 insertions(+), 35 deletions(-) diff --git a/packages/angular/cli/src/utilities/config.ts b/packages/angular/cli/src/utilities/config.ts index 25f8dfb2f896..dfe21fa96692 100644 --- a/packages/angular/cli/src/utilities/config.ts +++ b/packages/angular/cli/src/utilities/config.ts @@ -11,7 +11,7 @@ import { existsSync, promises as fs } from 'node:fs'; import * as os from 'node:os'; import * as path from 'node:path'; import { PackageManager } from '../../lib/config/workspace-schema'; -import { findUp } from './find-up'; +import { findUp, findUpSync } from './find-up'; import { JSONFile, readAndParseJson } from './json-file'; function isJsonObject(value: json.JsonValue | undefined): value is json.JsonObject { @@ -70,13 +70,13 @@ function xdgConfigHomeOld(home: string): string { return path.join(p, '.angular-config.json'); } -function projectFilePath(projectPath?: string): string | null { +async function projectFilePath(projectPath?: string): Promise { // Find the configuration, either where specified, in the Angular CLI project // (if it's in node_modules) or from the current process. return ( - (projectPath && findUp(configNames, projectPath)) || - findUp(configNames, process.cwd()) || - findUp(configNames, __dirname) + (projectPath && (await findUp(configNames, projectPath))) || + (await findUp(configNames, process.cwd())) || + (await findUp(configNames, __dirname)) ); } @@ -181,7 +181,7 @@ export async function getWorkspace( return cachedWorkspaces.get(level); } - const configPath = level === 'local' ? projectFilePath() : globalFilePath(); + const configPath = level === 'local' ? await projectFilePath() : globalFilePath(); if (!configPath) { if (level === 'global') { // Unlike a local config, a global config is not mandatory. @@ -223,7 +223,7 @@ export async function getWorkspace( export async function getWorkspaceRaw( level: 'local' | 'global' = 'local', ): Promise<[JSONFile | null, string | null]> { - let configPath = level === 'local' ? projectFilePath() : globalFilePath(); + let configPath = level === 'local' ? await projectFilePath() : globalFilePath(); if (!configPath) { if (level === 'global') { diff --git a/packages/angular/cli/src/utilities/find-up.ts b/packages/angular/cli/src/utilities/find-up.ts index 317c8d8497f5..f088105b0558 100644 --- a/packages/angular/cli/src/utilities/find-up.ts +++ b/packages/angular/cli/src/utilities/find-up.ts @@ -7,24 +7,66 @@ */ import { existsSync } from 'node:fs'; -import * as path from 'node:path'; +import { stat } from 'node:fs/promises'; +import { dirname, join, resolve } from 'node:path'; -export function findUp(names: string | string[], from: string) { - if (!Array.isArray(names)) { - names = [names]; +/** + * Find a file or directory by walking up the directory tree. + * @param names The name or names of the files or directories to find. + * @param from The directory to start the search from. + * @returns The path to the first match found, or `null` if no match was found. + */ +export async function findUp(names: string | string[], from: string): Promise { + const filenames = Array.isArray(names) ? names : [names]; + + let currentDir = resolve(from); + while (true) { + for (const name of filenames) { + const p = join(currentDir, name); + try { + await stat(p); + + return p; + } catch { + // Ignore errors (e.g. file not found). + } + } + + const parentDir = dirname(currentDir); + if (parentDir === currentDir) { + break; + } + + currentDir = parentDir; } - const root = path.parse(from).root; - let currentDir = from; - while (currentDir && currentDir !== root) { - for (const name of names) { - const p = path.join(currentDir, name); + return null; +} + +/** + * Synchronously find a file or directory by walking up the directory tree. + * @param names The name or names of the files or directories to find. + * @param from The directory to start the search from. + * @returns The path to the first match found, or `null` if no match was found. + */ +export function findUpSync(names: string | string[], from: string): string | null { + const filenames = Array.isArray(names) ? names : [names]; + + let currentDir = resolve(from); + while (true) { + for (const name of filenames) { + const p = join(currentDir, name); if (existsSync(p)) { return p; } } - currentDir = path.dirname(currentDir); + const parentDir = dirname(currentDir); + if (parentDir === currentDir) { + break; + } + + currentDir = parentDir; } return null; diff --git a/packages/angular/cli/src/utilities/project.ts b/packages/angular/cli/src/utilities/project.ts index 39ce2e6d3e83..12ca07545342 100644 --- a/packages/angular/cli/src/utilities/project.ts +++ b/packages/angular/cli/src/utilities/project.ts @@ -10,7 +10,7 @@ import { normalize } from '@angular-devkit/core'; import * as fs from 'node:fs'; import * as os from 'node:os'; import * as path from 'node:path'; -import { findUp } from './find-up'; +import { findUpSync } from './find-up'; interface PackageDependencies { dependencies?: Record; @@ -19,7 +19,7 @@ interface PackageDependencies { export function findWorkspaceFile(currentDirectory = process.cwd()): string | null { const possibleConfigFiles = ['angular.json', '.angular.json']; - const configFilePath = findUp(possibleConfigFiles, currentDirectory); + const configFilePath = findUpSync(possibleConfigFiles, currentDirectory); if (configFilePath === null) { return null; } diff --git a/packages/angular_devkit/architect/bin/architect.ts b/packages/angular_devkit/architect/bin/architect.ts index acfd798b89a2..b4513721a1da 100644 --- a/packages/angular_devkit/architect/bin/architect.ts +++ b/packages/angular_devkit/architect/bin/architect.ts @@ -16,21 +16,23 @@ import { Architect } from '../index'; import { WorkspaceNodeModulesArchitectHost } from '../node/index'; function findUp(names: string | string[], from: string) { - if (!Array.isArray(names)) { - names = [names]; - } - const root = path.parse(from).root; + const filenames = Array.isArray(names) ? names : [names]; - let currentDir = from; - while (currentDir && currentDir !== root) { - for (const name of names) { + let currentDir = path.resolve(from); + while (true) { + for (const name of filenames) { const p = path.join(currentDir, name); if (existsSync(p)) { return p; } } - currentDir = path.dirname(currentDir); + const parentDir = path.dirname(currentDir); + if (parentDir === currentDir) { + break; + } + + currentDir = parentDir; } return null; diff --git a/packages/angular_devkit/schematics_cli/bin/schematics.ts b/packages/angular_devkit/schematics_cli/bin/schematics.ts index 8dc64ff5eae0..109497dd89e1 100644 --- a/packages/angular_devkit/schematics_cli/bin/schematics.ts +++ b/packages/angular_devkit/schematics_cli/bin/schematics.ts @@ -177,21 +177,23 @@ function _createPromptProvider(): schema.PromptProvider { } function findUp(names: string | string[], from: string) { - if (!Array.isArray(names)) { - names = [names]; - } - const root = path.parse(from).root; + const filenames = Array.isArray(names) ? names : [names]; - let currentDir = from; - while (currentDir && currentDir !== root) { - for (const name of names) { + let currentDir = path.resolve(from); + while (true) { + for (const name of filenames) { const p = path.join(currentDir, name); if (existsSync(p)) { return p; } } - currentDir = path.dirname(currentDir); + const parentDir = path.dirname(currentDir); + if (parentDir === currentDir) { + break; + } + + currentDir = parentDir; } return null; From 2f0599a61465826eb955500ea0899967ebdff7f8 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:28:24 -0500 Subject: [PATCH 62/68] refactor(@angular/cli): remove resolve dependency and use native require.resolve This commit removes the `resolve` dependency from `@angular/cli` and replaces its usage with native `require.resolve` via `createRequire`. The `findPackageJson` utility is now only used in migration-only scenarios where the Node.js module caching behavior that prompted the original use of `resolve` is no longer a concern. This reduces the package dependency footprint. --- package.json | 1 - packages/angular/cli/BUILD.bazel | 2 -- packages/angular/cli/package.json | 1 - packages/angular/cli/src/utilities/package-tree.ts | 6 +++--- pnpm-lock.yaml | 11 ----------- 5 files changed, 3 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index ac935c4ead6a..4f136df9262b 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,6 @@ "@types/pacote": "^11.1.3", "@types/picomatch": "^4.0.0", "@types/progress": "^2.0.3", - "@types/resolve": "^1.17.1", "@types/semver": "^7.3.12", "@types/watchpack": "^2.4.4", "@types/yargs": "^17.0.20", diff --git a/packages/angular/cli/BUILD.bazel b/packages/angular/cli/BUILD.bazel index abed616cd810..6d33838ae2e7 100644 --- a/packages/angular/cli/BUILD.bazel +++ b/packages/angular/cli/BUILD.bazel @@ -72,7 +72,6 @@ ts_project( ":node_modules/npm-package-arg", ":node_modules/pacote", ":node_modules/parse5-html-rewriting-stream", - ":node_modules/resolve", ":node_modules/yargs", ":node_modules/zod", "//:node_modules/@angular/core", @@ -80,7 +79,6 @@ ts_project( "//:node_modules/@types/node", "//:node_modules/@types/npm-package-arg", "//:node_modules/@types/pacote", - "//:node_modules/@types/resolve", "//:node_modules/@types/semver", "//:node_modules/@types/yargs", "//:node_modules/@types/yarnpkg__lockfile", diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json index 8872ceeee5b0..452594492313 100644 --- a/packages/angular/cli/package.json +++ b/packages/angular/cli/package.json @@ -37,7 +37,6 @@ "npm-package-arg": "13.0.2", "pacote": "21.0.4", "parse5-html-rewriting-stream": "8.0.0", - "resolve": "1.22.11", "semver": "7.7.3", "yargs": "18.0.0", "zod": "4.3.5" diff --git a/packages/angular/cli/src/utilities/package-tree.ts b/packages/angular/cli/src/utilities/package-tree.ts index 14e8a9edd689..3153d8966144 100644 --- a/packages/angular/cli/src/utilities/package-tree.ts +++ b/packages/angular/cli/src/utilities/package-tree.ts @@ -7,8 +7,8 @@ */ import * as fs from 'node:fs'; +import { createRequire } from 'node:module'; import { dirname, join } from 'node:path'; -import * as resolve from 'resolve'; import { NgAddSaveDependency } from './package-metadata'; interface PackageJson { @@ -52,8 +52,8 @@ export async function readPackageJson(packageJsonPath: string): Promise Date: Mon, 12 Jan 2026 16:56:08 -0500 Subject: [PATCH 63/68] refactor(@angular/cli): remove unused package-tree utilities This commit removes the unused `package-tree.ts` utilities, including `getProjectDependencies`, `readPackageJson`, and `PackageTreeNode`. The `findPackageJson` function, which was the only remaining used part, has been moved directly into `commands/update/cli.ts` where it is consumed. --- .../angular/cli/src/commands/update/cli.ts | 12 ++- .../angular/cli/src/utilities/package-tree.ts | 86 ------------------- 2 files changed, 11 insertions(+), 87 deletions(-) delete mode 100644 packages/angular/cli/src/utilities/package-tree.ts diff --git a/packages/angular/cli/src/commands/update/cli.ts b/packages/angular/cli/src/commands/update/cli.ts index b5f0be73539e..8703eb017f24 100644 --- a/packages/angular/cli/src/commands/update/cli.ts +++ b/packages/angular/cli/src/commands/update/cli.ts @@ -29,7 +29,6 @@ import { import { colors } from '../../utilities/color'; import { disableVersionCheck } from '../../utilities/environment-options'; import { assertIsError } from '../../utilities/error'; -import { findPackageJson } from '../../utilities/package-tree'; import { checkCLIVersion, coerceVersionNumber, @@ -697,3 +696,14 @@ async function readPackageManifest(manifestPath: string): Promise; - devDependencies?: Record; - peerDependencies?: Record; - optionalDependencies?: Record; - 'ng-update'?: { - migrations?: string; - }; - 'ng-add'?: { - save?: NgAddSaveDependency; - }; -} - -function getAllDependencies(pkg: PackageJson): Set<[string, string]> { - return new Set([ - ...Object.entries(pkg.dependencies || []), - ...Object.entries(pkg.devDependencies || []), - ...Object.entries(pkg.peerDependencies || []), - ...Object.entries(pkg.optionalDependencies || []), - ]); -} - -export interface PackageTreeNode { - name: string; - version: string; - path: string; - package: PackageJson | undefined; -} - -export async function readPackageJson(packageJsonPath: string): Promise { - try { - return JSON.parse((await fs.promises.readFile(packageJsonPath)).toString()) as PackageJson; - } catch { - return undefined; - } -} - -export function findPackageJson(workspaceDir: string, packageName: string): string | undefined { - try { - const projectRequire = createRequire(join(workspaceDir, 'package.json')); - const packageJsonPath = projectRequire.resolve(`${packageName}/package.json`); - - return packageJsonPath; - } catch { - return undefined; - } -} - -export async function getProjectDependencies(dir: string): Promise> { - const pkg = await readPackageJson(join(dir, 'package.json')); - if (!pkg) { - throw new Error('Could not find package.json'); - } - - const results = new Map(); - for (const [name, version] of getAllDependencies(pkg)) { - const packageJsonPath = findPackageJson(dir, name); - if (!packageJsonPath) { - continue; - } - - results.set(name, { - name, - version, - path: dirname(packageJsonPath), - package: await readPackageJson(packageJsonPath), - }); - } - - return results; -} From fd1a2091d20709781438e1c588a79e8c93cf5183 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sat, 10 Jan 2026 17:49:50 +0200 Subject: [PATCH 64/68] fix(@angular/ssr): handle platform destruction during rendering Fixes crash when platform/app destroys itself during the bootstrapping and stabilization phase. Previously, the code would call `applicationRef.injector` without checking if the platform was destroyed, resulting in: "Error: Injector has already been destroyed" This can occur when: - Component constructor calls `inject(PlatformRef).destroy()` - AbortSignal triggers during request handling - APP_INITIALIZER rejects and causes cleanup - Custom guard/resolver logic destroys the platform Solution: Check `applicationRef.destroyed` after `whenStable()` and return error state instead of accessing destroyed injector. Test: Added test case that destroys app in component constructor to verify graceful handling of this edge case. --- packages/angular/ssr/src/utils/ng.ts | 12 +++++++++++- packages/angular/ssr/test/app_spec.ts | 21 +++++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/packages/angular/ssr/src/utils/ng.ts b/packages/angular/ssr/src/utils/ng.ts index 16e059e6aaf2..acf2df180f32 100644 --- a/packages/angular/ssr/src/utils/ng.ts +++ b/packages/angular/ssr/src/utils/ng.ts @@ -59,7 +59,10 @@ export async function renderAngular( url: URL, platformProviders: StaticProvider[], serverContext: string, -): Promise<{ hasNavigationError: boolean; redirectTo?: string; content: () => Promise }> { +): Promise< + | { hasNavigationError: true } + | { hasNavigationError: boolean; redirectTo?: string; content: () => Promise } +> { // A request to `http://www.example.com/page/index.html` will render the Angular route corresponding to `http://www.example.com/page`. const urlToRender = stripIndexHtmlFromURL(url); const platformRef = platformServer([ @@ -100,6 +103,13 @@ export async function renderAngular( // Block until application is stable. await applicationRef.whenStable(); + // This code protect against app destruction during bootstrapping which is a + // valid case. We should not assume the `applicationRef` is not in destroyed state. + // Calling `envInjector.get` would throw `NG0205: Injector has already been destroyed`. + if (applicationRef.destroyed) { + return { hasNavigationError: true }; + } + // TODO(alanagius): Find a way to avoid rendering here especially for redirects as any output will be discarded. const envInjector = applicationRef.injector; const routerIsProvided = !!envInjector.get(ActivatedRoute, null); diff --git a/packages/angular/ssr/test/app_spec.ts b/packages/angular/ssr/test/app_spec.ts index 9584feafeb72..a72c4d75fae2 100644 --- a/packages/angular/ssr/test/app_spec.ts +++ b/packages/angular/ssr/test/app_spec.ts @@ -12,8 +12,8 @@ import '@angular/compiler'; /* eslint-enable import/no-unassigned-import */ import { APP_BASE_HREF } from '@angular/common'; -import { Component, REQUEST, RESPONSE_INIT, inject } from '@angular/core'; -import { CanActivateFn, Router } from '@angular/router'; +import { Component, PlatformRef, REQUEST, RESPONSE_INIT, inject } from '@angular/core'; +import { ActivatedRoute, CanActivateFn, Router } from '@angular/router'; import { AngularServerApp } from '../src/app'; import { RenderMode } from '../src/routes/route-config'; import { setAngularAppTestingManifest } from './testing-utils'; @@ -26,7 +26,13 @@ describe('AngularServerApp', () => { selector: 'app-home', template: `Home works`, }) - class HomeComponent {} + class HomeComponent { + constructor() { + if (inject(ActivatedRoute).snapshot.data['destroyApp']) { + inject(PlatformRef).destroy(); + } + } + } @Component({ selector: 'app-redirect', @@ -65,7 +71,7 @@ describe('AngularServerApp', () => { { path: 'home-ssg', component: HomeComponent }, { path: 'page-with-headers', component: HomeComponent }, { path: 'page-with-status', component: HomeComponent }, - + { path: 'page-destroy-app', component: HomeComponent, data: { destroyApp: true } }, { path: 'redirect', redirectTo: 'home' }, { path: 'redirect-via-navigate', component: RedirectComponent }, { @@ -227,6 +233,13 @@ describe('AngularServerApp', () => { expect(response?.status).toBe(201); }); + it('should not throw an error when app destroys itself', async () => { + const response = await app.handle(new Request('http://localhost/page-destroy-app')); + // The test expects response to be null, which is reasonable - if the app destroys + // itself, there's nothing to render. + expect(response).toBeNull(); + }); + it('should return static `index.csr.html` for routes with CSR rendering mode', async () => { const response = await app.handle(new Request('http://localhost/home-csr')); const content = await response?.text(); From 712f5081f0d3a398b61b6ad3217bf5a8be9be928 Mon Sep 17 00:00:00 2001 From: MeAkib Date: Tue, 13 Jan 2026 00:23:34 +0600 Subject: [PATCH 65/68] refactor: update copyright from Google Inc to Google LLC Update all copyright headers throughout the codebase to reflect the current legal entity name. This is a non-functional change that only affects the copyright notices in source files. --- packages/angular/cli/BUILD.bazel | 2 +- packages/angular/create/BUILD.bazel | 2 +- packages/angular/pwa/BUILD.bazel | 2 +- packages/angular/ssr/schematics/BUILD.bazel | 2 +- packages/angular_devkit/architect/BUILD.bazel | 2 +- packages/angular_devkit/architect/bin/BUILD.bazel | 2 +- packages/angular_devkit/architect/node/BUILD.bazel | 2 +- packages/angular_devkit/architect/testing/BUILD.bazel | 2 +- packages/angular_devkit/architect_cli/BUILD.bazel | 2 +- packages/angular_devkit/build_angular/BUILD.bazel | 2 +- packages/angular_devkit/build_webpack/BUILD.bazel | 2 +- packages/angular_devkit/core/BUILD.bazel | 2 +- packages/angular_devkit/core/node/BUILD.bazel | 2 +- packages/angular_devkit/core/node/testing/BUILD.bazel | 2 +- packages/angular_devkit/schematics/BUILD.bazel | 2 +- packages/angular_devkit/schematics/tasks/BUILD.bazel | 2 +- packages/angular_devkit/schematics/tasks/node/BUILD.bazel | 2 +- packages/angular_devkit/schematics/testing/BUILD.bazel | 2 +- packages/angular_devkit/schematics/tools/BUILD.bazel | 2 +- packages/angular_devkit/schematics_cli/BUILD.bazel | 2 +- packages/ngtools/webpack/BUILD.bazel | 2 +- packages/schematics/angular/BUILD.bazel | 2 +- .../schematics/tools/file-system-engine-host/BUILD.bazel | 2 +- tools/link_package_json_to_tarballs.bzl | 2 +- tools/package_json_release_filter.jq | 2 +- tools/snapshot_repo_filter.bzl | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/angular/cli/BUILD.bazel b/packages/angular/cli/BUILD.bazel index 6d33838ae2e7..0eac4a2cede9 100644 --- a/packages/angular/cli/BUILD.bazel +++ b/packages/angular/cli/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular/create/BUILD.bazel b/packages/angular/create/BUILD.bazel index 87c1896531d1..713eae80a7e5 100644 --- a/packages/angular/create/BUILD.bazel +++ b/packages/angular/create/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular/pwa/BUILD.bazel b/packages/angular/pwa/BUILD.bazel index 6cdb370a397b..08bf428c81d5 100644 --- a/packages/angular/pwa/BUILD.bazel +++ b/packages/angular/pwa/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular/ssr/schematics/BUILD.bazel b/packages/angular/ssr/schematics/BUILD.bazel index b0d2d0b9cbd8..531a17f49aa2 100644 --- a/packages/angular/ssr/schematics/BUILD.bazel +++ b/packages/angular/ssr/schematics/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/architect/BUILD.bazel b/packages/angular_devkit/architect/BUILD.bazel index 92fce0d2bfb3..8a1ce9945f6a 100644 --- a/packages/angular_devkit/architect/BUILD.bazel +++ b/packages/angular_devkit/architect/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/architect/bin/BUILD.bazel b/packages/angular_devkit/architect/bin/BUILD.bazel index cb7d761ac84d..8b3162a83225 100644 --- a/packages/angular_devkit/architect/bin/BUILD.bazel +++ b/packages/angular_devkit/architect/bin/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/architect/node/BUILD.bazel b/packages/angular_devkit/architect/node/BUILD.bazel index fad21dd46480..052175d8656b 100644 --- a/packages/angular_devkit/architect/node/BUILD.bazel +++ b/packages/angular_devkit/architect/node/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/architect/testing/BUILD.bazel b/packages/angular_devkit/architect/testing/BUILD.bazel index b2ff4a345e3a..4fffb6e5406b 100644 --- a/packages/angular_devkit/architect/testing/BUILD.bazel +++ b/packages/angular_devkit/architect/testing/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/architect_cli/BUILD.bazel b/packages/angular_devkit/architect_cli/BUILD.bazel index 291238b8d897..98cfd7606b81 100644 --- a/packages/angular_devkit/architect_cli/BUILD.bazel +++ b/packages/angular_devkit/architect_cli/BUILD.bazel @@ -1,7 +1,7 @@ load("@npm//:defs.bzl", "npm_link_all_packages") load("//tools:defaults.bzl", "npm_package") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel index 9d145d03682c..6e4fba869d9f 100644 --- a/packages/angular_devkit/build_angular/BUILD.bazel +++ b/packages/angular_devkit/build_angular/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/build_webpack/BUILD.bazel b/packages/angular_devkit/build_webpack/BUILD.bazel index 3a104c243a66..10b435d66e06 100644 --- a/packages/angular_devkit/build_webpack/BUILD.bazel +++ b/packages/angular_devkit/build_webpack/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/core/BUILD.bazel b/packages/angular_devkit/core/BUILD.bazel index b59c5bd37987..d57bd782596b 100644 --- a/packages/angular_devkit/core/BUILD.bazel +++ b/packages/angular_devkit/core/BUILD.bazel @@ -2,7 +2,7 @@ load("@devinfra//bazel/api-golden:index.bzl", "api_golden_test_npm_package") load("@npm//:defs.bzl", "npm_link_all_packages") load("//tools:defaults.bzl", "jasmine_test", "npm_package", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/core/node/BUILD.bazel b/packages/angular_devkit/core/node/BUILD.bazel index 83e49baecd78..9c6f34c3a51f 100644 --- a/packages/angular_devkit/core/node/BUILD.bazel +++ b/packages/angular_devkit/core/node/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/core/node/testing/BUILD.bazel b/packages/angular_devkit/core/node/testing/BUILD.bazel index 0e82f30747c2..fb7ffe1059d5 100644 --- a/packages/angular_devkit/core/node/testing/BUILD.bazel +++ b/packages/angular_devkit/core/node/testing/BUILD.bazel @@ -1,6 +1,6 @@ load("//tools:defaults.bzl", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/schematics/BUILD.bazel b/packages/angular_devkit/schematics/BUILD.bazel index e4c4a5d6bac4..f87f7abbc1f4 100644 --- a/packages/angular_devkit/schematics/BUILD.bazel +++ b/packages/angular_devkit/schematics/BUILD.bazel @@ -2,7 +2,7 @@ load("@devinfra//bazel/api-golden:index.bzl", "api_golden_test_npm_package") load("@npm//:defs.bzl", "npm_link_all_packages") load("//tools:defaults.bzl", "jasmine_test", "npm_package", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/schematics/tasks/BUILD.bazel b/packages/angular_devkit/schematics/tasks/BUILD.bazel index dfd195d0b443..64eba079b312 100644 --- a/packages/angular_devkit/schematics/tasks/BUILD.bazel +++ b/packages/angular_devkit/schematics/tasks/BUILD.bazel @@ -1,6 +1,6 @@ load("//tools:defaults.bzl", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/schematics/tasks/node/BUILD.bazel b/packages/angular_devkit/schematics/tasks/node/BUILD.bazel index 10c52d3bcb7a..f375698e1286 100644 --- a/packages/angular_devkit/schematics/tasks/node/BUILD.bazel +++ b/packages/angular_devkit/schematics/tasks/node/BUILD.bazel @@ -1,6 +1,6 @@ load("//tools:defaults.bzl", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/schematics/testing/BUILD.bazel b/packages/angular_devkit/schematics/testing/BUILD.bazel index 0e2ef1329cf2..63d17fc4d6c4 100644 --- a/packages/angular_devkit/schematics/testing/BUILD.bazel +++ b/packages/angular_devkit/schematics/testing/BUILD.bazel @@ -1,6 +1,6 @@ load("//tools:defaults.bzl", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/schematics/tools/BUILD.bazel b/packages/angular_devkit/schematics/tools/BUILD.bazel index 4bfd80127524..eea7e90d5286 100644 --- a/packages/angular_devkit/schematics/tools/BUILD.bazel +++ b/packages/angular_devkit/schematics/tools/BUILD.bazel @@ -1,6 +1,6 @@ load("//tools:defaults.bzl", "jasmine_test", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/angular_devkit/schematics_cli/BUILD.bazel b/packages/angular_devkit/schematics_cli/BUILD.bazel index 9952e8cf0857..b65313ef4735 100644 --- a/packages/angular_devkit/schematics_cli/BUILD.bazel +++ b/packages/angular_devkit/schematics_cli/BUILD.bazel @@ -2,7 +2,7 @@ load("@npm//:defs.bzl", "npm_link_all_packages") load("//tools:defaults.bzl", "npm_package", "ts_project") load("//tools:ts_json_schema.bzl", "ts_json_schema") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/ngtools/webpack/BUILD.bazel b/packages/ngtools/webpack/BUILD.bazel index 791df1d229d0..1463529d6c42 100644 --- a/packages/ngtools/webpack/BUILD.bazel +++ b/packages/ngtools/webpack/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/packages/schematics/angular/BUILD.bazel b/packages/schematics/angular/BUILD.bazel index 27e1179fa107..849c7aa4137b 100644 --- a/packages/schematics/angular/BUILD.bazel +++ b/packages/schematics/angular/BUILD.bazel @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/tests/angular_devkit/schematics/tools/file-system-engine-host/BUILD.bazel b/tests/angular_devkit/schematics/tools/file-system-engine-host/BUILD.bazel index 3b3c89c7ac3f..ce9135575279 100644 --- a/tests/angular_devkit/schematics/tools/file-system-engine-host/BUILD.bazel +++ b/tests/angular_devkit/schematics/tools/file-system-engine-host/BUILD.bazel @@ -1,6 +1,6 @@ load("//tools:defaults.bzl", "ts_project") -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/tools/link_package_json_to_tarballs.bzl b/tools/link_package_json_to_tarballs.bzl index 1a8ea5a17486..b01d64669834 100644 --- a/tools/link_package_json_to_tarballs.bzl +++ b/tools/link_package_json_to_tarballs.bzl @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/tools/package_json_release_filter.jq b/tools/package_json_release_filter.jq index 4b5a0eb20c62..8fdae0df46c5 100644 --- a/tools/package_json_release_filter.jq +++ b/tools/package_json_release_filter.jq @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 diff --git a/tools/snapshot_repo_filter.bzl b/tools/snapshot_repo_filter.bzl index a648e8e300a7..fbd9672c07a9 100644 --- a/tools/snapshot_repo_filter.bzl +++ b/tools/snapshot_repo_filter.bzl @@ -1,4 +1,4 @@ -# Copyright Google Inc. All Rights Reserved. +# 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 From 6ed2cb7dffcefa1ac2b391abd85041a869848b5e Mon Sep 17 00:00:00 2001 From: MeAkib Date: Tue, 13 Jan 2026 00:31:31 +0600 Subject: [PATCH 66/68] refactor: update license URL from angular.io to angular.dev and angular material link Update all license URL references throughout the codebase to point to the new angular.dev domain. This is a non-functional change that only affects the license links in source file headers. --- README.md | 2 +- .../application/tests/behavior/typescript-incremental_spec.ts | 2 +- packages/angular/ssr/third_party/beasties/index.d.ts | 2 +- scripts/templates/readme.ejs | 2 +- tests/e2e/assets/ssr-project-webpack/src/app/app.component.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 21a7d3f13398..f14224e1cac7 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,7 @@ This is a monorepo which contains many tools and packages: [quickstart]: https://angular.dev/tutorials/learn-angular [changelog]: CHANGELOG.md [documentation]: https://angular.dev/overview -[angularmaterial]: https://material.angular.io/ +[angularmaterial]: https://material.angular.dev/ [cli]: https://angular.dev/tools/cli [adev]: https://angular.dev/ [workspaceconfig]: https://angular.dev/reference/configs/workspace-config diff --git a/packages/angular/build/src/builders/application/tests/behavior/typescript-incremental_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/typescript-incremental_spec.ts index 2c73e66d9f8b..cc74b9549e9d 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/typescript-incremental_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/typescript-incremental_spec.ts @@ -3,7 +3,7 @@ * 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.io/license + * found in the LICENSE file at https://angular.dev/license */ import { buildApplication } from '../../index'; diff --git a/packages/angular/ssr/third_party/beasties/index.d.ts b/packages/angular/ssr/third_party/beasties/index.d.ts index cba746c9f861..1e043424bf93 100644 --- a/packages/angular/ssr/third_party/beasties/index.d.ts +++ b/packages/angular/ssr/third_party/beasties/index.d.ts @@ -3,7 +3,7 @@ * 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.io/license + * found in the LICENSE file at https://angular.dev/license */ export { default } from 'beasties'; diff --git a/scripts/templates/readme.ejs b/scripts/templates/readme.ejs index 6a74a15f80d0..9d5324f9d6d2 100644 --- a/scripts/templates/readme.ejs +++ b/scripts/templates/readme.ejs @@ -197,7 +197,7 @@ for (const pkgName of packages) { [quickstart]: https://angular.dev/tutorials/learn-angular [changelog]: CHANGELOG.md [documentation]: https://angular.dev/overview -[angularmaterial]: https://material.angular.io/ +[angularmaterial]: https://material.angular.dev/ [cli]: https://angular.dev/tools/cli [adev]: https://angular.dev/ [workspaceconfig]: https://angular.dev/reference/configs/workspace-config diff --git a/tests/e2e/assets/ssr-project-webpack/src/app/app.component.html b/tests/e2e/assets/ssr-project-webpack/src/app/app.component.html index e99c7ea22c86..f9fa7a987098 100644 --- a/tests/e2e/assets/ssr-project-webpack/src/app/app.component.html +++ b/tests/e2e/assets/ssr-project-webpack/src/app/app.component.html @@ -481,7 +481,7 @@

Resources

- + Date: Tue, 13 Jan 2026 17:43:03 +0000 Subject: [PATCH 67/68] build: update cross-repo angular dependencies See associated pull request for more information. --- .../assistant-to-the-branch-manager.yml | 2 +- .github/workflows/ci.yml | 52 +++++++++---------- .github/workflows/dev-infra.yml | 4 +- .github/workflows/feature-requests.yml | 2 +- .github/workflows/perf.yml | 6 +-- .github/workflows/pr.yml | 44 ++++++++-------- MODULE.bazel | 2 +- MODULE.bazel.lock | 2 +- package.json | 2 +- pnpm-lock.yaml | 12 ++--- tests/e2e/ng-snapshot/package.json | 32 ++++++------ 11 files changed, 80 insertions(+), 80 deletions(-) diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index 1e2ae380b05e..60208dd095ca 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -17,6 +17,6 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@3ec78dc98edefbf3a324b84d093e66577ea30b29 + - uses: angular/dev-infra/github-actions/branch-manager@8ce8257f740613a7291256173e2706fb2ed8aefa with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 357f70cb18bd..3197a86069a9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Generate JSON schema types @@ -44,11 +44,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -61,11 +61,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -84,13 +84,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -100,11 +100,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Install node modules @@ -137,7 +137,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -164,13 +164,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -188,13 +188,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run CLI E2E tests @@ -208,13 +208,13 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-cli-${{ github.workflow }}-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa with: google_credential: ${{ secrets.RBE_TRUSTED_BUILDS_USER }} - name: Run E2E Browser tests @@ -244,11 +244,11 @@ jobs: CIRCLE_BRANCH: ${{ github.ref_name }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - run: pnpm admin snapshots --verbose env: SNAPSHOT_BUILDS_GITHUB_TOKEN: ${{ secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN }} diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index f35ed269e8bf..1e7e5cdb9bd6 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/pull-request-labeling@3ec78dc98edefbf3a324b84d093e66577ea30b29 + - uses: angular/dev-infra/github-actions/pull-request-labeling@8ce8257f740613a7291256173e2706fb2ed8aefa with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: angular/dev-infra/github-actions/post-approval-changes@3ec78dc98edefbf3a324b84d093e66577ea30b29 + - uses: angular/dev-infra/github-actions/post-approval-changes@8ce8257f740613a7291256173e2706fb2ed8aefa with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml index 588c3ee3fe2a..0eff82b705ea 100644 --- a/.github/workflows/feature-requests.yml +++ b/.github/workflows/feature-requests.yml @@ -16,6 +16,6 @@ jobs: if: github.repository == 'angular/angular-cli' runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/feature-request@3ec78dc98edefbf3a324b84d093e66577ea30b29 + - uses: angular/dev-infra/github-actions/feature-request@8ce8257f740613a7291256173e2706fb2ed8aefa with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 8d5897b8cc29..7bd1c9b434bb 100644 --- a/.github/workflows/perf.yml +++ b/.github/workflows/perf.yml @@ -23,7 +23,7 @@ jobs: workflows: ${{ steps.workflows.outputs.workflows }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - id: workflows @@ -38,9 +38,9 @@ jobs: workflow: ${{ fromJSON(needs.list.outputs.workflows) }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile # We utilize the google-github-actions/auth action to allow us to get an active credential using workflow diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 2312edca0c64..cc2c80342aa9 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,9 +34,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup ESLint Caching uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 with: @@ -66,17 +66,17 @@ jobs: # it has been merged. run: pnpm ng-dev format changed --check ${{ github.event.pull_request.base.sha }} - name: Check Package Licenses - uses: angular/dev-infra/github-actions/linting/licenses@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/linting/licenses@8ce8257f740613a7291256173e2706fb2ed8aefa build: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Build release targets @@ -93,11 +93,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Run module and package tests @@ -114,13 +114,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -128,11 +128,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Build E2E tests for Windows on Linux @@ -156,7 +156,7 @@ jobs: runs-on: windows-2025 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Download built Windows E2E tests @@ -183,13 +183,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=3 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.${{ matrix.subset }}_node${{ matrix.node }} @@ -205,12 +205,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Install node modules run: pnpm install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/setup@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@3ec78dc98edefbf3a324b84d093e66577ea30b29 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8ce8257f740613a7291256173e2706fb2ed8aefa - name: Run CLI E2E tests run: pnpm bazel test --test_env=E2E_SHARD_TOTAL=6 --test_env=E2E_SHARD_INDEX=${{ matrix.shard }} --config=e2e //tests:e2e.snapshots.${{ matrix.subset }}_node${{ matrix.node }} diff --git a/MODULE.bazel b/MODULE.bazel index ec01b276af8d..4da2dacab975 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -25,7 +25,7 @@ git_override( bazel_dep(name = "devinfra") git_override( module_name = "devinfra", - commit = "3ec78dc98edefbf3a324b84d093e66577ea30b29", + commit = "8ce8257f740613a7291256173e2706fb2ed8aefa", remote = "https://github.com/angular/dev-infra.git", ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 5c2a55ab267c..24525fbd8c07 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -412,7 +412,7 @@ "@@aspect_rules_js+//npm:extensions.bzl%pnpm": { "general": { "bzlTransitiveDigest": "zVV86HvMwDBJ8IsFt27k/Sjq0vCMPr8b8X9OAuprQ6w=", - "usagesDigest": "joQrwYZve0LRGQcA0w659tYcDgO7i285JhM3m8ojguc=", + "usagesDigest": "/NqvQUP/nSwl7fsTFSQHEZJU5rTvs4M1h1n8n0KpF7Q=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/package.json b/package.json index 4f136df9262b..9497776abb2f 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@angular/forms": "21.1.0-rc.0", "@angular/localize": "21.1.0-rc.0", "@angular/material": "21.1.0-next.4", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#50fe5451525482cef45fa98d953f899e92d618ce", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#486b075a283ef0c169475b981de1bd229114a000", "@angular/platform-browser": "21.1.0-rc.0", "@angular/platform-server": "21.1.0-rc.0", "@angular/router": "21.1.0-rc.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9ca5563c6c9..605e20b7cd7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,8 +47,8 @@ importers: specifier: 21.1.0-next.4 version: 21.1.0-next.4(b051653d7cc612357511ba8a2f98a625) '@angular/ng-dev': - specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#50fe5451525482cef45fa98d953f899e92d618ce - version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/50fe5451525482cef45fa98d953f899e92d618ce(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)) + specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#486b075a283ef0c169475b981de1bd229114a000 + version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/486b075a283ef0c169475b981de1bd229114a000(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)) '@angular/platform-browser': specifier: 21.1.0-rc.0 version: 21.1.0-rc.0(@angular/animations@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@21.1.0-rc.0(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@21.1.0-rc.0(@angular/compiler@21.1.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.0)) @@ -1020,9 +1020,9 @@ packages: '@angular/platform-browser': ^21.0.0-0 || ^21.1.0-0 || ^21.2.0-0 || ^21.3.0-0 || ^22.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/50fe5451525482cef45fa98d953f899e92d618ce': - resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/50fe5451525482cef45fa98d953f899e92d618ce} - version: 0.0.0-3ec78dc98edefbf3a324b84d093e66577ea30b29 + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/486b075a283ef0c169475b981de1bd229114a000': + resolution: {tarball: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/486b075a283ef0c169475b981de1bd229114a000} + version: 0.0.0-8ce8257f740613a7291256173e2706fb2ed8aefa hasBin: true '@angular/platform-browser@21.1.0-rc.0': @@ -9389,7 +9389,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/50fe5451525482cef45fa98d953f899e92d618ce(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))': + '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/486b075a283ef0c169475b981de1bd229114a000(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))': dependencies: '@actions/core': 2.0.1 '@google-cloud/spanner': 8.0.0(supports-color@10.2.2) diff --git a/tests/e2e/ng-snapshot/package.json b/tests/e2e/ng-snapshot/package.json index df29d91efd90..8cf086d84b61 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#a38f6fed777c7b80473492aba0261acbbe2e9f4b", - "@angular/cdk": "github:angular/cdk-builds#0539dd4d010c119630e6bcf597393489e1313bb4", - "@angular/common": "github:angular/common-builds#754de52e5f6c2ede77d0378aa889a97d559a8113", - "@angular/compiler": "github:angular/compiler-builds#21cd4a684b6b9ba607b4ec019fd3f8d1847d4e63", - "@angular/compiler-cli": "github:angular/compiler-cli-builds#08a43ed0320a6d0d5b268eaf43ccbafed860ed2b", - "@angular/core": "github:angular/core-builds#38b7649e2928eac9bb5dbb9593b2880d7f93e193", - "@angular/forms": "github:angular/forms-builds#5ff7e657d34956067dde22c829a7d2f3e1628408", - "@angular/language-service": "github:angular/language-service-builds#68142b174eb7dd296da6f412b5d31bbcc7d57456", - "@angular/localize": "github:angular/localize-builds#76d4cf0295505b71b0bf61e4d8818488128d9765", - "@angular/material": "github:angular/material-builds#ea5a6e2304c661907a9954ad860da7bbaf6fd86b", - "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#321361b3180f82f1553cd1a8a72756c00d48ec9d", - "@angular/platform-browser": "github:angular/platform-browser-builds#ef8b35329b869ab3d9adac11a4025071eaf075c5", - "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#25e46ca0513f02ae562317dad3ec45497f0d0787", - "@angular/platform-server": "github:angular/platform-server-builds#249b09bc45577772ff5349a2b99ccc7cab5b2080", - "@angular/router": "github:angular/router-builds#6cba1b408d9015fb8771a3bd00d1b00d097e7fa6", - "@angular/service-worker": "github:angular/service-worker-builds#d6355eef029449edec0c401eaf8053b7e384cb5d" + "@angular/animations": "github:angular/animations-builds#2fb6689dfa572ee9791e73ea4baa69a950c21001", + "@angular/cdk": "github:angular/cdk-builds#1ab9962498d6903432ccc38546c01cf09bb1a366", + "@angular/common": "github:angular/common-builds#3677993d8692da988eb734945aa9a17f633d095a", + "@angular/compiler": "github:angular/compiler-builds#a4c253557608874de2aa4d928b708b2488c8c1f2", + "@angular/compiler-cli": "github:angular/compiler-cli-builds#9a1ae7227b72d529e096390d1ac8b23dd92ada0e", + "@angular/core": "github:angular/core-builds#3b438e222a9305cd7401bf5b9c6a8c90759a3073", + "@angular/forms": "github:angular/forms-builds#ec56afffd56368aeb2e5aef57811ded5ffe14247", + "@angular/language-service": "github:angular/language-service-builds#5d167367e05a47d610f449ba57a3ff72b5a721b3", + "@angular/localize": "github:angular/localize-builds#ec44ae08265544772405adacda279e0b95d0bf91", + "@angular/material": "github:angular/material-builds#dace9dfcc8404a7ede4c4cc5a9dbffa1b9dcf9b5", + "@angular/material-moment-adapter": "github:angular/material-moment-adapter-builds#75351c7ea416e662f7eb55a4e384ec7e6cafc848", + "@angular/platform-browser": "github:angular/platform-browser-builds#0f17437decd1e4c6dd7b36ccf1da9a441816cd17", + "@angular/platform-browser-dynamic": "github:angular/platform-browser-dynamic-builds#b653692adb865fded706633c12602f459ce6fea5", + "@angular/platform-server": "github:angular/platform-server-builds#1ccd39aa8a1ead4297c1a1774cea6b427e7b27d1", + "@angular/router": "github:angular/router-builds#51cbccfd0694c60eec77216a530a3bb261110504", + "@angular/service-worker": "github:angular/service-worker-builds#a4a19e4f00e1b8f3d879b5a9b354231558e354b1" } } From 79b69f5e87ec5b70c6c968137c8b1d18e38613c6 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 13 Jan 2026 05:09:24 +0000 Subject: [PATCH 68/68] build: lock file maintenance See associated pull request for more information. --- pnpm-lock.yaml | 698 ++++++++++++++++++++++++------------------------- 1 file changed, 342 insertions(+), 356 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 605e20b7cd7c..28edd1963ea7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,7 +93,7 @@ importers: version: 16.0.3(rollup@4.55.1) '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.6.1(eslint@9.39.2(jiti@2.6.1)) + version: 5.7.0(eslint@9.39.2(jiti@2.6.1)) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -114,7 +114,7 @@ importers: version: 4.1.1 '@types/jasmine': specifier: ~5.1.0 - version: 5.1.13 + version: 5.1.14 '@types/jasmine-reporters': specifier: ^2 version: 2.5.3 @@ -129,10 +129,10 @@ importers: version: 3.0.0(esbuild@0.27.2) '@types/lodash': specifier: ^4.17.0 - version: 4.17.21 + version: 4.17.23 '@types/node': specifier: ^22.12.0 - version: 22.19.3 + version: 22.19.5 '@types/npm-package-arg': specifier: ^6.1.0 version: 6.1.4 @@ -267,7 +267,7 @@ importers: version: 6.3.0(rollup@4.55.1)(typescript@5.9.3) rollup-plugin-sourcemaps2: specifier: 0.5.4 - version: 0.5.4(@types/node@22.19.3)(rollup@4.55.1) + version: 0.5.4(@types/node@22.19.5)(rollup@4.55.1) semver: specifier: 7.7.3 version: 7.7.3 @@ -276,7 +276,7 @@ importers: version: 0.5.21 ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@22.19.3)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.5)(typescript@5.9.3) tslib: specifier: 2.8.1 version: 2.8.1 @@ -878,8 +878,8 @@ packages: '@actions/exec@2.0.0': resolution: {integrity: sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==} - '@actions/http-client@3.0.0': - resolution: {integrity: sha512-1s3tXAfVMSz9a4ZEBkXXRQD4QhY3+GAsWSbaYpeknPOKEeyRiU3lH+bHiLMZdo2x/fIeQ/hscL1wCkDLVM2DZQ==} + '@actions/http-client@3.0.1': + resolution: {integrity: sha512-SbGS8c/vySbNO3kjFgSW77n83C4MQx/Yoe+b1hAdpuvfHxnkHzDq2pWljUpAA56Si1Gae/7zjeZsV0CYjmLo/w==} '@actions/io@2.0.0': resolution: {integrity: sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==} @@ -1633,8 +1633,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.22': - resolution: {integrity: sha512-qBcx6zYlhleiFfdtzkRgwNC7VVoAwfK76Vmsw5t+PbvtdknO9StgRk7ROvq9so1iqbdW4uLIDAsXRsTfUrIoOw==} + '@csstools/css-syntax-patches-for-csstree@1.0.25': + resolution: {integrity: sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==} engines: {node: '>=18'} '@csstools/css-tokenizer@3.0.4': @@ -1845,8 +1845,8 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.0.0': - resolution: {integrity: sha512-PRfWP+8FOldvbApr6xL7mNCw4cJcSTq4GA7tYbgq15mRb0kWKO/wEB2jr+uwjFH3sZvEZneZyCUGTxsv4Sahyw==} + '@eslint/core@1.0.1': + resolution: {integrity: sha512-r18fEAj9uCk+VjzGt2thsbOmychS+4kxI14spVNibUO2vqKX7obOG+ymZljAwuPZl+S3clPGwCwTDtrdqTiY6Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/eslintrc@3.3.3': @@ -2149,8 +2149,8 @@ packages: '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} - '@hono/node-server@1.19.7': - resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==} + '@hono/node-server@1.19.8': + resolution: {integrity: sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -2175,8 +2175,8 @@ packages: resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} - '@inquirer/ansi@2.0.2': - resolution: {integrity: sha512-SYLX05PwJVnW+WVegZt1T4Ip1qba1ik+pNJPDiqvk6zS5Y/i8PhRzLpGEtVd7sW0G8cMtkD8t4AZYhQwm8vnww==} + '@inquirer/ansi@2.0.3': + resolution: {integrity: sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} '@inquirer/checkbox@4.3.2': @@ -2188,8 +2188,8 @@ packages: '@types/node': optional: true - '@inquirer/checkbox@5.0.3': - resolution: {integrity: sha512-xtQP2eXMFlOcAhZ4ReKP2KZvDIBb1AnCfZ81wWXG3DXLVH0f0g4obE0XDPH+ukAEMRcZT0kdX2AS1jrWGXbpxw==} + '@inquirer/checkbox@5.0.4': + resolution: {integrity: sha512-DrAMU3YBGMUAp6ArwTIp/25CNDtDbxk7UjIrrtM25JVVrlVYlVzHh5HR1BDFu9JMyUoZ4ZanzeaHqNDttf3gVg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2206,8 +2206,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.0.3': - resolution: {integrity: sha512-lyEvibDFL+NA5R4xl8FUmNhmu81B+LDL9L/MpKkZlQDJZXzG8InxiqYxiAlQYa9cqLLhYqKLQwZqXmSTqCLjyw==} + '@inquirer/confirm@6.0.4': + resolution: {integrity: sha512-WdaPe7foUnoGYvXzH4jp4wH/3l+dBhZ3uwhKjXjwdrq5tEIFaANxj6zrGHxLdsIA0yKM0kFPVcEalOZXBB5ISA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2224,8 +2224,8 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.0': - resolution: {integrity: sha512-+jD/34T1pK8M5QmZD/ENhOfXdl9Zr+BrQAUc5h2anWgi7gggRq15ZbiBeLoObj0TLbdgW7TAIQRU2boMc9uOKQ==} + '@inquirer/core@11.1.1': + resolution: {integrity: sha512-hV9o15UxX46OyQAtaoMqAOxGR8RVl1aZtDx1jHbCtSJy1tBdTfKxLPKf7utsE4cRy4tcmCQ4+vdV+ca+oNxqNA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2242,8 +2242,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.0.3': - resolution: {integrity: sha512-wYyQo96TsAqIciP/r5D3cFeV8h4WqKQ/YOvTg5yOfP2sqEbVVpbxPpfV3LM5D0EP4zUI3EZVHyIUIllnoIa8OQ==} + '@inquirer/editor@5.0.4': + resolution: {integrity: sha512-QI3Jfqcv6UO2/VJaEFONH8Im1ll++Xn/AJTBn9Xf+qx2M+H8KZAdQ5sAe2vtYlo+mLW+d7JaMJB4qWtK4BG3pw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2260,8 +2260,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.0.3': - resolution: {integrity: sha512-2oINvuL27ujjxd95f6K2K909uZOU2x1WiAl7Wb1X/xOtL8CgQ1kSxzykIr7u4xTkXkXOAkCuF45T588/YKee7w==} + '@inquirer/expand@5.0.4': + resolution: {integrity: sha512-0I/16YwPPP0Co7a5MsomlZLpch48NzYfToyqYAOWtBmaXSB80RiNQ1J+0xx2eG+Wfxt0nHtpEWSRr6CzNVnOGg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2278,8 +2278,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@2.0.2': - resolution: {integrity: sha512-X/fMXK7vXomRWEex1j8mnj7s1mpnTeP4CO/h2gysJhHLT2WjBnLv4ZQEGpm/kcYI8QfLZ2fgW+9kTKD+jeopLg==} + '@inquirer/external-editor@2.0.3': + resolution: {integrity: sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2291,8 +2291,8 @@ packages: resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} - '@inquirer/figures@2.0.2': - resolution: {integrity: sha512-qXm6EVvQx/FmnSrCWCIGtMHwqeLgxABP8XgcaAoywsL0NFga9gD5kfG0gXiv80GjK9Hsoz4pgGwF/+CjygyV9A==} + '@inquirer/figures@2.0.3': + resolution: {integrity: sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} '@inquirer/input@4.3.1': @@ -2304,8 +2304,8 @@ packages: '@types/node': optional: true - '@inquirer/input@5.0.3': - resolution: {integrity: sha512-4R0TdWl53dtp79Vs6Df2OHAtA2FVNqya1hND1f5wjHWxZJxwDMSNB1X5ADZJSsQKYAJ5JHCTO+GpJZ42mK0Otw==} + '@inquirer/input@5.0.4': + resolution: {integrity: sha512-4B3s3jvTREDFvXWit92Yc6jF1RJMDy2VpSqKtm4We2oVU65YOh2szY5/G14h4fHlyQdpUmazU5MPCFZPRJ0AOw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2322,8 +2322,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.0.3': - resolution: {integrity: sha512-TjQLe93GGo5snRlu83JxE38ZPqj5ZVggL+QqqAF2oBA5JOJoxx25GG3EGH/XN/Os5WOmKfO8iLVdCXQxXRZIMQ==} + '@inquirer/number@4.0.4': + resolution: {integrity: sha512-CmMp9LF5HwE+G/xWsC333TlCzYYbXMkcADkKzcawh49fg2a1ryLc7JL1NJYYt1lJ+8f4slikNjJM9TEL/AljYQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2340,8 +2340,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.0.3': - resolution: {integrity: sha512-rCozGbUMAHedTeYWEN8sgZH4lRCdgG/WinFkit6ZPsp8JaNg2T0g3QslPBS5XbpORyKP/I+xyBO81kFEvhBmjA==} + '@inquirer/password@5.0.4': + resolution: {integrity: sha512-ZCEPyVYvHK4W4p2Gy6sTp9nqsdHQCfiPXIP9LbJVW4yCinnxL/dDDmPaEZVysGrj8vxVReRnpfS2fOeODe9zjg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2376,8 +2376,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.1.0': - resolution: {integrity: sha512-yUCuVh0jW026Gr2tZlG3kHignxcrLKDR3KBp+eUgNz+BAdSeZk0e18yt2gyBr+giYhj/WSIHCmPDOgp1mT2niQ==} + '@inquirer/rawlist@5.2.0': + resolution: {integrity: sha512-CciqGoOUMrFo6HxvOtU5uL8fkjCmzyeB6fG7O1vdVAZVSopUBYECOwevDBlqNLyyYmzpm2Gsn/7nLrpruy9RFg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2394,8 +2394,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.0.3': - resolution: {integrity: sha512-lzqVw0YwuKYetk5VwJ81Ba+dyVlhseHPx9YnRKQgwXdFS0kEavCz2gngnNhnMIxg8+j1N/rUl1t5s1npwa7bqg==} + '@inquirer/search@4.1.0': + resolution: {integrity: sha512-EAzemfiP4IFvIuWnrHpgZs9lAhWDA0GM3l9F4t4mTQ22IFtzfrk8xbkMLcAN7gmVML9O/i+Hzu8yOUyAaL6BKA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2412,8 +2412,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.0.3': - resolution: {integrity: sha512-M+ynbwS0ecQFDYMFrQrybA0qL8DV0snpc4kKevCCNaTpfghsRowRY7SlQBeIYNzHqXtiiz4RG9vTOeb/udew7w==} + '@inquirer/select@5.0.4': + resolution: {integrity: sha512-s8KoGpPYMEQ6WXc0dT9blX2NtIulMdLOO3LA1UKOiv7KFWzlJ6eLkEYTDBIi+JkyKXyn8t/CD6TinxGjyLt57g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -2439,6 +2439,15 @@ packages: '@types/node': optional: true + '@inquirer/type@4.0.3': + resolution: {integrity: sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -2866,14 +2875,14 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@2.2.0': - resolution: {integrity: sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==} + '@opentelemetry/context-async-hooks@2.3.0': + resolution: {integrity: sha512-hGcsT0qDP7Il1L+qT3JFpiGl1dCjF794Bb4yCRCYdr7XC0NwHtOF3ngF86Gk6TUnsakbyQsDQ0E/S4CU0F4d4g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.2.0': - resolution: {integrity: sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==} + '@opentelemetry/core@2.3.0': + resolution: {integrity: sha512-PcmxJQzs31cfD0R2dE91YGFcLxOSN4Bxz7gez5UwSUjCai8BwH/GI5HchfVshHkWdTkUs0qcaPJgVHKXUp7I3A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -2885,92 +2894,92 @@ packages: '@oxc-project/types@0.107.0': resolution: {integrity: sha512-QFDRbYfV2LVx8tyqtyiah3jQPUj1mK2+RYwxyFWyGoys6XJnwTdlzO6rdNNHOPorHAu5Uo34oWRKcvNpbJarmQ==} - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.5.4': + resolution: {integrity: sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.4': + resolution: {integrity: sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.4': + resolution: {integrity: sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.4': + resolution: {integrity: sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.4': + resolution: {integrity: sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.4': + resolution: {integrity: sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.4': + resolution: {integrity: sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.4': + resolution: {integrity: sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.4': + resolution: {integrity: sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.4': + resolution: {integrity: sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.4': + resolution: {integrity: sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.4': + resolution: {integrity: sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.4': + resolution: {integrity: sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.4': + resolution: {integrity: sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==} engines: {node: '>= 10.0.0'} '@pinojs/redact@0.4.0': @@ -3362,8 +3371,8 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@stylistic/eslint-plugin@5.6.1': - resolution: {integrity: sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw==} + '@stylistic/eslint-plugin@5.7.0': + resolution: {integrity: sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -3405,8 +3414,8 @@ packages: '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - '@types/babel__code-frame@7.0.6': - resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} + '@types/babel__code-frame@7.27.0': + resolution: {integrity: sha512-Dwlo+LrxDx/0SpfmJ/BKveHf7QXWvLBLc+x03l5sbzykj3oB9nHygCpSECF1a+s+QIxbghe+KHqC90vGtxLRAA==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3486,11 +3495,11 @@ packages: '@types/events@3.0.3': resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} - '@types/express-serve-static-core@4.19.7': - resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + '@types/express-serve-static-core@4.19.8': + resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} - '@types/express-serve-static-core@5.1.0': - resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} + '@types/express-serve-static-core@5.1.1': + resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} @@ -3534,6 +3543,9 @@ packages: '@types/jasmine@5.1.13': resolution: {integrity: sha512-MYCcDkruFc92LeYZux5BC0dmqo2jk+M5UIZ4/oFnAPCXN9mCcQhLyj7F3/Za7rocVyt5YRr1MmqJqFlvQ9LVcg==} + '@types/jasmine@5.1.14': + resolution: {integrity: sha512-16bJdpgUPNKXuaelVxuLZUeDd02+PnF0aQd5HY4xLWoUOMoRE+CyNkRpjRMIcPBCR1dscSb52pmFNILAN1uzkw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3558,8 +3570,8 @@ packages: '@types/loader-utils@3.0.0': resolution: {integrity: sha512-oOi4OGpiLUbb+Q/cN9FIkkDFgOpOGZ2cUAzb5i03wrGstnG6Syx1WDMhSiB5rcP10XX7cw7Uev8mv++/aplnNg==} - '@types/lodash@4.17.21': - resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==} + '@types/lodash@4.17.23': + resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} '@types/micromatch@2.3.35': resolution: {integrity: sha512-J749bHo/Zu56w0G0NI/IGHLQPiSsjx//0zJhfEVAN95K/xM5C8ZDmhkXtU3qns0sBOao7HuQzr8XV1/2o5LbXA==} @@ -3573,8 +3585,8 @@ packages: '@types/node-forge@1.3.14': resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node@22.19.3': - resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} + '@types/node@22.19.5': + resolution: {integrity: sha512-HfF8+mYcHPcPypui3w3mvzuIErlNOh2OAG+BCeBZCEwyiD5ls2SiCwEyT47OELtf7M3nHxBdu0FsmzdKxkN52Q==} '@types/node@24.10.4': resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} @@ -4313,8 +4325,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.9.11: - resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} hasBin: true basic-ftp@5.1.0: @@ -4369,8 +4381,8 @@ packages: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.1: - resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} bonjour-service@1.3.0: @@ -4485,8 +4497,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001762: - resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} + caniuse-lite@1.0.30001764: + resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -4804,8 +4816,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@5.3.6: - resolution: {integrity: sha512-legscpSpgSAeGEe0TNcai97DKt9Vd9AsAdOL7Uoetb52Ar/8eJm3LIa39qpv8wWzLFlNG4vVvppQM+teaMPj3A==} + cssstyle@5.3.7: + resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} engines: {node: '>=20'} custom-event@1.0.1: @@ -4992,11 +5004,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -5303,6 +5310,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5317,6 +5328,10 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.0.0: + resolution: {integrity: sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -5954,8 +5969,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.1: - resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} icss-utils@5.1.0: @@ -7907,8 +7922,9 @@ packages: saucelabs@1.5.0: resolution: {integrity: sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==} - sax@1.4.3: - resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -8598,8 +8614,8 @@ packages: unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@7.18.0: - resolution: {integrity: sha512-aLO7B+pYKuqcpapWdzhvzrjfm+qeiQNK3OILZAmlXJxgMfCsltOINMvNonA7nMMKiEjY1vAMA02O7u+eWym43w==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} @@ -8701,8 +8717,8 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@7.0.1: - resolution: {integrity: sha512-BM0Upcemlce8/9+HE+/VpWqn3u3mYh6Om/FEC8yPMnEHwf710fW5Q6fhjT1SQyRlZD1G9CJbgfH+rWgAcIvjlQ==} + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} validator@13.15.23: @@ -8734,46 +8750,6 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - vite@7.3.0: - resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} - 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.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -9064,6 +9040,18 @@ packages: utf-8-validate: optional: true + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.9.0: resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==} engines: {node: '>=10.0.0'} @@ -9209,13 +9197,13 @@ snapshots: '@actions/core@2.0.1': dependencies: '@actions/exec': 2.0.0 - '@actions/http-client': 3.0.0 + '@actions/http-client': 3.0.1 '@actions/exec@2.0.0': dependencies: '@actions/io': 2.0.0 - '@actions/http-client@3.0.0': + '@actions/http-client@3.0.1': dependencies: tunnel: 0.0.6 undici: 5.29.0 @@ -10207,7 +10195,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.22': {} + '@csstools/css-syntax-patches-for-csstree@1.0.25': {} '@csstools/css-tokenizer@3.0.4': {} @@ -10337,7 +10325,7 @@ snapshots: '@eslint/compat@2.0.0(eslint@9.39.2(jiti@2.6.1))': dependencies: - '@eslint/core': 1.0.0 + '@eslint/core': 1.0.1 optionalDependencies: eslint: 9.39.2(jiti@2.6.1) @@ -10357,7 +10345,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@1.0.0': + '@eslint/core@1.0.1': dependencies: '@types/json-schema': 7.0.15 @@ -10740,8 +10728,8 @@ snapshots: '@google-cloud/promisify': 5.0.0 '@grpc/proto-loader': 0.7.15 '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.38.0 '@types/big.js': 6.2.2 '@types/stack-trace': 0.0.33 @@ -10770,7 +10758,7 @@ snapshots: '@google/genai@1.34.0(@modelcontextprotocol/sdk@1.25.2(zod@4.3.5))(bufferutil@4.1.0)(supports-color@10.2.2)(utf-8-validate@6.0.6)': dependencies: google-auth-library: 10.5.0(supports-color@10.2.2) - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: '@modelcontextprotocol/sdk': 1.25.2(zod@4.3.5) transitivePeerDependencies: @@ -10786,7 +10774,7 @@ snapshots: '@grpc/grpc-js@1.9.15': dependencies: '@grpc/proto-loader': 0.7.15 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@grpc/proto-loader@0.7.15': dependencies: @@ -10804,7 +10792,7 @@ snapshots: '@hapi/bourne@3.0.0': {} - '@hono/node-server@1.19.7': {} + '@hono/node-server@1.19.8': {} '@humanfs/core@0.19.1': {} @@ -10819,7 +10807,7 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/ansi@2.0.2': {} + '@inquirer/ansi@2.0.3': {} '@inquirer/checkbox@4.3.2(@types/node@24.10.4)': dependencies: @@ -10831,12 +10819,12 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/checkbox@5.0.3(@types/node@24.10.4)': + '@inquirer/checkbox@5.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/ansi': 2.0.2 - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -10847,10 +10835,10 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/confirm@6.0.3(@types/node@24.10.4)': + '@inquirer/confirm@6.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -10867,11 +10855,11 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/core@11.1.0(@types/node@24.10.4)': + '@inquirer/core@11.1.1(@types/node@24.10.4)': dependencies: - '@inquirer/ansi': 2.0.2 - '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/ansi': 2.0.3 + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@24.10.4) cli-width: 4.1.0 mute-stream: 3.0.0 signal-exit: 4.1.0 @@ -10887,11 +10875,11 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/editor@5.0.3(@types/node@24.10.4)': + '@inquirer/editor@5.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/external-editor': 2.0.2(@types/node@24.10.4) - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/external-editor': 2.0.3(@types/node@24.10.4) + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -10903,30 +10891,30 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/expand@5.0.3(@types/node@24.10.4)': + '@inquirer/expand@5.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 '@inquirer/external-editor@1.0.3(@types/node@24.10.4)': dependencies: chardet: 2.1.1 - iconv-lite: 0.7.1 + iconv-lite: 0.7.2 optionalDependencies: '@types/node': 24.10.4 - '@inquirer/external-editor@2.0.2(@types/node@24.10.4)': + '@inquirer/external-editor@2.0.3(@types/node@24.10.4)': dependencies: chardet: 2.1.1 - iconv-lite: 0.7.1 + iconv-lite: 0.7.2 optionalDependencies: '@types/node': 24.10.4 '@inquirer/figures@1.0.15': {} - '@inquirer/figures@2.0.2': {} + '@inquirer/figures@2.0.3': {} '@inquirer/input@4.3.1(@types/node@24.10.4)': dependencies: @@ -10935,10 +10923,10 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/input@5.0.3(@types/node@24.10.4)': + '@inquirer/input@5.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -10949,10 +10937,10 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/number@4.0.3(@types/node@24.10.4)': + '@inquirer/number@4.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -10964,11 +10952,11 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/password@5.0.3(@types/node@24.10.4)': + '@inquirer/password@5.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/ansi': 2.0.2 - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -10989,16 +10977,16 @@ snapshots: '@inquirer/prompts@8.1.0(@types/node@24.10.4)': dependencies: - '@inquirer/checkbox': 5.0.3(@types/node@24.10.4) - '@inquirer/confirm': 6.0.3(@types/node@24.10.4) - '@inquirer/editor': 5.0.3(@types/node@24.10.4) - '@inquirer/expand': 5.0.3(@types/node@24.10.4) - '@inquirer/input': 5.0.3(@types/node@24.10.4) - '@inquirer/number': 4.0.3(@types/node@24.10.4) - '@inquirer/password': 5.0.3(@types/node@24.10.4) - '@inquirer/rawlist': 5.1.0(@types/node@24.10.4) - '@inquirer/search': 4.0.3(@types/node@24.10.4) - '@inquirer/select': 5.0.3(@types/node@24.10.4) + '@inquirer/checkbox': 5.0.4(@types/node@24.10.4) + '@inquirer/confirm': 6.0.4(@types/node@24.10.4) + '@inquirer/editor': 5.0.4(@types/node@24.10.4) + '@inquirer/expand': 5.0.4(@types/node@24.10.4) + '@inquirer/input': 5.0.4(@types/node@24.10.4) + '@inquirer/number': 4.0.4(@types/node@24.10.4) + '@inquirer/password': 5.0.4(@types/node@24.10.4) + '@inquirer/rawlist': 5.2.0(@types/node@24.10.4) + '@inquirer/search': 4.1.0(@types/node@24.10.4) + '@inquirer/select': 5.0.4(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -11010,10 +10998,10 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/rawlist@5.1.0(@types/node@24.10.4)': + '@inquirer/rawlist@5.2.0(@types/node@24.10.4)': dependencies: - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -11026,11 +11014,11 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/search@4.0.3(@types/node@24.10.4)': + '@inquirer/search@4.1.0(@types/node@24.10.4)': dependencies: - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -11044,12 +11032,12 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 - '@inquirer/select@5.0.3(@types/node@24.10.4)': + '@inquirer/select@5.0.4(@types/node@24.10.4)': dependencies: - '@inquirer/ansi': 2.0.2 - '@inquirer/core': 11.1.0(@types/node@24.10.4) - '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@24.10.4) + '@inquirer/ansi': 2.0.3 + '@inquirer/core': 11.1.1(@types/node@24.10.4) + '@inquirer/figures': 2.0.3 + '@inquirer/type': 4.0.3(@types/node@24.10.4) optionalDependencies: '@types/node': 24.10.4 @@ -11061,6 +11049,10 @@ snapshots: optionalDependencies: '@types/node': 24.10.4 + '@inquirer/type@4.0.3(@types/node@24.10.4)': + optionalDependencies: + '@types/node': 24.10.4 + '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -11182,7 +11174,7 @@ snapshots: '@modelcontextprotocol/sdk@1.25.2(zod@4.3.5)': dependencies: - '@hono/node-server': 1.19.7 + '@hono/node-server': 1.19.8 ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 @@ -11500,11 +11492,11 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.38.0 @@ -11513,65 +11505,65 @@ snapshots: '@oxc-project/types@0.107.0': {} - '@parcel/watcher-android-arm64@2.5.1': + '@parcel/watcher-android-arm64@2.5.4': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.5.4': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.5.4': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.5.4': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.5.4': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm-musl@2.5.4': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.5.4': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.5.4': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.5.4': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@parcel/watcher-linux-x64-musl@2.5.4': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.5.4': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.5.4': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.5.4': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.5.4': dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 is-glob: 4.0.3 - micromatch: 4.0.8 node-addon-api: 7.1.1 + picomatch: 4.0.3 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.5.4 + '@parcel/watcher-darwin-arm64': 2.5.4 + '@parcel/watcher-darwin-x64': 2.5.4 + '@parcel/watcher-freebsd-x64': 2.5.4 + '@parcel/watcher-linux-arm-glibc': 2.5.4 + '@parcel/watcher-linux-arm-musl': 2.5.4 + '@parcel/watcher-linux-arm64-glibc': 2.5.4 + '@parcel/watcher-linux-arm64-musl': 2.5.4 + '@parcel/watcher-linux-x64-glibc': 2.5.4 + '@parcel/watcher-linux-x64-musl': 2.5.4 + '@parcel/watcher-win32-arm64': 2.5.4 + '@parcel/watcher-win32-ia32': 2.5.4 + '@parcel/watcher-win32-x64': 2.5.4 optional: true '@pinojs/redact@0.4.0': {} @@ -11859,13 +11851,13 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.7.0(eslint@9.39.2(jiti@2.6.1))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/types': 8.52.0 eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-visitor-keys: 5.0.0 + espree: 11.0.0 estraverse: 5.3.0 picomatch: 4.0.3 @@ -11899,9 +11891,9 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 - '@types/babel__code-frame@7.0.6': {} + '@types/babel__code-frame@7.27.0': {} '@types/babel__core@7.20.5': dependencies: @@ -11929,16 +11921,16 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/browser-sync@2.29.1': dependencies: '@types/micromatch': 2.3.35 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/serve-static': 2.2.0 chokidar: 3.6.0 @@ -11949,23 +11941,23 @@ snapshots: '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/co-body@6.1.3': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/qs': 6.14.0 '@types/command-line-args@5.2.3': {} '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 4.19.7 - '@types/node': 22.19.3 + '@types/express-serve-static-core': 4.19.8 + '@types/node': 22.19.5 '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/content-disposition@0.5.9': {} @@ -11976,11 +11968,11 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 5.0.6 '@types/keygrip': 1.0.6 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/cors@2.8.19': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/debounce@1.2.4': {} @@ -11988,7 +11980,7 @@ snapshots: '@types/duplexify@3.6.5': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/ejs@3.1.5': {} @@ -12006,16 +11998,16 @@ snapshots: '@types/events@3.0.3': {} - '@types/express-serve-static-core@4.19.7': + '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 - '@types/express-serve-static-core@5.1.0': + '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -12023,25 +12015,25 @@ snapshots: '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/qs': 6.14.0 '@types/serve-static': 1.15.10 '@types/express@5.0.6': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.0 + '@types/express-serve-static-core': 5.1.1 '@types/serve-static': 2.2.0 '@types/folder-hash@4.0.4': {} '@types/git-raw-commits@5.0.1': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/http-assert@1.5.6': {} @@ -12049,7 +12041,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/ini@4.1.1': {} @@ -12065,17 +12057,19 @@ snapshots: '@types/jasmine-reporters@2.5.3': dependencies: - '@types/jasmine': 5.1.13 + '@types/jasmine': 5.1.14 '@types/jasmine@5.1.13': {} + '@types/jasmine@5.1.14': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} '@types/karma@6.3.9': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 log4js: 6.9.1 transitivePeerDependencies: - supports-color @@ -12095,13 +12089,13 @@ snapshots: '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.9 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/less@3.0.8': {} '@types/loader-utils@3.0.0(esbuild@0.27.2)': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: - '@swc/core' @@ -12109,7 +12103,7 @@ snapshots: - uglify-js - webpack-cli - '@types/lodash@4.17.21': {} + '@types/lodash@4.17.23': {} '@types/micromatch@2.3.35': dependencies: @@ -12119,26 +12113,26 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 form-data: 4.0.5 '@types/node-forge@1.3.14': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 - '@types/node@22.19.3': + '@types/node@22.19.5': dependencies: - undici-types: 7.18.0 + undici-types: 7.18.2 '@types/node@24.10.4': dependencies: - undici-types: 7.18.0 + undici-types: 7.18.2 '@types/npm-package-arg@6.1.4': {} '@types/npm-registry-fetch@8.0.9': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/node-fetch': 2.6.13 '@types/npm-package-arg': 6.1.4 '@types/npmlog': 7.0.0 @@ -12146,11 +12140,11 @@ snapshots: '@types/npmlog@7.0.0': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/pacote@11.1.8': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/npm-registry-fetch': 8.0.9 '@types/npmlog': 7.0.0 '@types/ssri': 7.1.5 @@ -12163,12 +12157,12 @@ snapshots: '@types/progress@2.0.7': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/pumpify@1.4.5': dependencies: '@types/duplexify': 3.6.5 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/q@0.0.32': {} @@ -12180,7 +12174,7 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/retry@0.12.2': {} @@ -12191,11 +12185,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/serve-index@1.9.4': dependencies: @@ -12204,42 +12198,42 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/send': 0.17.6 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/ssri@7.1.5': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/stack-trace@0.0.33': {} '@types/tar-stream@3.1.4': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/watchpack@2.4.5': dependencies: '@types/graceful-fs': 4.1.9 - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/which@3.0.4': {} '@types/ws@7.4.7': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 '@types/yargs-parser@21.0.3': {} @@ -12251,7 +12245,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 optional: true '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': @@ -12532,13 +12526,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.16(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.16 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.16': dependencies: @@ -12658,7 +12652,7 @@ snapshots: '@web/test-runner-core@0.13.4(bufferutil@4.1.0)': dependencies: '@babel/code-frame': 7.27.1 - '@types/babel__code-frame': 7.0.6 + '@types/babel__code-frame': 7.27.0 '@types/co-body': 6.1.3 '@types/convert-source-map': 2.0.3 '@types/debounce': 1.2.4 @@ -13062,7 +13056,7 @@ snapshots: autoprefixer@10.4.23(postcss@8.5.6): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001762 + caniuse-lite: 1.0.30001764 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -13151,7 +13145,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.9.11: {} + baseline-browser-mapping@2.9.14: {} basic-ftp@5.1.0: {} @@ -13232,13 +13226,13 @@ snapshots: transitivePeerDependencies: - supports-color - body-parser@2.2.1: + body-parser@2.2.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3(supports-color@10.2.2) http-errors: 2.0.1 - iconv-lite: 0.7.1 + iconv-lite: 0.7.2 on-finished: 2.4.1 qs: 6.14.1 raw-body: 3.0.2 @@ -13330,8 +13324,8 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.9.11 - caniuse-lite: 1.0.30001762 + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001764 electron-to-chromium: 1.5.267 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -13424,7 +13418,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001762: {} + caniuse-lite@1.0.30001764: {} caseless@0.12.0: {} @@ -13485,7 +13479,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -13769,10 +13763,10 @@ snapshots: cssesc@3.0.0: {} - cssstyle@5.3.6: + cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.1 - '@csstools/css-syntax-patches-for-csstree': 1.0.22 + '@csstools/css-syntax-patches-for-csstree': 1.0.25 css-tree: 3.1.0 lru-cache: 11.2.4 @@ -13918,9 +13912,6 @@ snapshots: destroy@1.2.0: {} - detect-libc@1.0.3: - optional: true - detect-libc@2.1.2: optional: true @@ -14059,7 +14050,7 @@ snapshots: engine.io@6.6.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@types/cors': 2.8.19 - '@types/node': 22.19.3 + '@types/node': 22.19.5 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -14315,6 +14306,8 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.0: {} + eslint@9.39.2(jiti@2.6.1): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -14362,6 +14355,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 + espree@11.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 5.0.0 + esprima@4.0.1: {} esquery@1.7.0: @@ -14507,7 +14506,7 @@ snapshots: express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.1 + body-parser: 2.2.2 content-disposition: 1.0.1 content-type: 1.0.5 cookie: 0.7.2 @@ -14541,7 +14540,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -15249,7 +15248,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.1: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -15634,7 +15633,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -15659,7 +15658,7 @@ snapshots: '@acemir/cssom': 0.9.30 '@asamuzakjp/dom-selector': 6.7.6 '@exodus/bytes': 1.8.0 - cssstyle: 5.3.6 + cssstyle: 5.3.7 data-urls: 6.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 @@ -15674,7 +15673,7 @@ snapshots: webidl-conversions: 8.0.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) xml-name-validator: 5.0.0 transitivePeerDependencies: - '@exodus/crypto' @@ -16310,7 +16309,7 @@ snapshots: needle@3.3.1: dependencies: iconv-lite: 0.6.3 - sax: 1.4.3 + sax: 1.4.4 optional: true negotiator@0.6.3: {} @@ -16435,7 +16434,7 @@ snapshots: hosted-git-info: 9.0.2 proc-log: 6.1.0 semver: 7.7.3 - validate-npm-package-name: 7.0.1 + validate-npm-package-name: 7.0.2 npm-packlist@10.0.3: dependencies: @@ -16917,7 +16916,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.3 + '@types/node': 22.19.5 long: 5.3.2 protractor@7.0.0: @@ -17013,7 +17012,7 @@ snapshots: devtools-protocol: 0.0.1534754 typed-query-selector: 2.12.0 webdriver-bidi-protocol: 0.3.10 - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -17101,7 +17100,7 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.1 + iconv-lite: 0.7.2 unpipe: 1.0.0 readable-stream@2.3.8: @@ -17329,12 +17328,12 @@ snapshots: optionalDependencies: '@babel/code-frame': 7.27.1 - rollup-plugin-sourcemaps2@0.5.4(@types/node@22.19.3)(rollup@4.55.1): + rollup-plugin-sourcemaps2@0.5.4(@types/node@22.19.5)(rollup@4.55.1): dependencies: '@rollup/pluginutils': 5.2.0(rollup@4.55.1) rollup: 4.55.1 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 rollup@4.55.1: dependencies: @@ -17429,7 +17428,7 @@ snapshots: immutable: 5.1.4 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 + '@parcel/watcher': 2.5.4 saucelabs@1.5.0: dependencies: @@ -17437,7 +17436,7 @@ snapshots: transitivePeerDependencies: - supports-color - sax@1.4.3: {} + sax@1.4.4: {} saxes@6.0.0: dependencies: @@ -18154,14 +18153,14 @@ snapshots: dependencies: typescript: 5.9.3 - ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3): + ts-node@10.9.2(@types/node@22.19.5)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.3 + '@types/node': 22.19.5 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -18289,7 +18288,7 @@ snapshots: buffer: 5.7.1 through: 2.3.8 - undici-types@7.18.0: {} + undici-types@7.18.2: {} undici@5.29.0: dependencies: @@ -18381,7 +18380,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@7.0.1: {} + validate-npm-package-name@7.0.2: {} validator@13.15.23: {} @@ -18461,24 +18460,6 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.55.1 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.10.4 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.4.2 - sass: 1.97.2 - terser: 5.44.1 - tsx: 4.21.0 - yaml: 2.8.2 - vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 @@ -18500,7 +18481,7 @@ snapshots: vitest@4.0.16(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.16 - '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.16(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.16 '@vitest/runner': 4.0.16 '@vitest/snapshot': 4.0.16 @@ -18517,7 +18498,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.10.4)(jiti@2.6.1)(less@4.4.2)(sass@1.97.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -18601,7 +18582,7 @@ snapshots: '@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.7 + '@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 @@ -18625,7 +18606,7 @@ snapshots: sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1(esbuild@0.27.2)) - ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: webpack: 5.104.1(esbuild@0.27.2) transitivePeerDependencies: @@ -18807,6 +18788,11 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 6.0.6 + ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + ws@8.9.0(bufferutil@4.1.0): optionalDependencies: bufferutil: 4.1.0 @@ -18826,7 +18812,7 @@ snapshots: xml2js@0.4.23: dependencies: - sax: 1.4.3 + sax: 1.4.4 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {}