fix(ivy): generate correct moduleNames for factories and summaries (#27483)

In ngtsc, files loaded into the ts.Program have a "module name", set via
ts.SourceFile.moduleName, which ends up being written into an AMD module
name triple-slash directive in the generated .js file.

For generated shim files (ngfactories, ngsummaries) that are constructed
synthetically, there was previously no moduleName set, which caused some
issues with downstream tests.

This commit adds logic to compute and set moduleNames for both generated
ngfactory and ngsummary shims.

PR Close #27483
This commit is contained in:
Alex Rickabaugh 2018-12-05 13:08:55 -08:00 committed by Igor Minar
parent cdf5cacdc0
commit d553ec2f36
5 changed files with 78 additions and 4 deletions

View File

@ -12,7 +12,7 @@ import * as ts from 'typescript';
import {relativePathBetween} from '../../util/src/path'; import {relativePathBetween} from '../../util/src/path';
import {ShimGenerator} from './host'; import {ShimGenerator} from './host';
import {isNonDeclarationTsFile} from './util'; import {generatedModuleName, isNonDeclarationTsFile} from './util';
const TS_DTS_SUFFIX = /(\.d)?\.ts$/; const TS_DTS_SUFFIX = /(\.d)?\.ts$/;
const STRIP_NG_FACTORY = /(.*)NgFactory$/; const STRIP_NG_FACTORY = /(.*)NgFactory$/;
@ -64,8 +64,13 @@ export class FactoryGenerator implements ShimGenerator {
...varLines, ...varLines,
].join('\n'); ].join('\n');
} }
return ts.createSourceFile( const genFile = ts.createSourceFile(
genFilePath, sourceText, original.languageVersion, true, ts.ScriptKind.TS); genFilePath, sourceText, original.languageVersion, true, ts.ScriptKind.TS);
if (original.moduleName !== undefined) {
genFile.moduleName =
generatedModuleName(original.moduleName, original.fileName, '.ngfactory');
}
return genFile;
} }
static forRootFiles(files: ReadonlyArray<string>): FactoryGenerator { static forRootFiles(files: ReadonlyArray<string>): FactoryGenerator {

View File

@ -9,7 +9,7 @@
import * as ts from 'typescript'; import * as ts from 'typescript';
import {ShimGenerator} from './host'; import {ShimGenerator} from './host';
import {isNonDeclarationTsFile} from './util'; import {generatedModuleName, isNonDeclarationTsFile} from './util';
export class SummaryGenerator implements ShimGenerator { export class SummaryGenerator implements ShimGenerator {
private constructor(private map: Map<string, string>) {} private constructor(private map: Map<string, string>) {}
@ -43,8 +43,13 @@ export class SummaryGenerator implements ShimGenerator {
varLines.push(`export const ɵempty = null;`); varLines.push(`export const ɵempty = null;`);
} }
const sourceText = varLines.join('\n'); const sourceText = varLines.join('\n');
return ts.createSourceFile( const genFile = ts.createSourceFile(
genFilePath, sourceText, original.languageVersion, true, ts.ScriptKind.TS); genFilePath, sourceText, original.languageVersion, true, ts.ScriptKind.TS);
if (original.moduleName !== undefined) {
genFile.moduleName =
generatedModuleName(original.moduleName, original.fileName, '.ngsummary');
}
return genFile;
} }
static forRootFiles(files: ReadonlyArray<string>): SummaryGenerator { static forRootFiles(files: ReadonlyArray<string>): SummaryGenerator {

View File

@ -6,9 +6,24 @@
* found in the LICENSE file at https://angular.io/license * found in the LICENSE file at https://angular.io/license
*/ */
import * as path from 'path';
import * as ts from 'typescript';
const TS_FILE = /\.tsx?$/; const TS_FILE = /\.tsx?$/;
const D_TS_FILE = /\.d\.ts$/; const D_TS_FILE = /\.d\.ts$/;
export function isNonDeclarationTsFile(file: string): boolean { export function isNonDeclarationTsFile(file: string): boolean {
return TS_FILE.exec(file) !== null && D_TS_FILE.exec(file) === null; return TS_FILE.exec(file) !== null && D_TS_FILE.exec(file) === null;
} }
export function generatedModuleName(
originalModuleName: string, originalFileName: string, genSuffix: string): string {
let moduleName: string;
if (originalFileName.endsWith('/index.ts')) {
moduleName = originalModuleName + '/index' + genSuffix;
} else {
moduleName = originalModuleName + genSuffix;
}
return moduleName;
}

View File

@ -0,0 +1,24 @@
package(default_visibility = ["//visibility:public"])
load("//tools:defaults.bzl", "jasmine_node_test", "ts_library")
ts_library(
name = "test_lib",
testonly = True,
srcs = glob([
"**/*.ts",
]),
deps = [
"//packages:types",
"//packages/compiler-cli/src/ngtsc/shims",
],
)
jasmine_node_test(
name = "test",
bootstrap = ["angular/tools/testing/init_node_no_angular_spec.js"],
deps = [
":test_lib",
"//tools/testing:node_no_angular",
],
)

View File

@ -0,0 +1,25 @@
/**
* @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 {generatedModuleName} from '../src/util';
describe('shim utilities', () => {
describe('generatedModuleName', () => {
it('should generate a correct module name for index files', () => {
expect(generatedModuleName('@angular/core', '/angular/packages/core/index.ts', '.ngfactory'))
.toBe('@angular/core/index.ngfactory');
});
it('should generate a correct module name for non-index files', () => {
expect(generatedModuleName(
'@angular/core/src/application_ref',
'/angular/packages/core/src/application_ref.ts', '.ngsummary'))
.toBe('@angular/core/src/application_ref.ngsummary');
});
});
});