Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit f476c56

Browse files
author
Dimitar Tachev
authored
feat: Support Angular Ivy modules with AOT (#828)
* feat: support Angular Ivy modules * test: add test for AOT transformation of Ivy compatible modules
1 parent 8e03af7 commit f476c56

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

Diff for: transformers/ns-replace-bootstrap.spec.ts

+32
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,38 @@ describe('@ngtools/webpack transformers', () => {
3434
expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`);
3535
});
3636

37+
it('should replace bootstrap and don`t use factories when Ivy is enabled', () => {
38+
const input = tags.stripIndent`
39+
import { platformNativeScriptDynamic } from "nativescript-angular/platform";
40+
import { AppModule } from "./app/app.module";
41+
42+
platformNativeScriptDynamic().bootstrapModule(AppModule);
43+
`;
44+
45+
const output = tags.stripIndent`
46+
import * as __NgCli_bootstrap_1_1 from "nativescript-angular/platform-static";
47+
import * as __NgCli_bootstrap_2_1 from "./app/app.module";
48+
49+
__NgCli_bootstrap_1_1.platformNativeScript().bootstrapModule(__NgCli_bootstrap_2_1.AppModule);
50+
`;
51+
52+
const { program, compilerHost } = createTypescriptContext(input);
53+
const ngCompiler: any = {
54+
_compilerOptions: {
55+
enableIvy: true
56+
},
57+
typeChecker: program.getTypeChecker(),
58+
entryModule: {
59+
path: '/project/src/app/app.module',
60+
className: 'AppModule',
61+
},
62+
};
63+
const transformer = nsReplaceBootstrap(() => ngCompiler);
64+
const result = transformTypescript(undefined, [transformer], program, compilerHost);
65+
66+
expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`);
67+
});
68+
3769
it('should replace bootstrap when barrel files are used', () => {
3870
const input = tags.stripIndent`
3971
import { platformNativeScriptDynamic } from "nativescript-angular/platform";

Diff for: transformers/ns-replace-bootstrap.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@ import {
1515
import { AngularCompilerPlugin } from '@ngtools/webpack';
1616
import { getResolvedEntryModule } from "../utils/transformers-utils";
1717

18-
1918
export function nsReplaceBootstrap(getNgCompiler: () => AngularCompilerPlugin): ts.TransformerFactory<ts.SourceFile> {
2019
const shouldTransform = (fileName) => !fileName.endsWith('.ngfactory.ts') && !fileName.endsWith('.ngstyle.ts');
2120
const getTypeChecker = () => getNgCompiler().typeChecker;
2221

2322
const standardTransform: StandardTransform = function (sourceFile: ts.SourceFile) {
2423
const ops: TransformOperation[] = [];
25-
const entryModule = getResolvedEntryModule(getNgCompiler());
24+
const ngCompiler = getNgCompiler();
25+
// TODO: use something public when available
26+
const enableIvy = (<any>ngCompiler)._compilerOptions && (<any>ngCompiler)._compilerOptions.enableIvy;
27+
const entryModule = getResolvedEntryModule(ngCompiler);
2628

2729
if (!shouldTransform(sourceFile.fileName) || !entryModule) {
2830
return ops;
@@ -73,16 +75,15 @@ export function nsReplaceBootstrap(getNgCompiler: () => AngularCompilerPlugin):
7375

7476
const firstNode = getFirstNode(sourceFile);
7577

76-
// Add the transform operations.
77-
const factoryClassName = entryModule.className + 'NgFactory';
78-
const factoryModulePath = normalizedEntryModulePath + '.ngfactory';
79-
78+
const factoryClassName = enableIvy ? entryModule.className : entryModule.className + 'NgFactory';
79+
const factoryModulePath = enableIvy ? normalizedEntryModulePath : normalizedEntryModulePath + '.ngfactory';
8080

8181
const newBootstrapPropAccessExpr = ts.getMutableClone(bootstrapPropAccessExpr);
8282
const newNsPlatformCallExpr = ts.getMutableClone(bootstrapPropAccessExpr.expression) as ts.CallExpression;
8383
newNsPlatformCallExpr.expression = ts.createPropertyAccess(idPlatformNativeScript, 'platformNativeScript');
8484
newBootstrapPropAccessExpr.expression = newNsPlatformCallExpr;
85-
newBootstrapPropAccessExpr.name = ts.createIdentifier("bootstrapModuleFactory");
85+
newBootstrapPropAccessExpr.name =
86+
enableIvy ? ts.createIdentifier("bootstrapModule") : ts.createIdentifier("bootstrapModuleFactory");
8687

8788
const newBootstrapCallExpr = ts.getMutableClone(bootstrapCallExpr);
8889
newBootstrapCallExpr.expression = newBootstrapPropAccessExpr;

0 commit comments

Comments
 (0)