From 05a98c02924f656be3257d5f459ae88c1ae29fba Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 26 Sep 2022 10:41:08 +0000 Subject: [PATCH] feat(@angular-devkit/build-angular): karma builder `main` option is now optional The Karma builder `main` option is now optional. The default test bootstrapping is injected automatically in the bundle. --- .../angular_devkit/build_angular/index.md | 2 +- .../build_angular/src/builders/karma/index.ts | 31 +++++++++++++++++++ .../src/builders/karma/schema.json | 2 +- .../src/builders/karma/tests/setup.ts | 1 - .../src/webpack/configs/common.ts | 2 +- .../test/hello-world-app/angular.json | 1 - .../test/hello-world-app/src/test.ts | 22 ------------- .../hello-world-app/src/tsconfig.spec.json | 1 - .../hello-world-lib/projects/lib/src/test.ts | 23 -------------- .../projects/lib/tsconfig.lib.json | 1 - .../projects/lib/tsconfig.spec.json | 3 -- 11 files changed, 34 insertions(+), 55 deletions(-) delete mode 100644 packages/angular_devkit/build_angular/test/hello-world-app/src/test.ts delete mode 100644 packages/angular_devkit/build_angular/test/hello-world-lib/projects/lib/src/test.ts diff --git a/goldens/public-api/angular_devkit/build_angular/index.md b/goldens/public-api/angular_devkit/build_angular/index.md index e7a6a890e1a1..5a7c1a144a75 100644 --- a/goldens/public-api/angular_devkit/build_angular/index.md +++ b/goldens/public-api/angular_devkit/build_angular/index.md @@ -178,7 +178,7 @@ export interface KarmaBuilderOptions { include?: string[]; inlineStyleLanguage?: InlineStyleLanguage_2; karmaConfig: string; - main: string; + main?: string; poll?: number; polyfills?: Polyfills_2; preserveSymlinks?: boolean; diff --git a/packages/angular_devkit/build_angular/src/builders/karma/index.ts b/packages/angular_devkit/build_angular/src/builders/karma/index.ts index d8ca058507d8..f406fa769047 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/karma/index.ts @@ -111,6 +111,17 @@ export function execute( throw new Error('The builder requires a target.'); } + if (!options.main) { + webpackConfig.entry ??= {}; + if (typeof webpackConfig.entry === 'object' && !Array.isArray(webpackConfig.entry)) { + if (Array.isArray(webpackConfig.entry['main'])) { + webpackConfig.entry['main'].push(getBuiltInMainFile()); + } else { + webpackConfig.entry['main'] = [getBuiltInMainFile()]; + } + } + } + const projectMetadata = await context.getProjectMetadata(projectName); const sourceRoot = (projectMetadata.sourceRoot ?? projectMetadata.root ?? '') as string; @@ -169,3 +180,23 @@ export function execute( export { KarmaBuilderOptions }; export default createBuilder & KarmaBuilderOptions>(execute); + +function getBuiltInMainFile(): string { + const content = Buffer.from( + ` + import { getTestBed } from '@angular/core/testing'; + import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, + } from '@angular/platform-browser-dynamic/testing'; + + // Initialize the Angular testing environment. + getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { + errorOnUnknownElements: true, + errorOnUnknownProperties: true + }); +`, + ).toString('base64'); + + return `ng-virtual-main.js!=!data:text/javascript;base64,${content}`; +} diff --git a/packages/angular_devkit/build_angular/src/builders/karma/schema.json b/packages/angular_devkit/build_angular/src/builders/karma/schema.json index 35a9de5054ee..1d55ee6434c9 100644 --- a/packages/angular_devkit/build_angular/src/builders/karma/schema.json +++ b/packages/angular_devkit/build_angular/src/builders/karma/schema.json @@ -255,7 +255,7 @@ } }, "additionalProperties": false, - "required": ["main", "tsConfig", "karmaConfig"], + "required": ["tsConfig", "karmaConfig"], "definitions": { "assetPattern": { "oneOf": [ 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 03693ac3e9b3..3197a12e8aba 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 @@ -20,7 +20,6 @@ export const KARMA_BUILDER_INFO = Object.freeze({ * Also disables progress reporting to minimize logging output. */ export const BASE_OPTIONS = Object.freeze({ - main: 'src/test.ts', polyfills: 'src/polyfills.ts', tsConfig: 'src/tsconfig.spec.json', karmaConfig: 'karma.conf.js', diff --git a/packages/angular_devkit/build_angular/src/webpack/configs/common.ts b/packages/angular_devkit/build_angular/src/webpack/configs/common.ts index 98f5dd550c50..2b585b8e71e5 100644 --- a/packages/angular_devkit/build_angular/src/webpack/configs/common.ts +++ b/packages/angular_devkit/build_angular/src/webpack/configs/common.ts @@ -130,7 +130,7 @@ export async function getCommonConfig(wco: WebpackConfigOptions): Promise