diff --git a/packages/angular_devkit/build_angular/src/builders/karma/application_builder.ts b/packages/angular_devkit/build_angular/src/builders/karma/application_builder.ts index cf67f76be5e3..b80ae54e896b 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/application_builder.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/application_builder.ts @@ -12,7 +12,6 @@ import { ResultKind, buildApplicationInternal, emitFilesToDisk, - purgeStaleBuildCache, } from '@angular/build/private'; import { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; import { randomUUID } from 'crypto'; @@ -22,7 +21,6 @@ import * as path from 'path'; import { Observable, catchError, defaultIfEmpty, from, of, switchMap } from 'rxjs'; import { Configuration } from 'webpack'; import { ExecutionTransformer } from '../../transforms'; -import { readTsconfig } from '../../utils/read-tsconfig'; import { OutputHashing } from '../browser-esbuild/schema'; import { findTests } from './find-tests'; import { Schema as KarmaBuilderOptions } from './schema'; @@ -110,18 +108,6 @@ async function collectEntrypoints( entryPoints.add('zone.js/testing'); } - const tsConfigPath = path.resolve(context.workspaceRoot, options.tsConfig); - const tsConfig = await readTsconfig(tsConfigPath); - - const localizePackageInitEntryPoint = '@angular/localize/init'; - const hasLocalizeType = tsConfig.options.types?.some( - (t) => t === '@angular/localize' || t === localizePackageInitEntryPoint, - ); - - if (hasLocalizeType) { - polyfills.push(localizePackageInitEntryPoint); - } - return [entryPoints, polyfills]; } diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/code-coverage_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/code-coverage_spec.ts index df27c1f067b5..a19d3005fbdb 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/code-coverage_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/code-coverage_spec.ts @@ -29,8 +29,8 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget, isAppli }); } - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('should generate coverage report when file was previously processed by Babel', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/errors_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/errors_spec.ts index c1ff1a15bd06..366cc2aa20a1 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/errors_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/errors_spec.ts @@ -11,8 +11,8 @@ import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { describe('Behavior: "Errors"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('should fail when there is a TypeScript error', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/module-cjs_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/module-cjs_spec.ts index 3737944c351d..d5c1c7b3d134 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/module-cjs_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/module-cjs_spec.ts @@ -11,8 +11,8 @@ import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { describe('Behavior: "module commonjs"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('should work when module is commonjs', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/rebuilds_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/rebuilds_spec.ts index 8575cbbffa84..542bdca20c81 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/rebuilds_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/behavior/rebuilds_spec.ts @@ -18,8 +18,8 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget, isAppli }); } - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('recovers from compilation failures in watch mode', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/assets_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/assets_spec.ts index b900dca8321d..a1a2005c8ab0 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/assets_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/assets_spec.ts @@ -11,8 +11,8 @@ import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { describe('Option: "assets"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('includes assets', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/builder-mode_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/builder-mode_spec.ts index 46880291928c..e37deb354aea 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/builder-mode_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/builder-mode_spec.ts @@ -14,13 +14,15 @@ const ESBUILD_LOG_TEXT = 'Application bundle generation complete.'; describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget, isApplicationTarget) => { describe('option: "builderMode"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('"application" always uses esbuild', async () => { harness.useTarget('test', { ...BASE_OPTIONS, + // Must explicitly provide localize polyfill: + polyfills: ['zone.js', '@angular/localize/init', 'zone.js/testing'], builderMode: BuilderMode.Application, }); diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage-exclude_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage-exclude_spec.ts index 4163a5db09d2..f04352d0c90a 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage-exclude_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage-exclude_spec.ts @@ -26,8 +26,8 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget, isAppli }); } - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('should exclude file from coverage when set', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts index 53c519ae5a7d..6eba93914f85 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/code-coverage_spec.ts @@ -27,8 +27,8 @@ describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget, isAppli }); } - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it('should generate coverage report when option is set to true', async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/exclude_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/exclude_spec.ts index e2cc3221a2e3..08623b689a7e 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/exclude_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/exclude_spec.ts @@ -11,8 +11,8 @@ import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { describe('Option: "exclude"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); beforeEach(async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/include_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/include_spec.ts index 9dd61aa52516..89ad4e307286 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/include_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/include_spec.ts @@ -11,8 +11,8 @@ import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { describe('Option: "include"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it(`should fail when includes doesn't match any files`, async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/styles_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/styles_spec.ts index 9eea6f4c1d80..909fcb1a1e09 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/styles_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/styles_spec.ts @@ -11,8 +11,8 @@ import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget) => { describe('Option: "styles"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); it(`processes 'styles.css' styles`, async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/web-worker-tsconfig_spec.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/web-worker-tsconfig_spec.ts index 719ecc318b94..6c3b74cf0a5e 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/options/web-worker-tsconfig_spec.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/options/web-worker-tsconfig_spec.ts @@ -11,8 +11,8 @@ import { BASE_OPTIONS, KARMA_BUILDER_INFO, describeKarmaBuilder } from '../setup describeKarmaBuilder(execute, KARMA_BUILDER_INFO, (harness, setupTarget, isApplicationBuilder) => { describe('Option: "webWorkerTsConfig"', () => { - beforeEach(() => { - setupTarget(harness); + beforeEach(async () => { + await setupTarget(harness); }); beforeEach(async () => { diff --git a/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts b/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts index 23d6f3a0f688..d78f691bef91 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/tests/setup.ts @@ -35,7 +35,7 @@ export const KARMA_BUILDER_INFO = Object.freeze({ * Also disables progress reporting to minimize logging output. */ export const BASE_OPTIONS = Object.freeze({ - polyfills: ['zone.js', 'zone.js/testing'], + polyfills: ['./src/polyfills', 'zone.js/testing'], tsConfig: 'src/tsconfig.spec.json', karmaConfig: 'karma.conf.js', browsers: 'ChromeHeadlessCI', @@ -62,10 +62,10 @@ function getCachedSchema(options: { schemaPath: string }): json.schema.JsonSchem * @param harness The builder harness to use when setting up the browser builder target * @param extraOptions The additional options that should be used when executing the target. */ -export function setupBrowserTarget( +export async function setupBrowserTarget( harness: BuilderHarness, extraOptions?: Partial, -): void { +): Promise { const browserSchema = getCachedSchema(BROWSER_BUILDER_INFO); harness.withBuilderTarget( @@ -117,10 +117,10 @@ export const APPLICATION_BUILDER_INFO = Object.freeze({ * @param harness The builder harness to use when setting up the application builder target * @param extraOptions The additional options that should be used when executing the target. */ -export function setupApplicationTarget( +export async function setupApplicationTarget( harness: BuilderHarness, extraOptions?: Partial, -): void { +): Promise { const applicationSchema = getCachedSchema(APPLICATION_BUILDER_INFO); harness.withBuilderTarget( @@ -135,6 +135,9 @@ export function setupApplicationTarget( optionSchema: applicationSchema, }, ); + + // For application-builder based targets, the localize polyfill needs to be explicit. + await harness.appendToFile('src/polyfills.ts', `import '@angular/localize/init';`); } /** Runs the test against both an application- and a browser-builder context. */