Skip to content

Commit

Permalink
fix(tsc-wrapped): decouple bundle index host from tsickle dependency
Browse files Browse the repository at this point in the history
  • Loading branch information
alexeagle committed Sep 1, 2017
1 parent c7e1bda commit e10b5ac
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 58 deletions.
11 changes: 2 additions & 9 deletions packages/tsc-wrapped/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,5 @@
* found in the LICENSE file at https://angular.io/license
*/

export {MetadataWriterHost} from './src/compiler_host';
export {CodegenExtension, UserError, createBundleIndexHost, main} from './src/main';

export {default as AngularCompilerOptions} from './src/options';
export * from './src/bundler';
export * from './src/cli_options';
export * from './src/collector';
export * from './src/index_writer';
export * from './src/schema';
export {main} from './src/main';
export * from './index_no_tsickle';
19 changes: 19 additions & 0 deletions packages/tsc-wrapped/index_no_tsickle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* @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
*/

// This index allows tsc-wrapped to be used with no dependency on tsickle.
// Short-term workaround until tsc-wrapped is removed entirely.
export {MetadataWriterHost} from './src/compiler_host';
export {CodegenExtension, UserError, createBundleIndexHost} from './src/main_no_tsickle';
export {default as AngularCompilerOptions} from './src/options';

export * from './src/bundler';
export * from './src/cli_options';
export * from './src/collector';
export * from './src/index_writer';
export * from './src/schema';
53 changes: 4 additions & 49 deletions packages/tsc-wrapped/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,60 +11,15 @@ import * as path from 'path';
import * as tsickle from 'tsickle';
import * as ts from 'typescript';

import {CompilerHostAdapter, MetadataBundler} from './bundler';
import {CodegenExtension, createBundleIndexHost} from './main_no_tsickle';
import {CliOptions} from './cli_options';
import {MetadataWriterHost, createSyntheticIndexHost} from './compiler_host';
import {privateEntriesToIndex} from './index_writer';
import NgOptions from './options';
import {check, tsc} from './tsc';
import {isVinylFile, VinylFile} from './vinyl_file';
import {MetadataWriterHost} from './compiler_host';

export {UserError} from './tsc';
import {check, tsc} from './tsc';
import {VinylFile, isVinylFile} from './vinyl_file';

const DTS = /\.d\.ts$/;
const JS_EXT = /(\.js|)$/;
const TS_EXT = /\.ts$/;

export interface CodegenExtension {
/**
* Returns the generated file names.
*/
(ngOptions: NgOptions, cliOptions: CliOptions, program: ts.Program,
host: ts.CompilerHost): Promise<string[]>;
}

export function createBundleIndexHost<H extends ts.CompilerHost>(
ngOptions: NgOptions, rootFiles: string[],
host: H): {host: H, indexName?: string, errors?: ts.Diagnostic[]} {
const files = rootFiles.filter(f => !DTS.test(f));
if (files.length != 1) {
return {
host,
errors: [{
file: null as any as ts.SourceFile,
start: null as any as number,
length: null as any as number,
messageText:
'Angular compiler option "flatModuleIndex" requires one and only one .ts file in the "files" field.',
category: ts.DiagnosticCategory.Error,
code: 0
}]
};
}
const file = files[0];
const indexModule = file.replace(/\.ts$/, '');
const bundler =
new MetadataBundler(indexModule, ngOptions.flatModuleId, new CompilerHostAdapter(host));
const metadataBundle = bundler.getMetadataBundle();
const metadata = JSON.stringify(metadataBundle.metadata);
const name =
path.join(path.dirname(indexModule), ngOptions.flatModuleOutFile !.replace(JS_EXT, '.ts'));
const libraryIndex = `./${path.basename(indexModule)}`;
const content = privateEntriesToIndex(libraryIndex, metadataBundle.privates);
host = createSyntheticIndexHost(host, {name, content, metadata});
return {host, indexName: name};
}

export function main(
project: string | VinylFile, cliOptions: CliOptions, codegen?: CodegenExtension,
options?: ts.CompilerOptions): Promise<any> {
Expand Down
61 changes: 61 additions & 0 deletions packages/tsc-wrapped/src/main_no_tsickle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/**
* @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 {CompilerHostAdapter, MetadataBundler} from './bundler';
import {CliOptions} from './cli_options';
import {createSyntheticIndexHost} from './compiler_host';
import {privateEntriesToIndex} from './index_writer';
import NgOptions from './options';

export {UserError} from './tsc';

export interface CodegenExtension {
/**
* Returns the generated file names.
*/
(ngOptions: NgOptions, cliOptions: CliOptions, program: ts.Program,
host: ts.CompilerHost): Promise<string[]>;
}

const DTS = /\.d\.ts$/;
const JS_EXT = /(\.js|)$/;

export function createBundleIndexHost<H extends ts.CompilerHost>(
ngOptions: NgOptions, rootFiles: string[],
host: H): {host: H, indexName?: string, errors?: ts.Diagnostic[]} {
const files = rootFiles.filter(f => !DTS.test(f));
if (files.length != 1) {
return {
host,
errors: [{
file: null as any as ts.SourceFile,
start: null as any as number,
length: null as any as number,
messageText:
'Angular compiler option "flatModuleIndex" requires one and only one .ts file in the "files" field.',
category: ts.DiagnosticCategory.Error,
code: 0
}]
};
}
const file = files[0];
const indexModule = file.replace(/\.ts$/, '');
const bundler =
new MetadataBundler(indexModule, ngOptions.flatModuleId, new CompilerHostAdapter(host));
const metadataBundle = bundler.getMetadataBundle();
const metadata = JSON.stringify(metadataBundle.metadata);
const name =
path.join(path.dirname(indexModule), ngOptions.flatModuleOutFile !.replace(JS_EXT, '.ts'));
const libraryIndex = `./${path.basename(indexModule)}`;
const content = privateEntriesToIndex(libraryIndex, metadataBundle.privates);
host = createSyntheticIndexHost(host, {name, content, metadata});
return {host, indexName: name};
}

0 comments on commit e10b5ac

Please sign in to comment.