mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-17 11:03:53 +08:00
fix(@angular-devkit/build-angular): only collect coverage from files under sourceRoot
(#11974)
In some cases when having libraries within the workspace this is causing a `Maximum call stack size exceeded`, Also for libraries coverage should be collected with the respective `ng test` Closes #11934
This commit is contained in:
parent
7f67c64be1
commit
7eb080362f
@ -74,6 +74,7 @@ export interface WebpackTestOptions extends BuildOptions {
|
|||||||
export interface WebpackConfigOptions<T = BuildOptions> {
|
export interface WebpackConfigOptions<T = BuildOptions> {
|
||||||
root: string;
|
root: string;
|
||||||
projectRoot: string;
|
projectRoot: string;
|
||||||
|
sourceRoot?: string;
|
||||||
buildOptions: T;
|
buildOptions: T;
|
||||||
tsConfig: ts.ParsedCommandLine;
|
tsConfig: ts.ParsedCommandLine;
|
||||||
tsConfigPath: string;
|
tsConfigPath: string;
|
||||||
|
@ -23,7 +23,7 @@ import { WebpackConfigOptions, WebpackTestOptions } from '../build-options';
|
|||||||
export function getTestConfig(
|
export function getTestConfig(
|
||||||
wco: WebpackConfigOptions<WebpackTestOptions>,
|
wco: WebpackConfigOptions<WebpackTestOptions>,
|
||||||
): webpack.Configuration {
|
): webpack.Configuration {
|
||||||
const { root, buildOptions } = wco;
|
const { root, buildOptions, sourceRoot: include } = wco;
|
||||||
|
|
||||||
const extraRules: webpack.Rule[] = [];
|
const extraRules: webpack.Rule[] = [];
|
||||||
const extraPlugins: webpack.Plugin[] = [];
|
const extraPlugins: webpack.Plugin[] = [];
|
||||||
@ -46,10 +46,12 @@ export function getTestConfig(
|
|||||||
}
|
}
|
||||||
|
|
||||||
extraRules.push({
|
extraRules.push({
|
||||||
test: /\.(js|ts)$/, loader: 'istanbul-instrumenter-loader',
|
test: /\.(js|ts)$/,
|
||||||
|
loader: 'istanbul-instrumenter-loader',
|
||||||
options: { esModules: true },
|
options: { esModules: true },
|
||||||
enforce: 'post',
|
enforce: 'post',
|
||||||
exclude,
|
exclude,
|
||||||
|
include,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,11 +71,13 @@ export class KarmaBuilder implements Builder<KarmaBuilderSchema> {
|
|||||||
karmaOptions.browsers = options.browsers.split(',');
|
karmaOptions.browsers = options.browsers.split(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sourceRoot = builderConfig.sourceRoot && resolve(root, builderConfig.sourceRoot);
|
||||||
|
|
||||||
karmaOptions.buildWebpack = {
|
karmaOptions.buildWebpack = {
|
||||||
root: getSystemPath(root),
|
root: getSystemPath(root),
|
||||||
projectRoot: getSystemPath(projectRoot),
|
projectRoot: getSystemPath(projectRoot),
|
||||||
options: options as NormalizedKarmaBuilderSchema,
|
options: options as NormalizedKarmaBuilderSchema,
|
||||||
webpackConfig: this._buildWebpackConfig(root, projectRoot, host,
|
webpackConfig: this._buildWebpackConfig(root, projectRoot, sourceRoot, host,
|
||||||
options as NormalizedKarmaBuilderSchema),
|
options as NormalizedKarmaBuilderSchema),
|
||||||
// Pass onto Karma to emit BuildEvents.
|
// Pass onto Karma to emit BuildEvents.
|
||||||
successCb: () => obs.next({ success: true }),
|
successCb: () => obs.next({ success: true }),
|
||||||
@ -108,6 +110,7 @@ export class KarmaBuilder implements Builder<KarmaBuilderSchema> {
|
|||||||
private _buildWebpackConfig(
|
private _buildWebpackConfig(
|
||||||
root: Path,
|
root: Path,
|
||||||
projectRoot: Path,
|
projectRoot: Path,
|
||||||
|
sourceRoot: Path | undefined,
|
||||||
host: virtualFs.Host<fs.Stats>,
|
host: virtualFs.Host<fs.Stats>,
|
||||||
options: NormalizedKarmaBuilderSchema,
|
options: NormalizedKarmaBuilderSchema,
|
||||||
) {
|
) {
|
||||||
@ -130,6 +133,7 @@ export class KarmaBuilder implements Builder<KarmaBuilderSchema> {
|
|||||||
wco = {
|
wco = {
|
||||||
root: getSystemPath(root),
|
root: getSystemPath(root),
|
||||||
projectRoot: getSystemPath(projectRoot),
|
projectRoot: getSystemPath(projectRoot),
|
||||||
|
sourceRoot: sourceRoot && getSystemPath(sourceRoot),
|
||||||
// TODO: use only this.options, it contains all flags and configs items already.
|
// TODO: use only this.options, it contains all flags and configs items already.
|
||||||
buildOptions: compatOptions,
|
buildOptions: compatOptions,
|
||||||
tsConfig,
|
tsConfig,
|
||||||
|
@ -56,4 +56,52 @@ describe('Karma Builder code coverage', () => {
|
|||||||
}),
|
}),
|
||||||
).toPromise().then(done, done.fail);
|
).toPromise().then(done, done.fail);
|
||||||
}, 120000);
|
}, 120000);
|
||||||
|
|
||||||
|
it(`should collect coverage from paths in 'sourceRoot'`, (done) => {
|
||||||
|
const overrides: Partial<NormalizedKarmaBuilderSchema> = { codeCoverage: true };
|
||||||
|
|
||||||
|
const files: { [path: string]: string } = {
|
||||||
|
'./dist/my-lib/index.d.ts': `
|
||||||
|
export declare const title = 'app';
|
||||||
|
`,
|
||||||
|
'./dist/my-lib/index.js': `
|
||||||
|
export const title = 'app';
|
||||||
|
`,
|
||||||
|
'./src/app/app.component.ts': `
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
import { title } from 'my-lib';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-root',
|
||||||
|
templateUrl: './app.component.html',
|
||||||
|
styleUrls: ['./app.component.css']
|
||||||
|
})
|
||||||
|
export class AppComponent {
|
||||||
|
title = title;
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
};
|
||||||
|
|
||||||
|
host.writeMultipleFiles(files);
|
||||||
|
|
||||||
|
host.replaceInFile('tsconfig.json', /"baseUrl": ".\/",/, `
|
||||||
|
"baseUrl": "./",
|
||||||
|
"paths": {
|
||||||
|
"my-lib": [
|
||||||
|
"./dist/my-lib"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
`);
|
||||||
|
|
||||||
|
runTargetSpec(host, karmaTargetSpec, overrides).pipe(
|
||||||
|
// It seems like the coverage files take a while being written to disk, so we wait 500ms here.
|
||||||
|
debounceTime(500),
|
||||||
|
tap(buildEvent => {
|
||||||
|
expect(buildEvent.success).toBe(true);
|
||||||
|
expect(host.scopedSync().exists(coverageFilePath)).toBe(true);
|
||||||
|
const content = virtualFs.fileBufferToString(host.scopedSync().read(coverageFilePath));
|
||||||
|
expect(content).not.toContain('my-lib');
|
||||||
|
}),
|
||||||
|
).toPromise().then(done, done.fail);
|
||||||
|
}, 120000);
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user