From 76ecd7d06e78929468185b5447962281c7857d3c Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 4 Mar 2026 13:48:13 +0100 Subject: [PATCH] build: update to TypeScript 6 Updates the repo to TypeScript 6 and resolves the resulting test failures. --- MODULE.bazel | 6 +- MODULE.bazel.lock | 6 +- .../hello-world-app/src/tsconfig.server.json | 3 +- modules/testing/builder/src/test-utils.ts | 2 +- package.json | 2 +- packages/angular/build/package.json | 2 +- .../tests/behavior/rebuild-errors_spec.ts | 2 +- .../typescript-isolated-modules_spec.ts | 3 + .../behavior/typescript-path-mapping_spec.ts | 1 + .../behavior/typescript-resolve-json_spec.ts | 9 +- .../tests/options/polyfills_spec.ts | 3 + .../tests/options/setup-files_spec.ts | 4 +- .../architect/src/create-builder.ts | 6 +- .../angular_devkit/build_angular/BUILD.bazel | 1 + .../angular_devkit/build_angular/package.json | 2 +- .../src/builders/app-shell/index.ts | 8 +- .../builders/browser/specs/allow-js_spec.ts | 6 +- .../builders/browser/specs/base-href_spec.ts | 13 +- .../browser/specs/build-optimizer_spec.ts | 4 +- .../browser/specs/cross-origin_spec.ts | 8 +- .../builders/browser/specs/deploy-url_spec.ts | 4 +- .../src/builders/browser/specs/index_spec.ts | 8 +- .../specs/unused-files-warning_spec.ts | 10 +- .../tests/behavior/rebuild-errors_spec.ts | 8 +- .../src/builders/server/index.ts | 3 +- .../ssr-dev-server/specs/proxy_spec.ts | 5 +- .../builders/ssr-dev-server/specs/ssl_spec.ts | 5 +- .../ssr-dev-server/specs/works_spec.ts | 5 +- .../test/hello-world-lib/tsconfig.json | 1 - .../builders/webpack-dev-server/index_spec.ts | 6 +- .../src/builders/webpack/index_spec.ts | 4 +- .../test/angular-app/tsconfig.json | 1 - .../test/basic-app/tsconfig.json | 1 - .../core/src/json/schema/visitor_spec.ts | 13 +- .../schematics/src/engine/schematic_spec.ts | 48 +++--- .../schematics/src/rules/base_spec.ts | 117 +++++++-------- .../schematics/src/rules/call_spec.ts | 97 ++++--------- .../schematics/src/rules/move_spec.ts | 69 ++++----- .../schematics/src/rules/template_spec.ts | 28 ++-- .../schematics/src/sink/host_spec.ts | 69 +++------ .../tools/file-system-engine-host_spec.ts | 19 +-- .../tools/workflow/node-workflow_spec.ts | 7 +- .../blank/project-files/tsconfig.json | 1 - .../schematic/files/tsconfig.json | 1 - packages/ngtools/webpack/package.json | 4 +- .../src/transformers/elide_imports_spec.ts | 10 +- .../webpack/src/transformers/spec_helpers.ts | 2 +- pnpm-lock.yaml | 137 +++++++++--------- .../assets/ssr-project-webpack/tsconfig.json | 1 - 49 files changed, 333 insertions(+), 442 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index b7cbca0be3dc..e8b0ffd5b69b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -165,9 +165,9 @@ use_repo(npm, "npm") rules_ts_ext = use_extension("@aspect_rules_ts//ts:extensions.bzl", "ext") rules_ts_ext.deps( name = "angular_cli_npm_typescript", - # Obtained by: npm info typescript@5.9.3 dist.integrity - ts_integrity = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - ts_version = "5.9.3", + # Obtained by: npm info typescript@6.0.0-beta dist.integrity + ts_integrity = "sha512-CldZdztDpQRLM1HC6WDQjQkQN5Ub5zRau737a1diGh3lPmb9oRsaWHk1y5iqK0o7+1bNJ0oXfEGRkAogFZBL+Q==", + ts_version = "6.0.0-beta", ) use_repo(rules_ts_ext, **{"npm_typescript": "angular_cli_npm_typescript"}) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 90379b2bd8eb..411b7f3dd1d8 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -571,7 +571,7 @@ "@@aspect_rules_ts+//ts:extensions.bzl%ext": { "general": { "bzlTransitiveDigest": "6NyLUdrb79stFKm8oWIBK2q65cT5Upbr8IR2Qwsywu8=", - "usagesDigest": "ohKYRsVTeRZRfv+0QiN+5H2ycAbbirey745XNBkWqkk=", + "usagesDigest": "WMA7n3NdJjSGUvkfejE4MruMdWMQ15/EpOmPFuISD6A=", "recordedFileInputs": { "@@rules_browsers+//package.json": "772d873d450a539e2133635aeb5e63744cf1cec86e6b37aeecd9267a147fb0d7" }, @@ -581,8 +581,8 @@ "angular_cli_npm_typescript": { "repoRuleId": "@@aspect_rules_ts+//ts/private:npm_repositories.bzl%http_archive_version", "attributes": { - "version": "5.9.3", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.0-beta", + "integrity": "sha512-CldZdztDpQRLM1HC6WDQjQkQN5Ub5zRau737a1diGh3lPmb9oRsaWHk1y5iqK0o7+1bNJ0oXfEGRkAogFZBL+Q==", "urls": [ "https://registry.npmjs.org/typescript/-/typescript-{}.tgz" ] diff --git a/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json b/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json index 9a492c781eb1..3fd4df49c45d 100644 --- a/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json +++ b/modules/testing/builder/projects/hello-world-app/src/tsconfig.server.json @@ -2,8 +2,7 @@ "extends": "./tsconfig.app.json", "compilerOptions": { "outDir": "../dist-server", - "baseUrl": "./", - "types": ["@angular/localize", "node"] + "types": ["@angular/localize", "node", "@types/express"] }, "files": [ "main.server.ts" diff --git a/modules/testing/builder/src/test-utils.ts b/modules/testing/builder/src/test-utils.ts index 3e8f1fe48fcb..63ded0215c90 100644 --- a/modules/testing/builder/src/test-utils.ts +++ b/modules/testing/builder/src/test-utils.ts @@ -80,7 +80,7 @@ export async function browserBuild( scheduleOptions?: ScheduleOptions, ): Promise { const run = await architect.scheduleTarget(target, overrides, scheduleOptions); - const output = (await run.result) as BuilderOutput & { outputs: { path: string }[] }; + const output = await run.result; expect(output.success).toBe(true); if (!output.success) { diff --git a/package.json b/package.json index 8a73b94dd8b1..85c25d1214b4 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "semver": "7.7.4", "source-map-support": "0.5.21", "tslib": "2.8.1", - "typescript": "5.9.3", + "typescript": "6.0.0-beta", "undici": "7.22.0", "unenv": "^1.10.0", "verdaccio": "6.2.9", diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index 805c87a77a1e..a8b030952db5 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -73,7 +73,7 @@ "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "tslib": "^2.3.0", - "typescript": ">=5.9 <6.0", + "typescript": ">=5.9 <6.1", "vitest": "^4.0.8" }, "peerDependenciesMeta": { diff --git a/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts index fa384be88080..de53c7223fff 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/rebuild-errors_spec.ts @@ -33,7 +33,7 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir { - @Input() foo: number; + @Input() foo!: number; } `; diff --git a/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts index 06e66cbd6da9..bef97e545ad9 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/typescript-isolated-modules_spec.ts @@ -55,6 +55,9 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { tsconfig.compilerOptions.isolatedModules = true; tsconfig.compilerOptions.jsx = 'react-jsx'; + // There's an implicit `any`, because we don't include the React typings. + tsconfig.compilerOptions.noImplicitAny = false; + return JSON.stringify(tsconfig); }); diff --git a/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts index 6e497f149566..416ee9c227bd 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/typescript-path-mapping_spec.ts @@ -83,6 +83,7 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { tsconfig.compilerOptions.paths = { 'app-module': ['./a.js'], }; + tsconfig.compilerOptions.allowJs = true; return JSON.stringify(tsconfig); }); diff --git a/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts b/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts index cf21d5545f7a..6ad5bbb3a9de 100644 --- a/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts +++ b/packages/angular/build/src/builders/application/tests/behavior/typescript-resolve-json_spec.ts @@ -20,7 +20,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { // Enable tsconfig resolveJsonModule option in tsconfig await harness.modifyFile('tsconfig.json', (content) => { const tsconfig = JSON.parse(content); - tsconfig.compilerOptions.moduleResolution = 'node'; + tsconfig.compilerOptions.moduleResolution = 'node16'; + tsconfig.compilerOptions.module = 'node16'; tsconfig.compilerOptions.resolveJsonModule = true; return JSON.stringify(tsconfig); @@ -44,7 +45,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { // Enable tsconfig resolveJsonModule option in tsconfig await harness.modifyFile('tsconfig.json', (content) => { const tsconfig = JSON.parse(content); - tsconfig.compilerOptions.moduleResolution = 'node'; + tsconfig.compilerOptions.moduleResolution = 'node16'; + tsconfig.compilerOptions.module = 'node16'; tsconfig.compilerOptions.resolveJsonModule = undefined; return JSON.stringify(tsconfig); @@ -73,7 +75,8 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { // Enable tsconfig resolveJsonModule option in tsconfig await harness.modifyFile('tsconfig.json', (content) => { const tsconfig = JSON.parse(content); - tsconfig.compilerOptions.moduleResolution = 'node'; + tsconfig.compilerOptions.moduleResolution = 'node16'; + tsconfig.compilerOptions.module = 'node16'; tsconfig.compilerOptions.resolveJsonModule = false; return JSON.stringify(tsconfig); diff --git a/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts b/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts index 8b5cc3a09ab3..5fff9bd33a7c 100644 --- a/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts +++ b/packages/angular/build/src/builders/application/tests/options/polyfills_spec.ts @@ -26,6 +26,9 @@ describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => { const tsconfig = JSON.parse(content); tsconfig.compilerOptions.baseUrl = baseUrl; + // The test is specifically testing `baseUrl` which is deprecated in TS6. + tsconfig.compilerOptions.ignoreDeprecations = '6.0'; + return JSON.stringify(tsconfig); }); }); diff --git a/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts b/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts index be70c833c9a9..65d0dadf17b8 100644 --- a/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts +++ b/packages/angular/build/src/builders/unit-test/tests/options/setup-files_spec.ts @@ -36,12 +36,12 @@ describeBuilder(execute, UNIT_TEST_BUILDER_INFO, (harness) => { it('should include the setup files', async () => { await harness.writeFiles({ - 'src/setup.ts': `globalThis['TEST_SETUP_RAN'] = true;`, + 'src/setup.ts': `(globalThis as any)['TEST_SETUP_RAN'] = true;`, 'src/app/app.component.spec.ts': ` import { describe, expect, test } from 'vitest' describe('AppComponent', () => { test('should have run setup file', () => { - expect(globalThis['TEST_SETUP_RAN']).toBe(true); + expect((globalThis as any)['TEST_SETUP_RAN']).toBe(true); }); });`, }); diff --git a/packages/angular_devkit/architect/src/create-builder.ts b/packages/angular_devkit/architect/src/create-builder.ts index d2fc8cfba5eb..de4808aaa296 100644 --- a/packages/angular_devkit/architect/src/create-builder.ts +++ b/packages/angular_devkit/architect/src/create-builder.ts @@ -92,9 +92,7 @@ export function createBuilder log(entry))); @@ -103,7 +101,7 @@ export function createBuilder=5.9 <6.0" + "typescript": ">=5.9 <6.1" }, "peerDependenciesMeta": { "@angular/core": { diff --git a/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts b/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts index abdaf31f3a98..6a70ff1a60d2 100644 --- a/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/app-shell/index.ts @@ -194,10 +194,10 @@ async function _appShellBuilder( let spinner: Spinner | undefined; try { - const [browserResult, serverResult] = await Promise.all([ - browserTargetRun.result as Promise, - serverTargetRun.result as Promise, - ]); + const [browserResult, serverResult] = (await Promise.all([ + browserTargetRun.result, + serverTargetRun.result, + ])) as [BrowserBuilderOutput, ServerBuilderOutput]; if (browserResult.success === false || browserResult.baseOutputPath === undefined) { return browserResult; diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts index e8e270b9e16c..3d75ce49a690 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/allow-js_spec.ts @@ -36,7 +36,7 @@ describe('Browser Builder allow js', () => { ); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const content = virtualFs.fileBufferToString( @@ -63,7 +63,7 @@ describe('Browser Builder allow js', () => { const overrides = { aot: true }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const content = virtualFs.fileBufferToString( @@ -93,7 +93,7 @@ describe('Browser Builder allow js', () => { const run = await architect.scheduleTarget(targetSpec, overrides); await lastValueFrom( - (run.output as Observable).pipe( + run.output.pipe( tap((output) => { const path = relative(host.root(), join(normalize(output.outputs[0].path), 'main.js')); const content = virtualFs.fileBufferToString(host.scopedSync().read(path)); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts index f8788cf3d947..b65dd9b74525 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/base-href_spec.ts @@ -10,7 +10,6 @@ import { Architect } from '@angular-devkit/architect'; import { join, normalize, tags, virtualFs } from '@angular-devkit/core'; import { lastValueFrom } from 'rxjs'; import { createArchitect, host } from '../../../testing/test-utils'; -import { BrowserBuilderOutput } from '../index'; describe('Browser Builder base href', () => { const targetSpec = { project: 'app', target: 'build' }; @@ -23,6 +22,12 @@ describe('Browser Builder base href', () => { afterEach(async () => host.restore().toPromise()); it('works', async () => { + host.replaceInFile( + 'tsconfig.json', + '"target": "es2022"', + '"target": "es2022", "allowJs": true', + ); + host.writeMultipleFiles({ 'src/my-js-file.js': `console.log(1); export const a = 2;`, 'src/main.ts': `import { a } from './my-js-file'; console.log(a);`, @@ -30,7 +35,7 @@ describe('Browser Builder base href', () => { const overrides = { baseHref: '/myUrl' }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); @@ -51,7 +56,7 @@ describe('Browser Builder base href', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBeTrue(); const fileName = join(normalize(output.outputs[0].path), 'index.html'); @@ -71,7 +76,7 @@ describe('Browser Builder base href', () => { const overrides = { baseHref: '/myUrl' }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts index 47f641fb55ff..b6c7be1fd931 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/build-optimizer_spec.ts @@ -40,7 +40,7 @@ describe('Browser Builder build optimizer', () => { const boOverrides = { ...noBoOverrides, buildOptimizer: true }; const run = await architect.scheduleTarget(targetSpec, noBoOverrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); @@ -54,7 +54,7 @@ describe('Browser Builder build optimizer', () => { await run.stop(); const boRun = await architect.scheduleTarget(targetSpec, boOverrides); - const boOutput = (await run.result) as BrowserBuilderOutput; + const boOutput = await run.result; expect(boOutput.success).toBe(true); const boStats = await lastValueFrom( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts index 8101c325b724..8b0b21eff392 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/cross-origin_spec.ts @@ -34,7 +34,7 @@ describe('Browser Builder crossOrigin', () => { it('works with use-credentials', async () => { const overrides = { crossOrigin: CrossOrigin.UseCredentials }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -54,7 +54,7 @@ describe('Browser Builder crossOrigin', () => { it('works with anonymous', async () => { const overrides = { crossOrigin: CrossOrigin.Anonymous }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -75,7 +75,7 @@ describe('Browser Builder crossOrigin', () => { it('works with none', async () => { const overrides = { crossOrigin: CrossOrigin.None }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -101,7 +101,7 @@ describe('Browser Builder crossOrigin', () => { const overrides = { crossOrigin: CrossOrigin.UseCredentials }; const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'runtime.js'); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts index 69453827b5a5..c24fabd3128b 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/deploy-url_spec.ts @@ -34,7 +34,7 @@ describe('Browser Builder deploy url', () => { }); const run = await architect.scheduleTarget(targetSpec, overrides); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.outputs[0].path).not.toBeUndefined(); const outputPath = normalize(output.outputs[0].path); @@ -51,7 +51,7 @@ describe('Browser Builder deploy url', () => { expect(runtimeContent).toContain('deployUrl/'); const run2 = await architect.scheduleTarget(targetSpec, overrides2); - const output2 = (await run2.result) as BrowserBuilderOutput; + const output2 = await run2.result; expect(output2.outputs[0].path).toEqual(outputPath); // These should be the same. const content2 = virtualFs.fileBufferToString( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts index cf2e2a5d6c76..7f06fe730475 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/index_spec.ts @@ -31,7 +31,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -56,7 +56,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -81,7 +81,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( @@ -105,7 +105,7 @@ describe('Browser Builder index HTML processing', () => { }); const run = await architect.scheduleTarget(targetSpec); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); const fileName = join(normalize(output.outputs[0].path), 'index.html'); const content = virtualFs.fileBufferToString( diff --git a/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts index b25d599f18a4..fc66978d8114 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/specs/unused-files-warning_spec.ts @@ -30,7 +30,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); @@ -49,7 +49,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(`unused-file.ts ${warningMessageSuffix}`)).toBe(true); @@ -82,7 +82,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, { aot: true }, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); @@ -105,7 +105,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); @@ -129,7 +129,7 @@ describe('Browser Builder unused files warnings', () => { logger.subscribe((e) => logs.push(e.message)); const run = await architect.scheduleTarget(targetSpec, undefined, { logger }); - const output = (await run.result) as BrowserBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(logs.join().includes(warningMessageSuffix)).toBe(false); diff --git a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts index 0daece623c63..26cbe1144d2b 100644 --- a/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/browser/tests/behavior/rebuild-errors_spec.ts @@ -23,7 +23,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir { - @Input() foo: number; + @Input() foo!: number; } `; @@ -150,7 +150,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir { - @Input() foo: number; + @Input() foo!: number; } `, ); @@ -160,7 +160,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir2 { - foo: string; + foo!: string; } `; await harness.writeFile('src/app/dir2.ts', goodDirectiveContents); @@ -216,7 +216,7 @@ describeBuilder(buildWebpackBrowser, BROWSER_BUILDER_INFO, (harness) => { import { Directive, Input } from '@angular/core'; @Directive({ selector: 'dir', standalone: false }) export class Dir2 { - @Input() foo: string; + @Input() foo!: string; } `, ); diff --git a/packages/angular_devkit/build_angular/src/builders/server/index.ts b/packages/angular_devkit/build_angular/src/builders/server/index.ts index 4903fe8e2403..ffe7174f0c44 100644 --- a/packages/angular_devkit/build_angular/src/builders/server/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/server/index.ts @@ -158,7 +158,8 @@ export function execute( }), concatMap(async (output) => { if (!output.success) { - return output as ServerBuilderOutput; + // The `as unknown` is here primarily for the linter. + return output as unknown as ServerBuilderOutput; } return { diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts index c6ea08e05cda..5539501222a6 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/proxy_spec.ts @@ -11,7 +11,6 @@ import { Architect } from '@angular-devkit/architect'; import * as browserSync from 'browser-sync'; import * as http from 'node:http'; import { createArchitect, host } from '../../../testing/test-utils'; -import { SSRDevServerBuilderOutput } from '../index'; describe('Serve SSR Builder - Proxy', () => { const target = { project: 'app', target: 'serve-ssr' }; @@ -33,7 +32,7 @@ describe('Serve SSR Builder - Proxy', () => { host.writeMultipleFiles({ 'src/main.server.ts': ` import { CommonEngine } from '@angular/ssr/node'; - import * as express from 'express'; + import express from 'express'; import { resolve, join } from 'node:path'; import { AppServerModule } from './app/app.module.server'; @@ -103,7 +102,7 @@ describe('Serve SSR Builder - Proxy', () => { proxyConfig: 'proxy.config.json', }); - const output = (await run.result) as SSRDevServerBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.baseUrl).toBe(`http://localhost:${output.port}`); diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts index 8c098b514fbb..0e81c282791a 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/ssl_spec.ts @@ -11,7 +11,6 @@ import { Architect } from '@angular-devkit/architect'; import * as browserSync from 'browser-sync'; import { Agent } from 'undici'; import { createArchitect, host } from '../../../testing/test-utils'; -import { SSRDevServerBuilderOutput } from '../index'; describe('Serve SSR Builder - SSL', () => { const target = { project: 'app', target: 'serve-ssr' }; @@ -33,7 +32,7 @@ describe('Serve SSR Builder - SSL', () => { host.writeMultipleFiles({ 'src/main.server.ts': ` import { CommonEngine } from '@angular/ssr/node'; - import * as express from 'express'; + import express from 'express'; import { resolve, join } from 'node:path'; import { AppServerModule } from './app/app.module.server'; @@ -81,7 +80,7 @@ describe('Serve SSR Builder - SSL', () => { it('works with SSL', async () => { const run = await architect.scheduleTarget(target, { ssl: true, port: 0 }); - const output = (await run.result) as SSRDevServerBuilderOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.baseUrl).toBe(`https://localhost:${output.port}`); diff --git a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts index 731443b6cd94..92324fa34526 100644 --- a/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/ssr-dev-server/specs/works_spec.ts @@ -10,7 +10,6 @@ import { Architect } from '@angular-devkit/architect'; // eslint-disable-next-line import/no-extraneous-dependencies import * as browserSync from 'browser-sync'; import { createArchitect, host } from '../../../testing/test-utils'; -import { SSRDevServerBuilderOutput } from '../index'; describe('Serve SSR Builder - Works', () => { const target = { project: 'app', target: 'serve-ssr' }; @@ -32,7 +31,7 @@ describe('Serve SSR Builder - Works', () => { host.writeMultipleFiles({ 'src/main.server.ts': ` import { CommonEngine } from '@angular/ssr/node'; - import * as express from 'express'; + import express from 'express'; import { resolve, join } from 'node:path'; import { AppServerModule } from './app/app.module.server'; @@ -90,7 +89,7 @@ describe('Serve SSR Builder - Works', () => { it('works with port 0', async () => { const run = await architect.scheduleTarget(target, { port: 0 }); - const output = (await run.result) as SSRDevServerBuilderOutput; + const output = await run.result; await run.stop(); expect(output.success).toBe(true); diff --git a/packages/angular_devkit/build_angular/test/hello-world-lib/tsconfig.json b/packages/angular_devkit/build_angular/test/hello-world-lib/tsconfig.json index f749045924e4..8ccae14cd594 100644 --- a/packages/angular_devkit/build_angular/test/hello-world-lib/tsconfig.json +++ b/packages/angular_devkit/build_angular/test/hello-world-lib/tsconfig.json @@ -1,7 +1,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts index 80b12e622b71..9e4f688d0c4e 100644 --- a/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts +++ b/packages/angular_devkit/build_webpack/src/builders/webpack-dev-server/index_spec.ts @@ -50,7 +50,7 @@ describe('Dev Server Builder', () => { const run = await architect.scheduleTarget(webpackTargetSpec, { webpackConfig: 'webpack.config.cjs', }); - const output = (await run.result) as DevServerBuildOutput; + const output = await run.result; expect(output.success).toBe(true); const response = await fetch(`http://localhost:${output.port}/bundle.js`); @@ -63,7 +63,7 @@ describe('Dev Server Builder', () => { const run = await architect.scheduleTarget(webpackTargetSpec, { webpackConfig: 'webpack.config.mjs', }); - const output = (await run.result) as DevServerBuildOutput; + const output = await run.result; expect(output.success).toBe(true); const response = await fetch(`http://localhost:${output.port}/bundle.js`); @@ -74,7 +74,7 @@ describe('Dev Server Builder', () => { it('works and returns emitted files', async () => { const run = await architect.scheduleTarget(webpackTargetSpec); - const output = (await run.result) as DevServerBuildOutput; + const output = await run.result; expect(output.success).toBe(true); expect(output.emittedFiles).toContain({ diff --git a/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts b/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts index 9564387d3d73..6209272d9376 100644 --- a/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts +++ b/packages/angular_devkit/build_webpack/src/builders/webpack/index_spec.ts @@ -73,7 +73,7 @@ describe('Webpack Builder basic test', () => { it('works and returns emitted files', async () => { const run = await architect.scheduleTarget({ project: 'app', target: 'build' }); - const output = (await run.result) as BuildResult; + const output = await run.result; expect(output.success).toBe(true); expect(output.emittedFiles).toContain({ @@ -114,7 +114,7 @@ describe('Webpack Builder basic test', () => { it('works and returns emitted files', async () => { const run = await architect.scheduleTarget({ project: 'app', target: 'build-webpack' }); - const output = (await run.result) as BuildResult; + const output = await run.result; expect(output.success).toBe(true); expect(output.emittedFiles).toContain( diff --git a/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json b/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json index c2343708c79a..beb80b8f4d01 100644 --- a/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json +++ b/packages/angular_devkit/build_webpack/test/angular-app/tsconfig.json @@ -1,7 +1,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, diff --git a/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json b/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json index 4625ba86dca4..d93948c96ff0 100644 --- a/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json +++ b/packages/angular_devkit/build_webpack/test/basic-app/tsconfig.json @@ -1,7 +1,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, diff --git a/packages/angular_devkit/core/src/json/schema/visitor_spec.ts b/packages/angular_devkit/core/src/json/schema/visitor_spec.ts index 4a556f979e9d..38cde5732e3e 100644 --- a/packages/angular_devkit/core/src/json/schema/visitor_spec.ts +++ b/packages/angular_devkit/core/src/json/schema/visitor_spec.ts @@ -84,13 +84,13 @@ describe('visitJson', () => { expect(result).toEqual({ a: { b: { c: ['_1', '_2', '_3'] } } }); }); - it('goes through all replacements recursively (async)', (done) => { + it('goes through all replacements recursively (async)', async () => { const json = { a: 1 }; const newJson = { b: '' }; const newJson2 = { c: [] }; const newJson3 = [1, 2, 3]; - visitJson(json, (value, ptr) => { + const result = await visitJson(json, (value, ptr) => { if (ptr.endsWith('a')) { return from(Promise.resolve(newJson)); } else if (ptr.endsWith('b')) { @@ -104,12 +104,9 @@ describe('visitJson', () => { } else { return from(Promise.resolve('abc')); } - }) - .toPromise() - .then((result) => { - expect(result).toEqual({ a: { b: { c: ['_1', '_2', '_3'] } } }); - done(); - }, done.fail); + }).toPromise(); + + expect(result).toEqual({ a: { b: { c: ['_1', '_2', '_3'] } } }); }); it('works with schema', () => { diff --git a/packages/angular_devkit/schematics/src/engine/schematic_spec.ts b/packages/angular_devkit/schematics/src/engine/schematic_spec.ts index b5f6fa8a18b9..8beb6ad81e9f 100644 --- a/packages/angular_devkit/schematics/src/engine/schematic_spec.ts +++ b/packages/angular_devkit/schematics/src/engine/schematic_spec.ts @@ -48,7 +48,7 @@ function files(tree: Tree) { } describe('Schematic', () => { - it('works with a rule', (done) => { + it('works with a rule', async () => { let inner: Tree | null = null; const desc: SchematicDescription = { collection, @@ -64,15 +64,12 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()))) - .then((x) => { - expect(files(inner!)).toEqual([]); - expect(files(x)).toEqual(['/a/b/c']); - }) - .then(done, done.fail); + const x = await lastValueFrom(schematic.call({}, observableOf(empty()))); + expect(files(inner!)).toEqual([]); + expect(files(x)).toEqual(['/a/b/c']); }); - it('works with a rule that returns an observable', (done) => { + it('works with a rule that returns an observable', async () => { let inner: Tree | null = null; const desc: SchematicDescription = { collection, @@ -87,16 +84,13 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()))) - .then((x) => { - expect(files(inner!)).toEqual([]); - expect(files(x)).toEqual([]); - expect(inner).not.toBe(x); - }) - .then(done, done.fail); + const x = await lastValueFrom(schematic.call({}, observableOf(empty()))); + expect(files(inner!)).toEqual([]); + expect(files(x)).toEqual([]); + expect(inner!).not.toBe(x); }); - it('works with nested chained function rules', (done) => { + it('works with nested chained function rules', async () => { let chainCount = 0; let oneCount = 0; let twoCount = 0; @@ -137,17 +131,14 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()))) - .then((_x) => { - expect(chainCount).toBe(1); - expect(oneCount).toBe(1); - expect(twoCount).toBe(1); - expect(threeCount).toBe(1); - }) - .then(done, done.fail); + await lastValueFrom(schematic.call({}, observableOf(empty()))); + expect(chainCount).toBe(1); + expect(oneCount).toBe(1); + expect(twoCount).toBe(1); + expect(threeCount).toBe(1); }); - it('can be called with a scope', (done) => { + it('can be called with a scope', async () => { const desc: SchematicDescription = { collection, name: 'test', @@ -159,10 +150,7 @@ describe('Schematic', () => { }; const schematic = new SchematicImpl(desc, desc.factory, null!, engine); - lastValueFrom(schematic.call({}, observableOf(empty()), {}, { scope: 'base' })) - .then((x) => { - expect(files(x)).toEqual(['/base/a/b/c']); - }) - .then(done, done.fail); + const x = await lastValueFrom(schematic.call({}, observableOf(empty()), {}, { scope: 'base' })); + expect(files(x)).toEqual(['/base/a/b/c']); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/base_spec.ts b/packages/angular_devkit/schematics/src/rules/base_spec.ts index 9470a55fcdb1..b3578ca8c00a 100644 --- a/packages/angular_devkit/schematics/src/rules/base_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/base_spec.ts @@ -23,7 +23,7 @@ const context: SchematicContext = { } as {} as SchematicContext; describe('chain', () => { - it('works with simple rules', (done) => { + it('works with simple rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); @@ -35,18 +35,17 @@ describe('chain', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), tree2); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom( + callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context), + ); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); - it('works with async rules', (done) => { + it('works with async rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); @@ -58,15 +57,12 @@ describe('chain', () => { const rule1: Rule = async (tree: Tree) => ((rulesCalled[1] = tree), tree2); const rule2: Rule = async (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callRule(chain([rule0, rule1, rule2]), tree0, context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(chain([rule0, rule1, rule2]), tree0, context)); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); it('works with a sync generator of rules', async () => { @@ -123,7 +119,7 @@ describe('chain', () => { expect(result).toBe(tree3); }); - it('works with observable rules', (done) => { + it('works with observable rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); @@ -135,20 +131,19 @@ describe('chain', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), observableOf(tree2)); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom( + callRule(chain([rule0, rule1, rule2]), observableOf(tree0), context), + ); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); }); describe('apply', () => { - it('works with simple rules', (done) => { + it('works with simple rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); const tree1 = empty(); @@ -160,18 +155,15 @@ describe('apply', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), tree2); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); - it('works with observable rules', (done) => { + it('works with observable rules', async () => { const rulesCalled: Tree[] = []; const tree0 = empty(); const tree1 = empty(); @@ -183,20 +175,17 @@ describe('apply', () => { const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), observableOf(tree2)); const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3); - lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)) - .then((result) => { - expect(result).not.toBe(tree0); - expect(rulesCalled[0]).toBe(tree0); - expect(rulesCalled[1]).toBe(tree1); - expect(rulesCalled[2]).toBe(tree2); - expect(result).toBe(tree3); - }) - .then(done, done.fail); + const result = await lastValueFrom(callSource(apply(source, [rule0, rule1, rule2]), context)); + expect(result).not.toBe(tree0); + expect(rulesCalled[0]).toBe(tree0); + expect(rulesCalled[1]).toBe(tree1); + expect(rulesCalled[2]).toBe(tree2); + expect(result).toBe(tree3); }); }); describe('partitionApplyMerge', () => { - it('works with simple rules', (done) => { + it('works with simple rules', async () => { const host = new virtualFs.test.TestHost({ '/test1': '', '/test2': '', @@ -217,30 +206,26 @@ describe('partitionApplyMerge', () => { return empty(); }; - lastValueFrom( + const result = await lastValueFrom( callRule(partitionApplyMerge(predicate, ruleYes, ruleNo), observableOf(tree), context), - ) - .then((result) => { - expect(result.exists('/test1')).toBe(false); - expect(result.exists('/test2')).toBe(false); - }) - .then(done, done.fail); + ); + expect(result.exists('/test1')).toBe(false); + expect(result.exists('/test2')).toBe(false); }); }); describe('applyToSubtree', () => { - it('works', (done) => { + it('works', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(applyToSubtree('a/b', [move('x')]), observableOf(tree), context)) - .then((result) => { - expect(result.exists('a/b/x/file1')).toBe(true); - expect(result.exists('a/b/x/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom( + callRule(applyToSubtree('a/b', [move('x')]), observableOf(tree), context), + ); + expect(result.exists('a/b/x/file1')).toBe(true); + expect(result.exists('a/b/x/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/call_spec.ts b/packages/angular_devkit/schematics/src/rules/call_spec.ts index f088f03a60b1..3d9a7c8ce2ea 100644 --- a/packages/angular_devkit/schematics/src/rules/call_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/call_spec.ts @@ -25,70 +25,42 @@ const context: SchematicContext = { } as {} as SchematicContext; describe('callSource', () => { - it('errors if undefined source', (done) => { + it('errors if undefined source', async () => { const source0: any = () => undefined; - callSource(source0, context) - .toPromise() - .then( - () => done.fail(), - (err) => { - expect(err).toEqual(new InvalidSourceResultException()); - }, - ) - .then(done, done.fail); + await expectAsync(callSource(source0, context).toPromise()).toBeRejectedWithError( + InvalidSourceResultException, + ); }); - it('errors if invalid source object', (done) => { + it('errors if invalid source object', async () => { const source0: Source = () => ({}) as Tree; - callSource(source0, context) - .toPromise() - .then( - () => done.fail(), - (err) => { - expect(err).toEqual(new InvalidSourceResultException({})); - }, - ) - .then(done, done.fail); + await expectAsync(callSource(source0, context).toPromise()).toBeRejectedWithError( + InvalidSourceResultException, + ); }); - it('errors if Observable of invalid source object', (done) => { + it('errors if Observable of invalid source object', async () => { const source0: Source = () => observableOf({} as Tree); - callSource(source0, context) - .toPromise() - .then( - () => done.fail(), - (err) => { - expect(err).toEqual(new InvalidSourceResultException({})); - }, - ) - .then(done, done.fail); + await expectAsync(callSource(source0, context).toPromise()).toBeRejectedWithError( + InvalidSourceResultException, + ); }); - it('works with a Tree', (done) => { + it('works with a Tree', async () => { const tree0 = empty(); const source0: Source = () => tree0; - - callSource(source0, context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callSource(source0, context).toPromise(); + expect(tree).toBe(tree0); }); - it('works with an Observable', (done) => { + it('works with an Observable', async () => { const tree0 = empty(); const source0: Source = () => observableOf(tree0); - - callSource(source0, context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callSource(source0, context).toPromise(); + expect(tree).toBe(tree0); }); }); @@ -109,39 +81,24 @@ describe('callRule', () => { ); }); - it('works with undefined result', (done) => { + it('works with undefined result', async () => { const tree0 = empty(); const rule0: Rule = () => undefined; - - callRule(rule0, observableOf(tree0), context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callRule(rule0, observableOf(tree0), context).toPromise(); + expect(tree).toBe(tree0); }); - it('works with a Tree', (done) => { + it('works with a Tree', async () => { const tree0 = empty(); const rule0: Rule = () => tree0; - - callRule(rule0, observableOf(tree0), context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callRule(rule0, observableOf(tree0), context).toPromise(); + expect(tree).toBe(tree0); }); - it('works with an Observable', (done) => { + it('works with an Observable', async () => { const tree0 = empty(); const rule0: Rule = () => observableOf(tree0); - - callRule(rule0, observableOf(tree0), context) - .toPromise() - .then((tree) => { - expect(tree).toBe(tree0); - }) - .then(done, done.fail); + const tree = await callRule(rule0, observableOf(tree0), context).toPromise(); + expect(tree).toBe(tree0); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/move_spec.ts b/packages/angular_devkit/schematics/src/rules/move_spec.ts index 3e0d20591375..10a33c693d43 100644 --- a/packages/angular_devkit/schematics/src/rules/move_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/move_spec.ts @@ -16,80 +16,65 @@ import { move } from './move'; const context: SchematicContext = null!; describe('move', () => { - it('works on moving the whole structure', (done) => { + it('works on moving the whole structure', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('sub'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('sub/a/b/file1')).toBe(true); - expect(result.exists('sub/a/b/file2')).toBe(true); - expect(result.exists('sub/a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('sub'), observableOf(tree), context)); + expect(result.exists('sub/a/b/file1')).toBe(true); + expect(result.exists('sub/a/b/file2')).toBe(true); + expect(result.exists('sub/a/c/file3')).toBe(true); }); - it('works on moving a subdirectory structure', (done) => { + it('works on moving a subdirectory structure', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('a/b', 'sub'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('sub/file1')).toBe(true); - expect(result.exists('sub/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('a/b', 'sub'), observableOf(tree), context)); + expect(result.exists('sub/file1')).toBe(true); + expect(result.exists('sub/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); - it('works on moving a directory into a subdirectory of itself', (done) => { + it('works on moving a directory into a subdirectory of itself', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('a/b', 'a/b/c'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('a/b/c/file1')).toBe(true); - expect(result.exists('a/b/c/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('a/b', 'a/b/c'), observableOf(tree), context)); + expect(result.exists('a/b/c/file1')).toBe(true); + expect(result.exists('a/b/c/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); - it('works on moving a directory into a parent of itself', (done) => { + it('works on moving a directory into a parent of itself', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move('a/b', 'a'), observableOf(tree), context)) - .then((result) => { - expect(result.exists('file1')).toBe(false); - expect(result.exists('file2')).toBe(false); - expect(result.exists('a/file1')).toBe(true); - expect(result.exists('a/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move('a/b', 'a'), observableOf(tree), context)); + expect(result.exists('file1')).toBe(false); + expect(result.exists('file2')).toBe(false); + expect(result.exists('a/file1')).toBe(true); + expect(result.exists('a/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); - it('becomes a noop with identical from and to', (done) => { + it('becomes a noop with identical from and to', async () => { const tree = new HostTree(); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); tree.create('a/c/file3', 'hello world'); - lastValueFrom(callRule(move(''), observableOf(tree), context)) - .then((result) => { - expect(result.exists('a/b/file1')).toBe(true); - expect(result.exists('a/b/file2')).toBe(true); - expect(result.exists('a/c/file3')).toBe(true); - }) - .then(done, done.fail); + const result = await lastValueFrom(callRule(move(''), observableOf(tree), context)); + expect(result.exists('a/b/file1')).toBe(true); + expect(result.exists('a/b/file2')).toBe(true); + expect(result.exists('a/c/file3')).toBe(true); }); }); diff --git a/packages/angular_devkit/schematics/src/rules/template_spec.ts b/packages/angular_devkit/schematics/src/rules/template_spec.ts index 076550e6f043..1833d8e7f37c 100644 --- a/packages/angular_devkit/schematics/src/rules/template_spec.ts +++ b/packages/angular_devkit/schematics/src/rules/template_spec.ts @@ -174,7 +174,7 @@ describe('contentTemplate', () => { }); describe('applyTemplateFiles', () => { - it('works with template files exclusively', (done) => { + it('works with template files exclusively', async () => { const tree = new UnitTestTree(new HostTree()); tree.create('a/b/file1', 'hello world'); tree.create('a/b/file2', 'hello world'); @@ -188,20 +188,16 @@ describe('applyTemplateFiles', () => { } as SchematicContext; // Rename all files that contain 'b' to 'hello'. - callRule(applyTemplates({ a: 'foo' }), observableOf(tree), context) - .toPromise() - .then(() => { - expect([...tree.files].sort()).toEqual([ - '/a/b/file1', - '/a/b/file2', - '/a/b/file3', - '/a/b/file__norename__', - '/a/b/filefoo', - '/a/c/file4', - ]); - - expect(tree.readContent('/a/b/file3')).toBe('hello 1 world'); - }) - .then(done, done.fail); + await callRule(applyTemplates({ a: 'foo' }), observableOf(tree), context).toPromise(); + + expect([...tree.files].sort()).toEqual([ + '/a/b/file1', + '/a/b/file2', + '/a/b/file3', + '/a/b/file__norename__', + '/a/b/filefoo', + '/a/c/file4', + ]); + expect(tree.readContent('/a/b/file3')).toBe('hello 1 world'); }); }); diff --git a/packages/angular_devkit/schematics/src/sink/host_spec.ts b/packages/angular_devkit/schematics/src/sink/host_spec.ts index 9a89b82af91d..55d92bea7e7f 100644 --- a/packages/angular_devkit/schematics/src/sink/host_spec.ts +++ b/packages/angular_devkit/schematics/src/sink/host_spec.ts @@ -11,7 +11,7 @@ import { HostCreateTree, HostTree } from '../tree/host-tree'; import { HostSink } from './host'; describe('FileSystemSink', () => { - it('works', (done) => { + it('works', async () => { const host = new virtualFs.test.TestHost({ '/hello': 'world', '/sub/directory/file2': '', @@ -32,19 +32,14 @@ describe('FileSystemSink', () => { const outputHost = new virtualFs.test.TestHost(); const sink = new HostSink(outputHost); - sink - .commit(tree) - .toPromise() - .then(() => { - const tmpFiles = outputHost.files.sort(); - expect(tmpFiles as string[]).toEqual(files); - expect(outputHost.sync.read(normalize('/test')).toString()).toBe('testing testing 1 2'); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + const tmpFiles = outputHost.files.sort(); + expect(tmpFiles as string[]).toEqual(files); + expect(outputHost.sync.read(normalize('/test')).toString()).toBe('testing testing 1 2'); }); describe('complex tests', () => { - beforeEach((done) => { + beforeEach(async () => { // Commit a version of the tree. const host = new virtualFs.test.TestHost({ '/file0': '/file0', @@ -55,10 +50,10 @@ describe('FileSystemSink', () => { const outputHost = new virtualFs.test.TestHost(); const sink = new HostSink(outputHost); - sink.commit(tree).toPromise().then(done, done.fail); + await sink.commit(tree).toPromise(); }); - it('can rename files', (done) => { + it('can rename files', async () => { const host = new virtualFs.test.TestHost({ '/file0': '/file0', }); @@ -66,17 +61,12 @@ describe('FileSystemSink', () => { tree.rename('/file0', '/file1'); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.exists(normalize('/file0'))).toBe(false); - expect(host.sync.exists(normalize('/file1'))).toBe(true); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.exists(normalize('/file0'))).toBe(false); + expect(host.sync.exists(normalize('/file1'))).toBe(true); }); - it('can rename nested files', (done) => { + it('can rename nested files', async () => { const host = new virtualFs.test.TestHost({ '/sub/directory/file2': '', }); @@ -84,17 +74,12 @@ describe('FileSystemSink', () => { tree.rename('/sub/directory/file2', '/another-directory/file2'); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.exists(normalize('/sub/directory/file2'))).toBe(false); - expect(host.sync.exists(normalize('/another-directory/file2'))).toBe(true); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.exists(normalize('/sub/directory/file2'))).toBe(false); + expect(host.sync.exists(normalize('/another-directory/file2'))).toBe(true); }); - it('can delete and create the same file', (done) => { + it('can delete and create the same file', async () => { const host = new virtualFs.test.TestHost({ '/file0': 'world', }); @@ -103,16 +88,11 @@ describe('FileSystemSink', () => { tree.create('/file0', 'hello'); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); }); - it('can rename then create the same file', (done) => { + it('can rename then create the same file', async () => { const host = new virtualFs.test.TestHost({ '/file0': 'world', }); @@ -126,14 +106,9 @@ describe('FileSystemSink', () => { expect(tree.exists('/file0')).toBeTruthy(); const sink = new HostSink(host); - sink - .commit(tree) - .toPromise() - .then(() => { - expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); - expect(virtualFs.fileBufferToString(host.sync.read(normalize('/file1')))).toBe('world'); - }) - .then(done, done.fail); + await sink.commit(tree).toPromise(); + expect(host.sync.read(normalize('/file0')).toString()).toBe('hello'); + expect(virtualFs.fileBufferToString(host.sync.read(normalize('/file1')))).toBe('world'); }); it('can rename then modify the same file', async () => { diff --git a/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts b/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts index 3d785563e663..c3ad3af40c5b 100644 --- a/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts +++ b/packages/angular_devkit/schematics/tools/file-system-engine-host_spec.ts @@ -297,7 +297,7 @@ describe('FileSystemEngineHost', () => { expect(() => collection.createSchematic('private-schematic')).toThrow(); }); - it('allows extra properties on schema', (done) => { + it('allows extra properties on schema', async () => { const engineHost = new FileSystemEngineHost(root); const engine = new SchematicEngine(engineHost); const host = new virtualFs.test.TestHost(); @@ -305,17 +305,12 @@ describe('FileSystemEngineHost', () => { const collection = engine.createCollection('extra-properties'); const schematic = collection.createSchematic('schematic1'); - lastValueFrom(schematic.call({}, observableOf(new HostTree(host)))) - .then((tree) => { - return lastValueFrom(new HostSink(host).commit(tree)); - }) - .then(() => { - expect(host.files as string[]).toEqual(['/extra-schematic']); - expect(host.sync.read(normalize('/extra-schematic')).toString()).toEqual( - 'extra-collection', - ); - }) - .then(done, done.fail); + await lastValueFrom(schematic.call({}, observableOf(new HostTree(host)))).then((tree) => { + return lastValueFrom(new HostSink(host).commit(tree)); + }); + + expect(host.files as string[]).toEqual(['/extra-schematic']); + expect(host.sync.read(normalize('/extra-schematic')).toString()).toEqual('extra-collection'); }); it('discovers a file-based task', () => { diff --git a/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts b/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts index 3d19f401c82b..d5ad2ff6bb25 100644 --- a/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts +++ b/packages/angular_devkit/schematics/tools/workflow/node-workflow_spec.ts @@ -13,17 +13,16 @@ import { NodeWorkflow } from './node-workflow'; describe('NodeWorkflow', () => { // TODO: this test seems to either not work on windows or on linux. - xit('works', (done) => { + xit('works', async () => { const workflow = new NodeWorkflow(new NodeJsSyncHost(), { dryRun: true }); const collection = path.join(__dirname, '../../../../schematics/angular/package.json'); - workflow + await workflow .execute({ collection, schematic: 'ng-new', options: { name: 'workflow-test', version: '6.0.0-rc.4' }, }) - .toPromise() - .then(done, done.fail); + .toPromise(); }); }); diff --git a/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json b/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json index 75cf15fa8e3c..e1f6243c1a46 100644 --- a/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json +++ b/packages/angular_devkit/schematics_cli/blank/project-files/tsconfig.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "baseUrl": "tsconfig", "lib": ["es2018", "dom"], "declaration": true, "module": "commonjs", diff --git a/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json b/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json index ae3b3e55e6a3..79285278e55c 100644 --- a/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json +++ b/packages/angular_devkit/schematics_cli/schematic/files/tsconfig.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "baseUrl": "tsconfig", "lib": ["es2018", "dom"], "module": "commonjs", "moduleResolution": "node", diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 132839480fc5..df63faea2067 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -22,14 +22,14 @@ "homepage": "https://github.com/angular/angular-cli/tree/main/packages/ngtools/webpack", "peerDependencies": { "@angular/compiler-cli": "0.0.0-ANGULAR-FW-PEER-DEP", - "typescript": ">=5.9 <6.0", + "typescript": ">=5.9 <6.1", "webpack": "^5.54.0" }, "devDependencies": { "@angular-devkit/core": "workspace:0.0.0-PLACEHOLDER", "@angular/compiler": "21.2.0-rc.0", "@angular/compiler-cli": "21.2.0-rc.0", - "typescript": "5.9.3", + "typescript": "6.0.0-beta", "webpack": "5.105.3" } } diff --git a/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts b/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts index 2138a0811034..92d28e46d8cd 100644 --- a/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts +++ b/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts @@ -421,6 +421,8 @@ describe('elide_imports', () => { jsxFactory: 'createElement', experimentalDecorators: true, jsx: ts.JsxEmit.React, + // The TS elements are implicitly `any`, because we don't include the React types. + noImplicitAny: false, }; const input = tags.stripIndent` @@ -543,7 +545,7 @@ describe('elide_imports', () => { import { Service } from './service'; export class Foo { - @Decorator() foo: Service; + @Decorator() foo!: Service; } ${dummyNode} @@ -576,7 +578,7 @@ describe('elide_imports', () => { import { Service } from './service'; export class Foo { - _foo: Service; + _foo!: Service; @Decorator() set name(f: Service) { @@ -613,7 +615,7 @@ describe('elide_imports', () => { import { Service } from './service'; export class Foo { - _foo: Service; + _foo!: Service; @Decorator() get name(): Service { @@ -652,7 +654,7 @@ describe('elide_imports', () => { export class Foo { @Decorator() name(): Service { - return undefined; + return undefined!; } } diff --git a/packages/ngtools/webpack/src/transformers/spec_helpers.ts b/packages/ngtools/webpack/src/transformers/spec_helpers.ts index 2b059d02f4e3..bc6e199cb8dd 100644 --- a/packages/ngtools/webpack/src/transformers/spec_helpers.ts +++ b/packages/ngtools/webpack/src/transformers/spec_helpers.ts @@ -28,7 +28,7 @@ export function createTypescriptContext( noEmitOnError: useLibs, allowJs: true, newLine: ts.NewLineKind.LineFeed, - moduleResolution: ts.ModuleResolutionKind.Node10, + moduleResolution: ts.ModuleResolutionKind.Bundler, module: ts.ModuleKind.ES2020, target: ts.ScriptTarget.ES2020, skipLibCheck: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b327bac466a..30a017b18639 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,7 +33,7 @@ importers: version: 21.2.0-rc.0 '@angular/compiler-cli': specifier: 21.2.0-rc.0 - version: 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3) + version: 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta) '@angular/core': specifier: 21.2.0-rc.0 version: 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.1) @@ -42,7 +42,7 @@ importers: version: 21.2.0-rc.0(@angular/common@21.2.0-rc.0(@angular/core@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.1))(@angular/platform-browser@21.2.0-rc.0(@angular/animations@21.2.0-rc.0(@angular/core@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.1)))(@angular/common@21.2.0-rc.0(@angular/core@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.1))(rxjs@7.8.2))(@angular/core@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(rxjs@7.8.2)(zone.js@0.16.1)))(rxjs@7.8.2) '@angular/localize': specifier: 21.2.0-rc.0 - version: 21.2.0-rc.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3))(@angular/compiler@21.2.0-rc.0) + version: 21.2.0-rc.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta))(@angular/compiler@21.2.0-rc.0) '@angular/material': specifier: 21.2.0-rc.0 version: 21.2.0-rc.0(b10e235d889ab235dc2911d6ec167f08) @@ -165,10 +165,10 @@ importers: version: 1.1.9 '@typescript-eslint/eslint-plugin': specifier: 8.56.1 - version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta))(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) '@typescript-eslint/parser': specifier: 8.56.1 - version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) ajv: specifier: 8.18.0 version: 8.18.0 @@ -189,7 +189,7 @@ importers: version: 10.1.8(eslint@10.0.2(jiti@2.6.1)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta))(eslint@10.0.2(jiti@2.6.1)) express: specifier: 5.2.1 version: 5.2.1 @@ -249,7 +249,7 @@ importers: version: 3.8.1 puppeteer: specifier: 24.37.5 - version: 24.37.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + version: 24.37.5(bufferutil@4.1.0)(typescript@6.0.0-beta)(utf-8-validate@6.0.6) quicktype-core: specifier: 23.2.6 version: 23.2.6(encoding@0.1.13) @@ -261,7 +261,7 @@ importers: version: 3.1.0 rollup-plugin-dts: specifier: 6.3.0 - version: 6.3.0(rollup@4.59.0)(typescript@5.9.3) + version: 6.3.0(rollup@4.59.0)(typescript@6.0.0-beta) rollup-plugin-sourcemaps2: specifier: 0.5.6 version: 0.5.6(@types/node@22.19.13)(rollup@4.59.0) @@ -275,8 +275,8 @@ importers: specifier: 2.8.1 version: 2.8.1 typescript: - specifier: 5.9.3 - version: 5.9.3 + specifier: 6.0.0-beta + version: 6.0.0-beta undici: specifier: 7.22.0 version: 7.22.0 @@ -418,7 +418,7 @@ importers: version: 4.4.2 ng-packagr: specifier: 22.0.0-next.0 - version: 22.0.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) + version: 22.0.0-next.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta))(tslib@2.8.1)(typescript@6.0.0-beta) postcss: specifier: 8.5.6 version: 8.5.6 @@ -660,7 +660,7 @@ importers: version: 8.5.6 postcss-loader: specifier: 8.2.1 - version: 8.2.1(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.3(esbuild@0.27.3)) + version: 8.2.1(postcss@8.5.6)(typescript@6.0.0-beta)(webpack@5.105.3(esbuild@0.27.3)) resolve-url-loader: specifier: 5.0.0 version: 5.0.0 @@ -715,7 +715,7 @@ importers: version: 3.0.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) ng-packagr: specifier: 22.0.0-next.0 - version: 22.0.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) + version: 22.0.0-next.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta))(tslib@2.8.1)(typescript@6.0.0-beta) undici: specifier: 7.22.0 version: 7.22.0 @@ -811,10 +811,10 @@ importers: version: 21.2.0-rc.0 '@angular/compiler-cli': specifier: 21.2.0-rc.0 - version: 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3) + version: 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta) typescript: - specifier: 5.9.3 - version: 5.9.3 + specifier: 6.0.0-beta + version: 6.0.0-beta webpack: specifier: 5.105.3 version: 5.105.3(esbuild@0.27.3) @@ -7857,6 +7857,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@6.0.0-beta: + resolution: {integrity: sha512-CldZdztDpQRLM1HC6WDQjQkQN5Ub5zRau737a1diGh3lPmb9oRsaWHk1y5iqK0o7+1bNJ0oXfEGRkAogFZBL+Q==} + engines: {node: '>=14.17'} + hasBin: true + ua-parser-js@0.7.41: resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} hasBin: true @@ -8485,7 +8490,7 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3)': + '@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta)': dependencies: '@angular/compiler': 21.2.0-rc.0 '@babel/core': 7.29.0 @@ -8497,7 +8502,7 @@ snapshots: tslib: 2.8.1 yargs: 18.0.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.0-beta transitivePeerDependencies: - supports-color @@ -8522,10 +8527,10 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/localize@21.2.0-rc.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3))(@angular/compiler@21.2.0-rc.0)': + '@angular/localize@21.2.0-rc.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta))(@angular/compiler@21.2.0-rc.0)': dependencies: '@angular/compiler': 21.2.0-rc.0 - '@angular/compiler-cli': 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3) + '@angular/compiler-cli': 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta) '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 tinyglobby: 0.2.15 @@ -11383,40 +11388,40 @@ snapshots: '@types/node': 22.19.13 optional: true - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta))(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/type-utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) '@typescript-eslint/visitor-keys': 8.56.1 eslint: 10.0.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.4.0(typescript@6.0.0-beta) + typescript: 6.0.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta)': dependencies: '@typescript-eslint/scope-manager': 8.56.1 '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.1(typescript@6.0.0-beta) '@typescript-eslint/visitor-keys': 8.56.1 debug: 4.4.3(supports-color@10.2.2) eslint: 10.0.2(jiti@2.6.1) - typescript: 5.9.3 + typescript: 6.0.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.56.1(typescript@6.0.0-beta)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@6.0.0-beta) '@typescript-eslint/types': 8.56.1 debug: 4.4.3(supports-color@10.2.2) - typescript: 5.9.3 + typescript: 6.0.0-beta transitivePeerDependencies: - supports-color @@ -11425,47 +11430,47 @@ snapshots: '@typescript-eslint/types': 8.56.1 '@typescript-eslint/visitor-keys': 8.56.1 - '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.56.1(typescript@6.0.0-beta)': dependencies: - typescript: 5.9.3 + typescript: 6.0.0-beta - '@typescript-eslint/type-utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta)': dependencies: '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.1(typescript@6.0.0-beta) + '@typescript-eslint/utils': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) debug: 4.4.3(supports-color@10.2.2) eslint: 10.0.2(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.4.0(typescript@6.0.0-beta) + typescript: 6.0.0-beta transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.56.1': {} - '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.56.1(typescript@6.0.0-beta)': dependencies: - '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) + '@typescript-eslint/project-service': 8.56.1(typescript@6.0.0-beta) + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@6.0.0-beta) '@typescript-eslint/types': 8.56.1 '@typescript-eslint/visitor-keys': 8.56.1 debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.4 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.4.0(typescript@6.0.0-beta) + typescript: 6.0.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.56.1 '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.1(typescript@6.0.0-beta) eslint: 10.0.2(jiti@2.6.1) - typescript: 5.9.3 + typescript: 6.0.0-beta transitivePeerDependencies: - supports-color @@ -12540,14 +12545,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.9.3): + cosmiconfig@9.0.0(typescript@6.0.0-beta): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.0-beta cross-fetch@4.1.0(encoding@0.1.13): dependencies: @@ -13035,17 +13040,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.0.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta))(eslint-import-resolver-node@0.3.9)(eslint@10.0.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) eslint: 10.0.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta))(eslint@10.0.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13056,7 +13061,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.0.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.0.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta))(eslint-import-resolver-node@0.3.9)(eslint@10.0.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13068,7 +13073,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@6.0.0-beta) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14807,10 +14812,10 @@ snapshots: netmask@2.0.2: {} - ng-packagr@22.0.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): + ng-packagr@22.0.0-next.0(@angular/compiler-cli@21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta))(tslib@2.8.1)(typescript@6.0.0-beta): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@5.9.3) + '@angular/compiler-cli': 21.2.0-rc.0(@angular/compiler@21.2.0-rc.0)(typescript@6.0.0-beta) '@rollup/plugin-json': 6.1.0(rollup@4.59.0) '@rollup/wasm-node': 4.59.0 ajv: 8.18.0 @@ -14827,12 +14832,12 @@ snapshots: ora: 9.3.0 piscina: 5.1.4 postcss: 8.5.6 - rollup-plugin-dts: 6.3.0(rollup@4.59.0)(typescript@5.9.3) + rollup-plugin-dts: 6.3.0(rollup@4.59.0)(typescript@6.0.0-beta) rxjs: 7.8.2 sass: 1.97.3 tinyglobby: 0.2.15 tslib: 2.8.1 - typescript: 5.9.3 + typescript: 6.0.0-beta optionalDependencies: rollup: 4.59.0 @@ -15269,9 +15274,9 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-loader@8.2.1(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.3(esbuild@0.27.3)): + postcss-loader@8.2.1(postcss@8.5.6)(typescript@6.0.0-beta)(webpack@5.105.3(esbuild@0.27.3)): dependencies: - cosmiconfig: 9.0.0(typescript@5.9.3) + cosmiconfig: 9.0.0(typescript@6.0.0-beta) jiti: 2.6.1 postcss: 8.5.6 semver: 7.7.4 @@ -15424,11 +15429,11 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.37.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6): + puppeteer@24.37.5(bufferutil@4.1.0)(typescript@6.0.0-beta)(utf-8-validate@6.0.6): dependencies: '@puppeteer/browsers': 2.13.0 chromium-bidi: 14.0.0(devtools-protocol@0.0.1566079) - cosmiconfig: 9.0.0(typescript@5.9.3) + cosmiconfig: 9.0.0(typescript@6.0.0-beta) devtools-protocol: 0.0.1566079 puppeteer-core: 24.37.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) typed-query-selector: 2.12.1 @@ -15680,11 +15685,11 @@ snapshots: semver: 7.7.4 spdx-expression-validate: 2.0.0 - rollup-plugin-dts@6.3.0(rollup@4.59.0)(typescript@5.9.3): + rollup-plugin-dts@6.3.0(rollup@4.59.0)(typescript@6.0.0-beta): dependencies: magic-string: 0.30.21 rollup: 4.59.0 - typescript: 5.9.3 + typescript: 6.0.0-beta optionalDependencies: '@babel/code-frame': 7.29.0 @@ -16435,9 +16440,9 @@ snapshots: dependencies: tslib: 2.8.1 - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.4.0(typescript@6.0.0-beta): dependencies: - typescript: 5.9.3 + typescript: 6.0.0-beta tsconfig-paths@3.15.0: dependencies: @@ -16535,6 +16540,8 @@ snapshots: typescript@5.9.3: {} + typescript@6.0.0-beta: {} + ua-parser-js@0.7.41: {} ua-parser-js@1.0.41: {} diff --git a/tests/e2e/assets/ssr-project-webpack/tsconfig.json b/tests/e2e/assets/ssr-project-webpack/tsconfig.json index bbc051d01524..9fbbe86694c4 100644 --- a/tests/e2e/assets/ssr-project-webpack/tsconfig.json +++ b/tests/e2e/assets/ssr-project-webpack/tsconfig.json @@ -2,7 +2,6 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", "outDir": "./dist/out-tsc", "strict": true, "noImplicitOverride": true,