refactor(@angular-devkit/build-optimizer): verify Program for type-checking passes

This commit is contained in:
Charles Lyding 2020-08-07 12:56:50 -04:00 committed by Filipe Silva
parent 3db588f743
commit 76b1b53a4b
4 changed files with 20 additions and 10 deletions

View File

@ -12,9 +12,9 @@ export declare function getPrefixClassesTransformer(): ts.TransformerFactory<ts.
export declare function getPrefixFunctionsTransformer(): ts.TransformerFactory<ts.SourceFile>;
export declare function getScrubFileTransformer(program: ts.Program): ts.TransformerFactory<ts.SourceFile>;
export declare function getScrubFileTransformer(program?: ts.Program): ts.TransformerFactory<ts.SourceFile>;
export declare function getScrubFileTransformerForCore(program: ts.Program): ts.TransformerFactory<ts.SourceFile>;
export declare function getScrubFileTransformerForCore(program?: ts.Program): ts.TransformerFactory<ts.SourceFile>;
export declare function getWrapEnumsTransformer(): ts.TransformerFactory<ts.SourceFile>;

View File

@ -9,6 +9,7 @@ import { readFileSync } from 'fs';
import {
TransformJavascriptOptions,
TransformJavascriptOutput,
TransformerFactoryCreator,
transformJavascript,
} from '../helpers/transform-javascript';
import { getPrefixClassesTransformer, testPrefixClasses } from '../transforms/prefix-classes';
@ -109,7 +110,7 @@ export function buildOptimizer(options: BuildOptimizerOptions): TransformJavascr
}
// Determine which transforms to apply.
const getTransforms = [];
const getTransforms: TransformerFactoryCreator[] = [];
let typeCheck = false;
if (options.isSideEffectFree || originalFilePath && isKnownSideEffectFree(originalFilePath)) {

View File

@ -8,6 +8,9 @@
import { RawSourceMap } from 'source-map';
import * as ts from '../../third_party/github.com/Microsoft/TypeScript/lib/typescript';
export type TransformerFactoryCreator = (
program?: ts.Program,
) => ts.TransformerFactory<ts.SourceFile>;
export interface TransformJavascriptOptions {
content: string;
@ -16,7 +19,7 @@ export interface TransformJavascriptOptions {
emitSourceMap?: boolean;
strict?: boolean;
typeCheck?: boolean;
getTransforms: Array<(program?: ts.Program) => ts.TransformerFactory<ts.SourceFile>>;
getTransforms: TransformerFactoryCreator[];
}
export interface TransformJavascriptOutput {
@ -110,7 +113,8 @@ export function transformJavascript(
};
}
const transforms = getTransforms.map((getTf) => getTf(undefined));
// All fast path transformers do not use a program
const transforms = getTransforms.map((getTf) => getTf(/* program */ undefined));
const result = ts.transform(tempSourceFile, transforms, tsOptions);
if (result.transformed.length === 0 || result.transformed[0] === tempSourceFile) {

View File

@ -20,17 +20,22 @@ export function testScrubFile(content: string) {
return markers.some((marker) => content.indexOf(marker) !== -1);
}
export function getScrubFileTransformer(program: ts.Program): ts.TransformerFactory<ts.SourceFile> {
return scrubFileTransformer(program.getTypeChecker(), false);
export function getScrubFileTransformer(program?: ts.Program): ts.TransformerFactory<ts.SourceFile> {
return scrubFileTransformer(program, false);
}
export function getScrubFileTransformerForCore(
program: ts.Program,
program?: ts.Program,
): ts.TransformerFactory<ts.SourceFile> {
return scrubFileTransformer(program.getTypeChecker(), true);
return scrubFileTransformer(program, true);
}
function scrubFileTransformer(checker: ts.TypeChecker, isAngularCoreFile: boolean) {
function scrubFileTransformer(program: ts.Program | undefined, isAngularCoreFile: boolean) {
if (!program) {
throw new Error('scrubFileTransformer requires a TypeScript Program.');
}
const checker = program.getTypeChecker();
return (context: ts.TransformationContext): ts.Transformer<ts.SourceFile> => {
const transformer: ts.Transformer<ts.SourceFile> = (sf: ts.SourceFile) => {