refactor(ivy): move the flat module index generator to its own package (#27743)

This commit moves the FlatIndexGenerator to its own package, in preparation
to expand its capabilities and support re-exporting of private declarations
from NgModules.

PR Close #27743
This commit is contained in:
Alex Rickabaugh
2018-12-07 14:37:32 -08:00
committed by Kara Erickson
parent f6c91c5a5a
commit 37b716b298
10 changed files with 60 additions and 19 deletions

View File

@ -9,6 +9,5 @@
/// <reference types="node" />
export {FactoryGenerator, FactoryInfo, generatedFactoryTransform} from './src/factory_generator';
export {FlatIndexGenerator} from './src/flat_index_generator';
export {GeneratedShimsHostWrapper, ShimGenerator} from './src/host';
export {SummaryGenerator} from './src/summary_generator';

View File

@ -10,9 +10,10 @@ import * as path from 'path';
import * as ts from 'typescript';
import {relativePathBetween} from '../../util/src/path';
import {isNonDeclarationTsPath} from '../../util/src/typescript';
import {ShimGenerator} from './host';
import {generatedModuleName, isNonDeclarationTsFile} from './util';
import {generatedModuleName} from './util';
const TS_DTS_SUFFIX = /(\.d)?\.ts$/;
const STRIP_NG_FACTORY = /(.*)NgFactory$/;
@ -87,7 +88,7 @@ export class FactoryGenerator implements ShimGenerator {
static forRootFiles(files: ReadonlyArray<string>): FactoryGenerator {
const map = new Map<string, string>();
files.filter(sourceFile => isNonDeclarationTsFile(sourceFile))
files.filter(sourceFile => isNonDeclarationTsPath(sourceFile))
.forEach(sourceFile => map.set(sourceFile.replace(/\.ts$/, '.ngfactory.ts'), sourceFile));
return new FactoryGenerator(map);
}

View File

@ -1,70 +0,0 @@
/**
* @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 * as path from 'path';
import * as ts from 'typescript';
import {ShimGenerator} from './host';
import {isNonDeclarationTsFile} from './util';
export class FlatIndexGenerator implements ShimGenerator {
readonly flatIndexPath: string;
private constructor(
relativeFlatIndexPath: string, readonly entryPoint: string,
readonly moduleName: string|null) {
this.flatIndexPath = path.posix.join(path.posix.dirname(entryPoint), relativeFlatIndexPath)
.replace(/\.js$/, '') +
'.ts';
}
static forRootFiles(flatIndexPath: string, files: ReadonlyArray<string>, moduleName: string|null):
FlatIndexGenerator|null {
// If there's only one .ts file in the program, it's the entry. Otherwise, look for the shortest
// (in terms of characters in the filename) file that ends in /index.ts. The second behavior is
// deprecated; users should always explicitly specify a single .ts entrypoint.
const tsFiles = files.filter(isNonDeclarationTsFile);
if (tsFiles.length === 1) {
return new FlatIndexGenerator(flatIndexPath, tsFiles[0], moduleName);
} else {
let indexFile: string|null = null;
for (const tsFile of tsFiles) {
if (tsFile.endsWith('/index.ts') &&
(indexFile === null || tsFile.length <= indexFile.length)) {
indexFile = tsFile;
}
}
if (indexFile !== null) {
return new FlatIndexGenerator(flatIndexPath, indexFile, moduleName);
} else {
return null;
}
}
}
recognize(fileName: string): boolean { return fileName === this.flatIndexPath; }
generate(): ts.SourceFile {
const relativeEntryPoint = './' +
path.posix.relative(path.posix.dirname(this.flatIndexPath), this.entryPoint)
.replace(/\.tsx?$/, '');
const contents = `/**
* Generated bundle index. Do not edit.
*/
export * from '${relativeEntryPoint}';
`;
const genFile = ts.createSourceFile(
this.flatIndexPath, contents, ts.ScriptTarget.ES2015, true, ts.ScriptKind.TS);
if (this.moduleName !== null) {
genFile.moduleName = this.moduleName;
}
return genFile;
}
}

View File

@ -8,8 +8,10 @@
import * as ts from 'typescript';
import {isNonDeclarationTsPath} from '../../util/src/typescript';
import {ShimGenerator} from './host';
import {generatedModuleName, isNonDeclarationTsFile} from './util';
import {generatedModuleName} from './util';
export class SummaryGenerator implements ShimGenerator {
private constructor(private map: Map<string, string>) {}
@ -61,7 +63,7 @@ export class SummaryGenerator implements ShimGenerator {
static forRootFiles(files: ReadonlyArray<string>): SummaryGenerator {
const map = new Map<string, string>();
files.filter(sourceFile => isNonDeclarationTsFile(sourceFile))
files.filter(sourceFile => isNonDeclarationTsPath(sourceFile))
.forEach(sourceFile => map.set(sourceFile.replace(/\.ts$/, '.ngsummary.ts'), sourceFile));
return new SummaryGenerator(map);
}

View File

@ -6,16 +6,6 @@
* 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 D_TS_FILE = /\.d\.ts$/;
export function isNonDeclarationTsFile(file: string): boolean {
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;