diff --git a/packages/angular/cli/lib/config/workspace-schema.json b/packages/angular/cli/lib/config/workspace-schema.json index 3fede1746559..f73424b5b554 100644 --- a/packages/angular/cli/lib/config/workspace-schema.json +++ b/packages/angular/cli/lib/config/workspace-schema.json @@ -417,8 +417,6 @@ "@angular-devkit/build-angular:karma", "@angular-devkit/build-angular:ng-packagr", "@angular-devkit/build-angular:prerender", - "@angular-devkit/build-angular:jest", - "@angular-devkit/build-angular:web-test-runner", "@angular-devkit/build-angular:server", "@angular-devkit/build-angular:ssr-dev-server" ] @@ -706,50 +704,6 @@ } } }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "builder": { - "const": "@angular-devkit/build-angular:jest" - }, - "defaultConfiguration": { - "type": "string", - "description": "A default named configuration to use when a target configuration is not provided." - }, - "options": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/jest/schema.json" - }, - "configurations": { - "type": "object", - "additionalProperties": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/jest/schema.json" - } - } - } - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "builder": { - "const": "@angular-devkit/build-angular:web-test-runner" - }, - "defaultConfiguration": { - "type": "string", - "description": "A default named configuration to use when a target configuration is not provided." - }, - "options": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/web-test-runner/schema.json" - }, - "configurations": { - "type": "object", - "additionalProperties": { - "$ref": "../../../../angular_devkit/build_angular/src/builders/web-test-runner/schema.json" - } - } - } - }, { "type": "object", "additionalProperties": false, diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel index 6e4fba869d9f..06bfa412c48d 100644 --- a/packages/angular_devkit/build_angular/BUILD.bazel +++ b/packages/angular_devkit/build_angular/BUILD.bazel @@ -39,11 +39,6 @@ ts_json_schema( src = "src/builders/extract-i18n/schema.json", ) -ts_json_schema( - name = "jest_schema", - src = "src/builders/jest/schema.json", -) - ts_json_schema( name = "karma_schema", src = "src/builders/karma/schema.json", @@ -74,11 +69,6 @@ ts_json_schema( src = "src/builders/prerender/schema.json", ) -ts_json_schema( - name = "web_test_runner_schema", - src = "src/builders/web-test-runner/schema.json", -) - copy_to_bin( name = "schemas", srcs = glob(["**/schema.json"]), @@ -88,7 +78,6 @@ RUNTIME_ASSETS = glob( include = [ "src/**/schema.json", "src/**/*.js", - "src/**/*.mjs", "src/**/*.html", ], ) + [ @@ -117,14 +106,12 @@ ts_project( "//packages/angular_devkit/build_angular:src/builders/browser/schema.ts", "//packages/angular_devkit/build_angular:src/builders/dev-server/schema.ts", "//packages/angular_devkit/build_angular:src/builders/extract-i18n/schema.ts", - "//packages/angular_devkit/build_angular:src/builders/jest/schema.ts", "//packages/angular_devkit/build_angular:src/builders/karma/schema.ts", "//packages/angular_devkit/build_angular:src/builders/ng-packagr/schema.ts", "//packages/angular_devkit/build_angular:src/builders/prerender/schema.ts", "//packages/angular_devkit/build_angular:src/builders/protractor/schema.ts", "//packages/angular_devkit/build_angular:src/builders/server/schema.ts", "//packages/angular_devkit/build_angular:src/builders/ssr-dev-server/schema.ts", - "//packages/angular_devkit/build_angular:src/builders/web-test-runner/schema.ts", ], data = RUNTIME_ASSETS, deps = [ @@ -145,7 +132,6 @@ ts_project( ":node_modules/@babel/runtime", ":node_modules/@discoveryjs/json-ext", ":node_modules/@ngtools/webpack", - ":node_modules/@web/test-runner", ":node_modules/ansi-colors", ":node_modules/autoprefixer", ":node_modules/babel-loader", diff --git a/packages/angular_devkit/build_angular/builders.json b/packages/angular_devkit/build_angular/builders.json index aba9dd1ffca6..b2af093bba3c 100644 --- a/packages/angular_devkit/build_angular/builders.json +++ b/packages/angular_devkit/build_angular/builders.json @@ -27,21 +27,11 @@ "schema": "./src/builders/extract-i18n/schema.json", "description": "Extract i18n strings from a browser application." }, - "jest": { - "implementation": "./src/builders/jest", - "schema": "./src/builders/jest/schema.json", - "description": "Run unit tests using Jest." - }, "karma": { "implementation": "./src/builders/karma", "schema": "./src/builders/karma/schema.json", "description": "Run Karma unit tests." }, - "web-test-runner": { - "implementation": "./src/builders/web-test-runner", - "schema": "./src/builders/web-test-runner/schema.json", - "description": "Run unit tests with Web Test Runner." - }, "protractor": { "implementation": "./src/builders/protractor-error", "schema": "./src/builders/protractor/schema.json", diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json index 04423dceffd8..a055ca81b157 100644 --- a/packages/angular_devkit/build_angular/package.json +++ b/packages/angular_devkit/build_angular/package.json @@ -66,7 +66,6 @@ }, "devDependencies": { "@angular/ssr": "workspace:*", - "@web/test-runner": "0.20.2", "browser-sync": "3.0.4", "ng-packagr": "21.2.0-next.0", "undici": "7.22.0" @@ -79,10 +78,7 @@ "@angular/platform-server": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/service-worker": "0.0.0-ANGULAR-FW-PEER-DEP", "@angular/ssr": "^0.0.0-PLACEHOLDER", - "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", - "jest": "^30.2.0", - "jest-environment-jsdom": "^30.2.0", "karma": "^6.3.0", "ng-packagr": "0.0.0-NG-PACKAGR-PEER-DEP", "protractor": "^7.0.0", @@ -108,18 +104,9 @@ "@angular/ssr": { "optional": true }, - "@web/test-runner": { - "optional": true - }, "browser-sync": { "optional": true }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, "karma": { "optional": true }, diff --git a/packages/angular_devkit/build_angular/src/builders/jest/index.ts b/packages/angular_devkit/build_angular/src/builders/jest/index.ts deleted file mode 100644 index 5cd8d6ebdad9..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/index.ts +++ /dev/null @@ -1,216 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { ResultKind, buildApplicationInternal } from '@angular/build/private'; -import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect'; -import { execFile as execFileCb } from 'node:child_process'; -import { randomUUID } from 'node:crypto'; -import * as fs from 'node:fs/promises'; -import * as path from 'node:path'; -import { promisify } from 'node:util'; -import { colors } from '../../utils/color'; -import { findTestFiles } from '../../utils/test-files'; -import { OutputHashing } from '../browser-esbuild/schema'; -import { writeTestFiles } from '../web-test-runner/write-test-files'; -import { normalizeOptions } from './options'; -import { Schema as JestBuilderSchema } from './schema'; - -const execFile = promisify(execFileCb); - -/** Main execution function for the Jest builder. */ -export default createBuilder( - async (schema: JestBuilderSchema, context: BuilderContext): Promise => { - context.logger.warn( - 'NOTE: The Jest builder is currently EXPERIMENTAL and will be removed in version 22.', - ); - - const options = normalizeOptions(schema); - const testOut = path.join(context.workspaceRoot, 'dist/test-out', randomUUID()); // TODO(dgp1130): Hide in temp directory. - - // Verify Jest installation and get the path to it's binary. - // We need to `node_modules/.bin/jest`, but there is no means to resolve that directly. Fortunately Jest's `package.json` exports the - // same file at `bin/jest`, so we can just resolve that instead. - const jest = resolveModule('jest/bin/jest'); - if (!jest) { - return { - success: false, - // TODO(dgp1130): Display a more accurate message for non-NPM users. - error: - 'Jest is not installed, most likely you need to run `npm install jest --save-dev` in your project.', - }; - } - - // Verify that JSDom is installed in the project. - const environment = resolveModule('jest-environment-jsdom'); - if (!environment) { - return { - success: false, - // TODO(dgp1130): Display a more accurate message for non-NPM users. - error: - '`jest-environment-jsdom` is not installed. Install it with `npm install jest-environment-jsdom --save-dev`.', - }; - } - - const [testFiles, customConfig] = await Promise.all([ - findTestFiles(options.include, options.exclude, context.workspaceRoot), - findCustomJestConfig(context.workspaceRoot), - ]); - - // Warn if a custom Jest configuration is found. We won't use it, so if a developer is trying to use a custom config, this hopefully - // makes a better experience than silently ignoring the configuration. - // Ideally, this would be a hard error. However a Jest config could exist for testing other files in the workspace outside of Angular - // CLI, so we likely can't produce a hard error in this situation without an opt-out. - if (customConfig) { - context.logger.warn( - 'A custom Jest config was found, but this is not supported by `@angular-devkit/build-angular:jest` and will be' + - ` ignored: ${customConfig}. This is an experiment to see if completely abstracting away Jest's configuration is viable. Please` + - ` consider if your use case can be met without directly modifying the Jest config. If this is a major obstacle for your use` + - ` case, please post it in this issue so we can collect feedback and evaluate: https://github.com/angular/angular-cli/issues/25434.`, - ); - } - - // Build all the test files. - const jestGlobal = path.join(__dirname, 'jest-global.mjs'); - const initTestBed = path.join(__dirname, 'init-test-bed.mjs'); - const buildResult = await first( - buildApplicationInternal( - { - // Build all the test files and also the `jest-global` and `init-test-bed` scripts. - entryPoints: new Set([...testFiles, jestGlobal, initTestBed]), - tsConfig: options.tsConfig, - polyfills: options.polyfills ?? ['zone.js', 'zone.js/testing'], - outputPath: testOut, - aot: options.aot, - index: false, - outputHashing: OutputHashing.None, - outExtension: 'mjs', // Force native ESM. - optimization: false, - sourceMap: { - scripts: true, - styles: false, - vendor: false, - }, - }, - context, - ), - ); - if (buildResult.kind === ResultKind.Failure) { - return { success: false }; - } else if (buildResult.kind !== ResultKind.Full) { - return { - success: false, - error: 'A full build result is required from the application builder.', - }; - } - - // Write test files - await writeTestFiles(buildResult.files, testOut); - - // Execute Jest on the built output directory. - const jestProc = execFile(process.execPath, [ - '--experimental-vm-modules', - jest, - - `--rootDir=${testOut}`, - `--config=${path.join(__dirname, 'jest.config.mjs')}`, - '--testEnvironment=jsdom', - - // TODO(dgp1130): Enable cache once we have a mechanism for properly clearing / disabling it. - '--no-cache', - - // Run basically all files in the output directory, any excluded files were already dropped by the build. - `--testMatch="/**/*.mjs"`, - - // Load polyfills and initialize the environment before executing each test file. - // IMPORTANT: Order matters here. - // First, we execute `jest-global.mjs` to initialize the `jest` global variable. - // Second, we execute user polyfills, including `zone.js` and `zone.js/testing`. This is dependent on the Jest global so it can patch - // the environment for fake async to work correctly. - // Third, we initialize `TestBed`. This is dependent on fake async being set up correctly beforehand. - `--setupFilesAfterEnv="/jest-global.mjs"`, - ...(options.polyfills?.length ? [`--setupFilesAfterEnv="/polyfills.mjs"`] : []), - `--setupFilesAfterEnv="/init-test-bed.mjs"`, - - // Don't run any infrastructure files as tests, they are manually loaded where needed. - `--testPathIgnorePatterns="/jest-global\\.mjs"`, - ...(options.polyfills ? [`--testPathIgnorePatterns="/polyfills\\.mjs"`] : []), - `--testPathIgnorePatterns="/init-test-bed\\.mjs"`, - - // Skip shared chunks, as they are not entry points to tests. - `--testPathIgnorePatterns="/chunk-.*\\.mjs"`, - - // Optionally enable color. - ...(colors.enabled ? ['--colors'] : []), - ]); - - // Stream test output to the terminal. - jestProc.child.stdout?.on('data', (chunk) => { - context.logger.info(chunk); - }); - jestProc.child.stderr?.on('data', (chunk) => { - // Write to stderr directly instead of `context.logger.error(chunk)` because the logger will overwrite Jest's coloring information. - process.stderr.write(chunk); - }); - - try { - await jestProc; - } catch (error) { - // No need to propagate error message, already piped to terminal output. - // TODO(dgp1130): Handle process spawning failures. - return { success: false }; - } - - return { success: true }; - }, -); - -/** Returns the first item yielded by the given generator and cancels the execution. */ -async function first(generator: AsyncIterable): Promise { - for await (const value of generator) { - return value; - } - - throw new Error('Expected generator to emit at least once.'); -} - -/** Safely resolves the given Node module string. */ -function resolveModule(module: string): string | undefined { - try { - return require.resolve(module); - } catch { - return undefined; - } -} - -/** Returns whether or not the provided directory includes a Jest configuration file. */ -async function findCustomJestConfig(dir: string): Promise { - const entries = await fs.readdir(dir, { withFileTypes: true }); - - // Jest supports many file extensions (`js`, `ts`, `cjs`, `cts`, `json`, etc.) Just look - // for anything with that prefix. - const config = entries.find((entry) => entry.isFile() && entry.name.startsWith('jest.config.')); - if (config) { - return path.join(dir, config.name); - } - - // Jest also supports a `jest` key in `package.json`, look for a config there. - const packageJsonPath = path.join(dir, 'package.json'); - let packageJson: string | undefined; - try { - packageJson = await fs.readFile(packageJsonPath, 'utf8'); - } catch { - return undefined; // No package.json, therefore no Jest configuration in it. - } - - const json = JSON.parse(packageJson) as { jest?: unknown }; - if ('jest' in json) { - return packageJsonPath; - } - - return undefined; -} diff --git a/packages/angular_devkit/build_angular/src/builders/jest/init-test-bed.mjs b/packages/angular_devkit/build_angular/src/builders/jest/init-test-bed.mjs deleted file mode 100644 index 2a9913b70363..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/init-test-bed.mjs +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// TODO(dgp1130): These imports likely don't resolve in stricter package environments like `pnpm`, since they are resolved relative to -// `@angular-devkit/build-angular` rather than the user's workspace. Should look into virtual modules to support those use cases. - -import { NgModule, provideZoneChangeDetection } from '@angular/core'; -import { getTestBed } from '@angular/core/testing'; -import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; - -@NgModule({ - providers: [typeof window.Zone !== 'undefined' ? provideZoneChangeDetection() : []], -}) -class TestModule {} - -getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), { - errorOnUnknownElements: true, - errorOnUnknownProperties: true, -}); diff --git a/packages/angular_devkit/build_angular/src/builders/jest/jest-global.mjs b/packages/angular_devkit/build_angular/src/builders/jest/jest-global.mjs deleted file mode 100644 index 40b8135b4e85..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/jest-global.mjs +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -/** - * @fileoverview Zone.js requires the `jest` global to be initialized in order to know that it must patch the environment to support Jest - * execution. When running ESM code, Jest does _not_ inject the global `jest` symbol, so Zone.js would not normally know it is running - * within Jest as users are supposed to import from `@jest/globals` or use `import.meta.jest`. Zone.js is not currently aware of this, so we - * manually set this global to get Zone.js to run correctly. - * - * TODO(dgp1130): Update Zone.js to directly support Jest ESM executions so we can drop this. - */ - -// eslint-disable-next-line no-undef -globalThis.jest = import.meta.jest; diff --git a/packages/angular_devkit/build_angular/src/builders/jest/jest.config.mjs b/packages/angular_devkit/build_angular/src/builders/jest/jest.config.mjs deleted file mode 100644 index 44b53d8003fc..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/jest.config.mjs +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// Empty config file, everything is specified via CLI options right now. -// This file is used just so Jest doesn't accidentally inherit a custom user-specified Jest config. -export default {}; diff --git a/packages/angular_devkit/build_angular/src/builders/jest/options.ts b/packages/angular_devkit/build_angular/src/builders/jest/options.ts deleted file mode 100644 index d0298c13a74a..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/options.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Schema as JestBuilderSchema } from './schema'; - -/** - * Options supported for the Jest builder. The schema is an approximate - * representation of the options type, but this is a more precise version. - */ -export type JestBuilderOptions = JestBuilderSchema & { - include: string[]; - exclude: string[]; -}; - -/** - * Normalizes input options validated by the schema to a more precise and useful - * options type in {@link JestBuilderOptions}. - */ -export function normalizeOptions(schema: JestBuilderSchema): JestBuilderOptions { - return { - // Options with default values can't actually be null, even if the types say so. - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - include: schema.include!, - exclude: schema.exclude!, - /* eslint-enable @typescript-eslint/no-non-null-assertion */ - - ...schema, - }; -} diff --git a/packages/angular_devkit/build_angular/src/builders/jest/schema.json b/packages/angular_devkit/build_angular/src/builders/jest/schema.json deleted file mode 100644 index 272a1a906597..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/schema.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "title": "Jest browser schema for Build Facade.", - "description": "Jest target options", - "type": "object", - "properties": { - "include": { - "type": "array", - "items": { - "type": "string" - }, - "default": ["**/*.spec.ts"], - "description": "Globs of files to include, relative to project root." - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "description": "Globs of files to exclude, relative to the project root." - }, - "tsConfig": { - "type": "string", - "description": "The name of the TypeScript configuration file." - }, - "polyfills": { - "type": "array", - "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'.", - "items": { - "type": "string", - "uniqueItems": true - }, - "default": [] - }, - "aot": { - "type": "boolean", - "description": "Run tests using Ahead of Time compilation.", - "default": false - } - }, - "additionalProperties": false, - "required": ["tsConfig"] -} diff --git a/packages/angular_devkit/build_angular/src/builders/jest/tests/options.ts b/packages/angular_devkit/build_angular/src/builders/jest/tests/options.ts deleted file mode 100644 index 33e21fbdd7d6..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/jest/tests/options.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { JestBuilderOptions } from '../options'; - -/** Default options to use for most tests. */ -export const BASE_OPTIONS = Object.freeze({ - include: ['**/*.spec.ts'], - exclude: [], - tsConfig: 'tsconfig.spec.json', -}); diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/builder-status-warnings.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/builder-status-warnings.ts deleted file mode 100644 index 9ece57556005..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/builder-status-warnings.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { BuilderContext } from '@angular-devkit/architect'; -import { Schema as WtrBuilderOptions } from './schema'; - -const UNSUPPORTED_OPTIONS: Array = [ - 'main', - 'assets', - 'scripts', - 'styles', - 'inlineStyleLanguage', - 'stylePreprocessorOptions', - 'sourceMap', - 'progress', - 'poll', - 'preserveSymlinks', - 'browsers', - 'codeCoverage', - 'codeCoverageExclude', - 'fileReplacements', - 'webWorkerTsConfig', - 'watch', -]; - -/** Logs a warning for any unsupported options specified. */ -export function logBuilderStatusWarnings(options: WtrBuilderOptions, ctx: BuilderContext) { - // Validate supported options - for (const unsupportedOption of UNSUPPORTED_OPTIONS) { - const value = (options as unknown as WtrBuilderOptions)[unsupportedOption]; - - if (value === undefined || value === false) { - continue; - } - if (Array.isArray(value) && value.length === 0) { - continue; - } - if (typeof value === 'object' && Object.keys(value).length === 0) { - continue; - } - - ctx.logger.warn(`The '${unsupportedOption}' option is not yet supported by this builder.`); - } -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/index.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/index.ts deleted file mode 100644 index d900375221ff..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/index.ts +++ /dev/null @@ -1,206 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Result, ResultKind, buildApplicationInternal } from '@angular/build/private'; -import { BuilderContext, BuilderOutput, createBuilder } from '@angular-devkit/architect'; -import type * as WebTestRunner from '@web/test-runner'; -import { randomUUID } from 'node:crypto'; -import fs from 'node:fs/promises'; -import { createRequire } from 'node:module'; -import path from 'node:path'; -import { findTestFiles } from '../../utils/test-files'; -import { OutputHashing } from '../browser-esbuild/schema'; -import { logBuilderStatusWarnings } from './builder-status-warnings'; -import { WtrBuilderOptions, normalizeOptions } from './options'; -import { Schema } from './schema'; -import { writeTestFiles } from './write-test-files'; - -export default createBuilder( - async (schema: Schema, ctx: BuilderContext): Promise => { - ctx.logger.warn( - 'NOTE: The Web Test Runner builder is currently EXPERIMENTAL and will be removed in version 22.', - ); - - logBuilderStatusWarnings(schema, ctx); - - // Dynamic import `@web/test-runner` from the user's workspace. As an optional peer dep, it may not be installed - // and may not be resolvable from `@angular-devkit/build-angular`. - const require = createRequire(`${ctx.workspaceRoot}/`); - let wtr: typeof WebTestRunner; - try { - wtr = require('@web/test-runner'); - } catch { - return { - success: false, - // TODO(dgp1130): Display a more accurate message for non-NPM users. - error: - 'Web Test Runner is not installed, most likely you need to run `npm install @web/test-runner --save-dev` in your project.', - }; - } - - const options = normalizeOptions(schema); - - const testDir = path.join(ctx.workspaceRoot, 'dist/test-out', randomUUID()); - - // Parallelize startup work. - const [testFiles] = await Promise.all([ - // Glob for files to test. - findTestFiles(options.include, options.exclude, ctx.workspaceRoot), - // Clean build output path. - fs.rm(testDir, { recursive: true, force: true }), - ]); - - // Build the tests and abort on any build failure. - const buildOutput = await buildTests(testFiles, testDir, options, ctx); - if (buildOutput.kind === ResultKind.Failure) { - return { success: false }; - } else if (buildOutput.kind !== ResultKind.Full) { - return { - success: false, - error: 'A full build result is required from the application builder.', - }; - } - - // Write test files - await writeTestFiles(buildOutput.files, testDir); - - // Run the built tests. - return await runTests(wtr, testDir, options); - }, -); - -/** Build all the given test files and write the result to the given output path. */ -async function buildTests( - testFiles: ReadonlySet, - outputPath: string, - options: WtrBuilderOptions, - ctx: BuilderContext, -): Promise { - const entryPoints = new Set([ - ...testFiles, - 'jasmine-core/lib/jasmine-core/jasmine.js', - '@angular-devkit/build-angular/src/builders/web-test-runner/jasmine_runner.js', - ]); - - // Extract `zone.js/testing` to a separate entry point because it needs to be loaded after Jasmine. - const [polyfills, hasZoneTesting] = extractZoneTesting(options.polyfills); - if (hasZoneTesting) { - entryPoints.add('zone.js/testing'); - } - - // Build tests with `application` builder, using test files as entry points. - // Also bundle in Jasmine and the Jasmine runner script, which need to share chunked dependencies. - const buildOutput = await first( - buildApplicationInternal( - { - entryPoints, - tsConfig: options.tsConfig, - outputPath, - aot: options.aot, - index: false, - outputHashing: OutputHashing.None, - optimization: false, - externalDependencies: [ - // Resolved by `@web/test-runner` at runtime with dynamically generated code. - '@web/test-runner-core', - ], - sourceMap: { - scripts: true, - styles: true, - vendor: true, - }, - polyfills, - }, - ctx, - ), - ); - - return buildOutput; -} - -function extractZoneTesting( - polyfills: readonly string[], -): [polyfills: string[], hasZoneTesting: boolean] { - const polyfillsWithoutZoneTesting = polyfills.filter( - (polyfill) => polyfill !== 'zone.js/testing', - ); - const hasZoneTesting = polyfills.length !== polyfillsWithoutZoneTesting.length; - - return [polyfillsWithoutZoneTesting, hasZoneTesting]; -} - -/** Run Web Test Runner on the given directory of bundled JavaScript tests. */ -async function runTests( - wtr: typeof WebTestRunner, - testDir: string, - options: WtrBuilderOptions, -): Promise { - const testPagePath = path.resolve(__dirname, 'test_page.html'); - const testPage = await fs.readFile(testPagePath, 'utf8'); - - const runner = await wtr.startTestRunner({ - config: { - rootDir: testDir, - files: [ - `${testDir}/**/*.js`, - `!${testDir}/polyfills.js`, - `!${testDir}/chunk-*.js`, - `!${testDir}/jasmine.js`, - `!${testDir}/jasmine_runner.js`, - `!${testDir}/testing.js`, // `zone.js/testing` - ], - testFramework: { - config: { - defaultTimeoutInterval: 5_000, - }, - }, - nodeResolve: true, - port: 9876, - watch: options.watch ?? false, - - testRunnerHtml: (_testFramework, _config) => testPage, - }, - readCliArgs: false, - readFileConfig: false, - autoExitProcess: false, - }); - if (!runner) { - throw new Error('Failed to start Web Test Runner.'); - } - - // Wait for the tests to complete and stop the runner. - const passed = (await once(runner, 'finished')) as boolean; - await runner.stop(); - - // No need to return error messages because Web Test Runner already printed them to the console. - return { success: passed }; -} - -/** Returns the first item yielded by the given generator and cancels the execution. */ -async function first(generator: AsyncIterable): Promise { - for await (const value of generator) { - return value; - } - - throw new Error('Expected generator to emit at least once.'); -} - -/** Listens for a single emission of an event and returns the value emitted. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function once, EventKey extends string & keyof Map>( - emitter: WebTestRunner.EventEmitter, - event: EventKey, -): Promise { - return new Promise((resolve) => { - const onEmit = (arg: Map[EventKey]): void => { - emitter.off(event, onEmit); - resolve(arg); - }; - emitter.on(event, onEmit); - }); -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/jasmine_runner.js b/packages/angular_devkit/build_angular/src/builders/web-test-runner/jasmine_runner.js deleted file mode 100644 index 0775ec09b227..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/jasmine_runner.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { NgModule } from '@angular/core'; -import { getTestBed } from '@angular/core/testing'; -import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; -import { - getConfig, - sessionFailed, - sessionFinished, - sessionStarted, -} from '@web/test-runner-core/browser/session.js'; - -/** Executes Angular Jasmine tests in the given environment and reports the results to Web Test Runner. */ -export async function runJasmineTests(jasmineEnv) { - const allSpecs = []; - const failedSpecs = []; - - jasmineEnv.addReporter({ - specDone(result) { - const expectations = [...result.passedExpectations, ...result.failedExpectations]; - allSpecs.push(...expectations.map((e) => ({ name: e.fullName, passed: e.passed }))); - - for (const e of result.failedExpectations) { - const message = `${result.fullName}\n${e.message}\n${e.stack}`; - // eslint-disable-next-line no-console - console.error(message); - failedSpecs.push({ - message, - name: e.fullName, - stack: e.stack, - expected: e.expected, - actual: e.actual, - }); - } - }, - - async jasmineDone(result) { - // eslint-disable-next-line no-console - console.log(`Tests ${result.overallStatus}!`); - await sessionFinished({ - passed: result.overallStatus === 'passed', - errors: failedSpecs, - testResults: { - name: '', - suites: [], - tests: allSpecs, - }, - }); - }, - }); - - await sessionStarted(); - - // Web Test Runner uses a different HTML page for every test, so we only get one `testFile` for the single `*.js` file we need to execute. - const { testFile, testFrameworkConfig } = await getConfig(); - const config = { defaultTimeoutInterval: 60_000, ...(testFrameworkConfig ?? {}) }; - - // eslint-disable-next-line no-undef - jasmine.DEFAULT_TIMEOUT_INTERVAL = config.defaultTimeoutInterval; - - @NgModule({ - providers: [typeof window.Zone !== 'undefined' ? provideZoneChangeDetection() : []], - }) - class TestModule {} - - // Initialize `TestBed` automatically for users. This assumes we already evaluated `zone.js/testing`. - getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), { - errorOnUnknownElements: true, - errorOnUnknownProperties: true, - }); - - // Load the test file and evaluate it. - try { - // eslint-disable-next-line no-undef - await import(new URL(testFile, document.baseURI).href); - - // Execute the test functions. - // eslint-disable-next-line no-undef - jasmineEnv.execute(); - } catch (err) { - // eslint-disable-next-line no-console - console.error(err); - await sessionFailed(err); - } -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/options.ts deleted file mode 100644 index 881ade56d5bf..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { Schema as WtrBuilderSchema } from './schema'; - -/** - * Options supported for the Web Test Runner builder. The schema is an approximate - * representation of the options type, but this is a more precise version. - */ -export type WtrBuilderOptions = Overwrite< - WtrBuilderSchema, - { - include: string[]; - exclude: string[]; - polyfills: string[]; - } ->; - -type Overwrite = Omit & Overrides; - -/** - * Normalizes input options validated by the schema to a more precise and useful - * options type in {@link WtrBuilderOptions}. - */ -export function normalizeOptions(schema: WtrBuilderSchema): WtrBuilderOptions { - return { - ...schema, - - // Options with default values can't actually be null, even if the types say so. - /* eslint-disable @typescript-eslint/no-non-null-assertion */ - include: schema.include!, - exclude: schema.exclude!, - /* eslint-enable @typescript-eslint/no-non-null-assertion */ - - polyfills: typeof schema.polyfills === 'string' ? [schema.polyfills] : schema.polyfills ?? [], - }; -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options_spec.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/options_spec.ts deleted file mode 100644 index d7514fb6d7f4..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/options_spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { normalizeOptions } from './options'; -import { Schema as WtrBuilderSchema } from './schema'; - -describe('options', () => { - describe('normalizeOptions()', () => { - const GOLDEN_SCHEMA: WtrBuilderSchema = { - include: ['**/included/*.ts'], - exclude: ['**/excluded/*.ts'], - tsConfig: './tsconfig.json', - }; - - it('requires include and exclude properties', () => { - const options = normalizeOptions({ - ...GOLDEN_SCHEMA, - include: ['**/*.ts'], - exclude: ['**/*.d.ts'], - }); - - expect(options).toContain({ - include: ['**/*.ts'], - exclude: ['**/*.d.ts'], - }); - - // @ts-expect-error `undefined` should not be in the `include` type. - options.include = undefined; - - // @ts-expect-error `undefined` should not be in the `exclude` type. - options.exclude = undefined; - }); - - it('normalizes polyfills', () => { - const stringPolyfillOptions = normalizeOptions({ - ...GOLDEN_SCHEMA, - polyfills: './polyfills.ts', - }); - - expect(stringPolyfillOptions.polyfills).toEqual(['./polyfills.ts']); - - const arrayPolyfillOptions = normalizeOptions({ - ...GOLDEN_SCHEMA, - polyfills: ['./first.ts', './second.ts'], - }); - - expect(arrayPolyfillOptions.polyfills).toEqual(['./first.ts', './second.ts']); - }); - - it('passes through other options', () => { - const options = normalizeOptions({ - ...GOLDEN_SCHEMA, - assets: ['./path/to/file.txt'], - }); - - expect(options.assets).toEqual(['./path/to/file.txt']); - }); - }); -}); diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/schema.json b/packages/angular_devkit/build_angular/src/builders/web-test-runner/schema.json deleted file mode 100644 index c922e768849b..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/schema.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "title": "Web Test Runner Target", - "description": "Web Test Runner target options for Build Facade.", - "type": "object", - "properties": { - "main": { - "type": "string", - "description": "The name of the main entry-point file." - }, - "tsConfig": { - "type": "string", - "description": "The name of the TypeScript configuration file." - }, - "polyfills": { - "description": "Polyfills to be included in the build.", - "oneOf": [ - { - "type": "array", - "description": "A list of polyfills to include in the build. Can be a full path for a file, relative to the current workspace or module specifier. Example: 'zone.js'.", - "items": { - "type": "string", - "uniqueItems": true - }, - "default": [] - }, - { - "type": "string", - "description": "The full path for the polyfills file, relative to the current workspace or a module specifier. Example: 'zone.js'." - } - ] - }, - "assets": { - "type": "array", - "description": "List of static application assets.", - "default": [], - "items": { - "$ref": "#/definitions/assetPattern" - } - }, - "scripts": { - "description": "Global scripts to be included in the build.", - "type": "array", - "default": [], - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "The file to include.", - "pattern": "\\.[cm]?jsx?$" - }, - "bundleName": { - "type": "string", - "pattern": "^[\\w\\-.]*$", - "description": "The bundle name for this extra entry point." - }, - "inject": { - "type": "boolean", - "description": "If the bundle will be referenced in the HTML file.", - "default": true - } - }, - "additionalProperties": false, - "required": ["input"] - }, - { - "type": "string", - "description": "The file to include.", - "pattern": "\\.[cm]?jsx?$" - } - ] - } - }, - "styles": { - "description": "Global styles to be included in the build.", - "type": "array", - "default": [], - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "input": { - "type": "string", - "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less)$" - }, - "bundleName": { - "type": "string", - "pattern": "^[\\w\\-.]*$", - "description": "The bundle name for this extra entry point." - }, - "inject": { - "type": "boolean", - "description": "If the bundle will be referenced in the HTML file.", - "default": true - } - }, - "additionalProperties": false, - "required": ["input"] - }, - { - "type": "string", - "description": "The file to include.", - "pattern": "\\.(?:css|scss|sass|less)$" - } - ] - } - }, - "inlineStyleLanguage": { - "description": "The stylesheet language to use for the application's inline component styles.", - "type": "string", - "default": "css", - "enum": ["css", "less", "sass", "scss"] - }, - "stylePreprocessorOptions": { - "description": "Options to pass to style preprocessors", - "type": "object", - "properties": { - "includePaths": { - "description": "Paths to include. Paths will be resolved to workspace root.", - "type": "array", - "items": { - "type": "string" - }, - "default": [] - } - }, - "additionalProperties": false - }, - "include": { - "type": "array", - "items": { - "type": "string" - }, - "default": ["**/*.spec.ts"], - "description": "Globs of files to include, relative to project root. \nThere are 2 special cases:\n - when a path to directory is provided, all spec files ending \".spec.@(ts|tsx)\" will be included\n - when a path to a file is provided, and a matching spec file exists it will be included instead." - }, - "exclude": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "description": "Globs of files to exclude, relative to the project root." - }, - "sourceMap": { - "description": "Output source maps for scripts and styles. For more information, see https://angular.dev/reference/configs/workspace-config#source-map-configuration.", - "default": true, - "oneOf": [ - { - "type": "object", - "properties": { - "scripts": { - "type": "boolean", - "description": "Output source maps for all scripts.", - "default": true - }, - "styles": { - "type": "boolean", - "description": "Output source maps for all styles.", - "default": true - }, - "vendor": { - "type": "boolean", - "description": "Resolve vendor packages source maps.", - "default": false - } - }, - "additionalProperties": false - }, - { - "type": "boolean" - } - ] - }, - "progress": { - "type": "boolean", - "description": "Log progress to the console while building.", - "default": true - }, - "watch": { - "type": "boolean", - "description": "Run build when files change." - }, - "poll": { - "type": "number", - "description": "Enable and define the file watching poll time period in milliseconds." - }, - "preserveSymlinks": { - "type": "boolean", - "description": "Do not use the real path when resolving modules. If unset then will default to `true` if NodeJS option --preserve-symlinks is set." - }, - "browsers": { - "type": "string", - "description": "Override which browsers tests are run against." - }, - "codeCoverage": { - "type": "boolean", - "description": "Output a code coverage report.", - "default": false - }, - "codeCoverageExclude": { - "type": "array", - "description": "Globs to exclude from code coverage.", - "items": { - "type": "string" - }, - "default": [] - }, - "fileReplacements": { - "description": "Replace compilation source files with other compilation source files in the build.", - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "src": { - "type": "string" - }, - "replaceWith": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["src", "replaceWith"] - }, - { - "type": "object", - "properties": { - "replace": { - "type": "string" - }, - "with": { - "type": "string" - } - }, - "additionalProperties": false, - "required": ["replace", "with"] - } - ] - }, - "default": [] - }, - "webWorkerTsConfig": { - "type": "string", - "description": "TypeScript configuration for Web Worker modules." - }, - "aot": { - "type": "boolean", - "description": "Run tests using Ahead of Time compilation.", - "default": false - } - }, - "additionalProperties": false, - "required": ["tsConfig"], - "definitions": { - "assetPattern": { - "oneOf": [ - { - "type": "object", - "properties": { - "glob": { - "type": "string", - "description": "The pattern to match." - }, - "input": { - "type": "string", - "description": "The input directory path in which to apply 'glob'. Defaults to the project root." - }, - "output": { - "type": "string", - "default": "", - "description": "Absolute path within the output." - }, - "ignore": { - "description": "An array of globs to ignore.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "additionalProperties": false, - "required": ["glob", "input"] - }, - { - "type": "string" - } - ] - } - } -} diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/test_page.html b/packages/angular_devkit/build_angular/src/builders/web-test-runner/test_page.html deleted file mode 100644 index 9cff64dccccc..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/test_page.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Unit tests - - - - - diff --git a/packages/angular_devkit/build_angular/src/builders/web-test-runner/write-test-files.ts b/packages/angular_devkit/build_angular/src/builders/web-test-runner/write-test-files.ts deleted file mode 100644 index 268be97f0fe0..000000000000 --- a/packages/angular_devkit/build_angular/src/builders/web-test-runner/write-test-files.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { BuildOutputFileType } from '@angular/build'; -import { ResultFile, emitFilesToDisk } from '@angular/build/private'; -import fs from 'node:fs/promises'; -import path from 'node:path'; - -export async function writeTestFiles(files: Record, testDir: string) { - const directoryExists = new Set(); - // Writes the test related output files to disk and ensures the containing directories are present - await emitFilesToDisk(Object.entries(files), async ([filePath, file]) => { - if (file.type !== BuildOutputFileType.Browser && file.type !== BuildOutputFileType.Media) { - return; - } - - const fullFilePath = path.join(testDir, filePath); - - // Ensure output subdirectories exist - const fileBasePath = path.dirname(fullFilePath); - if (fileBasePath && !directoryExists.has(fileBasePath)) { - await fs.mkdir(fileBasePath, { recursive: true }); - directoryExists.add(fileBasePath); - } - - if (file.origin === 'memory') { - // Write file contents - await fs.writeFile(fullFilePath, file.contents); - } else { - // Copy file contents - await fs.copyFile(file.inputPath, fullFilePath, fs.constants.COPYFILE_FICLONE); - } - }); -} diff --git a/packages/angular_devkit/build_angular/src/utils/test-files.ts b/packages/angular_devkit/build_angular/src/utils/test-files.ts deleted file mode 100644 index 1276f0347f4b..000000000000 --- a/packages/angular_devkit/build_angular/src/utils/test-files.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import { GlobOptions, glob as globFn } from 'tinyglobby'; - -/** - * Finds all test files in the project. - * - * @param options The builder options describing where to find tests. - * @param workspaceRoot The path to the root directory of the workspace. - * @param glob A promisified implementation of the `glob` module. Only intended for - * testing purposes. - * @returns A set of all test files in the project. - */ -export async function findTestFiles( - include: string[], - exclude: string[], - workspaceRoot: string, - glob: typeof globFn = globFn, -): Promise> { - const globOptions: GlobOptions = { - cwd: workspaceRoot, - ignore: ['node_modules/**'].concat(exclude), - braceExpansion: false, // Do not expand `a{b,c}` to `ab,ac`. - extglob: false, // Disable "extglob" patterns. - }; - - const included = await Promise.all(include.map((pattern) => glob(pattern, globOptions))); - - // Flatten and deduplicate any files found in multiple include patterns. - return new Set(included.flat()); -} diff --git a/packages/angular_devkit/build_angular/src/utils/test-files_spec.ts b/packages/angular_devkit/build_angular/src/utils/test-files_spec.ts deleted file mode 100644 index 9902aa47142a..000000000000 --- a/packages/angular_devkit/build_angular/src/utils/test-files_spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// eslint-disable-next-line import/no-extraneous-dependencies -import { promises as fs } from 'node:fs'; -import * as path from 'node:path'; -import { glob as realGlob } from 'tinyglobby'; -import { findTestFiles } from './test-files'; - -describe('test-files', () => { - describe('findTestFiles()', () => { - let tempDir!: string; - - beforeEach(async () => { - tempDir = await fs.mkdtemp('angular-cli-jest-builder-test-files-'); - }); - - afterEach(async () => { - await fs.rm(tempDir, { recursive: true }); - }); - - it('returns all the test files in the project', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.mkdir(path.join(tempDir, 'nested')); - await fs.writeFile(path.join(tempDir, 'nested', 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set(['foo.spec.ts', path.join('nested', 'bar.spec.ts')])); - }); - - it('excludes `node_modules/` and files from input options', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.ignored.spec.ts'), ''); - await fs.mkdir(path.join(tempDir, 'node_modules', 'dep'), { recursive: true }); - await fs.writeFile(path.join(tempDir, 'node_modules', 'dep', 'baz.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - ['**/*.ignored.spec.ts'] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set(['foo.spec.ts'])); - }); - - it('finds files in multiple globs', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.test.ts'), ''); - await fs.writeFile(path.join(tempDir, 'foo.ignored.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.ignored.test.ts'), ''); - - await fs.mkdir(path.join(tempDir, 'node_modules', 'dep'), { recursive: true }); - await fs.writeFile(path.join(tempDir, 'node_modules', 'dep', 'baz.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'node_modules', 'dep', 'baz.test.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts', '**/*.test.ts'] /* include */, - // Exclude should be applied to all `glob()` executions. - ['**/*.ignored.*.ts'] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set(['foo.spec.ts', 'bar.test.ts'])); - }); - - it('is constrained to the workspace root', async () => { - await fs.mkdir(path.join(tempDir, 'nested')); - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'nested', 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - [] /* exclude */, - path.join(tempDir, 'nested'), - ); - - expect(testFiles).toEqual(new Set(['bar.spec.ts'])); - }); - - it('throws if any `glob` invocation fails', async () => { - const err = new Error('Eww, I stepped in a glob.'); - const glob = jasmine - .createSpy('glob', realGlob) - .and.returnValues( - Promise.resolve(['foo.spec.ts']), - Promise.reject(err), - Promise.resolve(['bar.test.ts']), - ); - - await expectAsync( - findTestFiles( - ['*.spec.ts', '*.stuff.ts', '*.test.ts'] /* include */, - [] /* exclude */, - tempDir, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - glob as any, - ), - ).toBeRejectedWith(err); - }); - - it('disables brace expansion', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['{foo,bar}.spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set()); - }); - - it('disables `extglob` features', async () => { - await fs.writeFile(path.join(tempDir, 'foo.spec.ts'), ''); - await fs.writeFile(path.join(tempDir, 'bar.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['+(foo|bar).spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set()); - }); - - it('ignores directories', async () => { - await fs.mkdir(path.join(tempDir, 'foo.spec.ts')); - await fs.mkdir(path.join(tempDir, 'bar.spec.ts')); - await fs.writeFile(path.join(tempDir, 'bar.spec.ts', 'baz.spec.ts'), ''); - - const testFiles = await findTestFiles( - ['**/*.spec.ts'] /* include */, - [] /* exclude */, - tempDir, - ); - - expect(testFiles).toEqual(new Set([path.join('bar.spec.ts', 'baz.spec.ts')])); - }); - }); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cdedec51bfbf..d169e2c12cb7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -725,9 +725,6 @@ importers: '@angular/ssr': specifier: workspace:* version: link:../../angular/ssr - '@web/test-runner': - specifier: 0.20.2 - version: 0.20.2(bufferutil@4.1.0) browser-sync: specifier: 3.0.4 version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) @@ -2143,9 +2140,6 @@ packages: engines: {node: '>=6'} hasBin: true - '@hapi/bourne@3.0.0': - resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} - '@harperfast/extended-iterable@1.0.3': resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} @@ -3017,11 +3011,6 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@puppeteer/browsers@2.12.1': - resolution: {integrity: sha512-fXa6uXLxfslBlus3MEpW8S6S9fe5RwmAE5Gd8u3krqOwnkZJV3/lQJiY3LaFdTctLLqJtyMgEUGkbDnRNf6vbQ==} - engines: {node: '>=18'} - hasBin: true - '@rolldown/binding-android-arm64@1.0.0-rc.5': resolution: {integrity: sha512-zCEmUrt1bggwgBgeKLxNj217J1OrChrp3jJt24VK9jAharSTeVaHODNL+LpcQVhRz+FktYWfT9cjo5oZ99ZLpg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3133,15 +3122,6 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.1': - resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-node-resolve@16.0.3': resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} engines: {node: '>=14.0.0'} @@ -3368,9 +3348,6 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tsconfig/node10@1.0.12': resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} @@ -3394,12 +3371,6 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@types/accepts@1.3.7': - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - - '@types/babel__code-frame@7.27.0': - resolution: {integrity: sha512-Dwlo+LrxDx/0SpfmJ/BKveHf7QXWvLBLc+x03l5sbzykj3oB9nHygCpSECF1a+s+QIxbghe+KHqC90vGtxLRAA==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3430,33 +3401,15 @@ packages: '@types/cli-progress@3.11.6': resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==} - '@types/co-body@6.1.3': - resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} - - '@types/command-line-args@5.2.3': - resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} - '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/content-disposition@0.5.9': - resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} - - '@types/convert-source-map@2.0.3': - resolution: {integrity: sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==} - - '@types/cookies@0.9.2': - resolution: {integrity: sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==} - '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/debounce@1.2.4': - resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -3502,9 +3455,6 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/http-assert@1.5.6': - resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} - '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -3514,15 +3464,6 @@ packages: '@types/ini@4.1.1': resolution: {integrity: sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==} - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jasmine-reporters@2.5.3': resolution: {integrity: sha512-8aojAUdgdiD9VQbllBJb/9gny3lOjz9T5gyMcbYlKe6npwGVsarbr8v2JYSFJSZSuFYXcPVzFG2lLX3ib0j/DA==} @@ -3541,15 +3482,6 @@ packages: '@types/karma@6.3.9': resolution: {integrity: sha512-sjE/MHnoAZAQYAKRXAbjTOiBKyGGErEM725bruRcmDdMa2vp1bjWPhApI7/i564PTyHlzc3vIGXLL6TFIpAxFg==} - '@types/keygrip@1.0.6': - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} - - '@types/koa-compose@3.2.9': - resolution: {integrity: sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==} - - '@types/koa@2.15.0': - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} - '@types/less@3.0.8': resolution: {integrity: sha512-Gjm4+H9noDJgu5EdT3rUw5MhPBag46fiOy27BefvWkNL8mlZnKnCaVVVTLKj6RYXed9b62CPKnPav9govyQDzA==} @@ -3589,9 +3521,6 @@ packages: '@types/parse-glob@3.0.32': resolution: {integrity: sha512-n4xmml2WKR12XeQprN8L/sfiVPa8FHS3k+fxp4kSr/PA2GsGUgFND+bvISJxM0y5QdvzNEGjEVU3eIrcKks/pA==} - '@types/parse5@6.0.3': - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - '@types/picomatch@4.0.2': resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==} @@ -3661,9 +3590,6 @@ packages: '@types/which@3.0.4': resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -3865,56 +3791,6 @@ packages: '@vitest/utils@4.0.18': resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} - '@web/browser-logs@0.4.1': - resolution: {integrity: sha512-ypmMG+72ERm+LvP+loj9A64MTXvWMXHUOu773cPO4L1SV/VWg6xA9Pv7vkvkXQX+ItJtCJt+KQ+U6ui2HhSFUw==} - engines: {node: '>=18.0.0'} - - '@web/config-loader@0.3.3': - resolution: {integrity: sha512-ilzeQzrPpPLWZhzFCV+4doxKDGm7oKVfdKpW9wiUNVgive34NSzCw+WzXTvjE4Jgr5CkyTDIObEmMrqQEjhT0g==} - engines: {node: '>=18.0.0'} - - '@web/dev-server-core@0.7.5': - resolution: {integrity: sha512-Da65zsiN6iZPMRuj4Oa6YPwvsmZmo5gtPWhW2lx3GTUf5CAEapjVpZVlUXnKPL7M7zRuk72jSsIl8lo+XpTCtw==} - engines: {node: '>=18.0.0'} - - '@web/dev-server-rollup@0.6.4': - resolution: {integrity: sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==} - engines: {node: '>=18.0.0'} - - '@web/dev-server@0.4.6': - resolution: {integrity: sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==} - engines: {node: '>=18.0.0'} - hasBin: true - - '@web/parse5-utils@2.1.1': - resolution: {integrity: sha512-7rBVZEMGfrq2iPcAEwJ0KSNSvmA2a6jT2CK8/gyIOHgn4reg7bSSRbzyWIEYWyIkeRoYEukX/aW+nAeCgSSqhQ==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-chrome@0.18.1': - resolution: {integrity: sha512-eO6ctCaqSguGM6G3cFobGHnrEs9wlv9Juj/Akyr4XLjeEMTheNULdvOXw9Bygi+QC/ir/0snMmt+/YKnfy8rYA==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-commands@0.9.0': - resolution: {integrity: sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-core@0.13.4': - resolution: {integrity: sha512-84E1025aUSjvZU1j17eCTwV7m5Zg3cZHErV3+CaJM9JPCesZwLraIa0ONIQ9w4KLgcDgJFw9UnJ0LbFf42h6tg==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-coverage-v8@0.8.0': - resolution: {integrity: sha512-PskiucYpjUtgNfR2zF2AWqWwjXL7H3WW/SnCAYmzUrtob7X9o/+BjdyZ4wKbOxWWSbJO4lEdGIDLu+8X2Xw+lA==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-mocha@0.9.0': - resolution: {integrity: sha512-ZL9F6FXd0DBQvo/h/+mSfzFTSRVxzV9st/AHhpgABtUtV/AIpVE9to6+xdkpu6827kwjezdpuadPfg+PlrBWqQ==} - engines: {node: '>=18.0.0'} - - '@web/test-runner@0.20.2': - resolution: {integrity: sha512-zfEGYEDnS0EI8qgoWFjmtkIXhqP15W40NW3dCaKtbxj5eU0a7E53f3GV/tZGD0GlZKF8d4Fyw+AFrwOJU9Z4GA==} - engines: {node: '>=18.0.0'} - hasBin: true - '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -4074,10 +3950,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -4125,14 +3997,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - - array-back@6.2.2: - resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} - engines: {node: '>=12.17'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -4152,10 +4016,6 @@ packages: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array-union@3.0.1: resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} engines: {node: '>=12'} @@ -4203,17 +4063,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.11: resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - async-each-series@0.1.1: resolution: {integrity: sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==} engines: {node: '>=0.8.0'} @@ -4302,36 +4154,6 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.4: - resolution: {integrity: sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.7.0: - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4343,10 +4165,6 @@ packages: resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true - basic-ftp@5.1.0: - resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} - engines: {node: '>=10.0.0'} - batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -4479,10 +4297,6 @@ packages: 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==} - engines: {node: '>= 6.0.0'} - cacheable-lookup@6.1.0: resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} engines: {node: '>=10.6.0'} @@ -4511,10 +4325,6 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - caniuse-lite@1.0.30001770: resolution: {integrity: sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==} @@ -4525,10 +4335,6 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} - chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -4566,24 +4372,10 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - chrome-launcher@0.15.2: - resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} - engines: {node: '>=12.13.0'} - hasBin: true - chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - chromium-bidi@14.0.0: - resolution: {integrity: sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==} - peerDependencies: - devtools-protocol: '*' - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -4628,18 +4420,6 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - co-body@6.2.0: - resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} - engines: {node: '>=8.0.0'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - collection-utils@1.0.1: resolution: {integrity: sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==} @@ -4661,14 +4441,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} - - command-line-usage@7.0.3: - resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==} - engines: {node: '>=12.20.0'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -4751,10 +4523,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} - copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} @@ -4846,10 +4614,6 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - data-urls@7.0.0: resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -4873,9 +4637,6 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4939,9 +4700,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -4957,10 +4715,6 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} - default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -4969,10 +4723,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -4984,10 +4734,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - del@2.2.2: resolution: {integrity: sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==} engines: {node: '>=0.10.0'} @@ -4996,9 +4742,6 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} @@ -5007,10 +4750,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dependency-graph@0.11.0: - resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} - engines: {node: '>= 0.6.0'} - dependency-graph@1.0.0: resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} engines: {node: '>=4'} @@ -5034,9 +4773,6 @@ packages: devtools-protocol@0.0.1045489: resolution: {integrity: sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ==} - devtools-protocol@0.0.1566079: - resolution: {integrity: sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==} - di@0.0.1: resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} @@ -5044,14 +4780,6 @@ packages: resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} - diff@5.2.2: - resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} @@ -5195,9 +4923,6 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - errorstacks@2.4.1: - resolution: {integrity: sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==} - es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -5263,11 +4988,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -5350,11 +5070,6 @@ packages: resolution: {integrity: sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -5413,10 +5128,6 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -5542,10 +5253,6 @@ packages: resolution: {integrity: sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==} engines: {node: '>=20'} - find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} @@ -5710,10 +5417,6 @@ packages: get-tsconfig@4.13.6: resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} - getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} @@ -5764,10 +5467,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globby@5.0.0: resolution: {integrity: sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==} engines: {node: '>=0.10.0'} @@ -5891,20 +5590,12 @@ packages: htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} - http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} @@ -5972,10 +5663,6 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -6044,17 +5731,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflation@2.1.0: - resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} - engines: {node: '>= 0.8.0'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -6068,10 +5748,6 @@ packages: injection-js@2.6.1: resolution: {integrity: sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==} - internal-ip@6.2.0: - resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} - engines: {node: '>=10'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -6084,10 +5760,6 @@ packages: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} - ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -6138,11 +5810,6 @@ packages: is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6189,10 +5856,6 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-ip@3.1.0: - resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} - engines: {node: '>=8'} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -6273,10 +5936,6 @@ packages: is-stream-ended@0.1.4: resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -6318,10 +5977,6 @@ packages: resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -6340,10 +5995,6 @@ packages: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} - isbinaryfile@5.0.7: - resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} - engines: {node: '>= 18.0.0'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -6571,10 +6222,6 @@ packages: engines: {node: '>= 10'} hasBin: true - keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -6582,28 +6229,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - - koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} - - koa-etag@4.0.0: - resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} - - koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} - - koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} - - koa@2.16.3: - resolution: {integrity: sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} - launch-editor@2.12.0: resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} @@ -6640,9 +6265,6 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - limiter@1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} @@ -6723,10 +6345,6 @@ packages: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} - log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - log-update@7.1.0: resolution: {integrity: sha512-y9pi/ZOQQVvTgfRDEHV1Cj4zQUkJZPipEUNOxhn1R6KgmdMs7LKvXWCd9eMVPGJgvYzFLCenecWr0Ps8ChVv2A==} engines: {node: '>=20'} @@ -6760,10 +6378,6 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -6785,9 +6399,6 @@ packages: resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==} engines: {node: ^20.17.0 || >=22.9.0} - marky@1.3.0: - resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -6865,10 +6476,6 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -6951,9 +6558,6 @@ packages: mitt@1.2.0: resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -6998,9 +6602,6 @@ packages: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} - nanocolors@0.2.13: - resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7029,10 +6630,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - ng-packagr@21.2.0-next.0: resolution: {integrity: sha512-BkRAqx1ZljIYpBbjDi/+3y8AMo9S19vm8zx3YWpqMAaIpDb7cvsT+Une9b4oyEK/7p+XvWw+LaPVleTAQtQEMQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -7143,10 +6740,6 @@ packages: resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} engines: {node: ^20.17.0 || >=22.9.0} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -7210,17 +6803,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} @@ -7229,10 +6815,6 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - opn@5.3.0: resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==} engines: {node: '>=4'} @@ -7263,10 +6845,6 @@ packages: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} - p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} - p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -7311,14 +6889,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -7351,9 +6921,6 @@ packages: parse5-sax-parser@8.0.0: resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} @@ -7393,10 +6960,6 @@ packages: path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -7476,10 +7039,6 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - portfinder@1.0.38: - resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} - engines: {node: '>= 10.12'} - portscanner@2.2.0: resolution: {integrity: sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==} engines: {node: '>=0.4', npm: '>=1.0.0'} @@ -7605,10 +7164,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -7638,10 +7193,6 @@ packages: resolution: {integrity: sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==} engines: {node: '>=14.1.0'} - puppeteer-core@24.37.3: - resolution: {integrity: sha512-fokQ8gv+hNgsRWqVuP5rUjGp+wzV5aMTP3fcm8ekNabmLGlJdFHas1OdMscAH9Gzq4Qcf7cfI/Pe6wEcAqQhqg==} - engines: {node: '>=18'} - puppeteer@18.2.1: resolution: {integrity: sha512-7+UhmYa7wxPh2oMRwA++k8UGVDxh3YdWFB52r9C3tM81T6BU7cuusUSxImz0GEYSOYUKk/YzIhkQ6+vc0gHbxQ==} engines: {node: '>=14.1.0'} @@ -7799,10 +7350,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -7822,10 +7369,6 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -8055,9 +7598,6 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -8107,14 +7647,6 @@ packages: resolution: {integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==} engines: {node: ^20.17.0 || >=22.9.0} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - slice-ansi@7.1.2: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} @@ -8335,10 +7867,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -8369,10 +7897,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - table-layout@4.1.1: - resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} - engines: {node: '>=12.17'} - tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -8380,9 +7904,6 @@ packages: tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -8510,10 +8031,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} - tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -8557,10 +8074,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} @@ -8591,10 +8104,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -8625,22 +8134,11 @@ packages: typed-graphqlify@3.1.6: resolution: {integrity: sha512-Snlg1ZrokbkQuemOb4xjWWCJrNcOMeb2Ii0/BwMfwLCcJVNjygyqhrFkrYNvi4gDrwWFrGE0TvxxM+Slym2JMg==} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - - typical@7.3.0: - resolution: {integrity: sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==} - engines: {node: '>=12.17'} - ua-parser-js@0.7.41: resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} hasBin: true @@ -8757,10 +8255,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -8896,9 +8390,6 @@ packages: web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} - webdriver-bidi-protocol@0.4.1: - resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} - webdriver-js-extender@2.1.0: resolution: {integrity: sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==} engines: {node: '>=6.9.x'} @@ -8911,10 +8402,6 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -8981,10 +8468,6 @@ packages: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} - whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} - whatwg-url@16.0.0: resolution: {integrity: sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -9040,10 +8523,6 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wordwrapjs@5.1.1: - resolution: {integrity: sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==} - engines: {node: '>=12.17'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -9063,18 +8542,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -9203,10 +8670,6 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} - yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -9224,9 +8687,6 @@ packages: peerDependencies: zod: ^3.25 || ^4 - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -10836,8 +10296,6 @@ snapshots: protobufjs: 7.5.4 yargs: 17.7.2 - '@hapi/bourne@3.0.0': {} - '@harperfast/extended-iterable@1.0.3': optional: true @@ -11717,21 +11175,6 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@puppeteer/browsers@2.12.1': - dependencies: - debug: 4.4.3(supports-color@10.2.2) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.7.4 - tar-fs: 3.1.1 - yargs: 17.7.2 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.5': optional: true @@ -11797,16 +11240,6 @@ snapshots: optionalDependencies: rollup: 4.57.1 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.57.1)': - dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.57.1) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.11 - optionalDependencies: - rollup: 4.57.1 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.57.1)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.57.1) @@ -11974,8 +11407,6 @@ snapshots: '@tootallnate/once@2.0.0': {} - '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -11996,12 +11427,6 @@ snapshots: tslib: 2.8.1 optional: true - '@types/accepts@1.3.7': - dependencies: - '@types/node': 22.19.11 - - '@types/babel__code-frame@7.27.0': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 @@ -12050,13 +11475,6 @@ snapshots: dependencies: '@types/node': 22.19.11 - '@types/co-body@6.1.3': - dependencies: - '@types/node': 22.19.11 - '@types/qs': 6.14.0 - - '@types/command-line-args@5.2.3': {} - '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 @@ -12066,23 +11484,10 @@ snapshots: dependencies: '@types/node': 22.19.11 - '@types/content-disposition@0.5.9': {} - - '@types/convert-source-map@2.0.3': {} - - '@types/cookies@0.9.2': - dependencies: - '@types/connect': 3.4.38 - '@types/express': 5.0.6 - '@types/keygrip': 1.0.6 - '@types/node': 22.19.11 - '@types/cors@2.8.19': dependencies: '@types/node': 22.19.11 - '@types/debounce@1.2.4': {} - '@types/deep-eql@4.0.2': {} '@types/duplexify@3.6.5': @@ -12144,8 +11549,6 @@ snapshots: dependencies: '@types/node': 22.19.11 - '@types/http-assert@1.5.6': {} - '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': @@ -12154,16 +11557,6 @@ snapshots: '@types/ini@4.1.1': {} - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - '@types/jasmine-reporters@2.5.3': dependencies: '@types/jasmine': 5.1.15 @@ -12183,23 +11576,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@types/keygrip@1.0.6': {} - - '@types/koa-compose@3.2.9': - dependencies: - '@types/koa': 2.15.0 - - '@types/koa@2.15.0': - dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.9 - '@types/cookies': 0.9.2 - '@types/http-assert': 1.5.6 - '@types/http-errors': 2.0.5 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.9 - '@types/node': 22.19.11 - '@types/less@3.0.8': {} '@types/loader-utils@3.0.0(esbuild@0.27.3)': @@ -12256,8 +11632,6 @@ snapshots: '@types/parse-glob@3.0.32': {} - '@types/parse5@6.0.3': {} - '@types/picomatch@4.0.2': {} '@types/progress@2.0.7': @@ -12334,10 +11708,6 @@ snapshots: '@types/which@3.0.4': {} - '@types/ws@7.4.7': - dependencies: - '@types/node': 22.19.11 - '@types/ws@8.18.1': dependencies: '@types/node': 22.19.11 @@ -12662,178 +12032,6 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - '@web/browser-logs@0.4.1': - dependencies: - errorstacks: 2.4.1 - - '@web/config-loader@0.3.3': {} - - '@web/dev-server-core@0.7.5(bufferutil@4.1.0)': - dependencies: - '@types/koa': 2.15.0 - '@types/ws': 7.4.7 - '@web/parse5-utils': 2.1.1 - chokidar: 4.0.3 - clone: 2.1.2 - es-module-lexer: 1.7.0 - get-stream: 6.0.1 - is-stream: 2.0.1 - isbinaryfile: 5.0.7 - koa: 2.16.3 - koa-etag: 4.0.0 - koa-send: 5.0.1 - koa-static: 5.0.0 - lru-cache: 8.0.5 - mime-types: 2.1.35 - parse5: 6.0.1 - picomatch: 2.3.1 - ws: 7.5.10(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/dev-server-rollup@0.6.4(bufferutil@4.1.0)': - dependencies: - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.57.1) - '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) - nanocolors: 0.2.13 - parse5: 6.0.1 - rollup: 4.57.1 - whatwg-url: 14.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/dev-server@0.4.6(bufferutil@4.1.0)': - dependencies: - '@babel/code-frame': 7.29.0 - '@types/command-line-args': 5.2.3 - '@web/config-loader': 0.3.3 - '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) - '@web/dev-server-rollup': 0.6.4(bufferutil@4.1.0) - camelcase: 6.3.0 - command-line-args: 5.2.1 - command-line-usage: 7.0.3 - debounce: 1.2.1 - deepmerge: 4.3.1 - internal-ip: 6.2.0 - nanocolors: 0.2.13 - open: 8.4.2 - portfinder: 1.0.38 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/parse5-utils@2.1.1': - dependencies: - '@types/parse5': 6.0.3 - parse5: 6.0.1 - - '@web/test-runner-chrome@0.18.1(bufferutil@4.1.0)': - dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - '@web/test-runner-coverage-v8': 0.8.0(bufferutil@4.1.0) - chrome-launcher: 0.15.2 - puppeteer-core: 24.37.3(bufferutil@4.1.0) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - - '@web/test-runner-commands@0.9.0(bufferutil@4.1.0)': - dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - mkdirp: 1.0.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/test-runner-core@0.13.4(bufferutil@4.1.0)': - dependencies: - '@babel/code-frame': 7.29.0 - '@types/babel__code-frame': 7.27.0 - '@types/co-body': 6.1.3 - '@types/convert-source-map': 2.0.3 - '@types/debounce': 1.2.4 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@web/browser-logs': 0.4.1 - '@web/dev-server-core': 0.7.5(bufferutil@4.1.0) - chokidar: 4.0.3 - cli-cursor: 3.1.0 - co-body: 6.2.0 - convert-source-map: 2.0.0 - debounce: 1.2.1 - dependency-graph: 0.11.0 - globby: 11.1.0 - internal-ip: 6.2.0 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - log-update: 4.0.0 - nanocolors: 0.2.13 - nanoid: 3.3.11 - open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.6 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/test-runner-coverage-v8@0.8.0(bufferutil@4.1.0)': - dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - istanbul-lib-coverage: 3.2.2 - lru-cache: 8.0.5 - picomatch: 2.3.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/test-runner-mocha@0.9.0(bufferutil@4.1.0)': - dependencies: - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@web/test-runner@0.20.2(bufferutil@4.1.0)': - dependencies: - '@web/browser-logs': 0.4.1 - '@web/config-loader': 0.3.3 - '@web/dev-server': 0.4.6(bufferutil@4.1.0) - '@web/test-runner-chrome': 0.18.1(bufferutil@4.1.0) - '@web/test-runner-commands': 0.9.0(bufferutil@4.1.0) - '@web/test-runner-core': 0.13.4(bufferutil@4.1.0) - '@web/test-runner-mocha': 0.9.0(bufferutil@4.1.0) - camelcase: 6.3.0 - command-line-args: 5.2.1 - command-line-usage: 7.0.3 - convert-source-map: 2.0.0 - diff: 5.2.2 - globby: 11.1.0 - nanocolors: 0.2.13 - portfinder: 1.0.38 - source-map: 0.7.6 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -13038,10 +12236,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -13073,10 +12267,6 @@ snapshots: argparse@2.0.1: {} - array-back@3.1.0: {} - - array-back@6.2.2: {} - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -13101,8 +12291,6 @@ snapshots: dependencies: array-uniq: 1.0.3 - array-union@2.1.0: {} - array-union@3.0.1: {} array-uniq@1.0.3: {} @@ -13159,18 +12347,12 @@ snapshots: assertion-error@2.0.1: {} - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 - ast-v8-to-istanbul@0.3.11: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 10.0.0 - astral-regex@2.0.0: {} - async-each-series@0.1.1: {} async-function@1.0.0: {} @@ -13250,49 +12432,12 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.4: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.8.2) - bare-url: 2.3.2 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-os@3.6.2: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.2 - optional: true - - bare-stream@2.7.0(bare-events@2.8.2): - dependencies: - streamx: 2.23.0 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-url@2.3.2: - dependencies: - bare-path: 3.0.0 - optional: true - base64-js@1.5.1: {} base64id@2.0.0: {} baseline-browser-mapping@2.9.19: {} - basic-ftp@5.1.0: {} - batch@0.6.1: {} bcrypt-pbkdf@1.0.2: @@ -13512,11 +12657,6 @@ snapshots: ssri: 13.0.1 unique-filename: 5.0.0 - cache-content-type@1.0.1: - dependencies: - mime-types: 2.1.35 - ylru: 1.4.0 - cacheable-lookup@6.1.0: {} cacheable-request@7.0.2: @@ -13550,18 +12690,12 @@ snapshots: camelcase@5.3.1: {} - camelcase@6.3.0: {} - caniuse-lite@1.0.30001770: {} caseless@0.12.0: {} chai@6.2.2: {} - chalk-template@0.4.0: - dependencies: - chalk: 4.1.2 - chalk@1.1.3: dependencies: ansi-styles: 2.2.1 @@ -13611,27 +12745,8 @@ snapshots: chownr@3.0.0: {} - chrome-launcher@0.15.2: - dependencies: - '@types/node': 22.19.11 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - transitivePeerDependencies: - - supports-color - chrome-trace-event@1.0.4: {} - chromium-bidi@14.0.0(devtools-protocol@0.0.1566079): - dependencies: - devtools-protocol: 0.0.1566079 - mitt: 3.0.1 - zod: 3.25.76 - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -13687,18 +12802,6 @@ snapshots: dependencies: mimic-response: 1.0.1 - clone@2.1.2: {} - - co-body@6.2.0: - dependencies: - '@hapi/bourne': 3.0.0 - inflation: 2.1.0 - qs: 6.15.0 - raw-body: 2.5.3 - type-is: 1.6.18 - - co@4.6.0: {} - collection-utils@1.0.1: {} color-convert@2.0.1: @@ -13715,20 +12818,6 @@ snapshots: dependencies: delayed-stream: 1.0.0 - command-line-args@5.2.1: - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - - command-line-usage@7.0.3: - dependencies: - array-back: 6.2.2 - chalk-template: 0.4.0 - table-layout: 4.1.1 - typical: 7.3.0 - commander@14.0.3: {} commander@2.20.3: {} @@ -13803,11 +12892,6 @@ snapshots: cookie@0.7.2: {} - cookies@0.9.1: - dependencies: - depd: 2.0.0 - keygrip: 1.1.0 - copy-anything@2.0.6: dependencies: is-what: 3.14.1 @@ -13913,8 +12997,6 @@ snapshots: data-uri-to-buffer@4.0.1: {} - data-uri-to-buffer@6.0.2: {} - data-urls@7.0.0: dependencies: whatwg-mimetype: 5.0.0 @@ -13944,8 +13026,6 @@ snapshots: dayjs@1.11.13: {} - debounce@1.2.1: {} - debug@2.6.9: dependencies: ms: 2.0.0 @@ -13982,8 +13062,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-equal@1.0.1: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -13995,10 +13073,6 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 - default-gateway@6.0.3: - dependencies: - execa: 5.1.1 - defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -14007,8 +13081,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -14019,12 +13091,6 @@ snapshots: defu@6.1.4: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - del@2.2.2: dependencies: globby: 5.0.0 @@ -14037,14 +13103,10 @@ snapshots: delayed-stream@1.0.0: {} - delegates@1.0.0: {} - depd@1.1.2: {} depd@2.0.0: {} - dependency-graph@0.11.0: {} - dependency-graph@1.0.0: {} destroy@1.2.0: {} @@ -14058,18 +13120,10 @@ snapshots: devtools-protocol@0.0.1045489: {} - devtools-protocol@0.0.1566079: {} - di@0.0.1: {} diff@4.0.4: {} - diff@5.2.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 @@ -14235,8 +13289,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - errorstacks@2.4.1: {} - es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -14368,14 +13420,6 @@ snapshots: escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@10.0.2(jiti@2.6.1)): dependencies: eslint: 10.0.2(jiti@2.6.1) @@ -14496,8 +13540,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 5.0.1 - esprima@4.0.1: {} - esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -14542,18 +13584,6 @@ snapshots: dependencies: eventsource-parser: 3.0.6 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - exit@0.1.2: {} expect-type@1.3.0: {} @@ -14765,10 +13795,6 @@ snapshots: common-path-prefix: 3.0.0 pkg-dir: 8.0.0 - find-replace@3.0.0: - dependencies: - array-back: 3.1.0 - find-up-simple@1.0.1: {} find-up@4.1.0: @@ -14970,14 +13996,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.5: - dependencies: - basic-ftp: 5.1.0 - data-uri-to-buffer: 6.0.2 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - getpass@0.1.7: dependencies: assert-plus: 1.0.0 @@ -15037,15 +14055,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globby@5.0.0: dependencies: array-union: 1.0.2 @@ -15206,22 +14215,10 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 - http-assert@1.5.0: - dependencies: - deep-equal: 1.0.1 - http-errors: 1.8.1 - http-cache-semantics@4.2.0: {} http-deceiver@1.2.7: {} - http-errors@1.6.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - http-errors@1.8.1: dependencies: depd: 1.1.2 @@ -15334,8 +14331,6 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} - husky@9.1.7: {} hyperdyperid@1.2.0: {} @@ -15384,15 +14379,11 @@ snapshots: imurmurhash@0.1.4: {} - inflation@2.1.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.3: {} - inherits@2.0.4: {} ini@1.3.8: {} @@ -15403,13 +14394,6 @@ snapshots: dependencies: tslib: 2.8.1 - internal-ip@6.2.0: - dependencies: - default-gateway: 6.0.3 - ipaddr.js: 1.9.1 - is-ip: 3.1.0 - p-event: 4.2.0 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -15420,8 +14404,6 @@ snapshots: ip-address@10.1.0: {} - ip-regex@4.3.0: {} - ipaddr.js@1.9.1: {} ipaddr.js@2.3.0: {} @@ -15474,8 +14456,6 @@ snapshots: is-deflate@1.0.0: {} - is-docker@2.2.1: {} - is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -15512,10 +14492,6 @@ snapshots: is-interactive@2.0.0: {} - is-ip@3.1.0: - dependencies: - ip-regex: 4.3.0 - is-map@2.0.3: {} is-module@1.0.0: {} @@ -15580,8 +14556,6 @@ snapshots: is-stream-ended@0.1.4: {} - is-stream@2.0.1: {} - is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -15618,10 +14592,6 @@ snapshots: is-wsl@1.1.0: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -15634,8 +14604,6 @@ snapshots: isbinaryfile@4.0.10: {} - isbinaryfile@5.0.7: {} - isexe@2.0.0: {} isexe@4.0.0: {} @@ -15935,70 +14903,12 @@ snapshots: - supports-color - utf-8-validate - keygrip@1.1.0: - dependencies: - tsscmp: 1.0.6 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 kind-of@6.0.3: {} - koa-compose@4.1.0: {} - - koa-convert@2.0.0: - dependencies: - co: 4.6.0 - koa-compose: 4.1.0 - - koa-etag@4.0.0: - dependencies: - etag: 1.8.1 - - koa-send@5.0.1: - dependencies: - debug: 4.4.3(supports-color@10.2.2) - http-errors: 1.8.1 - resolve-path: 1.4.0 - transitivePeerDependencies: - - supports-color - - koa-static@5.0.0: - dependencies: - debug: 3.2.7 - koa-send: 5.0.1 - transitivePeerDependencies: - - supports-color - - koa@2.16.3: - dependencies: - accepts: 1.3.8 - cache-content-type: 1.0.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookies: 0.9.1 - debug: 4.4.3(supports-color@10.2.2) - delegates: 1.0.0 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - fresh: 0.5.2 - http-assert: 1.5.0 - http-errors: 1.8.1 - is-generator-function: 1.1.2 - koa-compose: 4.1.0 - koa-convert: 2.0.0 - on-finished: 2.4.1 - only: 0.0.2 - parseurl: 1.3.3 - statuses: 1.5.0 - type-is: 1.6.18 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - launch-editor@2.12.0: dependencies: picocolors: 1.1.1 @@ -16039,13 +14949,6 @@ snapshots: dependencies: immediate: 3.0.6 - lighthouse-logger@1.4.2: - dependencies: - debug: 2.6.9 - marky: 1.3.0 - transitivePeerDependencies: - - supports-color - limiter@1.1.5: {} lines-and-columns@1.2.4: {} @@ -16130,13 +15033,6 @@ snapshots: is-unicode-supported: 2.1.0 yoctocolors: 2.1.2 - log-update@4.0.0: - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - log-update@7.1.0: dependencies: ansi-escapes: 7.3.0 @@ -16177,8 +15073,6 @@ snapshots: lru-cache@7.18.3: {} - lru-cache@8.0.5: {} - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -16217,8 +15111,6 @@ snapshots: transitivePeerDependencies: - supports-color - marky@1.3.0: {} - math-intrinsics@1.1.0: {} mdn-data@2.12.2: {} @@ -16279,8 +15171,6 @@ snapshots: mime@3.0.0: {} - mimic-fn@2.1.0: {} - mimic-function@5.0.1: {} mimic-response@1.0.1: {} @@ -16357,8 +15247,6 @@ snapshots: mitt@1.2.0: {} - mitt@3.0.1: {} - mkdirp-classic@0.5.3: {} mkdirp@0.5.6: @@ -16405,8 +15293,6 @@ snapshots: mute-stream@3.0.0: {} - nanocolors@0.2.13: {} - nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -16425,8 +15311,6 @@ snapshots: neo-async@2.6.2: {} - netmask@2.0.2: {} - ng-packagr@21.2.0-next.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): dependencies: '@ampproject/remapping': 2.3.0 @@ -16564,10 +15448,6 @@ snapshots: transitivePeerDependencies: - supports-color - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -16631,16 +15511,10 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - onetime@7.0.0: dependencies: mimic-function: 5.0.1 - only@0.0.2: {} - open@10.2.0: dependencies: default-browser: 5.5.0 @@ -16657,12 +15531,6 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - opn@5.3.0: dependencies: is-wsl: 1.1.0 @@ -16702,10 +15570,6 @@ snapshots: p-cancelable@2.1.1: {} - p-event@4.2.0: - dependencies: - p-timeout: 3.2.0 - p-finally@1.0.0: {} p-limit@2.3.0: @@ -16748,24 +15612,6 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.2.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6(supports-color@10.2.2) - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - package-json-from-dist@1.0.1: {} pacote@21.3.1: @@ -16817,8 +15663,6 @@ snapshots: dependencies: parse5: 8.0.0 - parse5@6.0.1: {} - parse5@8.0.0: dependencies: entities: 6.0.1 @@ -16849,8 +15693,6 @@ snapshots: path-to-regexp@8.3.0: {} - path-type@4.0.0: {} - pathe@1.1.2: {} pathe@2.0.3: {} @@ -16930,13 +15772,6 @@ snapshots: pluralize@8.0.0: {} - portfinder@1.0.38: - dependencies: - async: 3.2.6 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - portscanner@2.2.0: dependencies: async: 2.6.4 @@ -17064,19 +15899,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.5.0: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@10.2.2) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6(supports-color@10.2.2) - lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - proxy-from-env@1.1.0: {} prr@1.0.1: @@ -17124,23 +15946,6 @@ snapshots: - supports-color - utf-8-validate - puppeteer-core@24.37.3(bufferutil@4.1.0): - dependencies: - '@puppeteer/browsers': 2.12.1 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1566079) - debug: 4.4.3(supports-color@10.2.2) - devtools-protocol: 0.0.1566079 - typed-query-selector: 2.12.0 - webdriver-bidi-protocol: 0.4.1 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - puppeteer@18.2.1(bufferutil@4.1.0)(encoding@0.1.13): dependencies: https-proxy-agent: 5.0.1(supports-color@10.2.2) @@ -17344,11 +16149,6 @@ snapshots: resolve-from@4.0.0: {} - resolve-path@1.4.0: - dependencies: - http-errors: 1.6.3 - path-is-absolute: 1.0.1 - resolve-pkg-maps@1.0.0: {} resolve-url-loader@5.0.0: @@ -17376,11 +16176,6 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -17688,8 +16483,6 @@ snapshots: setimmediate@1.0.5: {} - setprototypeof@1.1.0: {} - setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -17749,14 +16542,6 @@ snapshots: transitivePeerDependencies: - supports-color - slash@3.0.0: {} - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - slice-ansi@7.1.2: dependencies: ansi-styles: 6.2.3 @@ -18048,8 +16833,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@2.0.0: {} - strip-json-comments@3.1.1: {} stubs@3.0.0: {} @@ -18070,11 +16853,6 @@ snapshots: symbol-tree@3.2.4: {} - table-layout@4.1.1: - dependencies: - array-back: 6.2.2 - wordwrapjs: 5.1.1 - tapable@2.3.0: {} tar-fs@2.1.1: @@ -18084,18 +16862,6 @@ snapshots: pump: 3.0.3 tar-stream: 2.2.0 - tar-fs@3.1.1: - dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.5.4 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -18229,10 +16995,6 @@ snapshots: tr46@0.0.3: {} - tr46@5.1.1: - dependencies: - punycode: 2.3.1 - tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -18276,8 +17038,6 @@ snapshots: tslib@2.8.1: {} - tsscmp@1.0.6: {} - tsx@4.21.0: dependencies: esbuild: 0.27.3 @@ -18311,8 +17071,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.21.3: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -18361,14 +17119,8 @@ snapshots: typed-graphqlify@3.1.6: {} - typed-query-selector@2.12.0: {} - typescript@5.9.3: {} - typical@4.0.0: {} - - typical@7.3.0: {} - ua-parser-js@0.7.41: {} ua-parser-js@1.0.41: {} @@ -18467,12 +17219,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -18637,8 +17383,6 @@ snapshots: web-vitals@4.2.4: {} - webdriver-bidi-protocol@0.4.1: {} - webdriver-js-extender@2.1.0: dependencies: '@types/selenium-webdriver': 3.0.26 @@ -18660,8 +17404,6 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@7.0.0: {} - webidl-conversions@8.0.1: {} webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)): @@ -18771,11 +17513,6 @@ snapshots: whatwg-mimetype@5.0.0: {} - whatwg-url@14.2.0: - dependencies: - tr46: 5.1.1 - webidl-conversions: 7.0.0 - whatwg-url@16.0.0: dependencies: '@exodus/bytes': 1.14.1 @@ -18855,8 +17592,6 @@ snapshots: wordwrap@1.0.0: {} - wordwrapjs@5.1.1: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -18883,10 +17618,6 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.10(bufferutil@4.1.0): - optionalDependencies: - bufferutil: 4.1.0 - ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 @@ -18998,8 +17729,6 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - ylru@1.4.0: {} - yn@3.1.1: {} yocto-queue@0.1.0: {} @@ -19010,8 +17739,6 @@ snapshots: dependencies: zod: 4.3.6 - zod@3.25.76: {} - zod@4.3.6: {} zone.js@0.16.0: {} diff --git a/tests/e2e/tests/jest/aot.ts b/tests/e2e/tests/jest/aot.ts deleted file mode 100644 index b015e2a58757..000000000000 --- a/tests/e2e/tests/jest/aot.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { deleteFile, writeFile } from '../../utils/fs'; -import { updateJsonFile } from '../../utils/project'; -import { applyJestBuilder } from '../../utils/jest'; -import { ng } from '../../utils/process'; - -export default async function (): Promise { - await applyJestBuilder(); - - { - await updateJsonFile('tsconfig.spec.json', (json) => { - return { - ...json, - include: ['src/**/*.spec.ts'], - }; - }); - - await writeFile( - 'src/aot.spec.ts', - ` - import { Component } from '@angular/core'; - - describe('Hello', () => { - it('should *not* contain jit instructions', () => { - @Component({ - template: 'Hello', - }) - class Hello {} - - expect((Hello as any).ɵcmp.template.toString()).not.toContain('jit'); - }); - }); - `.trim(), - ); - - const { stderr } = await ng('test', '--aot'); - - if (!stderr.includes('Ran all test suites.') || stderr.includes('failed')) { - throw new Error(`Components were not transformed using AOT.\STDERR:\n\n${stderr}`); - } - } -} diff --git a/tests/e2e/tests/jest/basic.ts b/tests/e2e/tests/jest/basic.ts deleted file mode 100644 index 2a3b19119edd..000000000000 --- a/tests/e2e/tests/jest/basic.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { applyJestBuilder } from '../../utils/jest'; -import { ng } from '../../utils/process'; - -export default async function (): Promise { - await applyJestBuilder(); - - const { stderr } = await ng('test'); - - if (!stderr.includes('Jest builder is currently EXPERIMENTAL')) { - throw new Error(`No experimental notice in stderr.\nSTDERR:\n\n${stderr}`); - } -} diff --git a/tests/e2e/tests/jest/custom-config.ts b/tests/e2e/tests/jest/custom-config.ts deleted file mode 100644 index 10e481a43fcc..000000000000 --- a/tests/e2e/tests/jest/custom-config.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { deleteFile, writeFile } from '../../utils/fs'; -import { applyJestBuilder } from '../../utils/jest'; -import { ng } from '../../utils/process'; -import { updateJsonFile } from '../../utils/project'; - -export default async function (): Promise { - await applyJestBuilder(); - - { - // Users may incorrectly write a Jest config believing it to be used by Angular. - await writeFile( - 'jest.config.mjs', - ` - export default { - runner: 'does-not-exist', - }; - `.trim(), - ); - - // Should not fail from the above (broken) configuration. Shouldn't use it at all. - const { stderr } = await ng('test'); - - // Should warn that a Jest configuration was found but not used. - if (!stderr.includes('A custom Jest config was found')) { - throw new Error(`No warning about custom Jest config:\nSTDERR:\n\n${stderr}`); - } - if (!stderr.includes('jest.config.mjs')) { - throw new Error(`Warning did not call out 'jest.config.mjs':\nSTDERR:\n\n${stderr}`); - } - - await deleteFile('jest.config.mjs'); - } - - { - // Use `package.json` configuration instead of a `jest.config` file. - await updateJsonFile('package.json', (json) => { - json['jest'] = { - runner: 'does-not-exist', - }; - }); - - // Should not fail from the above (broken) configuration. Shouldn't use it at all. - const { stderr } = await ng('test'); - - // Should warn that a Jest configuration was found but not used. - if (!stderr.includes('A custom Jest config was found')) { - throw new Error(`No warning about custom Jest config:\nSTDERR:\n\n${stderr}`); - } - if (!stderr.includes('package.json')) { - throw new Error(`Warning did not call out 'package.json':\nSTDERR:\n\n${stderr}`); - } - } -} diff --git a/tests/e2e/tests/jest/no-zoneless.ts b/tests/e2e/tests/jest/no-zoneless.ts deleted file mode 100644 index 9a74a0295c4e..000000000000 --- a/tests/e2e/tests/jest/no-zoneless.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { replaceInFile } from '../../utils/fs'; -import { applyJestBuilder } from '../../utils/jest'; -import { installPackage, uninstallPackage } from '../../utils/packages'; -import { ng } from '../../utils/process'; - -export default async function (): Promise { - await applyJestBuilder({ - tsConfig: 'tsconfig.spec.json', - polyfills: ['zone.js', 'zone.js/testing'], - }); - - await replaceInFile( - 'src/app/app.spec.ts', - 'await fixture.whenStable();', - 'fixture.detectChanges();', - ); - - try { - await installPackage('zone.js'); - - const { stderr } = await ng('test'); - - if (!stderr.includes('Jest builder is currently EXPERIMENTAL')) { - throw new Error(`No experimental notice in stderr.\nSTDERR:\n\n${stderr}`); - } - } finally { - await uninstallPackage('zone.js'); - } -} diff --git a/tests/e2e/tests/web-test-runner/basic.ts b/tests/e2e/tests/web-test-runner/basic.ts deleted file mode 100644 index 4985f872fb18..000000000000 --- a/tests/e2e/tests/web-test-runner/basic.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { noSilentNg } from '../../utils/process'; -import { applyWtrBuilder } from '../../utils/web-test-runner'; - -export default async function () { - // Temporary disabled due to failure. - return; - - await applyWtrBuilder(); - - const { stderr } = await noSilentNg('test'); - - if (!stderr.includes('Web Test Runner builder is currently EXPERIMENTAL')) { - throw new Error(`No experimental notice in stderr.\nSTDERR:\n\n${stderr}`); - } -} diff --git a/tests/e2e/utils/jest.ts b/tests/e2e/utils/jest.ts deleted file mode 100644 index 5dc1f0efe464..000000000000 --- a/tests/e2e/utils/jest.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { silentNpm } from './process'; -import { updateJsonFile } from './project'; - -/** Updates the `test` builder in the current workspace to use Jest with the given options. */ -export async function applyJestBuilder( - options: {} = { - polyfills: [], - tsConfig: 'tsconfig.spec.json', - }, -): Promise { - await silentNpm('install', 'jest@30.2.0', 'jest-environment-jsdom@30.2.0', '--save-dev'); - - await updateJsonFile('angular.json', (json) => { - const projects = Object.values(json['projects']); - if (projects.length !== 1) { - throw new Error( - `Expected exactly one project but found ${projects.length} projects named ${Object.keys( - json['projects'], - ).join(', ')}`, - ); - } - const project = projects[0]! as any; - - // Update to Jest builder. - const test = project['architect']['test']; - test['builder'] = '@angular-devkit/build-angular:jest'; - test['options'] = options; - }); -} diff --git a/tests/e2e/utils/web-test-runner.ts b/tests/e2e/utils/web-test-runner.ts deleted file mode 100644 index da66c623b76e..000000000000 --- a/tests/e2e/utils/web-test-runner.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { silentNpm } from './process'; -import { updateJsonFile } from './project'; - -/** Updates the `test` builder in the current workspace to use Web Test Runner with the given options. */ -export async function applyWtrBuilder(): Promise { - await silentNpm('install', '@web/test-runner', '--save-dev'); - - await updateJsonFile('angular.json', (json) => { - const projects = Object.values(json['projects']); - if (projects.length !== 1) { - throw new Error( - `Expected exactly one project but found ${projects.length} projects named ${Object.keys( - json['projects'], - ).join(', ')}`, - ); - } - const project = projects[0]! as any; - - // Update to Web Test Runner builder. - const test = project['architect']['test']; - test['builder'] = '@angular-devkit/build-angular:web-test-runner'; - }); -}