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..49d0633f7a21 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,8 +20,7 @@ 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', + polyfills: ['zone.js', 'zone.js/testing', '@angular/localize/init'], tsConfig: 'src/tsconfig.spec.json', karmaConfig: 'karma.conf.js', browsers: 'ChromeHeadlessCI', 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 { '/projects/foo/src/index.html', '/projects/foo/src/main.ts', '/projects/foo/src/styles.css', - '/projects/foo/src/test.ts', '/projects/foo/src/app/app.module.ts', '/projects/foo/src/app/app.component.css', '/projects/foo/src/app/app.component.html', @@ -164,8 +163,7 @@ describe('Application Schematic', () => { const tree = await schematicRunner .runSchematicAsync('application', defaultOptions, workspaceTree) .toPromise(); - const { files, extends: _extends } = readJsonFile(tree, '/projects/foo/tsconfig.spec.json'); - expect(files).toEqual(['src/test.ts']); + const { extends: _extends } = readJsonFile(tree, '/projects/foo/tsconfig.spec.json'); expect(_extends).toBe('../../tsconfig.json'); }); @@ -255,7 +253,6 @@ describe('Application Schematic', () => { [ '/projects/foo/tsconfig.spec.json', '/projects/foo/karma.conf.js', - '/projects/foo/src/test.ts', '/projects/foo/src/app/app.component.css', '/projects/foo/src/app/app.component.html', '/projects/foo/src/app/app.component.spec.ts', @@ -285,7 +282,6 @@ describe('Application Schematic', () => { [ '/projects/foo/tsconfig.spec.json', '/projects/foo/karma.conf.js', - '/projects/foo/src/test.ts', '/projects/foo/src/app/app.component.html', '/projects/foo/src/app/app.component.spec.ts', ].forEach((x) => expect(files).not.toContain(x)); @@ -315,7 +311,6 @@ describe('Application Schematic', () => { [ '/projects/foo/tsconfig.spec.json', '/projects/foo/karma.conf.js', - '/projects/foo/src/test.ts', '/projects/foo/src/app/app.component.css', '/projects/foo/src/app/app.component.spec.ts', ].forEach((x) => expect(files).not.toContain(x)); @@ -410,7 +405,6 @@ describe('Application Schematic', () => { '/src/index.html', '/src/main.ts', '/src/styles.css', - '/src/test.ts', '/src/app/app.module.ts', '/src/app/app.component.css', '/src/app/app.component.html', @@ -436,7 +430,6 @@ describe('Application Schematic', () => { expect(buildOpt.tsConfig).toEqual('tsconfig.app.json'); const testOpt = prj.architect.test.options; - expect(testOpt.main).toEqual('src/test.ts'); expect(testOpt.tsConfig).toEqual('tsconfig.spec.json'); expect(testOpt.karmaConfig).toEqual('karma.conf.js'); expect(testOpt.styles).toEqual(['src/styles.css']); @@ -510,13 +503,13 @@ describe('Application Schematic', () => { expect(appTsConfig.extends).toEqual('./tsconfig.json'); const specTsConfig = readJsonFile(tree, '/tsconfig.spec.json'); expect(specTsConfig.extends).toEqual('./tsconfig.json'); - expect(specTsConfig.files).toEqual(['src/test.ts']); }); it(`should create correct paths when 'newProjectRoot' is blank`, async () => { const workspaceTree = await schematicRunner .runSchematicAsync('workspace', { ...workspaceOptions, newProjectRoot: '' }) .toPromise(); + const options = { ...defaultOptions, projectRoot: undefined }; const tree = await schematicRunner .runSchematicAsync('application', options, workspaceTree) diff --git a/packages/schematics/angular/library/files/src/test.ts.template b/packages/schematics/angular/library/files/src/test.ts.template deleted file mode 100644 index 0e689016906e..000000000000 --- a/packages/schematics/angular/library/files/src/test.ts.template +++ /dev/null @@ -1,12 +0,0 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files -import { getTestBed } from '@angular/core/testing'; -import { - BrowserDynamicTestingModule, - platformBrowserDynamicTesting -} from '@angular/platform-browser-dynamic/testing'; - -// First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { - errorOnUnknownElements: true, - errorOnUnknownProperties: true -}); diff --git a/packages/schematics/angular/library/files/tsconfig.lib.json.template b/packages/schematics/angular/library/files/tsconfig.lib.json.template index 353a24b4ac75..d8d4b0b23347 100644 --- a/packages/schematics/angular/library/files/tsconfig.lib.json.template +++ b/packages/schematics/angular/library/files/tsconfig.lib.json.template @@ -9,7 +9,6 @@ "types": [] }, "exclude": [ - "src/test.ts", "**/*.spec.ts" ] } diff --git a/packages/schematics/angular/library/files/tsconfig.spec.json.template b/packages/schematics/angular/library/files/tsconfig.spec.json.template index 2108b9b916f1..2490345bafff 100644 --- a/packages/schematics/angular/library/files/tsconfig.spec.json.template +++ b/packages/schematics/angular/library/files/tsconfig.spec.json.template @@ -7,9 +7,6 @@ "jasmine" ] }, - "files": [ - "src/test.ts" - ], "include": [ "**/*.spec.ts", "**/*.d.ts" diff --git a/packages/schematics/angular/library/index.ts b/packages/schematics/angular/library/index.ts index 69524593bcc2..70e77f788836 100644 --- a/packages/schematics/angular/library/index.ts +++ b/packages/schematics/angular/library/index.ts @@ -108,7 +108,6 @@ function addLibToWorkspaceFile( test: { builder: Builders.Karma, options: { - main: `${projectRoot}/src/test.ts`, tsConfig: `${projectRoot}/tsconfig.spec.json`, polyfills: ['zone.js', 'zone.js/testing'], karmaConfig: `${projectRoot}/karma.conf.js`, diff --git a/packages/schematics/angular/library/index_spec.ts b/packages/schematics/angular/library/index_spec.ts index 3b775211a904..e2ec7a47b2a5 100644 --- a/packages/schematics/angular/library/index_spec.ts +++ b/packages/schematics/angular/library/index_spec.ts @@ -57,7 +57,6 @@ describe('Library Schematic', () => { '/projects/foo/README.md', '/projects/foo/tsconfig.lib.json', '/projects/foo/tsconfig.lib.prod.json', - '/projects/foo/src/test.ts', '/projects/foo/src/my-index.ts', '/projects/foo/src/lib/foo.module.ts', '/projects/foo/src/lib/foo.component.spec.ts',