We recently added a transformer to NGC that is responsible for downleveling Angular decorators and constructor parameter types. The primary goal was to mitigate a TypeScript limitation/issue that surfaces in Angular projects due to the heavy reliance on type metadata being captured for DI. Additionally this is a pre-requisite of making `tsickle` optional in the Angular bazel toolchain. See: 401ef71ae5b01be95d124184a0b6936fc453a5d4 for more context on this. Another (less important) goal was to make sure that the CLI can re-use this transformer for its JIT mode compilation. The CLI (as outlined in the commit mentioned above), already has a transformer for downleveling constructor parameters. We want to avoid this duplication and exported the transform through the tooling-private compiler entry-point. Early experiments in using this transformer over the current one, highlighted that in JIT, class decorators cannot be downleveled. Angular relies on those to be invoked immediately for JIT (so that factories etc. are generated upon loading) The transformer we exposed, always downlevels such class decorators though, so that would break CLI's JIT mode. We can address the CLI's needs by adding another flag to skip class decorators. This will allow us to continue with the goal of de-duplication. PR Close #37545
50 lines
1.8 KiB
TypeScript
50 lines
1.8 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC 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
|
|
*/
|
|
|
|
/**
|
|
* @fileoverview
|
|
* This file is used as a private API channel to shared Angular FW APIs with @angular/cli.
|
|
*
|
|
* Any changes to this file should be discussed with the Angular CLI team.
|
|
*/
|
|
|
|
import * as ts from 'typescript';
|
|
|
|
import {TypeScriptReflectionHost} from './ngtsc/reflection';
|
|
import {getDownlevelDecoratorsTransform} from './transformers/downlevel_decorators_transform';
|
|
|
|
/**
|
|
* Known values for global variables in `@angular/core` that Terser should set using
|
|
* https://github.com/terser-js/terser#conditional-compilation
|
|
*/
|
|
export const GLOBAL_DEFS_FOR_TERSER = {
|
|
ngDevMode: false,
|
|
ngI18nClosureMode: false,
|
|
};
|
|
|
|
export const GLOBAL_DEFS_FOR_TERSER_WITH_AOT = {
|
|
...GLOBAL_DEFS_FOR_TERSER,
|
|
ngJitMode: false,
|
|
};
|
|
|
|
/**
|
|
* Transform for downleveling Angular decorators and Angular-decorated class constructor
|
|
* parameters for dependency injection. This transform can be used by the CLI for JIT-mode
|
|
* compilation where constructor parameters and associated Angular decorators should be
|
|
* downleveled so that apps are not exposed to the ES2015 temporal dead zone limitation
|
|
* in TypeScript. See https://github.com/angular/angular-cli/pull/14473 for more details.
|
|
*/
|
|
export function constructorParametersDownlevelTransform(program: ts.Program):
|
|
ts.TransformerFactory<ts.SourceFile> {
|
|
const typeChecker = program.getTypeChecker();
|
|
const reflectionHost = new TypeScriptReflectionHost(typeChecker);
|
|
return getDownlevelDecoratorsTransform(
|
|
typeChecker, reflectionHost, [], /* isCore */ false,
|
|
/* enableClosureCompiler */ false, /* skipClassDecorators */ true);
|
|
}
|