mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-15 18:13:38 +08:00
refactor(@angular-devkit/architect): remove deprecated TestLogger
BREAKING CHANGE: Deprecated `TestLogger` has been removed. Use `logging` API from `'@angular-devkit/core'` instead. **Note:** this change doesn't effect application developers.
This commit is contained in:
parent
ab9968d76e
commit
d3ad09508f
@ -14,13 +14,6 @@ export declare class TestingArchitectHost implements ArchitectHost {
|
|||||||
resolveBuilder(builderName: string): Promise<BuilderInfo | null>;
|
resolveBuilder(builderName: string): Promise<BuilderInfo | null>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export declare class TestLogger extends logging.Logger {
|
|
||||||
constructor(name: string, parent?: logging.Logger | null);
|
|
||||||
clear(): void;
|
|
||||||
includes(message: string): boolean;
|
|
||||||
test(re: RegExp): boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export declare class TestProjectHost extends NodeJsSyncHost {
|
export declare class TestProjectHost extends NodeJsSyncHost {
|
||||||
protected _templateRoot: Path;
|
protected _templateRoot: Path;
|
||||||
constructor(_templateRoot: Path);
|
constructor(_templateRoot: Path);
|
||||||
|
@ -7,4 +7,3 @@
|
|||||||
*/
|
*/
|
||||||
export * from './testing-architect-host';
|
export * from './testing-architect-host';
|
||||||
export * from './test-project-host';
|
export * from './test-project-host';
|
||||||
export * from './test-logger';
|
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright Google Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by an MIT-style license that can be
|
|
||||||
* found in the LICENSE file at https://angular.io/license
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { logging } from '@angular-devkit/core';
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
export class TestLogger extends logging.Logger {
|
|
||||||
private _latestEntries: logging.LogEntry[] = [];
|
|
||||||
constructor(name: string, parent: logging.Logger | null = null) {
|
|
||||||
super(name, parent);
|
|
||||||
this.subscribe((entry) => this._latestEntries.push(entry));
|
|
||||||
}
|
|
||||||
|
|
||||||
clear() {
|
|
||||||
this._latestEntries = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
includes(message: string) {
|
|
||||||
return this._latestEntries.some((entry) => entry.message.includes(message));
|
|
||||||
}
|
|
||||||
|
|
||||||
test(re: RegExp) {
|
|
||||||
return this._latestEntries.some((entry) => re.test(entry.message));
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,7 +7,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Architect } from '@angular-devkit/architect';
|
import { Architect } from '@angular-devkit/architect';
|
||||||
import { TestLogger, TestProjectHost } from '@angular-devkit/architect/testing';
|
import { TestProjectHost } from '@angular-devkit/architect/testing';
|
||||||
|
import { logging } from '@angular-devkit/core';
|
||||||
import { take, tap, timeout } from 'rxjs/operators';
|
import { take, tap, timeout } from 'rxjs/operators';
|
||||||
import {
|
import {
|
||||||
browserBuild,
|
browserBuild,
|
||||||
@ -45,12 +46,12 @@ describe('Browser Builder lazy modules', () => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function hasMissingModuleError(logger: TestLogger) {
|
function hasMissingModuleError(logs: string): boolean {
|
||||||
// TS type error when using import().
|
// TS type error when using import().
|
||||||
return logger.includes('Cannot find module') ||
|
return logs.includes('Cannot find module') ||
|
||||||
// Webpack error when using import() on a rebuild.
|
// Webpack error when using import() on a rebuild.
|
||||||
// There is no TS error because the type checker is forked on rebuilds.
|
// There is no TS error because the type checker is forked on rebuilds.
|
||||||
logger.includes('Module not found');
|
logs.includes('Module not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
const cases: [string, Record<string, string>][] = [
|
const cases: [string, Record<string, string>][] = [
|
||||||
@ -96,11 +97,14 @@ describe('Browser Builder lazy modules', () => {
|
|||||||
host.writeMultipleFiles(lazyModuleFnImport);
|
host.writeMultipleFiles(lazyModuleFnImport);
|
||||||
host.replaceInFile('src/app/app.module.ts', 'lazy.module', 'invalid.module');
|
host.replaceInFile('src/app/app.module.ts', 'lazy.module', 'invalid.module');
|
||||||
|
|
||||||
const logger = new TestLogger('build-lazy-errors');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const run = await architect.scheduleTarget(target, {}, { logger });
|
const run = await architect.scheduleTarget(target, {}, { logger });
|
||||||
const output = await run.result;
|
const output = await run.result;
|
||||||
expect(output.success).toBe(false);
|
expect(output.success).toBe(false);
|
||||||
expect(hasMissingModuleError(logger)).toBe(true, 'Should show missing module error');
|
expect(hasMissingModuleError(logs.join())).toBe(true, 'Should show missing module error');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should show error when lazy route is invalid on watch mode AOT', async () => {
|
it('should show error when lazy route is invalid on watch mode AOT', async () => {
|
||||||
@ -108,9 +112,9 @@ describe('Browser Builder lazy modules', () => {
|
|||||||
host.writeMultipleFiles(lazyModuleFnImport);
|
host.writeMultipleFiles(lazyModuleFnImport);
|
||||||
|
|
||||||
let buildNumber = 0;
|
let buildNumber = 0;
|
||||||
const logger = new TestLogger('rebuild-lazy-errors');
|
|
||||||
const overrides = { watch: true, aot: true };
|
const overrides = { watch: true, aot: true };
|
||||||
const run = await architect.scheduleTarget(target, overrides, { logger });
|
const run = await architect.scheduleTarget(target, overrides);
|
||||||
await run.output
|
await run.output
|
||||||
.pipe(
|
.pipe(
|
||||||
timeout(15000),
|
timeout(15000),
|
||||||
@ -120,7 +124,6 @@ describe('Browser Builder lazy modules', () => {
|
|||||||
case 1:
|
case 1:
|
||||||
expect(buildEvent.success).toBe(true);
|
expect(buildEvent.success).toBe(true);
|
||||||
host.replaceInFile('src/app/app.module.ts', 'lazy.module', 'invalid.module');
|
host.replaceInFile('src/app/app.module.ts', 'lazy.module', 'invalid.module');
|
||||||
logger.clear();
|
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
expect(buildEvent.success).toBe(false);
|
expect(buildEvent.success).toBe(false);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Architect } from '@angular-devkit/architect';
|
import { Architect } from '@angular-devkit/architect';
|
||||||
import { TestLogger } from '@angular-devkit/architect/testing';
|
import { logging } from '@angular-devkit/core';
|
||||||
import { browserBuild, createArchitect, host, veEnabled } from '../../test-utils';
|
import { browserBuild, createArchitect, host, veEnabled } from '../../test-utils';
|
||||||
|
|
||||||
describe('Browser Builder no entry module', () => {
|
describe('Browser Builder no entry module', () => {
|
||||||
@ -38,8 +38,11 @@ describe('Browser Builder no entry module', () => {
|
|||||||
host.replaceInFile('src/main.ts', /./g, '');
|
host.replaceInFile('src/main.ts', /./g, '');
|
||||||
host.appendToFile('src/main.ts', `import './app/app.module';`);
|
host.appendToFile('src/main.ts', `import './app/app.module';`);
|
||||||
|
|
||||||
const logger = new TestLogger('no-bootstrap');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
await browserBuild(architect, host, target, { baseHref: '/myUrl' }, { logger });
|
await browserBuild(architect, host, target, { baseHref: '/myUrl' }, { logger });
|
||||||
expect(logger.includes('Lazy routes discovery is not enabled')).toBe(true);
|
expect(logs.join().includes('Lazy routes discovery is not enabled')).toBe(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -7,8 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
// tslint:disable:no-big-function
|
// tslint:disable:no-big-function
|
||||||
import { Architect } from '@angular-devkit/architect';
|
import { Architect } from '@angular-devkit/architect';
|
||||||
import { TestLogger } from '@angular-devkit/architect/testing';
|
import { join, logging, normalize, virtualFs } from '@angular-devkit/core';
|
||||||
import { join, normalize, virtualFs } from '@angular-devkit/core';
|
|
||||||
import { debounceTime, take, takeWhile, tap } from 'rxjs/operators';
|
import { debounceTime, take, takeWhile, tap } from 'rxjs/operators';
|
||||||
import {
|
import {
|
||||||
createArchitect,
|
createArchitect,
|
||||||
@ -154,7 +153,10 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const overrides = { watch: true, forkTypeChecker: false };
|
const overrides = { watch: true, forkTypeChecker: false };
|
||||||
const logger = new TestLogger('rebuild-type-errors');
|
const logger = new logging.Logger('');
|
||||||
|
let logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const typeError = `is not assignable to parameter of type 'number'`;
|
const typeError = `is not assignable to parameter of type 'number'`;
|
||||||
let buildNumber = 0;
|
let buildNumber = 0;
|
||||||
|
|
||||||
@ -177,8 +179,8 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
case 2:
|
case 2:
|
||||||
// The second build should error out with a type error on the type of an argument.
|
// The second build should error out with a type error on the type of an argument.
|
||||||
expect(buildEvent.success).toBe(false);
|
expect(buildEvent.success).toBe(false);
|
||||||
expect(logger.includes(typeError)).toBe(true);
|
expect(logs.join().includes(typeError)).toBe(true);
|
||||||
logger.clear();
|
logs = [];
|
||||||
// Change an UNRELATED file and the error should still happen.
|
// Change an UNRELATED file and the error should still happen.
|
||||||
// Should trigger a rebuild, this time an error is also expected.
|
// Should trigger a rebuild, this time an error is also expected.
|
||||||
host.appendToFile('src/app/app.module.ts', `console.log(1);`);
|
host.appendToFile('src/app/app.module.ts', `console.log(1);`);
|
||||||
@ -187,8 +189,8 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
case 3:
|
case 3:
|
||||||
// The third build should have the same error as the first.
|
// The third build should have the same error as the first.
|
||||||
expect(buildEvent.success).toBe(false);
|
expect(buildEvent.success).toBe(false);
|
||||||
expect(logger.includes(typeError)).toBe(true);
|
expect(logs.join().includes(typeError)).toBe(true);
|
||||||
logger.clear();
|
logs = [];
|
||||||
// Fix the error.
|
// Fix the error.
|
||||||
host.writeMultipleFiles({
|
host.writeMultipleFiles({
|
||||||
'src/funky2.ts': `export const funky2 = (value: string) => value + 'hello';`,
|
'src/funky2.ts': `export const funky2 = (value: string) => value + 'hello';`,
|
||||||
@ -350,7 +352,9 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
// show up in getNgSemanticDiagnostics. Since getNgSemanticDiagnostics is only called on the
|
// show up in getNgSemanticDiagnostics. Since getNgSemanticDiagnostics is only called on the
|
||||||
// type checker, we must disable it to get a failing fourth build with Ivy.
|
// type checker, we must disable it to get a failing fourth build with Ivy.
|
||||||
const overrides = { watch: true, aot: true, forkTypeChecker: veEnabled };
|
const overrides = { watch: true, aot: true, forkTypeChecker: veEnabled };
|
||||||
const logger = new TestLogger('rebuild-aot-errors');
|
const logger = new logging.Logger('');
|
||||||
|
let logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
const staticAnalysisError = !veEnabled
|
const staticAnalysisError = !veEnabled
|
||||||
? 'selector must be a string'
|
? 'selector must be a string'
|
||||||
: 'Function expressions are not supported in decorators';
|
: 'Function expressions are not supported in decorators';
|
||||||
@ -367,18 +371,18 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
case 1:
|
case 1:
|
||||||
// The first build should error out with a static analysis error.
|
// The first build should error out with a static analysis error.
|
||||||
expect(buildEvent.success).toBe(false, 'First build should not succeed.');
|
expect(buildEvent.success).toBe(false, 'First build should not succeed.');
|
||||||
expect(logger.includes(staticAnalysisError)).toBe(true,
|
expect(logs.join().includes(staticAnalysisError)).toBe(true,
|
||||||
'First build should have static analysis error.');
|
'First build should have static analysis error.');
|
||||||
logger.clear();
|
logs = [];
|
||||||
// Fix the static analysis error.
|
// Fix the static analysis error.
|
||||||
host.writeMultipleFiles({ 'src/app/app.component.ts': origContent });
|
host.writeMultipleFiles({ 'src/app/app.component.ts': origContent });
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
expect(buildEvent.success).toBe(true, 'Second build should succeed.');
|
expect(buildEvent.success).toBe(true, 'Second build should succeed.');
|
||||||
expect(logger.includes(staticAnalysisError)).toBe(false,
|
expect(logs.join().includes(staticAnalysisError)).toBe(false,
|
||||||
'Second build should not have static analysis error.');
|
'Second build should not have static analysis error.');
|
||||||
logger.clear();
|
logs = [];
|
||||||
// Add an syntax error to a non-main file.
|
// Add an syntax error to a non-main file.
|
||||||
host.appendToFile('src/app/app.component.ts', `]]]`);
|
host.appendToFile('src/app/app.component.ts', `]]]`);
|
||||||
break;
|
break;
|
||||||
@ -386,11 +390,11 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
case 3:
|
case 3:
|
||||||
// The third build should have TS syntax error.
|
// The third build should have TS syntax error.
|
||||||
expect(buildEvent.success).toBe(false, 'Third build should not succeed.');
|
expect(buildEvent.success).toBe(false, 'Third build should not succeed.');
|
||||||
expect(logger.includes(syntaxError)).toBe(true,
|
expect(logs.join().includes(syntaxError)).toBe(true,
|
||||||
'Third build should have syntax analysis error.');
|
'Third build should have syntax analysis error.');
|
||||||
expect(logger.includes(staticAnalysisError)).toBe(false,
|
expect(logs.join().includes(staticAnalysisError)).toBe(false,
|
||||||
'Third build should not have static analysis error.');
|
'Third build should not have static analysis error.');
|
||||||
logger.clear();
|
logs = [];
|
||||||
// Fix the syntax error, but add the static analysis error again.
|
// Fix the syntax error, but add the static analysis error again.
|
||||||
host.writeMultipleFiles({
|
host.writeMultipleFiles({
|
||||||
'src/app/app.component.ts': origContent.replace(
|
'src/app/app.component.ts': origContent.replace(
|
||||||
@ -402,11 +406,11 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
expect(buildEvent.success).toBe(false, 'Fourth build should not succeed.');
|
expect(buildEvent.success).toBe(false, 'Fourth build should not succeed.');
|
||||||
expect(logger.includes(syntaxError)).toBe(false,
|
expect(logs.join().includes(syntaxError)).toBe(false,
|
||||||
'Fourth build should not have syntax analysis error.');
|
'Fourth build should not have syntax analysis error.');
|
||||||
expect(logger.includes(staticAnalysisError)).toBe(true,
|
expect(logs.join().includes(staticAnalysisError)).toBe(true,
|
||||||
'Fourth build should have static analysis error.');
|
'Fourth build should have static analysis error.');
|
||||||
logger.clear();
|
logs = [];
|
||||||
// Restore the file to a error-less state.
|
// Restore the file to a error-less state.
|
||||||
host.writeMultipleFiles({ 'src/app/app.component.ts': origContent });
|
host.writeMultipleFiles({ 'src/app/app.component.ts': origContent });
|
||||||
break;
|
break;
|
||||||
@ -414,9 +418,9 @@ describe('Browser Builder rebuilds', () => {
|
|||||||
case 5:
|
case 5:
|
||||||
// The fifth build should have everything fixed..
|
// The fifth build should have everything fixed..
|
||||||
expect(buildEvent.success).toBe(true, 'Fifth build should succeed.');
|
expect(buildEvent.success).toBe(true, 'Fifth build should succeed.');
|
||||||
expect(logger.includes(syntaxError)).toBe(false,
|
expect(logs.join().includes(syntaxError)).toBe(false,
|
||||||
'Fifth build should not have syntax analysis error.');
|
'Fifth build should not have syntax analysis error.');
|
||||||
expect(logger.includes(staticAnalysisError)).toBe(false,
|
expect(logs.join().includes(staticAnalysisError)).toBe(false,
|
||||||
'Fifth build should not have static analysis error.');
|
'Fifth build should not have static analysis error.');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Architect } from '@angular-devkit/architect';
|
import { Architect } from '@angular-devkit/architect';
|
||||||
import { TestLogger } from '@angular-devkit/architect/testing';
|
import { logging, normalize, virtualFs } from '@angular-devkit/core';
|
||||||
import { normalize, virtualFs } from '@angular-devkit/core';
|
|
||||||
import { of, race } from 'rxjs';
|
import { of, race } from 'rxjs';
|
||||||
import { delay, filter, map, take, takeUntil, takeWhile, tap, timeout } from 'rxjs/operators';
|
import { delay, filter, map, take, takeUntil, takeWhile, tap, timeout } from 'rxjs/operators';
|
||||||
import { browserBuild, createArchitect, host } from '../../test-utils';
|
import { browserBuild, createArchitect, host } from '../../test-utils';
|
||||||
@ -179,7 +178,8 @@ describe('Browser Builder file replacements', () => {
|
|||||||
|
|
||||||
const unexpectedError = `Property 'two' does not exist on type '{ one: number; }'`;
|
const unexpectedError = `Property 'two' does not exist on type '{ one: number; }'`;
|
||||||
const expectedError = `Property 'prop' does not exist on type '{}'`;
|
const expectedError = `Property 'prop' does not exist on type '{}'`;
|
||||||
const logger = new TestLogger('rebuild-type-errors');
|
|
||||||
|
const logger = new logging.Logger('');
|
||||||
|
|
||||||
// Race between a timeout and the expected log entry.
|
// Race between a timeout and the expected log entry.
|
||||||
const stop$ = race<null | string>(
|
const stop$ = race<null | string>(
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
import { Architect } from '@angular-devkit/architect';
|
import { Architect } from '@angular-devkit/architect';
|
||||||
import { TestLogger } from '@angular-devkit/architect/testing';
|
|
||||||
import { BrowserBuilderOutput } from '@angular-devkit/build-angular';
|
import { BrowserBuilderOutput } from '@angular-devkit/build-angular';
|
||||||
|
import { logging } from '@angular-devkit/core';
|
||||||
import { debounceTime, take, tap } from 'rxjs/operators';
|
import { debounceTime, take, tap } from 'rxjs/operators';
|
||||||
import { createArchitect, host, veEnabled } from '../../test-utils';
|
import { createArchitect, host, veEnabled } from '../../test-utils';
|
||||||
|
|
||||||
@ -32,12 +32,14 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const logger = new TestLogger('unused-files-warnings');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
||||||
const output = await run.result as BrowserBuilderOutput;
|
const output = await run.result as BrowserBuilderOutput;
|
||||||
expect(output.success).toBe(true);
|
expect(output.success).toBe(true);
|
||||||
expect(logger.includes(warningMessageSuffix)).toBe(false);
|
expect(logs.join().includes(warningMessageSuffix)).toBe(false);
|
||||||
logger.clear();
|
|
||||||
|
|
||||||
await run.stop();
|
await run.stop();
|
||||||
});
|
});
|
||||||
@ -56,12 +58,14 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
'"main.ts", "environments/environment.prod.ts"',
|
'"main.ts", "environments/environment.prod.ts"',
|
||||||
);
|
);
|
||||||
|
|
||||||
const logger = new TestLogger('unused-files-warnings');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
||||||
const output = await run.result as BrowserBuilderOutput;
|
const output = await run.result as BrowserBuilderOutput;
|
||||||
expect(output.success).toBe(true);
|
expect(output.success).toBe(true);
|
||||||
expect(logger.includes(`environment.prod.ts ${warningMessageSuffix}`)).toBe(true);
|
expect(logs.join().includes(`environment.prod.ts ${warningMessageSuffix}`)).toBe(true);
|
||||||
logger.clear();
|
|
||||||
|
|
||||||
await run.stop();
|
await run.stop();
|
||||||
});
|
});
|
||||||
@ -90,12 +94,14 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
`"main.ts", ${Object.keys(ignoredFiles).map(f => `"${f.replace('src/', '')}"`).join(',')}`,
|
`"main.ts", ${Object.keys(ignoredFiles).map(f => `"${f.replace('src/', '')}"`).join(',')}`,
|
||||||
);
|
);
|
||||||
|
|
||||||
const logger = new TestLogger('unused-files-warnings');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
||||||
const output = await run.result as BrowserBuilderOutput;
|
const output = await run.result as BrowserBuilderOutput;
|
||||||
expect(output.success).toBe(true);
|
expect(output.success).toBe(true);
|
||||||
expect(logger.includes(warningMessageSuffix)).toBe(false);
|
expect(logs.join().includes(warningMessageSuffix)).toBe(false);
|
||||||
logger.clear();
|
|
||||||
|
|
||||||
await run.stop();
|
await run.stop();
|
||||||
});
|
});
|
||||||
@ -118,12 +124,14 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
`'@angular/core';\nimport { MyType } from './type';\n`,
|
`'@angular/core';\nimport { MyType } from './type';\n`,
|
||||||
);
|
);
|
||||||
|
|
||||||
const logger = new TestLogger('unused-files-warnings');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
||||||
const output = await run.result as BrowserBuilderOutput;
|
const output = await run.result as BrowserBuilderOutput;
|
||||||
expect(output.success).toBe(true);
|
expect(output.success).toBe(true);
|
||||||
expect(logger.includes(warningMessageSuffix)).toBe(false);
|
expect(logs.join().includes(warningMessageSuffix)).toBe(false);
|
||||||
logger.clear();
|
|
||||||
|
|
||||||
await run.stop();
|
await run.stop();
|
||||||
});
|
});
|
||||||
@ -148,12 +156,14 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
`'@angular/core';\nimport { MyType } from './type';\n`,
|
`'@angular/core';\nimport { MyType } from './type';\n`,
|
||||||
);
|
);
|
||||||
|
|
||||||
const logger = new TestLogger('unused-files-warnings');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
const run = await architect.scheduleTarget(targetSpec, undefined, { logger });
|
||||||
const output = await run.result as BrowserBuilderOutput;
|
const output = await run.result as BrowserBuilderOutput;
|
||||||
expect(output.success).toBe(true);
|
expect(output.success).toBe(true);
|
||||||
expect(logger.includes(warningMessageSuffix)).toBe(false);
|
expect(logs.join().includes(warningMessageSuffix)).toBe(false);
|
||||||
logger.clear();
|
|
||||||
|
|
||||||
await run.stop();
|
await run.stop();
|
||||||
});
|
});
|
||||||
@ -172,7 +182,10 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
'"**/*.d.ts", "testing/**/*.ts"',
|
'"**/*.d.ts", "testing/**/*.ts"',
|
||||||
);
|
);
|
||||||
|
|
||||||
const logger = new TestLogger('unused-files-warnings');
|
const logger = new logging.Logger('');
|
||||||
|
let logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
let buildNumber = 0;
|
let buildNumber = 0;
|
||||||
const run = await architect.scheduleTarget(targetSpec, { watch: true }, { logger });
|
const run = await architect.scheduleTarget(targetSpec, { watch: true }, { logger });
|
||||||
|
|
||||||
@ -186,7 +199,7 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
switch (buildNumber) {
|
switch (buildNumber) {
|
||||||
case 1:
|
case 1:
|
||||||
// The first should not have unused files
|
// The first should not have unused files
|
||||||
expect(logger.includes(warningMessageSuffix)).toBe(false, `Case ${buildNumber} failed.`);
|
expect(logs.join().includes(warningMessageSuffix)).toBe(false, `Case ${buildNumber} failed.`);
|
||||||
|
|
||||||
// Write a used file
|
// Write a used file
|
||||||
host.writeMultipleFiles({
|
host.writeMultipleFiles({
|
||||||
@ -203,7 +216,7 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
// The second should have type.ts as unused
|
// The second should have type.ts as unused
|
||||||
expect(logger.includes(`type.ts ${warningMessageSuffix}`)).toBe(true, `Case ${buildNumber} failed.`);
|
expect(logs.join().includes(`type.ts ${warningMessageSuffix}`)).toBe(true, `Case ${buildNumber} failed.`);
|
||||||
|
|
||||||
host.replaceInFile(
|
host.replaceInFile(
|
||||||
'src/app/app.component.ts',
|
'src/app/app.component.ts',
|
||||||
@ -214,11 +227,11 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
// The third should not have any unused files
|
// The third should not have any unused files
|
||||||
expect(logger.includes(warningMessageSuffix)).toBe(false, `Case ${buildNumber} failed.`);
|
expect(logs.join().includes(warningMessageSuffix)).toBe(false, `Case ${buildNumber} failed.`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.clear();
|
logs = [];
|
||||||
}),
|
}),
|
||||||
take(3),
|
take(3),
|
||||||
)
|
)
|
||||||
@ -245,7 +258,9 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
'src/testing/type.ts': 'export type MyType = number;',
|
'src/testing/type.ts': 'export type MyType = number;',
|
||||||
});
|
});
|
||||||
|
|
||||||
const logger = new TestLogger('unused-files-warnings');
|
const logger = new logging.Logger('');
|
||||||
|
let logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
let buildNumber = 0;
|
let buildNumber = 0;
|
||||||
const run = await architect.scheduleTarget(targetSpec, { watch: true }, { logger });
|
const run = await architect.scheduleTarget(targetSpec, { watch: true }, { logger });
|
||||||
|
|
||||||
@ -259,18 +274,18 @@ describe('Browser Builder unused files warnings', () => {
|
|||||||
switch (buildNumber) {
|
switch (buildNumber) {
|
||||||
case 1:
|
case 1:
|
||||||
// The first should have type.ts as unused.
|
// The first should have type.ts as unused.
|
||||||
expect(logger.includes(`type.ts ${warningMessageSuffix}`)).toBe(true, `Case ${buildNumber} failed.`);
|
expect(logs.join().includes(`type.ts ${warningMessageSuffix}`)).toBe(true, `Case ${buildNumber} failed.`);
|
||||||
|
|
||||||
// touch a file to trigger a rebuild
|
// touch a file to trigger a rebuild
|
||||||
host.appendToFile('src/main.ts', '');
|
host.appendToFile('src/main.ts', '');
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
// The second should should have type.ts as unused but shouldn't warn.
|
// The second should should have type.ts as unused but shouldn't warn.
|
||||||
expect(logger.includes(warningMessageSuffix)).toBe(false, `Case ${buildNumber} failed.`);
|
expect(logs.join().includes(warningMessageSuffix)).toBe(false, `Case ${buildNumber} failed.`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.clear();
|
logs = [];
|
||||||
}),
|
}),
|
||||||
take(2),
|
take(2),
|
||||||
)
|
)
|
||||||
|
@ -7,8 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Architect } from '@angular-devkit/architect';
|
import { Architect } from '@angular-devkit/architect';
|
||||||
import { TestLogger } from '@angular-devkit/architect/testing';
|
import { join, logging, virtualFs } from '@angular-devkit/core';
|
||||||
import { join, virtualFs } from '@angular-devkit/core';
|
|
||||||
import { timer } from 'rxjs';
|
import { timer } from 'rxjs';
|
||||||
import { debounceTime, map, switchMap, takeWhile, tap } from 'rxjs/operators';
|
import { debounceTime, map, switchMap, takeWhile, tap } from 'rxjs/operators';
|
||||||
import { browserBuild, createArchitect, host, outputPath } from '../../test-utils';
|
import { browserBuild, createArchitect, host, outputPath } from '../../test-utils';
|
||||||
@ -87,7 +86,11 @@ describe('Browser Builder Web Worker support', () => {
|
|||||||
|
|
||||||
it('bundles TS worker', async () => {
|
it('bundles TS worker', async () => {
|
||||||
host.writeMultipleFiles(workerFiles);
|
host.writeMultipleFiles(workerFiles);
|
||||||
const logger = new TestLogger('worker-warnings');
|
|
||||||
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
const overrides = { webWorkerTsConfig: 'src/tsconfig.worker.json' };
|
const overrides = { webWorkerTsConfig: 'src/tsconfig.worker.json' };
|
||||||
await browserBuild(architect, host, target, overrides, { logger });
|
await browserBuild(architect, host, target, overrides, { logger });
|
||||||
|
|
||||||
@ -101,7 +104,7 @@ describe('Browser Builder Web Worker support', () => {
|
|||||||
const mainContent = virtualFs.fileBufferToString(
|
const mainContent = virtualFs.fileBufferToString(
|
||||||
host.scopedSync().read(join(outputPath, 'main.js')));
|
host.scopedSync().read(join(outputPath, 'main.js')));
|
||||||
expect(mainContent).toContain('0.worker.js');
|
expect(mainContent).toContain('0.worker.js');
|
||||||
expect(logger.includes('WARNING')).toBe(false, 'Should show no warnings.');
|
expect(logs.join().includes('WARNING')).toBe(false, 'Should show no warnings.');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('minimizes and hashes worker', async () => {
|
it('minimizes and hashes worker', async () => {
|
||||||
|
@ -6,8 +6,7 @@
|
|||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
import { Architect } from '@angular-devkit/architect';
|
import { Architect } from '@angular-devkit/architect';
|
||||||
import { TestLogger } from '@angular-devkit/architect/testing';
|
import { join, logging, normalize, virtualFs } from '@angular-devkit/core';
|
||||||
import { join, normalize, virtualFs } from '@angular-devkit/core';
|
|
||||||
import { createArchitect, extractI18nTargetSpec, host } from '../test-utils';
|
import { createArchitect, extractI18nTargetSpec, host } from '../test-utils';
|
||||||
|
|
||||||
|
|
||||||
@ -41,21 +40,27 @@ describe('Extract i18n Target', () => {
|
|||||||
}, 30000);
|
}, 30000);
|
||||||
|
|
||||||
it('does not show full build logs', async () => {
|
it('does not show full build logs', async () => {
|
||||||
const logger = new TestLogger('i18n');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
host.appendToFile('src/app/app.component.html', '<p i18n>i18n test</p>');
|
host.appendToFile('src/app/app.component.html', '<p i18n>i18n test</p>');
|
||||||
|
|
||||||
const run = await architect.scheduleTarget(extractI18nTargetSpec);
|
const run = await architect.scheduleTarget(extractI18nTargetSpec, undefined, { logger });
|
||||||
|
|
||||||
await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true }));
|
await expectAsync(run.result).toBeResolvedTo(jasmine.objectContaining({ success: true }));
|
||||||
|
|
||||||
await run.stop();
|
await run.stop();
|
||||||
|
|
||||||
expect(logger.includes('Chunk Names')).toBe(false);
|
expect(logs.join().includes('Chunk Names')).toBe(false);
|
||||||
expect(logger.includes('[emitted]')).toBe(false);
|
expect(logs.join().includes('[emitted]')).toBe(false);
|
||||||
}, 30000);
|
}, 30000);
|
||||||
|
|
||||||
it('shows errors', async () => {
|
it('shows errors', async () => {
|
||||||
const logger = new TestLogger('i18n-errors');
|
const logger = new logging.Logger('');
|
||||||
|
const logs: string[] = [];
|
||||||
|
logger.subscribe(e => logs.push(e.message));
|
||||||
|
|
||||||
host.appendToFile('src/app/app.component.html',
|
host.appendToFile('src/app/app.component.html',
|
||||||
'<p i18n>Hello world <span i18n>inner</span></p>');
|
'<p i18n>Hello world <span i18n>inner</span></p>');
|
||||||
|
|
||||||
@ -66,7 +71,7 @@ describe('Extract i18n Target', () => {
|
|||||||
await run.stop();
|
await run.stop();
|
||||||
|
|
||||||
const msg = 'Could not mark an element as translatable inside a translatable section';
|
const msg = 'Could not mark an element as translatable inside a translatable section';
|
||||||
expect(logger.includes(msg)).toBe(true);
|
expect(logs.join().includes(msg)).toBe(true);
|
||||||
}, 30000);
|
}, 30000);
|
||||||
|
|
||||||
it('supports locale', async () => {
|
it('supports locale', async () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user