diff --git a/CHANGELOG.md b/CHANGELOG.md
index 82043c029b3b..8fc145618dd9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,88 @@
+
+
+# 20.3.19 (2026-03-04)
+
+### @angular-devkit/build-angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------- |
+| [0299b4d1a](https://github.com/angular/angular-cli/commit/0299b4d1aca13f11a06e2e92c593fe3e20906d23) | fix | update copy-webpack-plugin to v14.0.0 |
+
+
+
+
+
+# 20.3.18 (2026-02-26)
+
+### @angular-devkit/core
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------ |
+| [39596d529](https://github.com/angular/angular-cli/commit/39596d529f831f72a2134bc3c9ac163867ff5702) | fix | update `ajv` to `8.18.0` |
+
+### @angular/build
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ----------------------- |
+| [f668e2778](https://github.com/angular/angular-cli/commit/f668e2778c4c4dbecc8a1c6831c092f5512d1ec1) | fix | update rollup to 4.59.0 |
+
+
+
+
+
+# 20.3.17 (2026-02-23)
+
+### @angular/ssr
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------- |
+| [8700e18d7](https://github.com/angular/angular-cli/commit/8700e18d7cf175d80fe6ce6205589767b7870c1c) | fix | prevent open redirect via X-Forwarded-Prefix header |
+| [67582a946](https://github.com/angular/angular-cli/commit/67582a946808d2c021cbcfacbf203ef58a6fbded) | fix | validate host headers to prevent header-based SSRF |
+
+
+
+
+
+# 20.3.16 (2026-02-09)
+
+### @angular/cli
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ |
+| [656888a25](https://github.com/angular/angular-cli/commit/656888a250af060c110ae87024b0e475b079c23d) | fix | update dependency @modelcontextprotocol/sdk to v1.26.0 |
+
+
+
+
+
+# 20.3.15 (2026-01-21)
+
+### @angular/cli
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------ |
+| [795d65413](https://github.com/angular/angular-cli/commit/795d654138701a03d4d793d3299ff4f33e427a03) | fix | update pacote to v21.0.4 |
+
+### @angular-devkit/build-angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | --------------------------------- |
+| [ffc72cbc5](https://github.com/angular/angular-cli/commit/ffc72cbc52e23cb545476b3fdefc7e5f170eb55d) | fix | update webpack to version 5.104.1 |
+
+
+
+
+
+# 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 |
+
+
+
# 20.3.13 (2025-12-03)
diff --git a/goldens/public-api/angular/ssr/index.api.md b/goldens/public-api/angular/ssr/index.api.md
index 81764fcc1f62..cbdacabfd7f6 100644
--- a/goldens/public-api/angular/ssr/index.api.md
+++ b/goldens/public-api/angular/ssr/index.api.md
@@ -11,11 +11,17 @@ import { Type } from '@angular/core';
// @public
export class AngularAppEngine {
+ constructor(options?: AngularAppEngineOptions);
handle(request: Request, requestContext?: unknown): Promise;
static ɵallowStaticRouteRender: boolean;
static ɵhooks: Hooks;
}
+// @public
+export interface AngularAppEngineOptions {
+ allowedHosts?: readonly string[];
+}
+
// @public
export function createRequestHandler(handler: RequestHandlerFunction): RequestHandlerFunction;
diff --git a/goldens/public-api/angular/ssr/node/index.api.md b/goldens/public-api/angular/ssr/node/index.api.md
index eccb6396938e..2c52c06b47c1 100644
--- a/goldens/public-api/angular/ssr/node/index.api.md
+++ b/goldens/public-api/angular/ssr/node/index.api.md
@@ -15,8 +15,12 @@ import { Type } from '@angular/core';
// @public
export class AngularNodeAppEngine {
- constructor();
- handle(request: IncomingMessage | Http2ServerRequest, requestContext?: unknown): Promise;
+ constructor(options?: AngularNodeAppEngineOptions);
+ handle(request: IncomingMessage | Http2ServerRequest | Request, requestContext?: unknown): Promise;
+}
+
+// @public
+export interface AngularNodeAppEngineOptions extends AngularAppEngineOptions {
}
// @public
@@ -27,6 +31,7 @@ export class CommonEngine {
// @public (undocumented)
export interface CommonEngineOptions {
+ allowedHosts?: readonly string[];
bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise);
enablePerformanceProfiler?: boolean;
providers?: StaticProvider[];
diff --git a/goldens/public-api/angular_devkit/build_webpack/index.api.md b/goldens/public-api/angular_devkit/build_webpack/index.api.md
index db2b47c9ed74..0d60187627d5 100644
--- a/goldens/public-api/angular_devkit/build_webpack/index.api.md
+++ b/goldens/public-api/angular_devkit/build_webpack/index.api.md
@@ -7,8 +7,8 @@
import { BuilderContext } from '@angular-devkit/architect';
import { BuilderOutput } from '@angular-devkit/architect';
import { Observable } from 'rxjs';
-import webpack from 'webpack';
-import WebpackDevServer from 'webpack-dev-server';
+import type webpack from 'webpack';
+import type WebpackDevServer from 'webpack-dev-server';
// @public (undocumented)
export type BuildResult = BuilderOutput & {
diff --git a/package.json b/package.json
index 3a070036b09b..a0387019ed7e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@angular/devkit-repo",
- "version": "20.3.13",
+ "version": "20.3.19",
"private": true,
"description": "Software Development Kit for Angular",
"keywords": [
@@ -96,7 +96,7 @@
"@types/yarnpkg__lockfile": "^1.1.5",
"@typescript-eslint/eslint-plugin": "8.39.1",
"@typescript-eslint/parser": "8.39.1",
- "ajv": "8.17.1",
+ "ajv": "8.18.0",
"ansi-colors": "4.1.3",
"beasties": "0.3.5",
"buffer": "6.0.3",
@@ -132,7 +132,7 @@
"protractor": "~7.0.0",
"puppeteer": "18.2.1",
"quicktype-core": "23.2.6",
- "rollup": "4.46.2",
+ "rollup": "4.59.0",
"rollup-license-plugin": "~3.0.1",
"semver": "7.7.2",
"shelljs": "^0.10.0",
diff --git a/packages/angular/build/BUILD.bazel b/packages/angular/build/BUILD.bazel
index 8102d101e166..059426ca38d1 100644
--- a/packages/angular/build/BUILD.bazel
+++ b/packages/angular/build/BUILD.bazel
@@ -300,6 +300,10 @@ jasmine_test(
name = "dev-server_integration_tests",
size = "medium",
data = [":dev-server_integration_test_lib"],
+ env = {
+ # Force IPv4 to resolve RBE resolution issues
+ "NODE_OPTIONS": "--dns-result-order=ipv4first",
+ },
flaky = True,
shard_count = 10,
)
diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json
index ea57319b5721..2a3a98d341da 100644
--- a/packages/angular/build/package.json
+++ b/packages/angular/build/package.json
@@ -37,7 +37,7 @@
"parse5-html-rewriting-stream": "8.0.0",
"picomatch": "4.0.3",
"piscina": "5.1.3",
- "rollup": "4.52.3",
+ "rollup": "4.59.0",
"sass": "1.90.0",
"semver": "7.7.2",
"source-map-support": "0.5.21",
diff --git a/packages/angular/build/src/builders/application/execute-build.ts b/packages/angular/build/src/builders/application/execute-build.ts
index 0654cd965558..aaddc5b6ef7e 100644
--- a/packages/angular/build/src/builders/application/execute-build.ts
+++ b/packages/angular/build/src/builders/application/execute-build.ts
@@ -56,6 +56,7 @@ export async function executeBuild(
verbose,
colors,
jsonLogs,
+ security,
} = options;
// TODO: Consider integrating into watch mode. Would require full rebuild on target changes.
@@ -263,7 +264,7 @@ export async function executeBuild(
if (serverEntryPoint) {
executionResult.addOutputFile(
SERVER_APP_ENGINE_MANIFEST_FILENAME,
- generateAngularServerAppEngineManifest(i18nOptions, baseHref),
+ generateAngularServerAppEngineManifest(i18nOptions, security.allowedHosts, baseHref),
BuildOutputFileType.ServerRoot,
);
}
diff --git a/packages/angular/build/src/builders/application/options.ts b/packages/angular/build/src/builders/application/options.ts
index 25bd87253357..87bec31ed381 100644
--- a/packages/angular/build/src/builders/application/options.ts
+++ b/packages/angular/build/src/builders/application/options.ts
@@ -400,8 +400,9 @@ export async function normalizeOptions(
}
}
- const autoCsp = options.security?.autoCsp;
+ const { autoCsp, allowedHosts = [] } = options.security ?? {};
const security = {
+ allowedHosts,
autoCsp: autoCsp
? {
unsafeEval: autoCsp === true ? false : !!autoCsp.unsafeEval,
diff --git a/packages/angular/build/src/builders/application/schema.json b/packages/angular/build/src/builders/application/schema.json
index 8db4e6145b3f..5498a21fe004 100644
--- a/packages/angular/build/src/builders/application/schema.json
+++ b/packages/angular/build/src/builders/application/schema.json
@@ -52,6 +52,14 @@
"type": "object",
"additionalProperties": false,
"properties": {
+ "allowedHosts": {
+ "description": "A list of hostnames that are allowed to access the server-side application. For more information, see https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf.",
+ "type": "array",
+ "uniqueItems": true,
+ "items": {
+ "type": "string"
+ }
+ },
"autoCsp": {
"description": "Enables automatic generation of a hash-based Strict Content Security Policy (https://web.dev/articles/strict-csp#choose-hash) based on scripts in index.html. Will default to true once we are out of experimental/preview phases.",
"default": false,
diff --git a/packages/angular/build/src/builders/dev-server/vite-server.ts b/packages/angular/build/src/builders/dev-server/vite-server.ts
index 7f8665dd8061..4df3cc3d4023 100644
--- a/packages/angular/build/src/builders/dev-server/vite-server.ts
+++ b/packages/angular/build/src/builders/dev-server/vite-server.ts
@@ -113,7 +113,16 @@ export async function* serveWithVite(
}
// Disable auto CSP.
+ const allowedHosts = Array.isArray(serverOptions.allowedHosts)
+ ? [...serverOptions.allowedHosts]
+ : [];
+
+ // Always allow the dev server host
+ allowedHosts.push(serverOptions.host);
+
browserOptions.security = {
+ allowedHosts,
+ // Disable auto CSP.
autoCsp: false,
};
diff --git a/packages/angular/build/src/utils/server-rendering/manifest.ts b/packages/angular/build/src/utils/server-rendering/manifest.ts
index 2dfad0ff2dfb..975f7718715d 100644
--- a/packages/angular/build/src/utils/server-rendering/manifest.ts
+++ b/packages/angular/build/src/utils/server-rendering/manifest.ts
@@ -53,11 +53,13 @@ function escapeUnsafeChars(str: string): string {
*
* @param i18nOptions - The internationalization options for the application build. This
* includes settings for inlining locales and determining the output structure.
+ * @param allowedHosts - A list of hosts that are allowed to access the server-side application.
* @param baseHref - The base HREF for the application. This is used to set the base URL
* for all relative URLs in the application.
*/
export function generateAngularServerAppEngineManifest(
i18nOptions: NormalizedApplicationBuildOptions['i18nOptions'],
+ allowedHosts: string[],
baseHref: string | undefined,
): string {
const entryPoints: Record = {};
@@ -84,6 +86,7 @@ export function generateAngularServerAppEngineManifest(
const manifestContent = `
export default {
basePath: '${basePath}',
+ allowedHosts: ${JSON.stringify(allowedHosts, undefined, 2)},
supportedLocales: ${JSON.stringify(supportedLocales, undefined, 2)},
entryPoints: {
${Object.entries(entryPoints)
diff --git a/packages/angular/build/src/utils/server-rendering/prerender.ts b/packages/angular/build/src/utils/server-rendering/prerender.ts
index f33f851f10c4..39d0f0934c92 100644
--- a/packages/angular/build/src/utils/server-rendering/prerender.ts
+++ b/packages/angular/build/src/utils/server-rendering/prerender.ts
@@ -225,6 +225,9 @@ async function renderPages(
hasSsrEntry: !!outputFilesForWorker['server.mjs'],
} as RenderWorkerData,
execArgv: workerExecArgv,
+ env: {
+ 'NG_ALLOWED_HOSTS': 'localhost',
+ },
});
try {
@@ -337,6 +340,9 @@ async function getAllRoutes(
hasSsrEntry: !!outputFilesForWorker['server.mjs'],
} as RoutesExtractorWorkerData,
execArgv: workerExecArgv,
+ env: {
+ 'NG_ALLOWED_HOSTS': 'localhost',
+ },
});
try {
diff --git a/packages/angular/cli/package.json b/packages/angular/cli/package.json
index 38a2e6e30394..3668dbef400a 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.8.2",
"@listr2/prompt-adapter-inquirer": "3.0.1",
- "@modelcontextprotocol/sdk": "1.24.0",
+ "@modelcontextprotocol/sdk": "1.26.0",
"@schematics/angular": "workspace:0.0.0-PLACEHOLDER",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.35.0",
@@ -35,7 +35,7 @@
"jsonc-parser": "3.3.1",
"listr2": "9.0.1",
"npm-package-arg": "13.0.0",
- "pacote": "21.0.0",
+ "pacote": "21.0.4",
"resolve": "1.22.10",
"semver": "7.7.2",
"yargs": "18.0.0",
diff --git a/packages/angular/ssr/BUILD.bazel b/packages/angular/ssr/BUILD.bazel
index 2218488daeb6..982bdfbb577b 100644
--- a/packages/angular/ssr/BUILD.bazel
+++ b/packages/angular/ssr/BUILD.bazel
@@ -20,7 +20,7 @@ ts_project(
),
args = [
"--lib",
- "dom,es2020",
+ "dom.iterable,dom,es2022",
],
data = [
"//packages/angular/ssr/third_party/beasties:beasties_bundled",
diff --git a/packages/angular/ssr/node/public_api.ts b/packages/angular/ssr/node/public_api.ts
index 81932873a440..89900f95cc5c 100644
--- a/packages/angular/ssr/node/public_api.ts
+++ b/packages/angular/ssr/node/public_api.ts
@@ -12,7 +12,7 @@ export {
type CommonEngineOptions,
} from './src/common-engine/common-engine';
-export { AngularNodeAppEngine } from './src/app-engine';
+export { AngularNodeAppEngine, type AngularNodeAppEngineOptions } from './src/app-engine';
export { createNodeRequestHandler, type NodeRequestHandlerFunction } from './src/handler';
export { writeResponseToNodeResponse } from './src/response';
diff --git a/packages/angular/ssr/node/src/app-engine.ts b/packages/angular/ssr/node/src/app-engine.ts
index 8edac0ef69c6..29eb1fd366ab 100644
--- a/packages/angular/ssr/node/src/app-engine.ts
+++ b/packages/angular/ssr/node/src/app-engine.ts
@@ -9,9 +9,16 @@
import { AngularAppEngine } from '@angular/ssr';
import type { IncomingMessage } from 'node:http';
import type { Http2ServerRequest } from 'node:http2';
+import { AngularAppEngineOptions } from '../../src/app-engine';
+import { getAllowedHostsFromEnv } from './environment-options';
import { attachNodeGlobalErrorHandlers } from './errors';
import { createWebRequestFromNodeRequest } from './request';
+/**
+ * Options for the Angular Node.js server application engine.
+ */
+export interface AngularNodeAppEngineOptions extends AngularAppEngineOptions {}
+
/**
* Angular server application engine.
* Manages Angular server applications (including localized ones), handles rendering requests,
@@ -21,9 +28,18 @@ import { createWebRequestFromNodeRequest } from './request';
* application to ensure consistent handling of rendering requests and resource management.
*/
export class AngularNodeAppEngine {
- private readonly angularAppEngine = new AngularAppEngine();
+ private readonly angularAppEngine: AngularAppEngine;
+
+ /**
+ * Creates a new instance of the Angular Node.js server application engine.
+ * @param options Options for the Angular Node.js server application engine.
+ */
+ constructor(options?: AngularNodeAppEngineOptions) {
+ this.angularAppEngine = new AngularAppEngine({
+ ...options,
+ allowedHosts: [...getAllowedHostsFromEnv(), ...(options?.allowedHosts ?? [])],
+ });
- constructor() {
attachNodeGlobalErrorHandlers();
}
@@ -31,21 +47,36 @@ export class AngularNodeAppEngine {
* Handles an incoming HTTP request by serving prerendered content, performing server-side rendering,
* or delivering a static file for client-side rendered routes based on the `RenderMode` setting.
*
- * This method adapts Node.js's `IncomingMessage` or `Http2ServerRequest`
+ * This method adapts Node.js's `IncomingMessage`, `Http2ServerRequest` or `Request`
* to a format compatible with the `AngularAppEngine` and delegates the handling logic to it.
*
- * @param request - The incoming HTTP request (`IncomingMessage` or `Http2ServerRequest`).
+ * @param request - The incoming HTTP request (`IncomingMessage`, `Http2ServerRequest` or `Request`).
* @param requestContext - Optional context for rendering, such as metadata associated with the request.
* @returns A promise that resolves to the resulting HTTP response object, or `null` if no matching Angular route is found.
*
* @remarks A request to `https://www.example.com/page/index.html` will serve or render the Angular route
* corresponding to `https://www.example.com/page`.
+ *
+ * @remarks
+ * To prevent potential Server-Side Request Forgery (SSRF), this function verifies the hostname
+ * of the `request.url` against a list of authorized hosts.
+ * If the hostname is not recognized and `allowedHosts` is not empty, a Client-Side Rendered (CSR) version of the
+ * page is returned otherwise a 400 Bad Request is returned.
+ *
+ * Resolution:
+ * Authorize your hostname by configuring `allowedHosts` in `angular.json` in:
+ * `projects.[project-name].architect.build.options.security.allowedHosts`.
+ * Alternatively, you can define the allowed hostname via the environment variable `process.env['NG_ALLOWED_HOSTS']`
+ * or pass it directly through the configuration options of `AngularNodeAppEngine`.
+ *
+ * For more information see: https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf
*/
async handle(
- request: IncomingMessage | Http2ServerRequest,
+ request: IncomingMessage | Http2ServerRequest | Request,
requestContext?: unknown,
): Promise {
- const webRequest = createWebRequestFromNodeRequest(request);
+ const webRequest =
+ request instanceof Request ? request : createWebRequestFromNodeRequest(request);
return this.angularAppEngine.handle(webRequest, requestContext);
}
diff --git a/packages/angular/ssr/node/src/common-engine/common-engine.ts b/packages/angular/ssr/node/src/common-engine/common-engine.ts
index 079c1187696b..1c130d9abe86 100644
--- a/packages/angular/ssr/node/src/common-engine/common-engine.ts
+++ b/packages/angular/ssr/node/src/common-engine/common-engine.ts
@@ -12,6 +12,8 @@ import { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/plat
import * as fs from 'node:fs';
import { dirname, join, normalize, resolve } from 'node:path';
import { URL } from 'node:url';
+import { validateUrl } from '../../../src/utils/validation';
+import { getAllowedHostsFromEnv } from '../environment-options';
import { attachNodeGlobalErrorHandlers } from '../errors';
import { CommonEngineInlineCriticalCssProcessor } from './inline-css-processor';
import {
@@ -31,6 +33,9 @@ export interface CommonEngineOptions {
/** Enable request performance profiling data collection and printing the results in the server console. */
enablePerformanceProfiler?: boolean;
+
+ /** A set of hostnames that are allowed to access the server. */
+ allowedHosts?: readonly string[];
}
export interface CommonEngineRenderOptions {
@@ -64,8 +69,14 @@ export class CommonEngine {
private readonly templateCache = new Map();
private readonly inlineCriticalCssProcessor = new CommonEngineInlineCriticalCssProcessor();
private readonly pageIsSSG = new Map();
+ private readonly allowedHosts: ReadonlySet;
constructor(private options?: CommonEngineOptions) {
+ this.allowedHosts = new Set([
+ ...getAllowedHostsFromEnv(),
+ ...(this.options?.allowedHosts ?? []),
+ ]);
+
attachNodeGlobalErrorHandlers();
}
@@ -74,6 +85,40 @@ export class CommonEngine {
* render options
*/
async render(opts: CommonEngineRenderOptions): Promise {
+ const { url } = opts;
+
+ if (url && URL.canParse(url)) {
+ const urlObj = new URL(url);
+ try {
+ validateUrl(urlObj, this.allowedHosts);
+ } catch (error) {
+ const isAllowedHostConfigured = this.allowedHosts.size > 0;
+ // eslint-disable-next-line no-console
+ console.error(
+ `ERROR: ${(error as Error).message}` +
+ 'Please provide a list of allowed hosts in the "allowedHosts" option in the "CommonEngine" constructor.',
+ isAllowedHostConfigured
+ ? ''
+ : '\nFalling back to client side rendering. This will become a 400 Bad Request in a future major version.',
+ );
+
+ if (!isAllowedHostConfigured) {
+ // Fallback to CSR to avoid a breaking change.
+ // TODO(alanagius): Return a 400 and remove this fallback in the next major version (v22).
+ let document = opts.document;
+ if (!document && opts.documentFilePath) {
+ document = opts.document ?? (await this.getDocument(opts.documentFilePath));
+ }
+
+ if (document) {
+ return document;
+ }
+ }
+
+ throw error;
+ }
+ }
+
const enablePerformanceProfiler = this.options?.enablePerformanceProfiler;
const runMethod = enablePerformanceProfiler
diff --git a/packages/angular/ssr/node/src/environment-options.ts b/packages/angular/ssr/node/src/environment-options.ts
new file mode 100644
index 000000000000..b18dcd08ebe6
--- /dev/null
+++ b/packages/angular/ssr/node/src/environment-options.ts
@@ -0,0 +1,29 @@
+/**
+ * @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
+ */
+
+/**
+ * Retrieves the list of allowed hosts from the environment variable `NG_ALLOWED_HOSTS`.
+ * @returns An array of allowed hosts.
+ */
+export function getAllowedHostsFromEnv(): ReadonlyArray {
+ const allowedHosts: string[] = [];
+ const envNgAllowedHosts = process.env['NG_ALLOWED_HOSTS'];
+ if (!envNgAllowedHosts) {
+ return allowedHosts;
+ }
+
+ const hosts = envNgAllowedHosts.split(',');
+ for (const host of hosts) {
+ const trimmed = host.trim();
+ if (trimmed.length > 0) {
+ allowedHosts.push(trimmed);
+ }
+ }
+
+ return allowedHosts;
+}
diff --git a/packages/angular/ssr/node/src/request.ts b/packages/angular/ssr/node/src/request.ts
index 32d90d0029fc..402ec29ba56d 100644
--- a/packages/angular/ssr/node/src/request.ts
+++ b/packages/angular/ssr/node/src/request.ts
@@ -8,6 +8,7 @@
import type { IncomingHttpHeaders, IncomingMessage } from 'node:http';
import type { Http2ServerRequest } from 'node:http2';
+import { getFirstHeaderValue } from '../../src/utils/validation';
/**
* A set containing all the pseudo-headers defined in the HTTP/2 specification.
@@ -103,21 +104,3 @@ export function createRequestUrl(nodeRequest: IncomingMessage | Http2ServerReque
return new URL(`${protocol}://${hostnameWithPort}${originalUrl ?? url}`);
}
-
-/**
- * Extracts the first value from a multi-value header string.
- *
- * @param value - A string or an array of strings representing the header values.
- * If it's a string, values are expected to be comma-separated.
- * @returns The first trimmed value from the multi-value header, or `undefined` if the input is invalid or empty.
- *
- * @example
- * ```typescript
- * getFirstHeaderValue("value1, value2, value3"); // "value1"
- * getFirstHeaderValue(["value1", "value2"]); // "value1"
- * getFirstHeaderValue(undefined); // undefined
- * ```
- */
-function getFirstHeaderValue(value: string | string[] | undefined): string | undefined {
- return value?.toString().split(',', 1)[0]?.trim();
-}
diff --git a/packages/angular/ssr/public_api.ts b/packages/angular/ssr/public_api.ts
index e685f4ceabe3..e566d8414f2f 100644
--- a/packages/angular/ssr/public_api.ts
+++ b/packages/angular/ssr/public_api.ts
@@ -8,7 +8,7 @@
export * from './private_export';
-export { AngularAppEngine } from './src/app-engine';
+export { AngularAppEngine, type AngularAppEngineOptions } from './src/app-engine';
export { createRequestHandler, type RequestHandlerFunction } from './src/handler';
export {
diff --git a/packages/angular/ssr/src/app-engine.ts b/packages/angular/ssr/src/app-engine.ts
index dd204a4b595f..6242750b4c47 100644
--- a/packages/angular/ssr/src/app-engine.ts
+++ b/packages/angular/ssr/src/app-engine.ts
@@ -11,6 +11,17 @@ import { Hooks } from './hooks';
import { getPotentialLocaleIdFromUrl, getPreferredLocale } from './i18n';
import { EntryPointExports, getAngularAppEngineManifest } from './manifest';
import { joinUrlParts } from './utils/url';
+import { cloneRequestAndPatchHeaders, validateRequest } from './utils/validation';
+
+/**
+ * Options for the Angular server application engine.
+ */
+export interface AngularAppEngineOptions {
+ /**
+ * A set of allowed hostnames for the server application.
+ */
+ allowedHosts?: readonly string[];
+}
/**
* Angular server application engine.
@@ -45,6 +56,11 @@ export class AngularAppEngine {
*/
private readonly manifest = getAngularAppEngineManifest();
+ /**
+ * A set of allowed hostnames for the server application.
+ */
+ private readonly allowedHosts: ReadonlySet;
+
/**
* A map of supported locales from the server application's manifest.
*/
@@ -57,6 +73,14 @@ export class AngularAppEngine {
*/
private readonly entryPointsCache = new Map>();
+ /**
+ * Creates a new instance of the Angular server application engine.
+ * @param options Options for the Angular server application engine.
+ */
+ constructor(options?: AngularAppEngineOptions) {
+ this.allowedHosts = new Set([...(options?.allowedHosts ?? []), ...this.manifest.allowedHosts]);
+ }
+
/**
* Handles an incoming HTTP request by serving prerendered content, performing server-side rendering,
* or delivering a static file for client-side rendered routes based on the `RenderMode` setting.
@@ -67,12 +91,38 @@ export class AngularAppEngine {
*
* @remarks A request to `https://www.example.com/page/index.html` will serve or render the Angular route
* corresponding to `https://www.example.com/page`.
+ *
+ * @remarks
+ * To prevent potential Server-Side Request Forgery (SSRF), this function verifies the hostname
+ * of the `request.url` against a list of authorized hosts.
+ * If the hostname is not recognized and `allowedHosts` is not empty, a Client-Side Rendered (CSR) version of the
+ * page is returned otherwise a 400 Bad Request is returned.
+ * Resolution:
+ * Authorize your hostname by configuring `allowedHosts` in `angular.json` in:
+ * `projects.[project-name].architect.build.options.security.allowedHosts`.
+ * Alternatively, you pass it directly through the configuration options of `AngularAppEngine`.
+ *
+ * For more information see: https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf
*/
async handle(request: Request, requestContext?: unknown): Promise {
- const serverApp = await this.getAngularServerAppForRequest(request);
+ const allowedHost = this.allowedHosts;
+ try {
+ validateRequest(request, allowedHost);
+ } catch (error) {
+ return this.handleValidationError(error as Error, request);
+ }
+
+ // Clone request with patched headers to prevent unallowed host header access.
+ const { request: securedRequest, onError: onHeaderValidationError } =
+ cloneRequestAndPatchHeaders(request, allowedHost);
+
+ const serverApp = await this.getAngularServerAppForRequest(securedRequest);
if (serverApp) {
- return serverApp.handle(request, requestContext);
+ return Promise.race([
+ onHeaderValidationError.then((error) => this.handleValidationError(error, securedRequest)),
+ serverApp.handle(securedRequest, requestContext),
+ ]);
}
if (this.supportedLocales.length > 1) {
@@ -201,4 +251,42 @@ export class AngularAppEngine {
return this.getEntryPointExports(potentialLocale) ?? this.getEntryPointExports('');
}
+
+ /**
+ * Handles validation errors by logging the error and returning an appropriate response.
+ *
+ * @param error - The validation error to handle.
+ * @param request - The HTTP request that caused the validation error.
+ * @returns A promise that resolves to a `Response` object with a 400 status code if allowed hosts are configured,
+ * or `null` if allowed hosts are not configured (in which case the request is served client-side).
+ */
+ private async handleValidationError(error: Error, request: Request): Promise {
+ const isAllowedHostConfigured = this.allowedHosts.size > 0;
+ const errorMessage = error.message;
+
+ // eslint-disable-next-line no-console
+ console.error(
+ `ERROR: Bad Request ("${request.url}").\n` +
+ errorMessage +
+ (isAllowedHostConfigured
+ ? ''
+ : '\nFalling back to client side rendering. This will become a 400 Bad Request in a future major version.') +
+ '\n\nFor more information, see https://angular.dev/best-practices/security#preventing-server-side-request-forgery-ssrf',
+ );
+
+ if (isAllowedHostConfigured) {
+ // Allowed hosts has been configured incorrectly, thus we can return a 400 bad request.
+ return new Response(errorMessage, {
+ status: 400,
+ statusText: 'Bad Request',
+ headers: { 'Content-Type': 'text/plain' },
+ });
+ }
+
+ // Fallback to CSR to avoid a breaking change.
+ // TODO(alanagius): Return a 400 and remove this fallback in the next major version (v22).
+ const serverApp = await this.getAngularServerAppForRequest(request);
+
+ return serverApp?.serveClientSidePage() ?? null;
+ }
}
diff --git a/packages/angular/ssr/src/app.ts b/packages/angular/ssr/src/app.ts
index ee14f8a26105..85227a9d8a33 100644
--- a/packages/angular/ssr/src/app.ts
+++ b/packages/angular/ssr/src/app.ts
@@ -468,6 +468,27 @@ export class AngularServerApp {
return html;
}
+
+ /**
+ * Serves the client-side version of the application.
+ * TODO(alanagius): Remove this method in version 22.
+ * @internal
+ */
+ async serveClientSidePage(): Promise {
+ const {
+ manifest: { locale },
+ assets,
+ } = this;
+
+ const html = await assets.getServerAsset('index.csr.html').text();
+
+ return new Response(html, {
+ headers: new Headers({
+ 'Content-Type': 'text/html;charset=UTF-8',
+ ...(locale !== undefined ? { 'Content-Language': locale } : {}),
+ }),
+ });
+ }
}
let angularServerApp: AngularServerApp | undefined;
diff --git a/packages/angular/ssr/src/manifest.ts b/packages/angular/ssr/src/manifest.ts
index 0de603bba104..21ded49b3e10 100644
--- a/packages/angular/ssr/src/manifest.ts
+++ b/packages/angular/ssr/src/manifest.ts
@@ -6,7 +6,6 @@
* found in the LICENSE file at https://angular.dev/license
*/
-import type { BootstrapContext } from '@angular/platform-browser';
import type { SerializableRouteTreeNode } from './routes/route-tree';
import { AngularBootstrap } from './utils/ng';
@@ -74,6 +73,11 @@ export interface AngularAppEngineManifest {
* - `value`: The url segment associated with that locale.
*/
readonly supportedLocales: Readonly>;
+
+ /**
+ * A readonly array of allowed hostnames.
+ */
+ readonly allowedHosts: Readonly;
}
/**
diff --git a/packages/angular/ssr/src/utils/url.ts b/packages/angular/ssr/src/utils/url.ts
index faabf15b1bd4..caf7f3aad310 100644
--- a/packages/angular/ssr/src/utils/url.ts
+++ b/packages/angular/ssr/src/utils/url.ts
@@ -95,26 +95,32 @@ export function addTrailingSlash(url: string): string {
* ```
*/
export function joinUrlParts(...parts: string[]): string {
- const normalizeParts: string[] = [];
+ const normalizedParts: string[] = [];
+
for (const part of parts) {
if (part === '') {
// Skip any empty parts
continue;
}
- let normalizedPart = part;
- if (part[0] === '/') {
- normalizedPart = normalizedPart.slice(1);
+ let start = 0;
+ let end = part.length;
+
+ // Use "Pointers" to avoid intermediate slices
+ while (start < end && part[start] === '/') {
+ start++;
}
- if (part[part.length - 1] === '/') {
- normalizedPart = normalizedPart.slice(0, -1);
+
+ while (end > start && part[end - 1] === '/') {
+ end--;
}
- if (normalizedPart !== '') {
- normalizeParts.push(normalizedPart);
+
+ if (start < end) {
+ normalizedParts.push(part.slice(start, end));
}
}
- return addLeadingSlash(normalizeParts.join('/'));
+ return addLeadingSlash(normalizedParts.join('/'));
}
/**
diff --git a/packages/angular/ssr/src/utils/validation.ts b/packages/angular/ssr/src/utils/validation.ts
new file mode 100644
index 000000000000..c89cdd6a64ed
--- /dev/null
+++ b/packages/angular/ssr/src/utils/validation.ts
@@ -0,0 +1,268 @@
+/**
+ * @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
+ */
+
+/**
+ * The set of headers that should be validated for host header injection attacks.
+ */
+const HOST_HEADERS_TO_VALIDATE: ReadonlySet = new Set(['host', 'x-forwarded-host']);
+
+/**
+ * Regular expression to validate that the port is a numeric value.
+ */
+const VALID_PORT_REGEX = /^\d+$/;
+
+/**
+ * Regular expression to validate that the protocol is either http or https (case-insensitive).
+ */
+const VALID_PROTO_REGEX = /^https?$/i;
+
+/**
+ * Regular expression to validate that the host is a valid hostname.
+ */
+const VALID_HOST_REGEX = /^[a-z0-9.:-]+$/i;
+
+/**
+ * Regular expression to validate that the prefix is valid.
+ */
+const INVALID_PREFIX_REGEX = /^[/\\]{2}|(?:^|[/\\])\.\.?(?:[/\\]|$)/;
+
+/**
+ * Extracts the first value from a multi-value header string.
+ *
+ * @param value - A string or an array of strings representing the header values.
+ * If it's a string, values are expected to be comma-separated.
+ * @returns The first trimmed value from the multi-value header, or `undefined` if the input is invalid or empty.
+ *
+ * @example
+ * ```typescript
+ * getFirstHeaderValue("value1, value2, value3"); // "value1"
+ * getFirstHeaderValue(["value1", "value2"]); // "value1"
+ * getFirstHeaderValue(undefined); // undefined
+ * ```
+ */
+export function getFirstHeaderValue(
+ value: string | string[] | undefined | null,
+): string | undefined {
+ return value?.toString().split(',', 1)[0]?.trim();
+}
+
+/**
+ * Validates a request.
+ *
+ * @param request - The incoming `Request` object to validate.
+ * @param allowedHosts - A set of allowed hostnames.
+ * @throws Error if any of the validated headers contain invalid values.
+ */
+export function validateRequest(request: Request, allowedHosts: ReadonlySet): void {
+ validateHeaders(request);
+ validateUrl(new URL(request.url), allowedHosts);
+}
+
+/**
+ * Validates that the hostname of a given URL is allowed.
+ *
+ * @param url - The URL object to validate.
+ * @param allowedHosts - A set of allowed hostnames.
+ * @throws Error if the hostname is not in the allowlist.
+ */
+export function validateUrl(url: URL, allowedHosts: ReadonlySet): void {
+ const { hostname } = url;
+ if (!isHostAllowed(hostname, allowedHosts)) {
+ throw new Error(`URL with hostname "${hostname}" is not allowed.`);
+ }
+}
+
+/**
+ * Clones a request and patches the `get` method of the request headers to validate the host headers.
+ * @param request - The request to validate.
+ * @param allowedHosts - A set of allowed hostnames.
+ * @returns An object containing the cloned request and a promise that resolves to an error
+ * if any of the validated headers contain invalid values.
+ */
+export function cloneRequestAndPatchHeaders(
+ request: Request,
+ allowedHosts: ReadonlySet,
+): { request: Request; onError: Promise } {
+ let onError: (value: Error) => void;
+ const onErrorPromise = new Promise((resolve) => {
+ onError = resolve;
+ });
+
+ const clonedReq = new Request(request.clone(), {
+ signal: request.signal,
+ });
+
+ const headers = clonedReq.headers;
+
+ const originalGet = headers.get;
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
+ (headers.get as typeof originalGet) = function (name) {
+ const value = originalGet.call(headers, name);
+ if (!value) {
+ return value;
+ }
+
+ validateHeader(name, value, allowedHosts, onError);
+
+ return value;
+ };
+
+ const originalValues = headers.values;
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
+ (headers.values as typeof originalValues) = function () {
+ for (const name of HOST_HEADERS_TO_VALIDATE) {
+ validateHeader(name, originalGet.call(headers, name), allowedHosts, onError);
+ }
+
+ return originalValues.call(headers);
+ };
+
+ const originalEntries = headers.entries;
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
+ (headers.entries as typeof originalEntries) = function () {
+ const iterator = originalEntries.call(headers);
+
+ return {
+ next() {
+ const result = iterator.next();
+ if (!result.done) {
+ const [key, value] = result.value;
+ validateHeader(key, value, allowedHosts, onError);
+ }
+
+ return result;
+ },
+ [Symbol.iterator]() {
+ return this;
+ },
+ };
+ };
+
+ // Ensure for...of loops use the new patched entries
+ (headers[Symbol.iterator] as typeof originalEntries) = headers.entries;
+
+ return { request: clonedReq, onError: onErrorPromise };
+}
+
+/**
+ * Validates a specific header value against the allowed hosts.
+ * @param name - The name of the header to validate.
+ * @param value - The value of the header to validate.
+ * @param allowedHosts - A set of allowed hostnames.
+ * @param onError - A callback function to call if the header value is invalid.
+ * @throws Error if the header value is invalid.
+ */
+function validateHeader(
+ name: string,
+ value: string | null,
+ allowedHosts: ReadonlySet,
+ onError: (value: Error) => void,
+): void {
+ if (!value) {
+ return;
+ }
+
+ if (!HOST_HEADERS_TO_VALIDATE.has(name.toLowerCase())) {
+ return;
+ }
+
+ try {
+ verifyHostAllowed(name, value, allowedHosts);
+ } catch (error) {
+ onError(error as Error);
+
+ throw error;
+ }
+}
+
+/**
+ * Validates a specific host header value against the allowed hosts.
+ *
+ * @param headerName - The name of the header to validate (e.g., 'host', 'x-forwarded-host').
+ * @param headerValue - The value of the header to validate.
+ * @param allowedHosts - A set of allowed hostnames.
+ * @throws Error if the header value is invalid or the hostname is not in the allowlist.
+ */
+function verifyHostAllowed(
+ headerName: string,
+ headerValue: string,
+ allowedHosts: ReadonlySet,
+): void {
+ const value = getFirstHeaderValue(headerValue);
+ if (!value) {
+ return;
+ }
+
+ const url = `http://${value}`;
+ if (!URL.canParse(url)) {
+ throw new Error(`Header "${headerName}" contains an invalid value and cannot be parsed.`);
+ }
+
+ const { hostname } = new URL(url);
+ if (!isHostAllowed(hostname, allowedHosts)) {
+ throw new Error(`Header "${headerName}" with value "${value}" is not allowed.`);
+ }
+}
+
+/**
+ * Checks if the hostname is allowed.
+ * @param hostname - The hostname to check.
+ * @param allowedHosts - A set of allowed hostnames.
+ * @returns `true` if the hostname is allowed, `false` otherwise.
+ */
+function isHostAllowed(hostname: string, allowedHosts: ReadonlySet): boolean {
+ if (allowedHosts.has(hostname)) {
+ return true;
+ }
+
+ for (const allowedHost of allowedHosts) {
+ if (!allowedHost.startsWith('*.')) {
+ continue;
+ }
+
+ const domain = allowedHost.slice(1);
+ if (hostname.endsWith(domain)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Validates the headers of an incoming request.
+ *
+ * @param request - The incoming `Request` object containing the headers to validate.
+ * @throws Error if any of the validated headers contain invalid values.
+ */
+function validateHeaders(request: Request): void {
+ const headers = request.headers;
+ for (const headerName of HOST_HEADERS_TO_VALIDATE) {
+ const headerValue = getFirstHeaderValue(headers.get(headerName));
+ if (headerValue && !VALID_HOST_REGEX.test(headerValue)) {
+ throw new Error(`Header "${headerName}" contains characters that are not allowed.`);
+ }
+ }
+
+ const xForwardedPort = getFirstHeaderValue(headers.get('x-forwarded-port'));
+ if (xForwardedPort && !VALID_PORT_REGEX.test(xForwardedPort)) {
+ throw new Error('Header "x-forwarded-port" must be a numeric value.');
+ }
+
+ const xForwardedProto = getFirstHeaderValue(headers.get('x-forwarded-proto'));
+ if (xForwardedProto && !VALID_PROTO_REGEX.test(xForwardedProto)) {
+ throw new Error('Header "x-forwarded-proto" must be either "http" or "https".');
+ }
+
+ const xForwardedPrefix = getFirstHeaderValue(headers.get('x-forwarded-prefix'));
+ if (xForwardedPrefix && INVALID_PREFIX_REGEX.test(xForwardedPrefix)) {
+ throw new Error(
+ 'Header "x-forwarded-prefix" must not start with multiple "/" or "\\" or contain ".", ".." path segments.',
+ );
+ }
+}
diff --git a/packages/angular/ssr/test/app-engine_spec.ts b/packages/angular/ssr/test/app-engine_spec.ts
index 76b68f6d4a82..738f7c695cc3 100644
--- a/packages/angular/ssr/test/app-engine_spec.ts
+++ b/packages/angular/ssr/test/app-engine_spec.ts
@@ -11,13 +11,26 @@
import '@angular/compiler';
/* eslint-enable import/no-unassigned-import */
-import { Component } from '@angular/core';
+import { Component, REQUEST, inject } from '@angular/core';
import { destroyAngularServerApp, getOrCreateAngularServerApp } from '../src/app';
import { AngularAppEngine } from '../src/app-engine';
import { setAngularAppEngineManifest } from '../src/manifest';
import { RenderMode } from '../src/routes/route-config';
import { setAngularAppTestingManifest } from './testing-utils';
+@Component({
+ selector: 'app-home',
+ template: 'Home works',
+})
+class TestHomeComponent {
+ private request = inject(REQUEST);
+ constructor() {
+ // Force header access to trigger validation
+ this.request?.headers.get('host');
+ this.request?.headers.get('x-forwarded-host');
+ }
+}
+
function createEntryPoint(locale: string) {
return async () => {
@Component({
@@ -84,6 +97,7 @@ describe('AngularAppEngine', () => {
describe('Localized app', () => {
beforeAll(() => {
setAngularAppEngineManifest({
+ allowedHosts: ['example.com'],
// Note: Although we are testing only one locale, we need to configure two or more
// to ensure that we test a different code path.
entryPoints: {
@@ -163,6 +177,7 @@ describe('AngularAppEngine', () => {
describe('Localized app with single locale', () => {
beforeAll(() => {
setAngularAppEngineManifest({
+ allowedHosts: ['example.com'],
entryPoints: {
it: createEntryPoint('it'),
},
@@ -230,6 +245,7 @@ describe('AngularAppEngine', () => {
class HomeComponent {}
setAngularAppEngineManifest({
+ allowedHosts: ['example.com'],
entryPoints: {
'': async () => {
setAngularAppTestingManifest(
@@ -274,4 +290,144 @@ describe('AngularAppEngine', () => {
expect(await response?.text()).toContain('Home works');
});
});
+
+ describe('Invalid host headers', () => {
+ let consoleErrorSpy: jasmine.Spy;
+
+ describe('with allowed hosts configured', () => {
+ beforeAll(() => {
+ setAngularAppEngineManifest({
+ allowedHosts: ['example.com'],
+ entryPoints: {
+ '': async () => {
+ setAngularAppTestingManifest(
+ [{ path: 'home', component: TestHomeComponent }],
+ [{ path: '**', renderMode: RenderMode.Server }],
+ );
+
+ return {
+ ɵgetOrCreateAngularServerApp: getOrCreateAngularServerApp,
+ ɵdestroyAngularServerApp: destroyAngularServerApp,
+ };
+ },
+ },
+ basePath: '/',
+ supportedLocales: { 'en-US': '' },
+ });
+
+ appEngine = new AngularAppEngine();
+ });
+
+ beforeEach(() => {
+ consoleErrorSpy = spyOn(console, 'error');
+ });
+
+ it('should return 400 when disallowed host', async () => {
+ const request = new Request('https://evil.com');
+ const response = await appEngine.handle(request);
+ expect(response).not.toBeNull();
+ expect(response?.status).toBe(400);
+ expect(await response?.text()).toContain('URL with hostname "evil.com" is not allowed.');
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
+ jasmine.stringMatching('URL with hostname "evil.com" is not allowed.'),
+ );
+ });
+
+ it('should return 400 when disallowed host header', async () => {
+ const request = new Request('https://example.com/home', {
+ headers: { 'host': 'evil.com' },
+ });
+ const response = await appEngine.handle(request);
+ expect(response).not.toBeNull();
+ expect(response?.status).toBe(400);
+ expect(await response?.text()).toContain(
+ 'Header "host" with value "evil.com" is not allowed.',
+ );
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
+ jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'),
+ );
+ });
+
+ it('should return 400 when disallowed x-forwarded-host header', async () => {
+ const request = new Request('https://example.com/home', {
+ headers: { 'x-forwarded-host': 'evil.com' },
+ });
+ const response = await appEngine.handle(request);
+ expect(response).not.toBeNull();
+ expect(response?.status).toBe(400);
+ expect(await response?.text()).toContain(
+ 'Header "x-forwarded-host" with value "evil.com" is not allowed.',
+ );
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
+ jasmine.stringMatching('Header "x-forwarded-host" with value "evil.com" is not allowed.'),
+ );
+ });
+
+ it('should return 400 when host with path separator', async () => {
+ const request = new Request('https://example.com/home', {
+ headers: { 'host': 'example.com/evil' },
+ });
+ const response = await appEngine.handle(request);
+ expect(response).not.toBeNull();
+ expect(response?.status).toBe(400);
+ expect(await response?.text()).toContain(
+ 'Header "host" contains characters that are not allowed.',
+ );
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
+ jasmine.stringMatching('Header "host" contains characters that are not allowed.'),
+ );
+ });
+ });
+
+ describe('without allowed hosts configured', () => {
+ beforeAll(() => {
+ setAngularAppEngineManifest({
+ allowedHosts: [],
+ entryPoints: {
+ '': async () => {
+ setAngularAppTestingManifest(
+ [{ path: 'home', component: TestHomeComponent }],
+ [{ path: '**', renderMode: RenderMode.Server }],
+ );
+
+ return {
+ ɵgetOrCreateAngularServerApp: getOrCreateAngularServerApp,
+ ɵdestroyAngularServerApp: destroyAngularServerApp,
+ };
+ },
+ },
+ basePath: '/',
+ supportedLocales: { 'en-US': '' },
+ });
+
+ appEngine = new AngularAppEngine();
+ });
+
+ beforeEach(() => {
+ consoleErrorSpy = spyOn(console, 'error');
+ });
+
+ it('should log error and fallback to CSR when disallowed host', async () => {
+ const request = new Request('https://example.com');
+ const response = await appEngine.handle(request);
+ expect(response).not.toBeNull();
+ expect(await response?.text()).toContain('CSR page');
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
+ jasmine.stringMatching('URL with hostname "example.com" is not allowed.'),
+ );
+ });
+
+ it('should log error and fallback to CSR when host with path separator', async () => {
+ const request = new Request('https://example.com/home', {
+ headers: { 'host': 'example.com/evil' },
+ });
+ const response = await appEngine.handle(request);
+ expect(response).not.toBeNull();
+ expect(await response?.text()).toContain('CSR page');
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
+ jasmine.stringMatching('Header "host" contains characters that are not allowed.'),
+ );
+ });
+ });
+ });
});
diff --git a/packages/angular/ssr/test/utils/url_spec.ts b/packages/angular/ssr/test/utils/url_spec.ts
index 9a7a7cb3ad49..a108c7ff1df6 100644
--- a/packages/angular/ssr/test/utils/url_spec.ts
+++ b/packages/angular/ssr/test/utils/url_spec.ts
@@ -100,6 +100,18 @@ describe('URL Utils', () => {
it('should handle an all-empty URL parts', () => {
expect(joinUrlParts('', '')).toBe('/');
});
+
+ it('should normalize parts with multiple leading and trailing slashes', () => {
+ expect(joinUrlParts('//path//', '///to///', '//resource//')).toBe('/path/to/resource');
+ });
+
+ it('should handle a single part', () => {
+ expect(joinUrlParts('path')).toBe('/path');
+ });
+
+ it('should handle parts containing only slashes', () => {
+ expect(joinUrlParts('//', '///')).toBe('/');
+ });
});
describe('stripIndexHtmlFromURL', () => {
diff --git a/packages/angular/ssr/test/utils/validation_spec.ts b/packages/angular/ssr/test/utils/validation_spec.ts
new file mode 100644
index 000000000000..10ab896e36f1
--- /dev/null
+++ b/packages/angular/ssr/test/utils/validation_spec.ts
@@ -0,0 +1,307 @@
+/**
+ * @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 {
+ cloneRequestAndPatchHeaders,
+ getFirstHeaderValue,
+ validateRequest,
+ validateUrl,
+} from '../../src/utils/validation';
+
+describe('Validation Utils', () => {
+ describe('getFirstHeaderValue', () => {
+ it('should return the first value from a comma-separated string', () => {
+ expect(getFirstHeaderValue('value1, value2')).toBe('value1');
+ });
+
+ it('should return the value if it is a single string', () => {
+ expect(getFirstHeaderValue('value1')).toBe('value1');
+ });
+
+ it('should return the first value from an array of strings', () => {
+ expect(getFirstHeaderValue(['value1', 'value2'])).toBe('value1');
+ });
+
+ it('should return undefined for null or undefined', () => {
+ expect(getFirstHeaderValue(null)).toBeUndefined();
+ expect(getFirstHeaderValue(undefined)).toBeUndefined();
+ });
+
+ it('should return empty string for empty string input', () => {
+ expect(getFirstHeaderValue('')).toBe('');
+ });
+ });
+
+ describe('validateUrl', () => {
+ const allowedHosts = new Set(['example.com', '*.google.com']);
+
+ it('should pass for allowed hostname', () => {
+ expect(() => validateUrl(new URL('http://example.com'), allowedHosts)).not.toThrow();
+ });
+
+ it('should pass for wildcard allowed hostname', () => {
+ expect(() => validateUrl(new URL('http://foo.google.com'), allowedHosts)).not.toThrow();
+ });
+
+ it('should throw for disallowed hostname', () => {
+ expect(() => validateUrl(new URL('http://evil.com'), allowedHosts)).toThrowError(
+ /URL with hostname "evil.com" is not allowed/,
+ );
+ });
+
+ it('should match subdomains for wildcard', () => {
+ expect(() => validateUrl(new URL('http://sub.foo.google.com'), allowedHosts)).not.toThrow();
+ });
+
+ it('should not match base domain for wildcard (*.google.com vs google.com)', () => {
+ // Logic: hostname.endsWith('.google.com') -> 'google.com'.endsWith('.google.com') is false
+ expect(() => validateUrl(new URL('http://google.com'), allowedHosts)).toThrowError(
+ /URL with hostname "google.com" is not allowed/,
+ );
+ });
+ });
+
+ describe('validateRequest', () => {
+ const allowedHosts = new Set(['example.com']);
+
+ it('should pass for valid request', () => {
+ const req = new Request('http://example.com', {
+ headers: {
+ 'x-forwarded-port': '443',
+ 'x-forwarded-proto': 'https',
+ },
+ });
+
+ expect(() => validateRequest(req, allowedHosts)).not.toThrow();
+ });
+
+ it('should throw if URL hostname is invalid', () => {
+ const req = new Request('http://evil.com');
+
+ expect(() => validateRequest(req, allowedHosts)).toThrowError(
+ /URL with hostname "evil.com" is not allowed/,
+ );
+ });
+
+ it('should throw if x-forwarded-port is invalid', () => {
+ const req = new Request('http://example.com', {
+ headers: { 'x-forwarded-port': 'abc' },
+ });
+
+ expect(() => validateRequest(req, allowedHosts)).toThrowError(
+ 'Header "x-forwarded-port" must be a numeric value.',
+ );
+ });
+
+ it('should throw if x-forwarded-proto is invalid', () => {
+ const req = new Request('http://example.com', {
+ headers: { 'x-forwarded-proto': 'ftp' },
+ });
+ expect(() => validateRequest(req, allowedHosts)).toThrowError(
+ 'Header "x-forwarded-proto" must be either "http" or "https".',
+ );
+ });
+
+ it('should throw if host contains path separators', () => {
+ const req = new Request('http://example.com', {
+ headers: { 'host': 'example.com/bad' },
+ });
+ expect(() => validateRequest(req, allowedHosts)).toThrowError(
+ 'Header "host" contains characters that are not allowed.',
+ );
+ });
+
+ it('should throw if x-forwarded-host contains path separators', () => {
+ const req = new Request('http://example.com', {
+ headers: { 'x-forwarded-host': 'example.com/bad' },
+ });
+ expect(() => validateRequest(req, allowedHosts)).toThrowError(
+ 'Header "x-forwarded-host" contains characters that are not allowed.',
+ );
+ });
+
+ it('should throw error if x-forwarded-prefix starts with multiple slashes or backslashes', () => {
+ const inputs = ['//evil', '\\\\evil', '/\\evil', '\\/evil'];
+
+ for (const prefix of inputs) {
+ const request = new Request('https://example.com', {
+ headers: {
+ 'x-forwarded-prefix': prefix,
+ },
+ });
+
+ expect(() => validateRequest(request, allowedHosts))
+ .withContext(`Prefix: "${prefix}"`)
+ .toThrowError(
+ 'Header "x-forwarded-prefix" must not start with multiple "/" or "\\" or contain ".", ".." path segments.',
+ );
+ }
+ });
+
+ it('should throw error if x-forwarded-prefix contains dot segments', () => {
+ const inputs = [
+ '/./',
+ '/../',
+ '/foo/./bar',
+ '/foo/../bar',
+ '/.',
+ '/..',
+ './',
+ '../',
+ '.\\',
+ '..\\',
+ '/foo/.\\bar',
+ '/foo/..\\bar',
+ '.',
+ '..',
+ ];
+
+ for (const prefix of inputs) {
+ const request = new Request('https://example.com', {
+ headers: {
+ 'x-forwarded-prefix': prefix,
+ },
+ });
+
+ expect(() => validateRequest(request, allowedHosts))
+ .withContext(`Prefix: "${prefix}"`)
+ .toThrowError(
+ 'Header "x-forwarded-prefix" must not start with multiple "/" or "\\" or contain ".", ".." path segments.',
+ );
+ }
+ });
+
+ it('should validate x-forwarded-prefix with valid dot usage', () => {
+ const inputs = ['/foo.bar', '/foo.bar/baz', '/v1.2', '/.well-known'];
+
+ for (const prefix of inputs) {
+ const request = new Request('https://example.com', {
+ headers: {
+ 'x-forwarded-prefix': prefix,
+ },
+ });
+
+ expect(() => validateRequest(request, allowedHosts))
+ .withContext(`Prefix: "${prefix}"`)
+ .not.toThrow();
+ }
+ });
+ });
+
+ describe('cloneRequestAndPatchHeaders', () => {
+ const allowedHosts = new Set(['example.com', '*.valid.com']);
+
+ it('should validate host header when accessed via get()', async () => {
+ const req = new Request('http://example.com', {
+ headers: { 'host': 'evil.com' },
+ });
+ const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts);
+
+ expect(() => secured.headers.get('host')).toThrowError(
+ 'Header "host" with value "evil.com" is not allowed.',
+ );
+ await expectAsync(onError).toBeResolvedTo(
+ jasmine.objectContaining({
+ message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed'),
+ }),
+ );
+ });
+
+ it('should allow valid host header', () => {
+ const req = new Request('http://example.com', {
+ headers: { 'host': 'example.com' },
+ });
+ const { request: secured } = cloneRequestAndPatchHeaders(req, allowedHosts);
+ expect(secured.headers.get('host')).toBe('example.com');
+ });
+
+ it('should validate x-forwarded-host header', async () => {
+ const req = new Request('http://example.com', {
+ headers: { 'x-forwarded-host': 'evil.com' },
+ });
+ const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts);
+
+ expect(() => secured.headers.get('x-forwarded-host')).toThrowError(
+ 'Header "x-forwarded-host" with value "evil.com" is not allowed.',
+ );
+ await expectAsync(onError).toBeResolvedTo(
+ jasmine.objectContaining({
+ message: jasmine.stringMatching(
+ 'Header "x-forwarded-host" with value "evil.com" is not allowed',
+ ),
+ }),
+ );
+ });
+
+ it('should allow accessing other headers without validation', () => {
+ const req = new Request('http://example.com', {
+ headers: { 'accept': 'application/json' },
+ });
+ const { request: secured } = cloneRequestAndPatchHeaders(req, allowedHosts);
+
+ expect(secured.headers.get('accept')).toBe('application/json');
+ });
+
+ it('should validate headers when iterating with entries()', async () => {
+ const req = new Request('http://example.com', {
+ headers: { 'host': 'evil.com' },
+ });
+ const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts);
+
+ expect(() => {
+ for (const _ of secured.headers.entries()) {
+ // access the header to trigger the validation
+ }
+ }).toThrowError('Header "host" with value "evil.com" is not allowed.');
+
+ await expectAsync(onError).toBeResolvedTo(
+ jasmine.objectContaining({
+ message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'),
+ }),
+ );
+ });
+
+ it('should validate headers when iterating with values()', async () => {
+ const req = new Request('http://example.com', {
+ headers: { 'host': 'evil.com' },
+ });
+ const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts);
+
+ expect(() => {
+ for (const _ of secured.headers.values()) {
+ // access the header to trigger the validation
+ }
+ }).toThrowError('Header "host" with value "evil.com" is not allowed.');
+
+ await expectAsync(onError).toBeResolvedTo(
+ jasmine.objectContaining({
+ message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'),
+ }),
+ );
+ });
+
+ it('should validate headers when iterating with for...of', async () => {
+ const req = new Request('http://example.com', {
+ headers: { 'host': 'evil.com' },
+ });
+ const { request: secured, onError } = cloneRequestAndPatchHeaders(req, allowedHosts);
+
+ expect(() => {
+ for (const _ of secured.headers) {
+ // access the header to trigger the validation
+ }
+ }).toThrowError('Header "host" with value "evil.com" is not allowed.');
+
+ await expectAsync(onError).toBeResolvedTo(
+ jasmine.objectContaining({
+ message: jasmine.stringMatching('Header "host" with value "evil.com" is not allowed.'),
+ }),
+ );
+ });
+ });
+});
diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel
index 459197eaf149..f2f5ea56ac77 100644
--- a/packages/angular_devkit/build_angular/BUILD.bazel
+++ b/packages/angular_devkit/build_angular/BUILD.bazel
@@ -425,6 +425,9 @@ LARGE_SPECS = {
"//modules/testing/builder:node_modules/@angular-devkit/build-angular",
],
env = {
+ # Force IPv4 to resolve RBE resolution issues
+ "NODE_OPTIONS": "--dns-result-order=ipv4first",
+
# TODO: Replace Puppeteer downloaded browsers with Bazel-managed browsers,
# or standardize to avoid complex configuration like this!
"PUPPETEER_DOWNLOAD_PATH": "../../../node_modules/puppeteer/downloads",
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index f37de4ae6ca2..0c9a4f13980d 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -26,7 +26,7 @@
"autoprefixer": "10.4.21",
"babel-loader": "10.0.0",
"browserslist": "^4.21.5",
- "copy-webpack-plugin": "13.0.1",
+ "copy-webpack-plugin": "14.0.0",
"css-loader": "7.1.2",
"esbuild-wasm": "0.25.9",
"fast-glob": "3.3.3",
@@ -55,7 +55,7 @@
"terser": "5.43.1",
"tree-kill": "1.2.2",
"tslib": "2.8.1",
- "webpack": "5.101.2",
+ "webpack": "5.105.0",
"webpack-dev-middleware": "7.4.2",
"webpack-dev-server": "5.2.2",
"webpack-merge": "6.0.1",
diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts
index 6219ea6a46a2..37e04171aed4 100644
--- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts
+++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/index.ts
@@ -114,7 +114,13 @@ export function execute(
return of([b, s]);
}
- return startNodeServer(s, nodeServerPort, context.logger, !!options.inspect).pipe(
+ return startNodeServer(
+ s,
+ nodeServerPort,
+ options.host,
+ context.logger,
+ !!options.inspect,
+ ).pipe(
map(() => [b, s]),
catchError((err) => {
context.logger.error(`A server error has occurred.\n${mapErrorToMessage(err)}`);
@@ -216,12 +222,13 @@ export function log(
function startNodeServer(
serverOutput: BuilderOutput,
port: number,
+ host: string | undefined,
logger: logging.LoggerApi,
inspectMode = false,
): Observable {
const outputPath = serverOutput.outputPath as string;
const path = join(outputPath, 'main.js');
- const env = { ...process.env, PORT: '' + port };
+ const env = { ...process.env, PORT: '' + port, NG_ALLOWED_HOSTS: host ?? 'localhost' };
const args = ['--enable-source-maps', `"${path}"`];
if (inspectMode) {
diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts
index a4cafd66ee06..b125312653e9 100644
--- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts
+++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts
@@ -54,11 +54,12 @@ describe('Serve SSR Builder', () => {
}));
server.use((req, res, next) => {
+ const { protocol, originalUrl, baseUrl, headers } = req;
commonEngine
.render({
bootstrap: AppServerModule,
documentFilePath: indexHtml,
- url: req.originalUrl,
+ url: \`\${protocol}://\${headers.host}\${originalUrl}\`,
publicPath: distFolder,
})
.then((html) => res.send(html))
diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts
index 3792d87f839c..4a358ee1c123 100644
--- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts
+++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts
@@ -54,11 +54,12 @@ describe('Serve SSR Builder', () => {
}));
server.use((req, res, next) => {
+ const { protocol, originalUrl, baseUrl, headers } = req;
commonEngine
.render({
bootstrap: AppServerModule,
documentFilePath: indexHtml,
- url: req.originalUrl,
+ url: \`\${protocol}://\${headers.host}\${originalUrl}\`,
publicPath: distFolder,
})
.then((html) => res.send(html))
diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts
index 8e92c4d666e3..3feed5d3161a 100644
--- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts
+++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts
@@ -53,11 +53,12 @@ describe('Serve SSR Builder', () => {
}));
server.use((req, res, next) => {
+ const { protocol, originalUrl, baseUrl, headers } = req;
commonEngine
.render({
bootstrap: AppServerModule,
documentFilePath: indexHtml,
- url: req.originalUrl,
+ url: \`\${protocol}://\${headers.host}\${originalUrl}\`,
publicPath: distFolder,
})
.then((html) => res.send(html))
diff --git a/packages/angular_devkit/build_webpack/BUILD.bazel b/packages/angular_devkit/build_webpack/BUILD.bazel
index f66ea94f1919..3a104c243a66 100644
--- a/packages/angular_devkit/build_webpack/BUILD.bazel
+++ b/packages/angular_devkit/build_webpack/BUILD.bazel
@@ -90,6 +90,10 @@ jasmine_test(
"//:node_modules/typescript",
"//:node_modules/zone.js",
],
+ env = {
+ # Force IPv4 to resolve RBE resolution issues
+ "NODE_OPTIONS": "--dns-result-order=ipv4first",
+ },
)
genrule(
diff --git a/packages/angular_devkit/build_webpack/package.json b/packages/angular_devkit/build_webpack/package.json
index bc9afa203240..5af189c9709c 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.101.2",
+ "webpack": "5.105.0",
"webpack-dev-server": "5.2.2"
},
"peerDependencies": {
diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts
index f078b614796c..66a2f09a6422 100644
--- a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts
+++ b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index.ts
@@ -10,8 +10,8 @@ import { Builder, BuilderContext, createBuilder } from '@angular-devkit/architec
import assert from 'node:assert';
import { resolve as pathResolve } from 'node:path';
import { Observable, from, isObservable, of, switchMap } from 'rxjs';
-import webpack from 'webpack';
-import WebpackDevServer from 'webpack-dev-server';
+import type webpack from 'webpack';
+import type WebpackDevServer from 'webpack-dev-server';
import { getEmittedFiles, getWebpackConfig } from '../../utils';
import { BuildResult, WebpackFactory, WebpackLoggingCallback } from '../webpack';
import { Schema as WebpackDevServerBuilderSchema } from './schema';
@@ -44,7 +44,7 @@ export function runWebpackDevServer(
return of(result);
}
} else {
- return of(webpack(c));
+ return from(import('webpack').then((mod) => mod.default(c)));
}
};
@@ -54,9 +54,9 @@ export function runWebpackDevServer(
) => {
if (options.webpackDevServerFactory) {
return new options.webpackDevServerFactory(config, webpack);
+ } else {
+ return from(import('webpack-dev-server').then((mod) => new mod.default(config, webpack)));
}
-
- return new WebpackDevServer(config, webpack);
};
const {
@@ -70,8 +70,14 @@ export function runWebpackDevServer(
} = options;
return createWebpack({ ...config, watch: false }).pipe(
+ switchMap(async (webpackCompiler) => {
+ return [
+ webpackCompiler,
+ options.webpackDevServerFactory ?? (await import('webpack-dev-server')).default,
+ ] as unknown as [webpack.Compiler | null, WebpackDevServerFactory];
+ }),
switchMap(
- (webpackCompiler) =>
+ ([webpackCompiler, webpackDevServerFactory]) =>
new Observable((obs) => {
assert(webpackCompiler, 'Webpack compiler factory did not return a compiler instance.');
@@ -79,7 +85,6 @@ export function runWebpackDevServer(
devServerConfig.host ??= 'localhost';
let result: Partial;
-
const statsOptions = typeof config.stats === 'boolean' ? undefined : config.stats;
webpackCompiler.hooks.done.tap('build-webpack', (stats) => {
@@ -94,7 +99,7 @@ export function runWebpackDevServer(
} as unknown as DevServerBuildOutput);
});
- const devServer = createWebpackDevServer(webpackCompiler, devServerConfig);
+ const devServer = new webpackDevServerFactory(devServerConfig, webpackCompiler);
devServer.startCallback((err) => {
if (err) {
obs.error(err);
diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts b/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts
index b6be070a9f92..ce3f91fd69d4 100644
--- a/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts
+++ b/packages/angular_devkit/build_webpack/src/builders/webpack/index.ts
@@ -10,7 +10,7 @@ import { Builder, BuilderContext, BuilderOutput, createBuilder } from '@angular-
import assert from 'node:assert';
import { resolve as pathResolve } from 'node:path';
import { Observable, from, isObservable, of, switchMap } from 'rxjs';
-import webpack from 'webpack';
+import type webpack from 'webpack';
import { EmittedFiles, getEmittedFiles, getWebpackConfig } from '../../utils';
import { Schema as RealWebpackBuilderSchema } from './schema';
@@ -57,7 +57,7 @@ export function runWebpack(
return of(result);
}
} else {
- return of(webpack(c));
+ return from(import('webpack').then((mod) => mod.default(c)));
}
};
@@ -104,7 +104,7 @@ export function runWebpack(
// Teardown logic. Close the watcher when unsubscribed from.
return () => {
- watching.close(() => {});
+ watching?.close(() => {});
webpackCompiler.close(() => {});
};
} else {
diff --git a/packages/angular_devkit/core/package.json b/packages/angular_devkit/core/package.json
index 2fa6f3eb24a4..e2daae128bdc 100644
--- a/packages/angular_devkit/core/package.json
+++ b/packages/angular_devkit/core/package.json
@@ -25,7 +25,7 @@
"./*.js": "./*.js"
},
"dependencies": {
- "ajv": "8.17.1",
+ "ajv": "8.18.0",
"ajv-formats": "3.0.1",
"jsonc-parser": "3.3.1",
"picomatch": "4.0.3",
diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json
index 83bbdfd6a3b9..8e4d32703e20 100644
--- a/packages/ngtools/webpack/package.json
+++ b/packages/ngtools/webpack/package.json
@@ -30,6 +30,6 @@
"@angular/compiler": "20.3.7",
"@angular/compiler-cli": "20.3.7",
"typescript": "5.9.2",
- "webpack": "5.101.2"
+ "webpack": "5.105.0"
}
}
diff --git a/packages/ngtools/webpack/src/paths-plugin.ts b/packages/ngtools/webpack/src/paths-plugin.ts
index a5e581b63c4d..612d70d4ad6e 100644
--- a/packages/ngtools/webpack/src/paths-plugin.ts
+++ b/packages/ngtools/webpack/src/paths-plugin.ts
@@ -17,9 +17,6 @@ export interface TypeScriptPathsPluginOptions extends Pick[4]>[2]>;
interface PathPluginResolverRequest extends ResolverRequest {
- context?: {
- issuer?: string;
- };
typescriptPathMapped?: boolean;
}
diff --git a/packages/schematics/angular/ssr/files/server-builder/server.ts.template b/packages/schematics/angular/ssr/files/server-builder/server.ts.template
index 7567fa65a81d..92272edc590d 100644
--- a/packages/schematics/angular/ssr/files/server-builder/server.ts.template
+++ b/packages/schematics/angular/ssr/files/server-builder/server.ts.template
@@ -15,7 +15,9 @@ export function app(): express.Express {
? join(distFolder, 'index.original.html')
: join(distFolder, 'index.html');
- const commonEngine = new CommonEngine();
+ const commonEngine = new CommonEngine({
+ allowedHosts: [/* Configure your hosts here */]
+ });
server.set('view engine', 'html');
server.set('views', distFolder);
diff --git a/packages/schematics/angular/ssr/index.ts b/packages/schematics/angular/ssr/index.ts
index e589395dac73..90744240e43b 100644
--- a/packages/schematics/angular/ssr/index.ts
+++ b/packages/schematics/angular/ssr/index.ts
@@ -6,7 +6,7 @@
* found in the LICENSE file at https://angular.dev/license
*/
-import { isJsonObject, join, normalize, strings } from '@angular-devkit/core';
+import { JsonObject, isJsonObject, join, normalize, strings } from '@angular-devkit/core';
import {
Rule,
SchematicContext,
@@ -204,6 +204,10 @@ function updateApplicationBuilderWorkspaceConfigRule(
buildTarget.options = {
...buildTarget.options,
+ security: {
+ ...((buildTarget.options?.security as JsonObject | undefined) ?? {}),
+ allowedHosts: [],
+ },
outputPath,
outputMode: 'server',
ssr: {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 927032edd4ae..7d23f2dbb743 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -48,7 +48,7 @@ importers:
version: 20.2.10(72d1932aa29c0670c8359e3ed8a5ff55)
'@angular/ng-dev':
specifier: https://github.com/angular/dev-infra-private-ng-dev-builds.git#b69a61793bd6ba935af262297688408d0b48252e
- version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/b69a61793bd6ba935af262297688408d0b48252e(@modelcontextprotocol/sdk@1.24.0(zod@4.1.13))
+ version: https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/b69a61793bd6ba935af262297688408d0b48252e(@modelcontextprotocol/sdk@1.26.0(zod@4.1.13))
'@angular/platform-browser':
specifier: 20.3.7
version: 20.3.7(@angular/animations@20.3.7(@angular/core@20.3.7(@angular/compiler@20.3.7)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.7(@angular/core@20.3.7(@angular/compiler@20.3.7)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.7(@angular/compiler@20.3.7)(rxjs@7.8.2)(zone.js@0.15.1))
@@ -78,16 +78,16 @@ importers:
version: 9.33.0
'@rollup/plugin-alias':
specifier: ^5.1.1
- version: 5.1.1(rollup@4.46.2)
+ version: 5.1.1(rollup@4.59.0)
'@rollup/plugin-commonjs':
specifier: ^28.0.0
- version: 28.0.6(rollup@4.46.2)
+ version: 28.0.6(rollup@4.59.0)
'@rollup/plugin-json':
specifier: ^6.1.0
- version: 6.1.0(rollup@4.46.2)
+ version: 6.1.0(rollup@4.59.0)
'@rollup/plugin-node-resolve':
specifier: 16.0.1
- version: 16.0.1(rollup@4.46.2)
+ version: 16.0.1(rollup@4.59.0)
'@stylistic/eslint-plugin':
specifier: ^5.0.0
version: 5.4.0(eslint@9.33.0(jiti@1.21.7))
@@ -170,8 +170,8 @@ importers:
specifier: 8.39.1
version: 8.39.1(eslint@9.33.0(jiti@1.21.7))(typescript@5.9.2)
ajv:
- specifier: 8.17.1
- version: 8.17.1
+ specifier: 8.18.0
+ version: 8.18.0
ansi-colors:
specifier: 4.1.3
version: 4.1.3
@@ -272,17 +272,17 @@ importers:
specifier: 23.2.6
version: 23.2.6(encoding@0.1.13)
rollup:
- specifier: 4.46.2
- version: 4.46.2
+ specifier: 4.59.0
+ version: 4.59.0
rollup-license-plugin:
specifier: ~3.0.1
version: 3.0.2
rollup-plugin-dts:
specifier: 6.2.1
- version: 6.2.1(rollup@4.46.2)(typescript@5.9.2)
+ version: 6.2.1(rollup@4.59.0)(typescript@5.9.2)
rollup-plugin-sourcemaps2:
specifier: 0.5.3
- version: 0.5.3(@types/node@22.18.10)(rollup@4.46.2)
+ version: 0.5.3(@types/node@22.18.10)(rollup@4.59.0)
semver:
specifier: 7.7.2
version: 7.7.2
@@ -404,8 +404,8 @@ importers:
specifier: 5.1.3
version: 5.1.3
rollup:
- specifier: 4.52.3
- version: 4.52.3
+ specifier: 4.59.0
+ version: 4.59.0
sass:
specifier: 1.90.0
version: 1.90.0
@@ -472,8 +472,8 @@ importers:
specifier: 3.0.1
version: 3.0.1(@inquirer/prompts@7.8.2(@types/node@24.9.1))(@types/node@24.9.1)(listr2@9.0.1)
'@modelcontextprotocol/sdk':
- specifier: 1.24.0
- version: 1.24.0(zod@4.1.13)
+ specifier: 1.26.0
+ version: 1.26.0(zod@4.1.13)
'@schematics/angular':
specifier: workspace:0.0.0-PLACEHOLDER
version: link:../../schematics/angular
@@ -496,8 +496,8 @@ importers:
specifier: 13.0.0
version: 13.0.0
pacote:
- specifier: 21.0.0
- version: 21.0.0
+ specifier: 21.0.4
+ version: 21.0.4
resolve:
specifier: 1.22.10
version: 1.22.10
@@ -643,16 +643,16 @@ importers:
version: 10.4.21(postcss@8.5.6)
babel-loader:
specifier: 10.0.0
- version: 10.0.0(@babel/core@7.28.3)(webpack@5.101.2(esbuild@0.25.9))
+ version: 10.0.0(@babel/core@7.28.3)(webpack@5.105.0(esbuild@0.25.9))
browserslist:
specifier: ^4.21.5
version: 4.26.3
copy-webpack-plugin:
- specifier: 13.0.1
- version: 13.0.1(webpack@5.101.2(esbuild@0.25.9))
+ specifier: 14.0.0
+ version: 14.0.0(webpack@5.105.0(esbuild@0.25.9))
css-loader:
specifier: 7.1.2
- version: 7.1.2(webpack@5.101.2(esbuild@0.25.9))
+ version: 7.1.2(webpack@5.105.0(esbuild@0.25.9))
esbuild-wasm:
specifier: 0.25.9
version: 0.25.9
@@ -676,16 +676,16 @@ importers:
version: 4.4.0
less-loader:
specifier: 12.3.0
- version: 12.3.0(less@4.4.0)(webpack@5.101.2(esbuild@0.25.9))
+ version: 12.3.0(less@4.4.0)(webpack@5.105.0(esbuild@0.25.9))
license-webpack-plugin:
specifier: 4.0.2
- version: 4.0.2(webpack@5.101.2(esbuild@0.25.9))
+ version: 4.0.2(webpack@5.105.0(esbuild@0.25.9))
loader-utils:
specifier: 3.3.1
version: 3.3.1
mini-css-extract-plugin:
specifier: 2.9.4
- version: 2.9.4(webpack@5.101.2(esbuild@0.25.9))
+ version: 2.9.4(webpack@5.105.0(esbuild@0.25.9))
open:
specifier: 10.2.0
version: 10.2.0
@@ -703,7 +703,7 @@ importers:
version: 8.5.6
postcss-loader:
specifier: 8.1.1
- version: 8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.2(esbuild@0.25.9))
+ version: 8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.105.0(esbuild@0.25.9))
resolve-url-loader:
specifier: 5.0.0
version: 5.0.0
@@ -715,13 +715,13 @@ importers:
version: 1.90.0
sass-loader:
specifier: 16.0.5
- version: 16.0.5(sass@1.90.0)(webpack@5.101.2(esbuild@0.25.9))
+ version: 16.0.5(sass@1.90.0)(webpack@5.105.0(esbuild@0.25.9))
semver:
specifier: 7.7.2
version: 7.7.2
source-map-loader:
specifier: 5.0.0
- version: 5.0.0(webpack@5.101.2(esbuild@0.25.9))
+ version: 5.0.0(webpack@5.105.0(esbuild@0.25.9))
source-map-support:
specifier: 0.5.21
version: 0.5.21
@@ -735,20 +735,20 @@ importers:
specifier: 2.8.1
version: 2.8.1
webpack:
- specifier: 5.101.2
- version: 5.101.2(esbuild@0.25.9)
+ specifier: 5.105.0
+ version: 5.105.0(esbuild@0.25.9)
webpack-dev-middleware:
specifier: 7.4.2
- version: 7.4.2(webpack@5.101.2(esbuild@0.25.9))
+ version: 7.4.2(webpack@5.105.0(esbuild@0.25.9))
webpack-dev-server:
specifier: 5.2.2
- version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.101.2(esbuild@0.25.9))
+ version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.105.0(esbuild@0.25.9))
webpack-merge:
specifier: 6.0.1
version: 6.0.1
webpack-subresource-integrity:
specifier: 5.1.0
- version: 5.1.0(webpack@5.101.2(esbuild@0.25.9))
+ version: 5.1.0(webpack@5.105.0(esbuild@0.25.9))
devDependencies:
'@angular/ssr':
specifier: workspace:*
@@ -786,20 +786,20 @@ importers:
specifier: workspace:0.0.0-PLACEHOLDER
version: link:../../ngtools/webpack
webpack:
- specifier: 5.101.2
- version: 5.101.2(esbuild@0.25.9)
+ specifier: 5.105.0
+ version: 5.105.0(esbuild@0.25.9)
webpack-dev-server:
specifier: 5.2.2
- version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.101.2(esbuild@0.25.9))
+ version: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.105.0(esbuild@0.25.9))
packages/angular_devkit/core:
dependencies:
ajv:
- specifier: 8.17.1
- version: 8.17.1
+ specifier: 8.18.0
+ version: 8.18.0
ajv-formats:
specifier: 3.0.1
- version: 3.0.1(ajv@8.17.1)
+ version: 3.0.1(ajv@8.18.0)
jsonc-parser:
specifier: 3.3.1
version: 3.3.1
@@ -868,8 +868,8 @@ importers:
specifier: 5.9.2
version: 5.9.2
webpack:
- specifier: 5.101.2
- version: 5.101.2(esbuild@0.25.9)
+ specifier: 5.105.0
+ version: 5.105.0(esbuild@0.25.9)
packages/schematics/angular:
dependencies:
@@ -2143,6 +2143,12 @@ packages:
'@hapi/bourne@3.0.0':
resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==}
+ '@hono/node-server@1.19.9':
+ resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==}
+ engines: {node: '>=18.14.1'}
+ peerDependencies:
+ hono: ^4
+
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@@ -2541,8 +2547,8 @@ packages:
cpu: [x64]
os: [win32]
- '@modelcontextprotocol/sdk@1.24.0':
- resolution: {integrity: sha512-D8h5KXY2vHFW8zTuxn2vuZGN0HGrQ5No6LkHwlEA9trVgNdPL3TF1dSqKA7Dny6BbBYKSW/rOBDXdC8KJAjUCg==}
+ '@modelcontextprotocol/sdk@1.26.0':
+ resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==}
engines: {node: '>=18'}
peerDependencies:
'@cfworker/json-schema': ^4.1.1
@@ -2710,42 +2716,42 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@npmcli/agent@3.0.0':
- resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/agent@4.0.0':
+ resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/fs@4.0.0':
- resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/fs@5.0.0':
+ resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/git@6.0.3':
- resolution: {integrity: sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/git@7.0.1':
+ resolution: {integrity: sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/installed-package-contents@3.0.0':
- resolution: {integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/installed-package-contents@4.0.0':
+ resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
hasBin: true
- '@npmcli/node-gyp@4.0.0':
- resolution: {integrity: sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/node-gyp@5.0.0':
+ resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/package-json@6.2.0':
- resolution: {integrity: sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/package-json@7.0.4':
+ resolution: {integrity: sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/promise-spawn@8.0.3':
- resolution: {integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/promise-spawn@9.0.1':
+ resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/redact@3.2.2':
- resolution: {integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/redact@4.0.0':
+ resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/run-script@9.1.0':
- resolution: {integrity: sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/run-script@10.0.3':
+ resolution: {integrity: sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
'@octokit/auth-app@8.1.1':
resolution: {integrity: sha512-yW9YUy1cuqWlz8u7908ed498wJFt42VYsYWjvepjojM4BdZSp4t+5JehFds7LfvYi550O/GaUI94rgbhswvxfA==}
@@ -3065,235 +3071,141 @@ packages:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.46.2':
- resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==}
- cpu: [arm]
- os: [android]
-
- '@rollup/rollup-android-arm-eabi@4.52.3':
- resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==}
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.46.2':
- resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==}
+ '@rollup/rollup-android-arm64@4.59.0':
+ resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-android-arm64@4.52.3':
- resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==}
- cpu: [arm64]
- os: [android]
-
- '@rollup/rollup-darwin-arm64@4.46.2':
- resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==}
- cpu: [arm64]
- os: [darwin]
-
- '@rollup/rollup-darwin-arm64@4.52.3':
- resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==}
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.46.2':
- resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==}
+ '@rollup/rollup-darwin-x64@4.59.0':
+ resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.52.3':
- resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.46.2':
- resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-arm64@4.52.3':
- resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==}
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.46.2':
- resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==}
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.52.3':
- resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==}
- cpu: [x64]
- os: [freebsd]
-
- '@rollup/rollup-linux-arm-gnueabihf@4.46.2':
- resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==}
- cpu: [arm]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm-gnueabihf@4.52.3':
- resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
cpu: [arm]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm-musleabihf@4.46.2':
- resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==}
- cpu: [arm]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-arm-musleabihf@4.52.3':
- resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==}
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
cpu: [arm]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-arm64-gnu@4.46.2':
- resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm64-gnu@4.52.3':
- resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==}
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-arm64-musl@4.46.2':
- resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-arm64-musl@4.52.3':
- resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==}
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-loong64-gnu@4.52.3':
- resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==}
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
cpu: [loong64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-loongarch64-gnu@4.46.2':
- resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==}
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
cpu: [loong64]
os: [linux]
- libc: [glibc]
+ libc: [musl]
- '@rollup/rollup-linux-ppc64-gnu@4.46.2':
- resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==}
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-ppc64-gnu@4.52.3':
- resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==}
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
cpu: [ppc64]
os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-riscv64-gnu@4.46.2':
- resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
+ libc: [musl]
- '@rollup/rollup-linux-riscv64-gnu@4.52.3':
- resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==}
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-riscv64-musl@4.46.2':
- resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==}
- cpu: [riscv64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-riscv64-musl@4.52.3':
- resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==}
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
cpu: [riscv64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-s390x-gnu@4.46.2':
- resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==}
- cpu: [s390x]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-s390x-gnu@4.52.3':
- resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==}
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-gnu@4.46.2':
- resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-x64-gnu@4.52.3':
- resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==}
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@rollup/rollup-linux-x64-musl@4.46.2':
- resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==}
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@rollup/rollup-linux-x64-musl@4.52.3':
- resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==}
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
cpu: [x64]
- os: [linux]
- libc: [musl]
+ os: [openbsd]
- '@rollup/rollup-openharmony-arm64@4.52.3':
- resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==}
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==}
cpu: [arm64]
os: [openharmony]
- '@rollup/rollup-win32-arm64-msvc@4.46.2':
- resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==}
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-arm64-msvc@4.52.3':
- resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==}
- cpu: [arm64]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.46.2':
- resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.52.3':
- resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==}
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-gnu@4.52.3':
- resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==}
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==}
cpu: [x64]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.46.2':
- resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==}
- cpu: [x64]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.52.3':
- resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==}
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==}
cpu: [x64]
os: [win32]
@@ -3305,29 +3217,29 @@ packages:
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
- '@sigstore/bundle@3.1.0':
- resolution: {integrity: sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@sigstore/bundle@4.0.0':
+ resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@sigstore/core@2.0.0':
- resolution: {integrity: sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@sigstore/core@3.1.0':
+ resolution: {integrity: sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@sigstore/protobuf-specs@0.4.3':
- resolution: {integrity: sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==}
+ '@sigstore/protobuf-specs@0.5.0':
+ resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==}
engines: {node: ^18.17.0 || >=20.5.0}
- '@sigstore/sign@3.1.0':
- resolution: {integrity: sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@sigstore/sign@4.1.0':
+ resolution: {integrity: sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@sigstore/tuf@3.1.1':
- resolution: {integrity: sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@sigstore/tuf@4.0.1':
+ resolution: {integrity: sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@sigstore/verify@2.1.1':
- resolution: {integrity: sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@sigstore/verify@3.1.0':
+ resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==}
+ engines: {node: ^20.17.0 || >=22.9.0}
'@socket.io/component-emitter@3.1.2':
resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
@@ -3361,9 +3273,9 @@ packages:
resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==}
engines: {node: ^16.14.0 || >=18.0.0}
- '@tufjs/models@3.0.1':
- resolution: {integrity: sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@tufjs/models@4.1.0':
+ resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==}
+ engines: {node: ^20.17.0 || >=22.9.0}
'@types/accepts@1.3.7':
resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==}
@@ -3948,9 +3860,9 @@ packages:
resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
hasBin: true
- abbrev@3.0.1:
- resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ abbrev@4.0.0:
+ resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
@@ -4026,6 +3938,9 @@ packages:
ajv@8.17.1:
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+ ajv@8.18.0:
+ resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
+
algoliasearch@5.35.0:
resolution: {integrity: sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==}
engines: {node: '>= 14.0.0'}
@@ -4294,6 +4209,10 @@ packages:
resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==}
hasBin: true
+ baseline-browser-mapping@2.9.14:
+ resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==}
+ hasBin: true
+
basic-ftp@5.0.5:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
engines: {node: '>=10.0.0'}
@@ -4343,6 +4262,10 @@ packages:
resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
engines: {node: '>=18'}
+ body-parser@2.2.2:
+ resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
+ engines: {node: '>=18'}
+
bonjour-service@1.3.0:
resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==}
@@ -4382,6 +4305,11 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
+ browserslist@4.28.1:
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
browserstack@1.6.1:
resolution: {integrity: sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==}
@@ -4419,9 +4347,9 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
- cacache@19.0.1:
- resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ cacache@20.0.3:
+ resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
cache-content-type@1.0.1:
resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==}
@@ -4454,6 +4382,9 @@ packages:
caniuse-lite@1.0.30001750:
resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==}
+ caniuse-lite@1.0.30001764:
+ resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==}
+
caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -4498,10 +4429,6 @@ packages:
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
- chownr@2.0.0:
- resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
- engines: {node: '>=10'}
-
chownr@3.0.0:
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
engines: {node: '>=18'}
@@ -4699,9 +4626,9 @@ packages:
copy-anything@2.0.6:
resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
- copy-webpack-plugin@13.0.1:
- resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==}
- engines: {node: '>= 18.12.0'}
+ copy-webpack-plugin@14.0.0:
+ resolution: {integrity: sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==}
+ engines: {node: '>= 20.9.0'}
peerDependencies:
webpack: ^5.1.0
@@ -5057,6 +4984,9 @@ packages:
electron-to-chromium@1.5.234:
resolution: {integrity: sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==}
+ electron-to-chromium@1.5.267:
+ resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
+
emoji-regex@10.5.0:
resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==}
@@ -5095,8 +5025,8 @@ packages:
resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==}
engines: {node: '>=10.2.0'}
- enhanced-resolve@5.18.3:
- resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
+ enhanced-resolve@5.19.0:
+ resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==}
engines: {node: '>=10.13.0'}
ent@2.2.2:
@@ -5152,6 +5082,9 @@ packages:
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+ es-module-lexer@2.0.0:
+ resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
+
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
@@ -5360,8 +5293,8 @@ packages:
express-rate-limit@5.5.1:
resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==}
- express-rate-limit@7.5.1:
- resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==}
+ express-rate-limit@8.2.1:
+ resolution: {integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==}
engines: {node: '>= 16'}
peerDependencies:
express: '>= 4.11'
@@ -5374,6 +5307,10 @@ packages:
resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
engines: {node: '>= 18'}
+ express@5.2.1:
+ resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
+ engines: {node: '>= 18'}
+
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@@ -5558,10 +5495,6 @@ packages:
resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
engines: {node: '>=6 <7 || >=8'}
- fs-minipass@2.1.0:
- resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
- engines: {node: '>= 8'}
-
fs-minipass@3.0.3:
resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -5673,6 +5606,10 @@ packages:
engines: {node: 20 || >=22}
hasBin: true
+ glob@13.0.0:
+ resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==}
+ engines: {node: 20 || >=22}
+
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported
@@ -5791,9 +5728,9 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
- hosted-git-info@8.1.0:
- resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ hono@4.11.7:
+ resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==}
+ engines: {node: '>=16.9.0'}
hosted-git-info@9.0.2:
resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==}
@@ -5984,6 +5921,10 @@ packages:
resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==}
engines: {node: ^18.17.0 || >=20.5.0}
+ ini@6.0.0:
+ resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
injection-js@2.5.0:
resolution: {integrity: sha512-UpY2ONt4xbht4GhSqQ2zMJ1rBIQq4uOY+DlR6aOeYyqK7xadXt7UQbJIyxmgk288bPMkIZKjViieHm0O0i72Jw==}
@@ -6397,9 +6338,9 @@ packages:
json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
- json-parse-even-better-errors@4.0.0:
- resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ json-parse-even-better-errors@5.0.0:
+ resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
@@ -6407,6 +6348,9 @@ packages:
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ json-schema-typed@8.0.2:
+ resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
+
json-schema@0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
@@ -6699,9 +6643,9 @@ packages:
make-error@1.3.6:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
- make-fetch-happen@14.0.3:
- resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ make-fetch-happen@15.0.3:
+ resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
marky@1.3.0:
resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==}
@@ -6803,6 +6747,10 @@ packages:
resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
engines: {node: 20 || >=22}
+ minimatch@10.1.1:
+ resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
+ engines: {node: 20 || >=22}
+
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -6825,9 +6773,9 @@ packages:
resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==}
engines: {node: '>=16 || 14 >=14.17'}
- minipass-fetch@4.0.1:
- resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ minipass-fetch@5.0.0:
+ resolution: {integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==}
+ engines: {node: ^20.17.0 || >=22.9.0}
minipass-flush@1.0.5:
resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==}
@@ -6845,18 +6793,10 @@ packages:
resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
engines: {node: '>=8'}
- minipass@5.0.0:
- resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
- engines: {node: '>=8'}
-
minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- minizlib@2.1.2:
- resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
- engines: {node: '>= 8'}
-
minizlib@3.1.0:
resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
engines: {node: '>= 18'}
@@ -7011,17 +6951,20 @@ packages:
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
hasBin: true
- node-gyp@11.4.2:
- resolution: {integrity: sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ node-gyp@12.1.0:
+ resolution: {integrity: sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==}
+ engines: {node: ^20.17.0 || >=22.9.0}
hasBin: true
node-releases@2.0.23:
resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==}
- nopt@8.1.0:
- resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
+ nopt@9.0.0:
+ resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
hasBin: true
normalize-path@3.0.0:
@@ -7032,21 +6975,17 @@ packages:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
- npm-bundled@4.0.0:
- resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- npm-install-checks@7.1.2:
- resolution: {integrity: sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ npm-bundled@5.0.0:
+ resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- npm-normalize-package-bin@4.0.0:
- resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ npm-install-checks@8.0.0:
+ resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- npm-package-arg@12.0.2:
- resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ npm-normalize-package-bin@5.0.0:
+ resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==}
+ engines: {node: ^20.17.0 || >=22.9.0}
npm-package-arg@13.0.0:
resolution: {integrity: sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==}
@@ -7056,13 +6995,13 @@ packages:
resolution: {integrity: sha512-DrIWNiWT0FTdDRjGOYfEEZUNe1IzaSZ+up7qBTKnrQDySpdmuOQvytrqQlpK5QrCA4IThMvL4wTumqaa1ZvVIQ==}
engines: {node: ^20.17.0 || >=22.9.0}
- npm-pick-manifest@10.0.0:
- resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ npm-pick-manifest@11.0.3:
+ resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- npm-registry-fetch@18.0.2:
- resolution: {integrity: sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ npm-registry-fetch@19.1.1:
+ resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
@@ -7302,8 +7241,8 @@ packages:
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
- pacote@21.0.0:
- resolution: {integrity: sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==}
+ pacote@21.0.4:
+ resolution: {integrity: sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==}
engines: {node: ^20.17.0 || >=22.9.0}
hasBin: true
@@ -7539,6 +7478,10 @@ packages:
resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==}
engines: {node: ^18.17.0 || >=20.5.0}
+ proc-log@6.1.0:
+ resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
@@ -7644,6 +7587,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'}
@@ -7832,13 +7779,8 @@ packages:
'@types/node':
optional: true
- rollup@4.46.2:
- resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
- rollup@4.52.3:
- resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==}
+ rollup@4.59.0:
+ resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -7971,6 +7913,10 @@ packages:
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+ serialize-javascript@7.0.3:
+ resolution: {integrity: sha512-h+cZ/XXarqDgCjo+YSyQU/ulDEESGGf8AMK9pPNmhNSl/FzPl6L8pMp1leca5z6NuG6tvV/auC8/43tmovowww==}
+ engines: {node: '>=20.0.0'}
+
serve-index@1.9.1:
resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==}
engines: {node: '>= 0.8.0'}
@@ -8056,9 +8002,9 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
- sigstore@3.1.0:
- resolution: {integrity: sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ sigstore@4.1.0:
+ resolution: {integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
@@ -8181,9 +8127,9 @@ packages:
resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- ssri@12.0.0:
- resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ ssri@13.0.0:
+ resolution: {integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==}
+ engines: {node: ^20.17.0 || >=22.9.0}
stack-trace@0.0.10:
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
@@ -8346,20 +8292,20 @@ packages:
tar-stream@3.1.7:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
- tar@6.2.1:
- resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
- engines: {node: '>=10'}
-
tar@7.5.1:
resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==}
engines: {node: '>=18'}
+ tar@7.5.4:
+ resolution: {integrity: sha512-AN04xbWGrSTDmVwlI4/GTlIIwMFk/XEv7uL8aa57zuvRy6s4hdBed+lVq2fAZ89XDa7Us3ANXcE3Tvqvja1kTA==}
+ engines: {node: '>=18'}
+
teeny-request@10.1.0:
resolution: {integrity: sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==}
engines: {node: '>=18'}
- terser-webpack-plugin@5.3.14:
- resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==}
+ terser-webpack-plugin@5.3.16:
+ resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==}
engines: {node: '>= 10.13.0'}
peerDependencies:
'@swc/core': '*'
@@ -8519,9 +8465,9 @@ packages:
engines: {node: '>=18.0.0'}
hasBin: true
- tuf-js@3.1.0:
- resolution: {integrity: sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ tuf-js@4.1.0:
+ resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
@@ -8649,13 +8595,13 @@ packages:
unicode-trie@2.0.0:
resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==}
- unique-filename@4.0.0:
- resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ unique-filename@5.0.0:
+ resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- unique-slug@5.0.0:
- resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ unique-slug@6.0.0:
+ resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
universal-github-app-jwt@2.2.2:
resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==}
@@ -8680,6 +8626,12 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -8874,6 +8826,10 @@ packages:
resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==}
engines: {node: '>=10.13.0'}
+ watchpack@2.5.1:
+ resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==}
+ engines: {node: '>=10.13.0'}
+
wbuf@1.7.3:
resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
@@ -8946,8 +8902,8 @@ packages:
html-webpack-plugin:
optional: true
- webpack@5.101.2:
- resolution: {integrity: sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==}
+ webpack@5.105.0:
+ resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==}
engines: {node: '>=10.13.0'}
hasBin: true
peerDependencies:
@@ -9012,6 +8968,11 @@ packages:
engines: {node: ^18.17.0 || >=20.5.0}
hasBin: true
+ which@6.0.0:
+ resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+ hasBin: true
+
why-is-node-running@2.3.0:
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
engines: {node: '>=8'}
@@ -9202,8 +9163,8 @@ packages:
resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
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
@@ -9399,11 +9360,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/b69a61793bd6ba935af262297688408d0b48252e(@modelcontextprotocol/sdk@1.24.0(zod@4.1.13))':
+ '@angular/ng-dev@https://codeload.github.com/angular/dev-infra-private-ng-dev-builds/tar.gz/b69a61793bd6ba935af262297688408d0b48252e(@modelcontextprotocol/sdk@1.26.0(zod@4.1.13))':
dependencies:
'@actions/core': 1.11.1
'@google-cloud/spanner': 8.0.0(supports-color@10.2.2)
- '@google/genai': 1.26.0(@modelcontextprotocol/sdk@1.24.0(zod@4.1.13))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5)
+ '@google/genai': 1.26.0(@modelcontextprotocol/sdk@1.26.0(zod@4.1.13))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5)
'@inquirer/prompts': 7.9.0(@types/node@24.9.1)
'@inquirer/type': 3.0.9(@types/node@24.9.1)
'@octokit/auth-app': 8.1.1
@@ -10738,12 +10699,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@google/genai@1.26.0(@modelcontextprotocol/sdk@1.24.0(zod@4.1.13))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5)':
+ '@google/genai@1.26.0(@modelcontextprotocol/sdk@1.26.0(zod@4.1.13))(bufferutil@4.0.9)(supports-color@10.2.2)(utf-8-validate@6.0.5)':
dependencies:
google-auth-library: 10.4.0(supports-color@10.2.2)
ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)
optionalDependencies:
- '@modelcontextprotocol/sdk': 1.24.0(zod@4.1.13)
+ '@modelcontextprotocol/sdk': 1.26.0(zod@4.1.13)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -10775,6 +10736,10 @@ snapshots:
'@hapi/bourne@3.0.0': {}
+ '@hono/node-server@1.19.9(hono@4.11.7)':
+ dependencies:
+ hono: 4.11.7
+
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.7':
@@ -11142,8 +11107,9 @@ snapshots:
'@lmdb/lmdb-win32-x64@3.4.2':
optional: true
- '@modelcontextprotocol/sdk@1.24.0(zod@4.1.13)':
+ '@modelcontextprotocol/sdk@1.26.0(zod@4.1.13)':
dependencies:
+ '@hono/node-server': 1.19.9(hono@4.11.7)
ajv: 8.17.1
ajv-formats: 3.0.1(ajv@8.17.1)
content-type: 1.0.5
@@ -11151,13 +11117,15 @@ snapshots:
cross-spawn: 7.0.6
eventsource: 3.0.7
eventsource-parser: 3.0.6
- express: 5.1.0
- express-rate-limit: 7.5.1(express@5.1.0)
+ express: 5.2.1
+ express-rate-limit: 8.2.1(express@5.2.1)
+ hono: 4.11.7
jose: 6.1.3
+ json-schema-typed: 8.0.2
pkce-challenge: 5.0.0
raw-body: 3.0.1
zod: 4.1.13
- zod-to-json-schema: 3.25.0(zod@4.1.13)
+ zod-to-json-schema: 3.25.1(zod@4.1.13)
transitivePeerDependencies:
- supports-color
@@ -11272,62 +11240,62 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
- '@npmcli/agent@3.0.0':
+ '@npmcli/agent@4.0.0':
dependencies:
agent-base: 7.1.4
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6(supports-color@10.2.2)
- lru-cache: 10.4.3
+ lru-cache: 11.2.2
socks-proxy-agent: 8.0.5
transitivePeerDependencies:
- supports-color
- '@npmcli/fs@4.0.0':
+ '@npmcli/fs@5.0.0':
dependencies:
semver: 7.7.2
- '@npmcli/git@6.0.3':
+ '@npmcli/git@7.0.1':
dependencies:
- '@npmcli/promise-spawn': 8.0.3
- ini: 5.0.0
- lru-cache: 10.4.3
- npm-pick-manifest: 10.0.0
- proc-log: 5.0.0
+ '@npmcli/promise-spawn': 9.0.1
+ ini: 6.0.0
+ lru-cache: 11.2.2
+ npm-pick-manifest: 11.0.3
+ proc-log: 6.1.0
promise-retry: 2.0.1
semver: 7.7.2
- which: 5.0.0
+ which: 6.0.0
- '@npmcli/installed-package-contents@3.0.0':
+ '@npmcli/installed-package-contents@4.0.0':
dependencies:
- npm-bundled: 4.0.0
- npm-normalize-package-bin: 4.0.0
+ npm-bundled: 5.0.0
+ npm-normalize-package-bin: 5.0.0
- '@npmcli/node-gyp@4.0.0': {}
+ '@npmcli/node-gyp@5.0.0': {}
- '@npmcli/package-json@6.2.0':
+ '@npmcli/package-json@7.0.4':
dependencies:
- '@npmcli/git': 6.0.3
- glob: 10.4.5
- hosted-git-info: 8.1.0
- json-parse-even-better-errors: 4.0.0
- proc-log: 5.0.0
+ '@npmcli/git': 7.0.1
+ glob: 13.0.0
+ hosted-git-info: 9.0.2
+ json-parse-even-better-errors: 5.0.0
+ proc-log: 6.1.0
semver: 7.7.2
validate-npm-package-license: 3.0.4
- '@npmcli/promise-spawn@8.0.3':
+ '@npmcli/promise-spawn@9.0.1':
dependencies:
- which: 5.0.0
+ which: 6.0.0
- '@npmcli/redact@3.2.2': {}
+ '@npmcli/redact@4.0.0': {}
- '@npmcli/run-script@9.1.0':
+ '@npmcli/run-script@10.0.3':
dependencies:
- '@npmcli/node-gyp': 4.0.0
- '@npmcli/package-json': 6.2.0
- '@npmcli/promise-spawn': 8.0.3
- node-gyp: 11.4.2
- proc-log: 5.0.0
- which: 5.0.0
+ '@npmcli/node-gyp': 5.0.0
+ '@npmcli/package-json': 7.0.4
+ '@npmcli/promise-spawn': 9.0.1
+ node-gyp: 12.1.0
+ proc-log: 6.1.0
+ which: 6.0.0
transitivePeerDependencies:
- supports-color
@@ -11585,13 +11553,13 @@ snapshots:
- react-native-b4a
- supports-color
- '@rollup/plugin-alias@5.1.1(rollup@4.46.2)':
+ '@rollup/plugin-alias@5.1.1(rollup@4.59.0)':
optionalDependencies:
- rollup: 4.46.2
+ rollup: 4.59.0
- '@rollup/plugin-commonjs@28.0.6(rollup@4.46.2)':
+ '@rollup/plugin-commonjs@28.0.6(rollup@4.59.0)':
dependencies:
- '@rollup/pluginutils': 5.3.0(rollup@4.46.2)
+ '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
commondir: 1.0.1
estree-walker: 2.0.2
fdir: 6.5.0(picomatch@4.0.3)
@@ -11599,188 +11567,123 @@ snapshots:
magic-string: 0.30.17
picomatch: 4.0.3
optionalDependencies:
- rollup: 4.46.2
-
- '@rollup/plugin-json@6.1.0(rollup@4.46.2)':
- dependencies:
- '@rollup/pluginutils': 5.3.0(rollup@4.46.2)
- optionalDependencies:
- rollup: 4.46.2
+ rollup: 4.59.0
- '@rollup/plugin-json@6.1.0(rollup@4.52.3)':
+ '@rollup/plugin-json@6.1.0(rollup@4.59.0)':
dependencies:
- '@rollup/pluginutils': 5.3.0(rollup@4.52.3)
+ '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
optionalDependencies:
- rollup: 4.52.3
+ rollup: 4.59.0
- '@rollup/plugin-node-resolve@15.3.1(rollup@4.52.3)':
+ '@rollup/plugin-node-resolve@15.3.1(rollup@4.59.0)':
dependencies:
- '@rollup/pluginutils': 5.3.0(rollup@4.52.3)
+ '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
is-module: 1.0.0
resolve: 1.22.10
optionalDependencies:
- rollup: 4.52.3
+ rollup: 4.59.0
- '@rollup/plugin-node-resolve@16.0.1(rollup@4.46.2)':
+ '@rollup/plugin-node-resolve@16.0.1(rollup@4.59.0)':
dependencies:
- '@rollup/pluginutils': 5.3.0(rollup@4.46.2)
+ '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
is-module: 1.0.0
resolve: 1.22.10
optionalDependencies:
- rollup: 4.46.2
-
- '@rollup/pluginutils@5.2.0(rollup@4.46.2)':
- dependencies:
- '@types/estree': 1.0.8
- estree-walker: 2.0.2
- picomatch: 4.0.3
- optionalDependencies:
- rollup: 4.46.2
+ rollup: 4.59.0
- '@rollup/pluginutils@5.3.0(rollup@4.46.2)':
+ '@rollup/pluginutils@5.2.0(rollup@4.59.0)':
dependencies:
'@types/estree': 1.0.8
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
- rollup: 4.46.2
+ rollup: 4.59.0
- '@rollup/pluginutils@5.3.0(rollup@4.52.3)':
+ '@rollup/pluginutils@5.3.0(rollup@4.59.0)':
dependencies:
'@types/estree': 1.0.8
estree-walker: 2.0.2
picomatch: 4.0.3
optionalDependencies:
- rollup: 4.52.3
-
- '@rollup/rollup-android-arm-eabi@4.46.2':
- optional: true
-
- '@rollup/rollup-android-arm-eabi@4.52.3':
- optional: true
-
- '@rollup/rollup-android-arm64@4.46.2':
- optional: true
-
- '@rollup/rollup-android-arm64@4.52.3':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.46.2':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.52.3':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.46.2':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.52.3':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.46.2':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.52.3':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.46.2':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.52.3':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.52.3':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.52.3':
- optional: true
+ rollup: 4.59.0
- '@rollup/rollup-linux-arm64-gnu@4.46.2':
+ '@rollup/rollup-android-arm-eabi@4.59.0':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.52.3':
+ '@rollup/rollup-android-arm64@4.59.0':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.46.2':
+ '@rollup/rollup-darwin-arm64@4.59.0':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.52.3':
+ '@rollup/rollup-darwin-x64@4.59.0':
optional: true
- '@rollup/rollup-linux-loong64-gnu@4.52.3':
+ '@rollup/rollup-freebsd-arm64@4.59.0':
optional: true
- '@rollup/rollup-linux-loongarch64-gnu@4.46.2':
+ '@rollup/rollup-freebsd-x64@4.59.0':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.46.2':
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.52.3':
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.46.2':
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.52.3':
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.46.2':
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.52.3':
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.46.2':
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.52.3':
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.46.2':
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.52.3':
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.46.2':
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.52.3':
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
optional: true
- '@rollup/rollup-openharmony-arm64@4.52.3':
+ '@rollup/rollup-linux-x64-musl@4.59.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.46.2':
+ '@rollup/rollup-openbsd-x64@4.59.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.52.3':
+ '@rollup/rollup-openharmony-arm64@4.59.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.46.2':
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.52.3':
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
optional: true
- '@rollup/rollup-win32-x64-gnu@4.52.3':
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.46.2':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.52.3':
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
optional: true
'@rollup/wasm-node@4.52.4':
@@ -11791,37 +11694,37 @@ snapshots:
'@rtsao/scc@1.1.0': {}
- '@sigstore/bundle@3.1.0':
+ '@sigstore/bundle@4.0.0':
dependencies:
- '@sigstore/protobuf-specs': 0.4.3
+ '@sigstore/protobuf-specs': 0.5.0
- '@sigstore/core@2.0.0': {}
+ '@sigstore/core@3.1.0': {}
- '@sigstore/protobuf-specs@0.4.3': {}
+ '@sigstore/protobuf-specs@0.5.0': {}
- '@sigstore/sign@3.1.0':
+ '@sigstore/sign@4.1.0':
dependencies:
- '@sigstore/bundle': 3.1.0
- '@sigstore/core': 2.0.0
- '@sigstore/protobuf-specs': 0.4.3
- make-fetch-happen: 14.0.3
- proc-log: 5.0.0
+ '@sigstore/bundle': 4.0.0
+ '@sigstore/core': 3.1.0
+ '@sigstore/protobuf-specs': 0.5.0
+ make-fetch-happen: 15.0.3
+ proc-log: 6.1.0
promise-retry: 2.0.1
transitivePeerDependencies:
- supports-color
- '@sigstore/tuf@3.1.1':
+ '@sigstore/tuf@4.0.1':
dependencies:
- '@sigstore/protobuf-specs': 0.4.3
- tuf-js: 3.1.0
+ '@sigstore/protobuf-specs': 0.5.0
+ tuf-js: 4.1.0
transitivePeerDependencies:
- supports-color
- '@sigstore/verify@2.1.1':
+ '@sigstore/verify@3.1.0':
dependencies:
- '@sigstore/bundle': 3.1.0
- '@sigstore/core': 2.0.0
- '@sigstore/protobuf-specs': 0.4.3
+ '@sigstore/bundle': 4.0.0
+ '@sigstore/core': 3.1.0
+ '@sigstore/protobuf-specs': 0.5.0
'@socket.io/component-emitter@3.1.2': {}
@@ -11849,10 +11752,10 @@ snapshots:
'@tufjs/canonical-json@2.0.0': {}
- '@tufjs/models@3.0.1':
+ '@tufjs/models@4.1.0':
dependencies:
'@tufjs/canonical-json': 2.0.0
- minimatch: 9.0.5
+ minimatch: 10.1.1
'@types/accepts@1.3.7':
dependencies:
@@ -12553,11 +12456,11 @@ snapshots:
'@web/dev-server-rollup@0.6.4(bufferutil@4.0.9)':
dependencies:
- '@rollup/plugin-node-resolve': 15.3.1(rollup@4.52.3)
+ '@rollup/plugin-node-resolve': 15.3.1(rollup@4.59.0)
'@web/dev-server-core': 0.7.5(bufferutil@4.0.9)
nanocolors: 0.2.13
parse5: 6.0.1
- rollup: 4.52.3
+ rollup: 4.59.0
whatwg-url: 14.2.0
transitivePeerDependencies:
- bufferutil
@@ -12781,7 +12684,7 @@ snapshots:
jsonparse: 1.3.1
through: 2.3.8
- abbrev@3.0.1: {}
+ abbrev@4.0.0: {}
abort-controller@3.0.0:
dependencies:
@@ -12832,15 +12735,19 @@ snapshots:
ajv-formats@2.1.1:
dependencies:
- ajv: 8.17.1
+ ajv: 8.18.0
ajv-formats@3.0.1(ajv@8.17.1):
optionalDependencies:
ajv: 8.17.1
- ajv-keywords@5.1.0(ajv@8.17.1):
+ ajv-formats@3.0.1(ajv@8.18.0):
+ optionalDependencies:
+ ajv: 8.18.0
+
+ ajv-keywords@5.1.0(ajv@8.18.0):
dependencies:
- ajv: 8.17.1
+ ajv: 8.18.0
fast-deep-equal: 3.1.3
ajv@6.12.6:
@@ -12857,6 +12764,13 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
+ ajv@8.18.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
algoliasearch@5.35.0:
dependencies:
'@algolia/abtesting': 1.1.0
@@ -13033,11 +12947,11 @@ snapshots:
b4a@1.7.3: {}
- babel-loader@10.0.0(@babel/core@7.28.3)(webpack@5.101.2(esbuild@0.25.9)):
+ babel-loader@10.0.0(@babel/core@7.28.3)(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
'@babel/core': 7.28.3
find-up: 5.0.0
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.3):
dependencies:
@@ -13110,6 +13024,8 @@ snapshots:
baseline-browser-mapping@2.8.16: {}
+ baseline-browser-mapping@2.9.14: {}
+
basic-ftp@5.0.5: {}
batch@0.6.1: {}
@@ -13182,6 +13098,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ 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.0
+ iconv-lite: 0.7.0
+ on-finished: 2.4.1
+ qs: 6.14.1
+ raw-body: 3.0.1
+ type-is: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
bonjour-service@1.3.0:
dependencies:
fast-deep-equal: 3.1.3
@@ -13272,6 +13202,14 @@ snapshots:
node-releases: 2.0.23
update-browserslist-db: 1.1.3(browserslist@4.26.3)
+ browserslist@4.28.1:
+ dependencies:
+ 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)
+
browserstack@1.6.1:
dependencies:
https-proxy-agent: 2.2.4
@@ -13308,20 +13246,19 @@ snapshots:
cac@6.7.14: {}
- cacache@19.0.1:
+ cacache@20.0.3:
dependencies:
- '@npmcli/fs': 4.0.0
+ '@npmcli/fs': 5.0.0
fs-minipass: 3.0.3
- glob: 10.4.5
- lru-cache: 10.4.3
+ glob: 13.0.0
+ lru-cache: 11.2.2
minipass: 7.1.2
minipass-collect: 2.0.1
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
p-map: 7.0.3
- ssri: 12.0.0
- tar: 7.5.1
- unique-filename: 4.0.0
+ ssri: 13.0.0
+ unique-filename: 5.0.0
cache-content-type@1.0.1:
dependencies:
@@ -13353,6 +13290,8 @@ snapshots:
caniuse-lite@1.0.30001750: {}
+ caniuse-lite@1.0.30001764: {}
+
caseless@0.12.0: {}
chai@5.3.3:
@@ -13412,8 +13351,6 @@ snapshots:
chownr@1.1.4: {}
- chownr@2.0.0: {}
-
chownr@3.0.0: {}
chrome-launcher@0.15.2:
@@ -13617,14 +13554,14 @@ snapshots:
dependencies:
is-what: 3.14.1
- copy-webpack-plugin@13.0.1(webpack@5.101.2(esbuild@0.25.9)):
+ copy-webpack-plugin@14.0.0(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
glob-parent: 6.0.2
normalize-path: 3.0.0
schema-utils: 4.3.3
- serialize-javascript: 6.0.2
+ serialize-javascript: 7.0.3
tinyglobby: 0.2.14
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
core-js-compat@3.46.0:
dependencies:
@@ -13668,7 +13605,7 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
- css-loader@7.1.2(webpack@5.101.2(esbuild@0.25.9)):
+ css-loader@7.1.2(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
icss-utils: 5.1.0(postcss@8.5.6)
postcss: 8.5.6
@@ -13679,7 +13616,7 @@ snapshots:
postcss-value-parser: 4.2.0
semver: 7.7.2
optionalDependencies:
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
css-select@6.0.0:
dependencies:
@@ -13944,6 +13881,8 @@ snapshots:
electron-to-chromium@1.5.234: {}
+ electron-to-chromium@1.5.267: {}
+
emoji-regex@10.5.0: {}
emoji-regex@8.0.0: {}
@@ -13994,7 +13933,7 @@ snapshots:
- supports-color
- utf-8-validate
- enhanced-resolve@5.18.3:
+ enhanced-resolve@5.19.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.0
@@ -14092,6 +14031,8 @@ snapshots:
es-module-lexer@1.7.0: {}
+ es-module-lexer@2.0.0: {}
+
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
@@ -14349,9 +14290,10 @@ snapshots:
express-rate-limit@5.5.1: {}
- express-rate-limit@7.5.1(express@5.1.0):
+ express-rate-limit@8.2.1(express@5.2.1):
dependencies:
- express: 5.1.0
+ express: 5.2.1
+ ip-address: 10.0.1
express@4.21.2:
dependencies:
@@ -14421,6 +14363,39 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ express@5.2.1:
+ dependencies:
+ accepts: 2.0.0
+ body-parser: 2.2.2
+ content-disposition: 1.0.0
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.2.2
+ debug: 4.4.3(supports-color@10.2.2)
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 2.1.0
+ fresh: 2.0.0
+ http-errors: 2.0.0
+ merge-descriptors: 2.0.0
+ mime-types: 3.0.1
+ on-finished: 2.4.1
+ once: 1.4.0
+ parseurl: 1.3.3
+ proxy-addr: 2.0.7
+ qs: 6.14.0
+ range-parser: 1.2.1
+ router: 2.2.0
+ send: 1.2.0
+ serve-static: 2.2.0
+ statuses: 2.0.2
+ type-is: 2.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
extend@3.0.2: {}
extract-zip@2.0.1:
@@ -14662,10 +14637,6 @@ snapshots:
jsonfile: 4.0.0
universalify: 0.1.2
- fs-minipass@2.1.0:
- dependencies:
- minipass: 3.3.6
-
fs-minipass@3.0.3:
dependencies:
minipass: 7.1.2
@@ -14800,6 +14771,12 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 2.0.0
+ glob@13.0.0:
+ dependencies:
+ minimatch: 10.1.1
+ minipass: 7.1.2
+ path-scurry: 2.0.0
+
glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
@@ -14943,9 +14920,7 @@ snapshots:
dependencies:
function-bind: 1.1.2
- hosted-git-info@8.1.0:
- dependencies:
- lru-cache: 10.4.3
+ hono@4.11.7: {}
hosted-git-info@9.0.2:
dependencies:
@@ -15155,6 +15130,8 @@ snapshots:
ini@5.0.0: {}
+ ini@6.0.0: {}
+
injection-js@2.5.0:
dependencies:
tslib: 2.8.1
@@ -15551,12 +15528,14 @@ snapshots:
json-parse-even-better-errors@2.3.1: {}
- json-parse-even-better-errors@4.0.0: {}
+ json-parse-even-better-errors@5.0.0: {}
json-schema-traverse@0.4.1: {}
json-schema-traverse@1.0.0: {}
+ json-schema-typed@8.0.2: {}
+
json-schema@0.4.0: {}
json-stable-stringify-without-jsonify@1.0.1: {}
@@ -15768,11 +15747,11 @@ snapshots:
picocolors: 1.1.1
shell-quote: 1.8.3
- less-loader@12.3.0(less@4.4.0)(webpack@5.101.2(esbuild@0.25.9)):
+ less-loader@12.3.0(less@4.4.0)(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
less: 4.4.0
optionalDependencies:
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
less@4.4.0:
dependencies:
@@ -15793,11 +15772,11 @@ snapshots:
prelude-ls: 1.2.1
type-check: 0.4.0
- license-webpack-plugin@4.0.2(webpack@5.101.2(esbuild@0.25.9)):
+ license-webpack-plugin@4.0.2(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
webpack-sources: 3.3.3
optionalDependencies:
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
lie@3.3.0:
dependencies:
@@ -15958,19 +15937,19 @@ snapshots:
make-error@1.3.6: {}
- make-fetch-happen@14.0.3:
+ make-fetch-happen@15.0.3:
dependencies:
- '@npmcli/agent': 3.0.0
- cacache: 19.0.1
+ '@npmcli/agent': 4.0.0
+ cacache: 20.0.3
http-cache-semantics: 4.2.0
minipass: 7.1.2
- minipass-fetch: 4.0.1
+ minipass-fetch: 5.0.0
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
negotiator: 1.0.0
- proc-log: 5.0.0
+ proc-log: 6.1.0
promise-retry: 2.0.1
- ssri: 12.0.0
+ ssri: 13.0.0
transitivePeerDependencies:
- supports-color
@@ -16030,11 +16009,11 @@ snapshots:
mimic-function@5.0.1: {}
- mini-css-extract-plugin@2.9.4(webpack@5.101.2(esbuild@0.25.9)):
+ mini-css-extract-plugin@2.9.4(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
schema-utils: 4.3.3
tapable: 2.3.0
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
minimalistic-assert@1.0.1: {}
@@ -16046,6 +16025,10 @@ snapshots:
dependencies:
'@isaacs/brace-expansion': 5.0.0
+ minimatch@10.1.1:
+ dependencies:
+ '@isaacs/brace-expansion': 5.0.0
+
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.12
@@ -16068,7 +16051,7 @@ snapshots:
dependencies:
minipass: 7.1.2
- minipass-fetch@4.0.1:
+ minipass-fetch@5.0.0:
dependencies:
minipass: 7.1.2
minipass-sized: 1.0.3
@@ -16092,15 +16075,8 @@ snapshots:
dependencies:
yallist: 4.0.0
- minipass@5.0.0: {}
-
minipass@7.1.2: {}
- minizlib@2.1.2:
- dependencies:
- minipass: 3.3.6
- yallist: 4.0.0
-
minizlib@3.1.0:
dependencies:
minipass: 7.1.2
@@ -16181,7 +16157,7 @@ snapshots:
dependencies:
'@ampproject/remapping': 2.3.0
'@angular/compiler-cli': 20.3.7(@angular/compiler@20.3.7)(typescript@5.9.2)
- '@rollup/plugin-json': 6.1.0(rollup@4.52.3)
+ '@rollup/plugin-json': 6.1.0(rollup@4.59.0)
'@rollup/wasm-node': 4.52.4
ajv: 8.17.1
ansi-colors: 4.1.3
@@ -16197,14 +16173,14 @@ snapshots:
ora: 8.2.0
piscina: 5.1.3
postcss: 8.5.6
- rollup-plugin-dts: 6.2.1(rollup@4.52.3)(typescript@5.9.2)
+ rollup-plugin-dts: 6.2.1(rollup@4.59.0)(typescript@5.9.2)
rxjs: 7.8.2
sass: 1.90.0
tinyglobby: 0.2.14
tslib: 2.8.1
typescript: 5.9.2
optionalDependencies:
- rollup: 4.52.3
+ rollup: 4.59.0
nock@14.0.10:
dependencies:
@@ -16249,47 +16225,42 @@ snapshots:
node-gyp-build@4.8.4: {}
- node-gyp@11.4.2:
+ node-gyp@12.1.0:
dependencies:
env-paths: 2.2.1
exponential-backoff: 3.1.3
graceful-fs: 4.2.11
- make-fetch-happen: 14.0.3
- nopt: 8.1.0
- proc-log: 5.0.0
+ make-fetch-happen: 15.0.3
+ nopt: 9.0.0
+ proc-log: 6.1.0
semver: 7.7.2
- tar: 7.5.1
+ tar: 7.5.4
tinyglobby: 0.2.14
- which: 5.0.0
+ which: 6.0.0
transitivePeerDependencies:
- supports-color
node-releases@2.0.23: {}
- nopt@8.1.0:
+ node-releases@2.0.27: {}
+
+ nopt@9.0.0:
dependencies:
- abbrev: 3.0.1
+ abbrev: 4.0.0
normalize-path@3.0.0: {}
normalize-range@0.1.2: {}
- npm-bundled@4.0.0:
+ npm-bundled@5.0.0:
dependencies:
- npm-normalize-package-bin: 4.0.0
+ npm-normalize-package-bin: 5.0.0
- npm-install-checks@7.1.2:
+ npm-install-checks@8.0.0:
dependencies:
semver: 7.7.2
- npm-normalize-package-bin@4.0.0: {}
-
- npm-package-arg@12.0.2:
- dependencies:
- hosted-git-info: 8.1.0
- proc-log: 5.0.0
- semver: 7.7.2
- validate-npm-package-name: 6.0.2
+ npm-normalize-package-bin@5.0.0: {}
npm-package-arg@13.0.0:
dependencies:
@@ -16303,23 +16274,23 @@ snapshots:
ignore-walk: 8.0.0
proc-log: 5.0.0
- npm-pick-manifest@10.0.0:
+ npm-pick-manifest@11.0.3:
dependencies:
- npm-install-checks: 7.1.2
- npm-normalize-package-bin: 4.0.0
- npm-package-arg: 12.0.2
+ npm-install-checks: 8.0.0
+ npm-normalize-package-bin: 5.0.0
+ npm-package-arg: 13.0.0
semver: 7.7.2
- npm-registry-fetch@18.0.2:
+ npm-registry-fetch@19.1.1:
dependencies:
- '@npmcli/redact': 3.2.2
+ '@npmcli/redact': 4.0.0
jsonparse: 1.3.1
- make-fetch-happen: 14.0.3
+ make-fetch-happen: 15.0.3
minipass: 7.1.2
- minipass-fetch: 4.0.1
+ minipass-fetch: 5.0.0
minizlib: 3.1.0
- npm-package-arg: 12.0.2
- proc-log: 5.0.0
+ npm-package-arg: 13.0.0
+ proc-log: 6.1.0
transitivePeerDependencies:
- supports-color
@@ -16514,25 +16485,25 @@ snapshots:
package-json-from-dist@1.0.1: {}
- pacote@21.0.0:
+ pacote@21.0.4:
dependencies:
- '@npmcli/git': 6.0.3
- '@npmcli/installed-package-contents': 3.0.0
- '@npmcli/package-json': 6.2.0
- '@npmcli/promise-spawn': 8.0.3
- '@npmcli/run-script': 9.1.0
- cacache: 19.0.1
+ '@npmcli/git': 7.0.1
+ '@npmcli/installed-package-contents': 4.0.0
+ '@npmcli/package-json': 7.0.4
+ '@npmcli/promise-spawn': 9.0.1
+ '@npmcli/run-script': 10.0.3
+ cacache: 20.0.3
fs-minipass: 3.0.3
minipass: 7.1.2
- npm-package-arg: 12.0.2
+ npm-package-arg: 13.0.0
npm-packlist: 10.0.2
- npm-pick-manifest: 10.0.0
- npm-registry-fetch: 18.0.2
- proc-log: 5.0.0
+ npm-pick-manifest: 11.0.3
+ npm-registry-fetch: 19.1.1
+ proc-log: 6.1.0
promise-retry: 2.0.1
- sigstore: 3.1.0
- ssri: 12.0.0
- tar: 6.2.1
+ sigstore: 4.1.0
+ ssri: 13.0.0
+ tar: 7.5.1
transitivePeerDependencies:
- supports-color
@@ -16689,14 +16660,14 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.101.2(esbuild@0.25.9)):
+ postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.9.2)(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
cosmiconfig: 9.0.0(typescript@5.9.2)
jiti: 1.21.7
postcss: 8.5.6
semver: 7.7.2
optionalDependencies:
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
transitivePeerDependencies:
- typescript
@@ -16742,6 +16713,8 @@ snapshots:
proc-log@5.0.0: {}
+ proc-log@6.1.0: {}
+
process-nextick-args@2.0.1: {}
process-warning@1.0.0: {}
@@ -16904,6 +16877,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: {}
@@ -17134,81 +17111,50 @@ snapshots:
node-fetch: 3.3.2
spdx-expression-validate: 2.0.0
- rollup-plugin-dts@6.2.1(rollup@4.46.2)(typescript@5.9.2):
- dependencies:
- magic-string: 0.30.17
- rollup: 4.46.2
- typescript: 5.9.2
- optionalDependencies:
- '@babel/code-frame': 7.27.1
-
- rollup-plugin-dts@6.2.1(rollup@4.52.3)(typescript@5.9.2):
+ rollup-plugin-dts@6.2.1(rollup@4.59.0)(typescript@5.9.2):
dependencies:
magic-string: 0.30.17
- rollup: 4.52.3
+ rollup: 4.59.0
typescript: 5.9.2
optionalDependencies:
'@babel/code-frame': 7.27.1
- rollup-plugin-sourcemaps2@0.5.3(@types/node@22.18.10)(rollup@4.46.2):
+ rollup-plugin-sourcemaps2@0.5.3(@types/node@22.18.10)(rollup@4.59.0):
dependencies:
- '@rollup/pluginutils': 5.2.0(rollup@4.46.2)
- rollup: 4.46.2
+ '@rollup/pluginutils': 5.2.0(rollup@4.59.0)
+ rollup: 4.59.0
optionalDependencies:
'@types/node': 22.18.10
- rollup@4.46.2:
- dependencies:
- '@types/estree': 1.0.8
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.46.2
- '@rollup/rollup-android-arm64': 4.46.2
- '@rollup/rollup-darwin-arm64': 4.46.2
- '@rollup/rollup-darwin-x64': 4.46.2
- '@rollup/rollup-freebsd-arm64': 4.46.2
- '@rollup/rollup-freebsd-x64': 4.46.2
- '@rollup/rollup-linux-arm-gnueabihf': 4.46.2
- '@rollup/rollup-linux-arm-musleabihf': 4.46.2
- '@rollup/rollup-linux-arm64-gnu': 4.46.2
- '@rollup/rollup-linux-arm64-musl': 4.46.2
- '@rollup/rollup-linux-loongarch64-gnu': 4.46.2
- '@rollup/rollup-linux-ppc64-gnu': 4.46.2
- '@rollup/rollup-linux-riscv64-gnu': 4.46.2
- '@rollup/rollup-linux-riscv64-musl': 4.46.2
- '@rollup/rollup-linux-s390x-gnu': 4.46.2
- '@rollup/rollup-linux-x64-gnu': 4.46.2
- '@rollup/rollup-linux-x64-musl': 4.46.2
- '@rollup/rollup-win32-arm64-msvc': 4.46.2
- '@rollup/rollup-win32-ia32-msvc': 4.46.2
- '@rollup/rollup-win32-x64-msvc': 4.46.2
- fsevents: 2.3.3
-
- rollup@4.52.3:
+ rollup@4.59.0:
dependencies:
'@types/estree': 1.0.8
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.52.3
- '@rollup/rollup-android-arm64': 4.52.3
- '@rollup/rollup-darwin-arm64': 4.52.3
- '@rollup/rollup-darwin-x64': 4.52.3
- '@rollup/rollup-freebsd-arm64': 4.52.3
- '@rollup/rollup-freebsd-x64': 4.52.3
- '@rollup/rollup-linux-arm-gnueabihf': 4.52.3
- '@rollup/rollup-linux-arm-musleabihf': 4.52.3
- '@rollup/rollup-linux-arm64-gnu': 4.52.3
- '@rollup/rollup-linux-arm64-musl': 4.52.3
- '@rollup/rollup-linux-loong64-gnu': 4.52.3
- '@rollup/rollup-linux-ppc64-gnu': 4.52.3
- '@rollup/rollup-linux-riscv64-gnu': 4.52.3
- '@rollup/rollup-linux-riscv64-musl': 4.52.3
- '@rollup/rollup-linux-s390x-gnu': 4.52.3
- '@rollup/rollup-linux-x64-gnu': 4.52.3
- '@rollup/rollup-linux-x64-musl': 4.52.3
- '@rollup/rollup-openharmony-arm64': 4.52.3
- '@rollup/rollup-win32-arm64-msvc': 4.52.3
- '@rollup/rollup-win32-ia32-msvc': 4.52.3
- '@rollup/rollup-win32-x64-gnu': 4.52.3
- '@rollup/rollup-win32-x64-msvc': 4.52.3
+ '@rollup/rollup-android-arm-eabi': 4.59.0
+ '@rollup/rollup-android-arm64': 4.59.0
+ '@rollup/rollup-darwin-arm64': 4.59.0
+ '@rollup/rollup-darwin-x64': 4.59.0
+ '@rollup/rollup-freebsd-arm64': 4.59.0
+ '@rollup/rollup-freebsd-x64': 4.59.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.59.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.59.0
+ '@rollup/rollup-linux-arm64-gnu': 4.59.0
+ '@rollup/rollup-linux-arm64-musl': 4.59.0
+ '@rollup/rollup-linux-loong64-gnu': 4.59.0
+ '@rollup/rollup-linux-loong64-musl': 4.59.0
+ '@rollup/rollup-linux-ppc64-gnu': 4.59.0
+ '@rollup/rollup-linux-ppc64-musl': 4.59.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.59.0
+ '@rollup/rollup-linux-riscv64-musl': 4.59.0
+ '@rollup/rollup-linux-s390x-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-musl': 4.59.0
+ '@rollup/rollup-openbsd-x64': 4.59.0
+ '@rollup/rollup-openharmony-arm64': 4.59.0
+ '@rollup/rollup-win32-arm64-msvc': 4.59.0
+ '@rollup/rollup-win32-ia32-msvc': 4.59.0
+ '@rollup/rollup-win32-x64-gnu': 4.59.0
+ '@rollup/rollup-win32-x64-msvc': 4.59.0
fsevents: 2.3.3
router@2.2.0:
@@ -17262,12 +17208,12 @@ snapshots:
safer-buffer@2.1.2: {}
- sass-loader@16.0.5(sass@1.90.0)(webpack@5.101.2(esbuild@0.25.9)):
+ sass-loader@16.0.5(sass@1.90.0)(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
neo-async: 2.6.2
optionalDependencies:
sass: 1.90.0
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
sass@1.90.0:
dependencies:
@@ -17292,9 +17238,9 @@ snapshots:
schema-utils@4.3.3:
dependencies:
'@types/json-schema': 7.0.15
- ajv: 8.17.1
+ ajv: 8.18.0
ajv-formats: 2.1.1
- ajv-keywords: 5.1.0(ajv@8.17.1)
+ ajv-keywords: 5.1.0(ajv@8.18.0)
select-hose@2.0.0: {}
@@ -17374,6 +17320,8 @@ snapshots:
dependencies:
randombytes: 2.1.0
+ serialize-javascript@7.0.3: {}
+
serve-index@1.9.1:
dependencies:
accepts: 1.3.8
@@ -17487,14 +17435,14 @@ snapshots:
signal-exit@4.1.0: {}
- sigstore@3.1.0:
+ sigstore@4.1.0:
dependencies:
- '@sigstore/bundle': 3.1.0
- '@sigstore/core': 2.0.0
- '@sigstore/protobuf-specs': 0.4.3
- '@sigstore/sign': 3.1.0
- '@sigstore/tuf': 3.1.1
- '@sigstore/verify': 2.1.1
+ '@sigstore/bundle': 4.0.0
+ '@sigstore/core': 3.1.0
+ '@sigstore/protobuf-specs': 0.5.0
+ '@sigstore/sign': 4.1.0
+ '@sigstore/tuf': 4.0.1
+ '@sigstore/verify': 3.1.0
transitivePeerDependencies:
- supports-color
@@ -17588,11 +17536,11 @@ snapshots:
source-map-js@1.2.1: {}
- source-map-loader@5.0.0(webpack@5.101.2(esbuild@0.25.9)):
+ source-map-loader@5.0.0(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
iconv-lite: 0.6.3
source-map-js: 1.2.1
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
source-map-support@0.4.18:
dependencies:
@@ -17675,7 +17623,7 @@ snapshots:
dependencies:
minipass: 7.1.2
- ssri@12.0.0:
+ ssri@13.0.0:
dependencies:
minipass: 7.1.2
@@ -17866,16 +17814,15 @@ snapshots:
- bare-abort-controller
- react-native-b4a
- tar@6.2.1:
+ tar@7.5.1:
dependencies:
- chownr: 2.0.0
- fs-minipass: 2.1.0
- minipass: 5.0.0
- minizlib: 2.1.2
- mkdirp: 1.0.4
- yallist: 4.0.0
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.2
+ minizlib: 3.1.0
+ yallist: 5.0.0
- tar@7.5.1:
+ tar@7.5.4:
dependencies:
'@isaacs/fs-minipass': 4.0.1
chownr: 3.0.0
@@ -17892,14 +17839,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- terser-webpack-plugin@5.3.14(esbuild@0.25.9)(webpack@5.101.2(esbuild@0.25.9)):
+ terser-webpack-plugin@5.3.16(esbuild@0.25.9)(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
'@jridgewell/trace-mapping': 0.3.31
jest-worker: 27.5.1
schema-utils: 4.3.3
serialize-javascript: 6.0.2
terser: 5.43.1
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
optionalDependencies:
esbuild: 0.25.9
@@ -18040,11 +17987,11 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
- tuf-js@3.1.0:
+ tuf-js@4.1.0:
dependencies:
- '@tufjs/models': 3.0.1
+ '@tufjs/models': 4.1.0
debug: 4.4.3(supports-color@10.2.2)
- make-fetch-happen: 14.0.3
+ make-fetch-happen: 15.0.3
transitivePeerDependencies:
- supports-color
@@ -18178,11 +18125,11 @@ snapshots:
pako: 0.2.9
tiny-inflate: 1.0.3
- unique-filename@4.0.0:
+ unique-filename@5.0.0:
dependencies:
- unique-slug: 5.0.0
+ unique-slug: 6.0.0
- unique-slug@5.0.0:
+ unique-slug@6.0.0:
dependencies:
imurmurhash: 0.1.4
@@ -18202,6 +18149,12 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ update-browserslist-db@1.2.3(browserslist@4.28.1):
+ dependencies:
+ browserslist: 4.28.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
@@ -18342,7 +18295,7 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
- rollup: 4.52.3
+ rollup: 4.59.0
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 24.9.1
@@ -18360,7 +18313,7 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
- rollup: 4.52.3
+ rollup: 4.59.0
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 24.9.1
@@ -18425,6 +18378,11 @@ snapshots:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
+ watchpack@2.5.1:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
wbuf@1.7.3:
dependencies:
minimalistic-assert: 1.0.1
@@ -18461,7 +18419,7 @@ snapshots:
webidl-conversions@7.0.0: {}
- webpack-dev-middleware@7.4.2(webpack@5.101.2(esbuild@0.25.9)):
+ webpack-dev-middleware@7.4.2(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
colorette: 2.0.20
memfs: 4.49.0
@@ -18470,9 +18428,9 @@ snapshots:
range-parser: 1.2.1
schema-utils: 4.3.3
optionalDependencies:
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
- webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.101.2(esbuild@0.25.9)):
+ webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
'@types/bonjour': 3.5.13
'@types/connect-history-api-fallback': 1.5.4
@@ -18500,10 +18458,10 @@ snapshots:
serve-index: 1.9.1
sockjs: 0.3.24
spdy: 4.0.2
- webpack-dev-middleware: 7.4.2(webpack@5.101.2(esbuild@0.25.9))
+ webpack-dev-middleware: 7.4.2(webpack@5.105.0(esbuild@0.25.9))
ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)
optionalDependencies:
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
transitivePeerDependencies:
- bufferutil
- debug
@@ -18518,12 +18476,12 @@ snapshots:
webpack-sources@3.3.3: {}
- webpack-subresource-integrity@5.1.0(webpack@5.101.2(esbuild@0.25.9)):
+ webpack-subresource-integrity@5.1.0(webpack@5.105.0(esbuild@0.25.9)):
dependencies:
typed-assert: 1.0.9
- webpack: 5.101.2(esbuild@0.25.9)
+ webpack: 5.105.0(esbuild@0.25.9)
- webpack@5.101.2(esbuild@0.25.9):
+ webpack@5.105.0(esbuild@0.25.9):
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.8
@@ -18533,10 +18491,10 @@ snapshots:
'@webassemblyjs/wasm-parser': 1.14.1
acorn: 8.15.0
acorn-import-phases: 1.0.4(acorn@8.15.0)
- browserslist: 4.26.3
+ browserslist: 4.28.1
chrome-trace-event: 1.0.4
- enhanced-resolve: 5.18.3
- es-module-lexer: 1.7.0
+ enhanced-resolve: 5.19.0
+ es-module-lexer: 2.0.0
eslint-scope: 5.1.1
events: 3.3.0
glob-to-regexp: 0.4.1
@@ -18547,8 +18505,8 @@ snapshots:
neo-async: 2.6.2
schema-utils: 4.3.3
tapable: 2.3.0
- terser-webpack-plugin: 5.3.14(esbuild@0.25.9)(webpack@5.101.2(esbuild@0.25.9))
- watchpack: 2.4.4
+ terser-webpack-plugin: 5.3.16(esbuild@0.25.9)(webpack@5.105.0(esbuild@0.25.9))
+ watchpack: 2.5.1
webpack-sources: 3.3.3
transitivePeerDependencies:
- '@swc/core'
@@ -18634,6 +18592,10 @@ snapshots:
dependencies:
isexe: 3.1.1
+ which@6.0.0:
+ dependencies:
+ isexe: 3.1.1
+
why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
@@ -18790,7 +18752,7 @@ snapshots:
yoctocolors-cjs@2.1.3: {}
- zod-to-json-schema@3.25.0(zod@4.1.13):
+ zod-to-json-schema@3.25.1(zod@4.1.13):
dependencies:
zod: 4.1.13
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index d1752e85bda6..554da06f4c78 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -23,6 +23,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'
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts
index 19e7dcd28b60..22befac99f9b 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-csp-nonce.ts
@@ -144,6 +144,7 @@ export default async function () {
{
...process.env,
'PORT': String(port),
+ 'NG_ALLOWED_HOSTS': 'localhost',
},
);
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts
index f05d2182bbd2..f21690c47df9 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-ngmodule.ts
@@ -157,6 +157,7 @@ export default async function () {
/Node Express server listening on/,
{
...process.env,
+ 'NG_ALLOWED_HOSTS': 'localhost',
'PORT': String(port),
},
);
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-standalone.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-standalone.ts
index 7c819e67693a..b8df3812f05c 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-standalone.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/express-engine-standalone.ts
@@ -114,6 +114,7 @@ export default async function () {
{
...process.env,
'PORT': String(port),
+ 'NG_ALLOWED_HOSTS': 'localhost',
},
);
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts
index 6d0a45459a16..aa6f7e3426ee 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-base-href.ts
@@ -111,6 +111,7 @@ async function spawnServer(): Promise {
{
...process.env,
'PORT': String(port),
+ 'NG_ALLOWED_HOSTS': 'localhost',
},
);
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts
index 79fc755c4477..7bc323311b4f 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n-sub-path.ts
@@ -146,6 +146,7 @@ async function spawnServer(): Promise {
{
...process.env,
'PORT': String(port),
+ 'NG_ALLOWED_HOSTS': 'localhost',
},
);
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts
index 994d77343d1e..efbff9871bbc 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-i18n.ts
@@ -122,6 +122,7 @@ async function spawnServer(): Promise {
{
...process.env,
'PORT': String(port),
+ 'NG_ALLOWED_HOSTS': 'localhost',
},
);
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts
index 130ade10ba9f..6fdd1998cdd2 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts
@@ -11,7 +11,6 @@ import {
import { updateJsonFile, useSha } from '../../../utils/project';
import { getGlobalVariable } from '../../../utils/env';
import { findFreePort } from '../../../utils/network';
-import { readFile } from 'node:fs/promises';
export default async function () {
assert(
@@ -98,6 +97,8 @@ export default async function () {
const options = buildTarget['options'];
options['ssr']['experimentalPlatform'] = 'neutral';
options['outputMode'] = 'server';
+ options['security'] ??= {};
+ options['security']['allowedHosts'] = ['localhost'];
});
await noSilentNg('build');
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts
index 5205d20eeb0a..ff72cb8e8df2 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server.ts
@@ -206,6 +206,7 @@ async function spawnServer(): Promise {
{
...process.env,
'PORT': String(port),
+ 'NG_ALLOWED_HOSTS': 'localhost',
},
);
diff --git a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts
index f1437392492d..fe316e3cd157 100644
--- a/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts
+++ b/tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-preload-links.ts
@@ -196,6 +196,7 @@ async function spawnServer(): Promise {
{
...process.env,
'PORT': String(port),
+ 'NG_ALLOWED_HOSTS': 'localhost',
},
);