From 2e002b44888c38aa87dd6d0ae7cf480bc5706d68 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:15:40 +0000 Subject: [PATCH] refactor: remove experimental Jest and Web Test Runner builders The experimental Jest and Web Test Runner builders have been removed from the Angular CLI. These builders were experimental and have been superseded. BREAKING CHANGE: The experimental `@angular-devkit/build-angular:jest` and `@angular-devkit/build-angular:web-test-runner` builders have been removed. --- .../cli/lib/config/workspace-schema.json | 46 - .../angular_devkit/build_angular/BUILD.bazel | 14 - .../build_angular/builders.json | 10 - .../angular_devkit/build_angular/package.json | 13 - .../build_angular/src/builders/jest/index.ts | 216 --- .../src/builders/jest/init-test-bed.mjs | 24 - .../src/builders/jest/jest-global.mjs | 19 - .../src/builders/jest/jest.config.mjs | 11 - .../src/builders/jest/options.ts | 34 - .../src/builders/jest/schema.json | 44 - .../src/builders/jest/tests/options.ts | 16 - .../builder-status-warnings.ts | 49 - .../src/builders/web-test-runner/index.ts | 206 --- .../web-test-runner/jasmine_runner.js | 91 -- .../src/builders/web-test-runner/options.ts | 42 - .../builders/web-test-runner/options_spec.ts | 64 - .../src/builders/web-test-runner/schema.json | 297 ---- .../builders/web-test-runner/test_page.html | 40 - .../web-test-runner/write-test-files.ts | 39 - .../build_angular/src/utils/test-files.ts | 37 - .../src/utils/test-files_spec.ts | 151 -- pnpm-lock.yaml | 1273 ----------------- tests/e2e/tests/jest/aot.ts | 41 - tests/e2e/tests/jest/basic.ts | 12 - tests/e2e/tests/jest/custom-config.ts | 53 - tests/e2e/tests/jest/no-zoneless.ts | 29 - tests/e2e/tests/web-test-runner/basic.ts | 15 - tests/e2e/utils/jest.ts | 29 - tests/e2e/utils/web-test-runner.ts | 23 - 29 files changed, 2938 deletions(-) delete mode 100644 packages/angular_devkit/build_angular/src/builders/jest/index.ts delete mode 100644 packages/angular_devkit/build_angular/src/builders/jest/init-test-bed.mjs delete mode 100644 packages/angular_devkit/build_angular/src/builders/jest/jest-global.mjs delete mode 100644 packages/angular_devkit/build_angular/src/builders/jest/jest.config.mjs delete mode 100644 packages/angular_devkit/build_angular/src/builders/jest/options.ts delete mode 100644 packages/angular_devkit/build_angular/src/builders/jest/schema.json delete mode 100644 packages/angular_devkit/build_angular/src/builders/jest/tests/options.ts delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/builder-status-warnings.ts delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/index.ts delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/jasmine_runner.js delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/options.ts delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/options_spec.ts delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/schema.json delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/test_page.html delete mode 100644 packages/angular_devkit/build_angular/src/builders/web-test-runner/write-test-files.ts delete mode 100644 packages/angular_devkit/build_angular/src/utils/test-files.ts delete mode 100644 packages/angular_devkit/build_angular/src/utils/test-files_spec.ts delete mode 100644 tests/e2e/tests/jest/aot.ts delete mode 100644 tests/e2e/tests/jest/basic.ts delete mode 100644 tests/e2e/tests/jest/custom-config.ts delete mode 100644 tests/e2e/tests/jest/no-zoneless.ts delete mode 100644 tests/e2e/tests/web-test-runner/basic.ts delete mode 100644 tests/e2e/utils/jest.ts delete mode 100644 tests/e2e/utils/web-test-runner.ts 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'; - }); -}