From 76b1b53a4b97fbed9e3992eafa82118fb94828ab Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Fri, 7 Aug 2020 12:56:50 -0400 Subject: [PATCH] refactor(@angular-devkit/build-optimizer): verify Program for type-checking passes --- .../build_optimizer/src/_golden-api.d.ts | 4 ++-- .../src/build-optimizer/build-optimizer.ts | 3 ++- .../src/helpers/transform-javascript.ts | 8 ++++++-- .../build_optimizer/src/transforms/scrub-file.ts | 15 ++++++++++----- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/etc/api/angular_devkit/build_optimizer/src/_golden-api.d.ts b/etc/api/angular_devkit/build_optimizer/src/_golden-api.d.ts index 4d3d155545..dadc9fe9b7 100644 --- a/etc/api/angular_devkit/build_optimizer/src/_golden-api.d.ts +++ b/etc/api/angular_devkit/build_optimizer/src/_golden-api.d.ts @@ -12,9 +12,9 @@ export declare function getPrefixClassesTransformer(): ts.TransformerFactory; -export declare function getScrubFileTransformer(program: ts.Program): ts.TransformerFactory; +export declare function getScrubFileTransformer(program?: ts.Program): ts.TransformerFactory; -export declare function getScrubFileTransformerForCore(program: ts.Program): ts.TransformerFactory; +export declare function getScrubFileTransformerForCore(program?: ts.Program): ts.TransformerFactory; export declare function getWrapEnumsTransformer(): ts.TransformerFactory; diff --git a/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts b/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts index eac95c7f23..1dd9a5572c 100644 --- a/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts +++ b/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts @@ -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)) { diff --git a/packages/angular_devkit/build_optimizer/src/helpers/transform-javascript.ts b/packages/angular_devkit/build_optimizer/src/helpers/transform-javascript.ts index d3e4be4a7c..c50e9d0408 100644 --- a/packages/angular_devkit/build_optimizer/src/helpers/transform-javascript.ts +++ b/packages/angular_devkit/build_optimizer/src/helpers/transform-javascript.ts @@ -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; 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>; + 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) { diff --git a/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts b/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts index bc213449db..7e8d89af14 100644 --- a/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts +++ b/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts @@ -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 { - return scrubFileTransformer(program.getTypeChecker(), false); +export function getScrubFileTransformer(program?: ts.Program): ts.TransformerFactory { + return scrubFileTransformer(program, false); } export function getScrubFileTransformerForCore( - program: ts.Program, + program?: ts.Program, ): ts.TransformerFactory { - 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 => { const transformer: ts.Transformer = (sf: ts.SourceFile) => {