diff --git a/build.sh b/build.sh index fba735ad50005..187b46496da45 100755 --- a/build.sh +++ b/build.sh @@ -6,7 +6,7 @@ cd `dirname $0` TSCONFIG=./modules/tsconfig.json -echo "====== (all)COMPILING: \$(npm bin)/ng2tc -p ${TSCONFIG} =====" +echo "====== (all)COMPILING: \$(npm bin)/tsc -p ${TSCONFIG} =====" rm -rf ./dist/all/ mkdir ./dist/all/ @@ -27,8 +27,14 @@ ln -s ../../../../node_modules/angular/angular.js . cd - # compile ts code -$(npm bin)/ng2tc -p ${TSCONFIG} - +# TODO: Right now we have a cycle in that the compiler_cli depends on Angular +# but we need it to compile Angular. +# The solution right now is to do 2 compilation runs. +# Fix this by separating the metadata extraction into a separate binary that does +# not depend on Angular. +$(npm bin)/tsc -p ${TSCONFIG} +NG_TC="node dist/all/@angular/compiler_cli/src/main" +$NG_TC -p modules/tsconfig.json rm -rf ./dist/packages-dist @@ -42,20 +48,20 @@ for PACKAGE in \ http \ router \ router-deprecated \ - upgrade + upgrade \ + compiler_cli do SRCDIR=./modules/@angular/${PACKAGE} DESTDIR=./dist/packages-dist/${PACKAGE} UMDES6PATH=${DESTDIR}/esm/${PACKAGE}.umd.js UMDES5PATH=${DESTDIR}/${PACKAGE}.umd.js - if [[ ${PACKAGE} == "router-deprecated" ]]; then echo "====== COMPILING: \$(npm bin)/tsc -p ${SRCDIR}/tsconfig-es5.json =====" $(npm bin)/tsc -p ${SRCDIR}/tsconfig-es5.json else - echo "====== COMPILING: \$(npm bin)/ng2tc -p ${SRCDIR}/tsconfig-es5.json =====" - $(npm bin)/ng2tc -p ${SRCDIR}/tsconfig-es5.json + echo "====== COMPILING: ${NG_TC} -p ${SRCDIR}/tsconfig-es5.json =====" + $NG_TC -p ${SRCDIR}/tsconfig-es5.json fi cp ${SRCDIR}/package.json ${DESTDIR}/ @@ -71,42 +77,43 @@ do find ${DESTDIR} -type f -name '*.d.ts' -print0 | xargs -0 sed -i '' -E 's/^( +)abstract ([[:alnum:]]+\:)/\1\2/g' fi + if [[ ${PACKAGE} != compiler_cli ]]; then + + if [[ ${PACKAGE} == "router-deprecated" ]]; then + echo "====== (esm)COMPILING: \$(npm bin)/tsc -p ${SRCDIR}/tsconfig-es2015.json =====" + $(npm bin)/tsc -p ${SRCDIR}/tsconfig-es2015.json + else + echo "====== (esm)COMPILING: $NG_TC -p ${SRCDIR}/tsconfig-es2015.json =====" + $NG_TC -p ${SRCDIR}/tsconfig-es2015.json + fi + + echo "====== BUNDLING: ${SRCDIR} =====" + ( + cd ${SRCDIR} + echo "..." # here just to have grep match something and not exit with 1 + ../../../node_modules/.bin/rollup -c rollup.config.js + ) 2>&1 | grep -v "as external dependency" + + # workaround for https://github.com/rollup/rollup/issues/626 + if [[ ${TRAVIS} ]]; then + sed -i "s/ class exports\./ class /g" ${DESTDIR}/esm/${PACKAGE}.umd.js + else + sed -i '' "s/ class exports\./ class /g" ${DESTDIR}/esm/${PACKAGE}.umd.js + fi + + $(npm bin)/tsc \ + --out ${UMDES5PATH} \ + --target es5 \ + --allowJs \ + ${UMDES6PATH} \ + modules/\@angular/manual_typings/globals.d.ts \ + modules/\@angular/typings/es6-collections/es6-collections.d.ts \ + modules/\@angular/typings/es6-promise/es6-promise.d.ts + rm ${UMDES6PATH} + + cat ./modules/@angular/license-banner.txt > ${UMDES5PATH}.tmp + cat ${UMDES5PATH} >> ${UMDES5PATH}.tmp + mv ${UMDES5PATH}.tmp ${UMDES5PATH} - if [[ ${PACKAGE} == "router-deprecated" ]]; then - echo "====== (esm)COMPILING: \$(npm bin)/tsc -p ${SRCDIR}/tsconfig-es2015.json =====" - $(npm bin)/tsc -p ${SRCDIR}/tsconfig-es2015.json - else - echo "====== (esm)COMPILING: \$(npm bin)/ng2tc -p ${SRCDIR}/tsconfig-es2015.json =====" - $(npm bin)/ng2tc -p ${SRCDIR}/tsconfig-es2015.json fi - - - echo "====== BUNDLING: ${SRCDIR} =====" - ( - cd ${SRCDIR} - echo "..." # here just to have grep match something and not exit with 1 - ../../../node_modules/.bin/rollup -c rollup.config.js - ) 2>&1 | grep -v "as external dependency" - - # workaround for https://github.com/rollup/rollup/issues/626 - if [[ ${TRAVIS} ]]; then - sed -i "s/ class exports\./ class /g" ${DESTDIR}/esm/${PACKAGE}.umd.js - else - sed -i '' "s/ class exports\./ class /g" ${DESTDIR}/esm/${PACKAGE}.umd.js - fi - - $(npm bin)/tsc \ - --out ${UMDES5PATH} \ - --target es5 \ - --allowJs \ - ${UMDES6PATH} \ - modules/\@angular/manual_typings/globals.d.ts \ - modules/\@angular/typings/es6-collections/es6-collections.d.ts \ - modules/\@angular/typings/es6-promise/es6-promise.d.ts - rm ${UMDES6PATH} - - cat ./modules/@angular/license-banner.txt > ${UMDES5PATH}.tmp - cat ${UMDES5PATH} >> ${UMDES5PATH}.tmp - mv ${UMDES5PATH}.tmp ${UMDES5PATH} - done diff --git a/karma-js.conf.js b/karma-js.conf.js index ee379292c4e7d..3369b84caeb6d 100644 --- a/karma-js.conf.js +++ b/karma-js.conf.js @@ -39,6 +39,7 @@ module.exports = function(config) { exclude: [ 'dist/all/@angular/**/e2e_test/**', 'dist/all/@angular/examples/**', + 'dist/all/@angular/compiler_cli/**', 'dist/all/angular1_router.js', 'dist/all/@angular/platform-browser/testing/e2e_util.js' ], diff --git a/modules/@angular/compiler/private_export.ts b/modules/@angular/compiler/private_export.ts index feec942e14dde..81ef39201cb73 100644 --- a/modules/@angular/compiler/private_export.ts +++ b/modules/@angular/compiler/private_export.ts @@ -1,5 +1,15 @@ import * as selector from './src/selector'; -import * as pathUtil from './src/output/path_util'; +import * as path_util from './src/output/path_util'; +import * as metadata_resolver from './src/metadata_resolver'; +import * as html_parser from './src/html_parser'; +import * as directive_normalizer from './src/directive_normalizer'; +import * as lexer from './src/expression_parser/lexer'; +import * as parser from './src/expression_parser/parser'; +import * as template_parser from './src/template_parser'; +import * as dom_element_schema_registry from './src/schema/dom_element_schema_registry'; +import * as style_compiler from './src/style_compiler'; +import * as view_compiler from './src/view_compiler/view_compiler'; +import * as ts_emitter from './src/output/ts_emitter'; export namespace __compiler_private__ { export type SelectorMatcher = selector.SelectorMatcher; @@ -8,9 +18,39 @@ export namespace __compiler_private__ { export type CssSelector = selector.CssSelector; export var CssSelector = selector.CssSelector; - export type AssetUrl = pathUtil.AssetUrl; - export var AssetUrl = pathUtil.AssetUrl; + export type AssetUrl = path_util.AssetUrl; + export var AssetUrl = path_util.AssetUrl; - export type ImportGenerator = pathUtil.ImportGenerator; - export var ImportGenerator = pathUtil.ImportGenerator; + export type ImportGenerator = path_util.ImportGenerator; + export var ImportGenerator = path_util.ImportGenerator; + + export type CompileMetadataResolver = metadata_resolver.CompileMetadataResolver; + export var CompileMetadataResolver = metadata_resolver.CompileMetadataResolver; + + export type HtmlParser = html_parser.HtmlParser; + export var HtmlParser = html_parser.HtmlParser; + + export type DirectiveNormalizer = directive_normalizer.DirectiveNormalizer; + export var DirectiveNormalizer = directive_normalizer.DirectiveNormalizer; + + export type Lexer = lexer.Lexer; + export var Lexer = lexer.Lexer; + + export type Parser = parser.Parser; + export var Parser = parser.Parser; + + export type TemplateParser = template_parser.TemplateParser; + export var TemplateParser = template_parser.TemplateParser; + + export type DomElementSchemaRegistry = dom_element_schema_registry.DomElementSchemaRegistry; + export var DomElementSchemaRegistry = dom_element_schema_registry.DomElementSchemaRegistry; + + export type StyleCompiler = style_compiler.StyleCompiler; + export var StyleCompiler = style_compiler.StyleCompiler; + + export type ViewCompiler = view_compiler.ViewCompiler; + export var ViewCompiler = view_compiler.ViewCompiler; + + export type TypeScriptEmitter = ts_emitter.TypeScriptEmitter; + export var TypeScriptEmitter = ts_emitter.TypeScriptEmitter; } diff --git a/tools/compiler_cli/README.md b/modules/@angular/compiler_cli/README.md similarity index 89% rename from tools/compiler_cli/README.md rename to modules/@angular/compiler_cli/README.md index ccd46935fbe42..b97d937ee9b91 100644 --- a/tools/compiler_cli/README.md +++ b/modules/@angular/compiler_cli/README.md @@ -80,18 +80,17 @@ At a high level, this program ## For developers Run the compiler from source: ``` -# Build angular2 -./build.sh -# Build the compiler -./node_modules/.bin/tsc -p tools/compiler_cli/src +# Build angular2 and the compiler +./node_modules/.bin/tsc -p modules # Run it on the test project -node ./dist/tools/compiler_cli/main.js -p tools/compiler_cli/test +$ export NODE_PATH=$NODE_PATH:dist/all:dist/tools +$ node dist/packages-dist/compiler_cli/src/main -p modules/@angular/compiler_cli/integrationtest ``` Release: ``` -$ gulp test.compiler_cli -$ cp tools/compiler_cli/README.md tools/compiler_cli/package.json dist/tools/compiler_cli +$ node dist/tools/cjs-jasmine -- @angular/compiler_cli/integrationtest/**/*_spec.js +$ cp modules/@angular/compiler_cli/README.md modules/@angular/compiler_cli/package.json dist/all/@angular/compiler_cli # npm login as angular -$ npm publish dist/tools/compiler_cli/ --access=public +$ npm publish dist/all/@angular/compiler_cli --access=public ``` diff --git a/modules/@angular/compiler_cli/index.ts b/modules/@angular/compiler_cli/index.ts new file mode 100644 index 0000000000000..8bb7748eca2fe --- /dev/null +++ b/modules/@angular/compiler_cli/index.ts @@ -0,0 +1,3 @@ +export {CodeGenerator} from './src/codegen'; +export {NodeReflectorHost} from './src/reflector_host'; +export {TsickleHost, MetadataWriterHost} from './src/compiler_host'; diff --git a/tools/compiler_cli/test/src/a/multiple_components.html b/modules/@angular/compiler_cli/integrationtest/src/a/multiple_components.html similarity index 100% rename from tools/compiler_cli/test/src/a/multiple_components.html rename to modules/@angular/compiler_cli/integrationtest/src/a/multiple_components.html diff --git a/tools/compiler_cli/test/src/a/multiple_components.ts b/modules/@angular/compiler_cli/integrationtest/src/a/multiple_components.ts similarity index 100% rename from tools/compiler_cli/test/src/a/multiple_components.ts rename to modules/@angular/compiler_cli/integrationtest/src/a/multiple_components.ts diff --git a/tools/compiler_cli/test/src/basic.css b/modules/@angular/compiler_cli/integrationtest/src/basic.css similarity index 100% rename from tools/compiler_cli/test/src/basic.css rename to modules/@angular/compiler_cli/integrationtest/src/basic.css diff --git a/tools/compiler_cli/test/src/basic.html b/modules/@angular/compiler_cli/integrationtest/src/basic.html similarity index 100% rename from tools/compiler_cli/test/src/basic.html rename to modules/@angular/compiler_cli/integrationtest/src/basic.html diff --git a/tools/compiler_cli/test/src/basic.ts b/modules/@angular/compiler_cli/integrationtest/src/basic.ts similarity index 100% rename from tools/compiler_cli/test/src/basic.ts rename to modules/@angular/compiler_cli/integrationtest/src/basic.ts diff --git a/tools/compiler_cli/test/src/bootstrap.ts b/modules/@angular/compiler_cli/integrationtest/src/bootstrap.ts similarity index 100% rename from tools/compiler_cli/test/src/bootstrap.ts rename to modules/@angular/compiler_cli/integrationtest/src/bootstrap.ts diff --git a/tools/compiler_cli/test/src/dep.d.ts b/modules/@angular/compiler_cli/integrationtest/src/dep.d.ts similarity index 100% rename from tools/compiler_cli/test/src/dep.d.ts rename to modules/@angular/compiler_cli/integrationtest/src/dep.d.ts diff --git a/tools/compiler_cli/test/src/features.ts b/modules/@angular/compiler_cli/integrationtest/src/features.ts similarity index 100% rename from tools/compiler_cli/test/src/features.ts rename to modules/@angular/compiler_cli/integrationtest/src/features.ts diff --git a/tools/compiler_cli/test/src/shared.css b/modules/@angular/compiler_cli/integrationtest/src/shared.css similarity index 100% rename from tools/compiler_cli/test/src/shared.css rename to modules/@angular/compiler_cli/integrationtest/src/shared.css diff --git a/tools/compiler_cli/src/basic_spec.ts b/modules/@angular/compiler_cli/integrationtest/test/basic_spec.ts similarity index 76% rename from tools/compiler_cli/src/basic_spec.ts rename to modules/@angular/compiler_cli/integrationtest/test/basic_spec.ts index f577705cb0b06..f3bb094b7ac2d 100644 --- a/tools/compiler_cli/src/basic_spec.ts +++ b/modules/@angular/compiler_cli/integrationtest/test/basic_spec.ts @@ -1,10 +1,8 @@ -/// -/// import * as fs from 'fs'; import * as path from 'path'; describe("template codegen output", () => { - const outDir = path.join('dist', 'tools', 'compiler_cli', 'test', 'built'); + const outDir = path.join('dist', 'all', '@angular', 'compiler_cli', 'integrationtest', 'src'); it("should lower Decorators without reflect-metadata", () => { const jsOutput = path.join(outDir, 'basic.js'); @@ -17,7 +15,7 @@ describe("template codegen output", () => { expect(fs.existsSync(metadataOutput)).toBeTruthy(); const output = fs.readFileSync(metadataOutput, {encoding: 'utf-8'}); expect(output).toContain('"decorators":'); - expect(output).toContain('"name":"Component","module":"angular2/core"'); + expect(output).toContain('"name":"Component","module":"@angular/core"'); }); it("should write .d.ts files", () => { diff --git a/modules/@angular/compiler_cli/integrationtest/tsconfig.json b/modules/@angular/compiler_cli/integrationtest/tsconfig.json new file mode 100644 index 0000000000000..07d017a174f82 --- /dev/null +++ b/modules/@angular/compiler_cli/integrationtest/tsconfig.json @@ -0,0 +1,23 @@ +{ + "angularCompilerOptions": { + // For TypeScript 1.8, we have to lay out generated files + // in the same source directory with your code. + "genDir": ".", + "legacyPackageLayout": false + }, + + "compilerOptions": { + "target": "es5", + "experimentalDecorators": true, + "noImplicitAny": false, + "moduleResolution": "node", + "outDir": "../../../../dist/all/@angular/compiler_cli/integrationtest", + "rootDir": "", + "declaration": true, + + "baseUrl": ".", + "paths": { + "@angular/*": ["../../../../dist/all/@angular/*"] + } + } +} diff --git a/modules/@angular/compiler_cli/integrationtest/typings.d.ts b/modules/@angular/compiler_cli/integrationtest/typings.d.ts new file mode 100644 index 0000000000000..b233a0dc0cbe3 --- /dev/null +++ b/modules/@angular/compiler_cli/integrationtest/typings.d.ts @@ -0,0 +1,4 @@ +/// +/// +/// +/// diff --git a/tools/compiler_cli/package.json b/modules/@angular/compiler_cli/package.json similarity index 97% rename from tools/compiler_cli/package.json rename to modules/@angular/compiler_cli/package.json index 1f27e74189bf0..c021809bb4adf 100644 --- a/tools/compiler_cli/package.json +++ b/modules/@angular/compiler_cli/package.json @@ -5,7 +5,7 @@ "main": "index.js", "typings": "index.d.ts", "bin": { - "ngc": "./main.js" + "ngc": "./src/main.js" }, "dependencies": { "ts-metadata-collector": "^0.1.0", diff --git a/tools/compiler_cli/src/codegen.ts b/modules/@angular/compiler_cli/src/codegen.ts similarity index 90% rename from tools/compiler_cli/src/codegen.ts rename to modules/@angular/compiler_cli/src/codegen.ts index bfe3956aa6030..954bc57a2d3a2 100644 --- a/tools/compiler_cli/src/codegen.ts +++ b/modules/@angular/compiler_cli/src/codegen.ts @@ -8,16 +8,11 @@ import * as path from 'path'; import * as compiler from '@angular/compiler'; import {ViewEncapsulation} from '@angular/core'; import {StaticReflector} from './static_reflector'; -import {CompileMetadataResolver} from '@angular/compiler/src/metadata_resolver'; -import {HtmlParser} from '@angular/compiler/src/html_parser'; -import {DirectiveNormalizer} from '@angular/compiler/src/directive_normalizer'; -import {Lexer} from '@angular/compiler/src/expression_parser/lexer'; -import {Parser} from '@angular/compiler/src/expression_parser/parser'; -import {TemplateParser} from '@angular/compiler/src/template_parser'; -import {DomElementSchemaRegistry} from '@angular/compiler/src/schema/dom_element_schema_registry'; -import {StyleCompiler} from '@angular/compiler/src/style_compiler'; -import {ViewCompiler} from '@angular/compiler/src/view_compiler/view_compiler'; -import {TypeScriptEmitter} from '@angular/compiler/src/output/ts_emitter'; +import {CompileMetadataResolver, HtmlParser, DirectiveNormalizer, Lexer, Parser, +TemplateParser, DomElementSchemaRegistry, StyleCompiler, +ViewCompiler, TypeScriptEmitter +} from './compiler_private'; + import {Parse5DomAdapter} from '@angular/platform-server'; import {MetadataCollector} from 'ts-metadata-collector'; diff --git a/tools/compiler_cli/src/compiler_host.ts b/modules/@angular/compiler_cli/src/compiler_host.ts similarity index 92% rename from tools/compiler_cli/src/compiler_host.ts rename to modules/@angular/compiler_cli/src/compiler_host.ts index 6b04ce58c11c7..7d8dfab9df500 100644 --- a/tools/compiler_cli/src/compiler_host.ts +++ b/modules/@angular/compiler_cli/src/compiler_host.ts @@ -4,11 +4,6 @@ import {convertDecorators} from 'tsickle'; import {NodeReflectorHost} from './reflector_host'; import {AngularCompilerOptions} from './codegen'; -const DEBUG = false; -function debug(msg: string, ...o: any[]) { - if (DEBUG) console.log(msg, ...o); -} - /** * Implementation of CompilerHost that forwards all methods to another instance. * Useful for partial implementations to override only methods they care about. @@ -37,11 +32,12 @@ export abstract class DelegatingHost implements ts.CompilerHost { export class TsickleHost extends DelegatingHost { // Additional diagnostics gathered by pre- and post-emit transformations. public diagnostics: ts.Diagnostic[] = []; - private TSICKLE_SUPPORT = `interface DecoratorInvocation { - type: Function; - args?: any[]; - } - `; + private TSICKLE_SUPPORT = ` +interface DecoratorInvocation { + type: Function; + args?: any[]; +} +`; constructor(delegate: ts.CompilerHost, private options: ts.CompilerOptions) { super(delegate); } getSourceFile = @@ -53,8 +49,7 @@ export class TsickleHost extends DelegatingHost { if (converted.diagnostics) { this.diagnostics.push(...converted.diagnostics); } - newContent = this.TSICKLE_SUPPORT + converted.output; - debug(newContent); + newContent = converted.output + this.TSICKLE_SUPPORT; } return ts.createSourceFile(fileName, newContent, languageVersion, true); } diff --git a/modules/@angular/compiler_cli/src/compiler_private.ts b/modules/@angular/compiler_cli/src/compiler_private.ts new file mode 100644 index 0000000000000..65429dc8a415a --- /dev/null +++ b/modules/@angular/compiler_cli/src/compiler_private.ts @@ -0,0 +1,37 @@ +import {__compiler_private__ as _c} from '@angular/compiler'; + +export var AssetUrl: typeof _c.AssetUrl = _c.AssetUrl; +export type AssetUrl = _c.AssetUrl; + +export var ImportGenerator: typeof _c.ImportGenerator = _c.ImportGenerator; +export type ImportGenerator = _c.ImportGenerator; + +export type CompileMetadataResolver = _c.CompileMetadataResolver; +export var CompileMetadataResolver: typeof _c.CompileMetadataResolver = _c.CompileMetadataResolver; + +export type HtmlParser = _c.HtmlParser; +export var HtmlParser: typeof _c.HtmlParser = _c.HtmlParser; + +export type DirectiveNormalizer = _c.DirectiveNormalizer; +export var DirectiveNormalizer: typeof _c.DirectiveNormalizer = _c.DirectiveNormalizer; + +export type Lexer = _c.Lexer; +export var Lexer: typeof _c.Lexer = _c.Lexer; + +export type Parser = _c.Parser; +export var Parser: typeof _c.Parser = _c.Parser; + +export type TemplateParser = _c.TemplateParser; +export var TemplateParser: typeof _c.TemplateParser = _c.TemplateParser; + +export type DomElementSchemaRegistry = _c.DomElementSchemaRegistry; +export var DomElementSchemaRegistry: typeof _c.DomElementSchemaRegistry = _c.DomElementSchemaRegistry; + +export type StyleCompiler = _c.StyleCompiler; +export var StyleCompiler: typeof _c.StyleCompiler = _c.StyleCompiler; + +export type ViewCompiler = _c.ViewCompiler; +export var ViewCompiler: typeof _c.ViewCompiler = _c.ViewCompiler; + +export type TypeScriptEmitter = _c.TypeScriptEmitter; +export var TypeScriptEmitter: typeof _c.TypeScriptEmitter = _c.TypeScriptEmitter; diff --git a/modules/@angular/compiler_cli/src/core_private.ts b/modules/@angular/compiler_cli/src/core_private.ts new file mode 100644 index 0000000000000..5197e05a103aa --- /dev/null +++ b/modules/@angular/compiler_cli/src/core_private.ts @@ -0,0 +1,4 @@ +import {__core_private__ as r, __core_private_types__ as t} from '@angular/core'; + +export type ReflectorReader = t.ReflectorReader; +export var ReflectorReader: typeof t.ReflectorReader = r.ReflectorReader; diff --git a/tools/compiler_cli/src/main.ts b/modules/@angular/compiler_cli/src/main.ts similarity index 93% rename from tools/compiler_cli/src/main.ts rename to modules/@angular/compiler_cli/src/main.ts index 99915411ff341..cc33e9336324f 100644 --- a/tools/compiler_cli/src/main.ts +++ b/modules/@angular/compiler_cli/src/main.ts @@ -1,7 +1,4 @@ #!/usr/bin/env node -// TODO(alexeagle): use --lib=node when available; remove this reference -// https://github.com/Microsoft/TypeScript/pull/7757#issuecomment-205644657 -/// // Must be imported first, because angular2 decorators throws on load. import 'reflect-metadata'; diff --git a/tools/compiler_cli/src/reflector_host.ts b/modules/@angular/compiler_cli/src/reflector_host.ts similarity index 100% rename from tools/compiler_cli/src/reflector_host.ts rename to modules/@angular/compiler_cli/src/reflector_host.ts diff --git a/tools/compiler_cli/src/static_reflector.ts b/modules/@angular/compiler_cli/src/static_reflector.ts similarity index 86% rename from tools/compiler_cli/src/static_reflector.ts rename to modules/@angular/compiler_cli/src/static_reflector.ts index 1d4cfcd9313c8..0dbf11cfa1a23 100644 --- a/tools/compiler_cli/src/static_reflector.ts +++ b/modules/@angular/compiler_cli/src/static_reflector.ts @@ -1,12 +1,3 @@ -import {StringMapWrapper, ListWrapper} from '@angular/core/src/facade/collection'; -import { - isArray, - isPresent, - isBlank, - isPrimitive, - isStringMap, - FunctionWrapper -} from '@angular/core/src/facade/lang'; import { AttributeMetadata, DirectiveMetadata, @@ -23,8 +14,7 @@ import { ViewQueryMetadata, QueryMetadata, } from '@angular/core'; -import {ReflectorReader} from '@angular/core/src/reflection/reflector_reader'; -import {reflector} from '@angular/core'; +import {ReflectorReader} from './core_private'; import {Provider} from '@angular/core'; import { HostMetadata, @@ -89,26 +79,26 @@ export class StaticReflector implements ReflectorReader { public annotations(type: StaticSymbol): any[] { let annotations = this.annotationCache.get(type); - if (!isPresent(annotations)) { + if (!annotations) { let classMetadata = this.getTypeMetadata(type); - if (isPresent(classMetadata['decorators'])) { + if (classMetadata['decorators']) { annotations = this.simplify(type, classMetadata['decorators']); } else { annotations = []; } - this.annotationCache.set(type, annotations.filter(ann => isPresent(ann))); + this.annotationCache.set(type, annotations.filter(ann => !!ann)); } return annotations; } public propMetadata(type: StaticSymbol): {[key: string]: any} { let propMetadata = this.propertyCache.get(type); - if (!isPresent(propMetadata)) { + if (!propMetadata) { let classMetadata = this.getTypeMetadata(type); - let members = isPresent(classMetadata) ? classMetadata['members'] : {}; + let members = classMetadata ? classMetadata['members'] : {}; propMetadata = mapStringMap(members, (propData, propName) => { let prop = (propData).find(a => a['__symbolic'] == 'property'); - if (isPresent(prop) && isPresent(prop['decorators'])) { + if (prop && prop['decorators']) { return this.simplify(type, prop['decorators']); } else { return []; @@ -125,29 +115,29 @@ export class StaticReflector implements ReflectorReader { } try { let parameters = this.parameterCache.get(type); - if (!isPresent(parameters)) { + if (!parameters) { let classMetadata = this.getTypeMetadata(type); - let members = isPresent(classMetadata) ? classMetadata['members'] : null; - let ctorData = isPresent(members) ? members['__ctor__'] : null; - if (isPresent(ctorData)) { + let members = classMetadata ? classMetadata['members'] : null; + let ctorData = members ? members['__ctor__'] : null; + if (ctorData) { let ctor = (ctorData).find(a => a['__symbolic'] == 'constructor'); let parameterTypes = this.simplify(type, ctor['parameters']); let parameterDecorators = this.simplify(type, ctor['parameterDecorators']); parameters = []; - ListWrapper.forEachWithIndex(parameterTypes, (paramType, index) => { + parameterTypes.forEach( (paramType, index) => { let nestedResult: any[] = []; - if (isPresent(paramType)) { + if (paramType) { nestedResult.push(paramType); } - let decorators = isPresent(parameterDecorators) ? parameterDecorators[index] : null; - if (isPresent(decorators)) { - ListWrapper.addAll(nestedResult, decorators); + let decorators = parameterDecorators ? parameterDecorators[index] : null; + if (decorators) { + nestedResult.push(...decorators); } parameters.push(nestedResult); }); } - if (!isPresent(parameters)) { + if (!parameters) { parameters = []; } this.parameterCache.set(type, parameters); @@ -162,16 +152,18 @@ export class StaticReflector implements ReflectorReader { private registerDecoratorOrConstructor(type: StaticSymbol, ctor: any): void { this.conversionMap.set(type, (context: StaticSymbol, args: any[]) => { let argValues: any[] = []; - ListWrapper.forEachWithIndex(args, (arg, index) => { + args.forEach( (arg, index) => { let argValue: any; - if (isStringMap(arg) && isBlank(arg['__symbolic'])) { + if (typeof arg === 'object' && !arg['__symbolic']) { argValue = mapStringMap(arg, (value, key) => this.simplify(context, value)); } else { argValue = this.simplify(context, arg); } argValues.push(argValue); }); - return FunctionWrapper.apply(reflector.factory(ctor), argValues); + var metadata = Object.create(ctor.prototype); + ctor.apply(metadata, argValues); + return metadata; }); } @@ -239,15 +231,15 @@ export class StaticReflector implements ReflectorReader { if (isPrimitive(expression)) { return expression; } - if (isArray(expression)) { + if (expression instanceof Array) { let result: any[] = []; for (let item of(expression)) { result.push(simplify(item)); } return result; } - if (isPresent(expression)) { - if (isPresent(expression['__symbolic'])) { + if (expression) { + if (expression['__symbolic']) { let staticSymbol: StaticSymbol; switch (expression['__symbolic']) { case "binop": @@ -312,15 +304,15 @@ export class StaticReflector implements ReflectorReader { case "index": let indexTarget = simplify(expression['expression']); let index = simplify(expression['index']); - if (isPresent(indexTarget) && isPrimitive(index)) return indexTarget[index]; + if (indexTarget && isPrimitive(index)) return indexTarget[index]; return null; case "select": let selectTarget = simplify(expression['expression']); let member = simplify(expression['member']); - if (isPresent(selectTarget) && isPrimitive(member)) return selectTarget[member]; + if (selectTarget && isPrimitive(member)) return selectTarget[member]; return null; case "reference": - if (isPresent(expression['module'])) { + if (expression['module']) { staticSymbol = _this.host.findDeclaration(expression['module'], expression['name'], context.filePath); } else { @@ -329,8 +321,8 @@ export class StaticReflector implements ReflectorReader { let result = staticSymbol; let moduleMetadata = _this.getModuleMetadata(staticSymbol.filePath); let declarationValue = - isPresent(moduleMetadata) ? moduleMetadata['metadata'][staticSymbol.name] : null; - if (isPresent(declarationValue)) { + moduleMetadata ? moduleMetadata['metadata'][staticSymbol.name] : null; + if (declarationValue) { result = _this.simplify(staticSymbol, declarationValue); } return result; @@ -342,9 +334,9 @@ export class StaticReflector implements ReflectorReader { staticSymbol = _this.host.findDeclaration(target['module'], target['name'], context.filePath); let converter = _this.conversionMap.get(staticSymbol); - if (isPresent(converter)) { + if (converter) { let args = expression['arguments']; - if (isBlank(args)) { + if (!args) { args = []; } return converter(context, args); @@ -367,9 +359,9 @@ export class StaticReflector implements ReflectorReader { */ public getModuleMetadata(module: string): {[key: string]: any} { let moduleMetadata = this.metadataCache.get(module); - if (!isPresent(moduleMetadata)) { + if (!moduleMetadata) { moduleMetadata = this.host.getMetadataFor(module); - if (!isPresent(moduleMetadata)) { + if (!moduleMetadata) { moduleMetadata = {__symbolic: "module", module: module, metadata: {}}; } this.metadataCache.set(module, moduleMetadata); @@ -380,7 +372,7 @@ export class StaticReflector implements ReflectorReader { private getTypeMetadata(type: StaticSymbol): {[key: string]: any} { let moduleMetadata = this.getModuleMetadata(type.filePath); let result = moduleMetadata['metadata'][type.name]; - if (!isPresent(result)) { + if (!result) { result = {__symbolic: "class"}; } return result; @@ -389,8 +381,12 @@ export class StaticReflector implements ReflectorReader { function mapStringMap(input: {[key: string]: any}, transform: (value: any, key: string) => any): {[key: string]: any} { - if (isBlank(input)) return {}; + if (!input) return {}; var result: {[key: string]: any} = {}; - StringMapWrapper.keys(input).forEach((key) => { result[key] = transform(input[key], key); }); + Object.keys(input).forEach((key) => { result[key] = transform(input[key], key); }); return result; } + +function isPrimitive(o: any):boolean { + return o === null || (typeof o !== "function" && typeof o !== "object"); +} \ No newline at end of file diff --git a/tools/compiler_cli/src/tsc.ts b/modules/@angular/compiler_cli/src/tsc.ts similarity index 100% rename from tools/compiler_cli/src/tsc.ts rename to modules/@angular/compiler_cli/src/tsc.ts diff --git a/tools/compiler_cli/src/static_reflector_spec.ts b/modules/@angular/compiler_cli/test/static_reflector_spec.ts similarity index 99% rename from tools/compiler_cli/src/static_reflector_spec.ts rename to modules/@angular/compiler_cli/test/static_reflector_spec.ts index 0b8e92fc346b8..5f0bb86effb2a 100644 --- a/tools/compiler_cli/src/static_reflector_spec.ts +++ b/modules/@angular/compiler_cli/test/static_reflector_spec.ts @@ -1,5 +1,3 @@ -/// - import { describe, it, @@ -11,7 +9,7 @@ import { import {isBlank} from '@angular/facade/src/lang'; import {ListWrapper} from '@angular/facade/src/collection'; -import {StaticReflector, StaticReflectorHost, StaticSymbol} from './static_reflector'; +import {StaticReflector, StaticReflectorHost, StaticSymbol} from '@angular/compiler_cli/src/static_reflector'; describe('StaticReflector', () => { let noContext = new StaticSymbol('', ''); diff --git a/modules/@angular/compiler_cli/tsconfig-es5.json b/modules/@angular/compiler_cli/tsconfig-es5.json new file mode 100644 index 0000000000000..30b2c689391e4 --- /dev/null +++ b/modules/@angular/compiler_cli/tsconfig-es5.json @@ -0,0 +1,34 @@ +{ + "angularCompilerOptions": { + "skipTemplateCodegen": true + }, + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "lib": ["es6", "dom"], + "noImplicitAny": true, + "sourceMap": true, + "baseUrl": ".", + "paths": { + "@angular/core": ["../../../dist/packages-dist/core"], + "@angular/common": ["../../../dist/packages-dist/common"], + "@angular/compiler": ["../../../dist/packages-dist/compiler"], + "@angular/platform-server": ["../../../dist/packages-dist/platform-server"], + "@angular/platform-browser": ["../../../dist/packages-dist/platform-browser"], + "ts-metadata-collector": ["dist/tools/metadata"] + }, + "experimentalDecorators": true, + "rootDir": ".", + "sourceRoot": ".", + "outDir": "../../../dist/packages-dist/compiler_cli", + "declaration": true + }, + "exclude": ["integrationtest"], + "files": [ + "index.ts", + "src/main.ts", + "../typings/node/node.d.ts", + "../typings/jasmine/jasmine.d.ts", + "../../../node_modules/zone.js/dist/zone.js.d.ts" + ] +} diff --git a/modules/@angular/platform-server/compiler_private.ts b/modules/@angular/platform-server/compiler_private.ts index eab4092790e26..bcf70d0d4f0fc 100644 --- a/modules/@angular/platform-server/compiler_private.ts +++ b/modules/@angular/platform-server/compiler_private.ts @@ -1,7 +1,7 @@ -import {__compiler_private__ as _} from '@angular/compiler'; +import {__compiler_private__ as _c} from '@angular/compiler'; -export type SelectorMatcher = typeof _.SelectorMatcher; -export var SelectorMatcher: typeof _.SelectorMatcher = _.SelectorMatcher; +export type SelectorMatcher = typeof _c.SelectorMatcher; +export var SelectorMatcher: typeof _c.SelectorMatcher = _c.SelectorMatcher; -export type CssSelector = typeof _.CssSelector; -export var CssSelector: typeof _.CssSelector = _.CssSelector; +export type CssSelector = typeof _c.CssSelector; +export var CssSelector: typeof _c.CssSelector = _c.CssSelector; diff --git a/modules/tsconfig.json b/modules/tsconfig.json index 7142eca96b405..31a72ba306023 100644 --- a/modules/tsconfig.json +++ b/modules/tsconfig.json @@ -28,6 +28,7 @@ "payload_tests", "rollup-test", "upgrade-ts2dart.d.ts", - "zone-ts2dart.d.ts" + "zone-ts2dart.d.ts", + "@angular/compiler_cli/integrationtest" ] } diff --git a/npm-shrinkwrap.clean.json b/npm-shrinkwrap.clean.json index 961f0c6554f77..2e4f2204ab757 100644 --- a/npm-shrinkwrap.clean.json +++ b/npm-shrinkwrap.clean.json @@ -58,9 +58,6 @@ "version": "2.0.0-beta.17", "resolved": "git://github.com/angular/angular.git#08cbd5481d04255864f5ff8e33d0756d4ec4c440" }, - "angular2-template-compiler": { - "version": "0.1.5" - }, "ansi": { "version": "0.3.0" }, diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 59b413fd43c77..b15680d7c7e4c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -93,11 +93,6 @@ "from": "angular/angular#2.0.0-build.cacdead.js", "resolved": "git://github.com/angular/angular.git#08cbd5481d04255864f5ff8e33d0756d4ec4c440" }, - "angular2-template-compiler": { - "version": "0.1.5", - "from": "angular2-template-compiler@>=0.1.5 <0.2.0", - "resolved": "https://registry.npmjs.org/angular2-template-compiler/-/angular2-template-compiler-0.1.5.tgz" - }, "ansi": { "version": "0.3.0", "from": "ansi@>=0.3.0 <0.4.0", diff --git a/package.json b/package.json index a39f1dfd955a3..457d1b57796a6 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "angular": "^1.5.0", "angular-animate": "^1.5.0", "angular-mocks": "^1.5.0", - "angular2-template-compiler": "^0.1.5", "base64-js": "^0.0.8", "bower": "^1.3.12", "broccoli": "^0.16.9", diff --git a/scripts/ci-lite/build.sh b/scripts/ci-lite/build.sh index 2714a6e9c3d0d..5791a90917a84 100755 --- a/scripts/ci-lite/build.sh +++ b/scripts/ci-lite/build.sh @@ -10,7 +10,16 @@ source ./env.sh cd ../.. $(npm bin)/tsc -p ./tools/tsconfig.json -$(npm bin)/ng2tc -p ./modules/tsconfig.json -$(npm bin)/tsc -p ./tools/compiler_cli/src/tsconfig.json + +# TODO: Right now we have a cycle in that the compiler_cli depends on Angular +# but we need it to compile Angular. +# The solution right now is to do 2 compilation runs. +# Fix this by separating the metadata extraction into a separate binary that does +# not depend on Angular. +$(npm bin)/tsc -p ./modules/tsconfig.json +node dist/all/@angular/compiler_cli/src/main -p modules/tsconfig.json + +# Compile the compiler_cli integration tests +node dist/all/@angular/compiler_cli/src/main -p modules/@angular/compiler_cli/integrationtest echo 'travis_fold:end:BUILD' diff --git a/scripts/ci-lite/env.sh b/scripts/ci-lite/env.sh index 9703f3f8a0a1e..6763bb7c64f66 100644 --- a/scripts/ci-lite/env.sh +++ b/scripts/ci-lite/env.sh @@ -41,7 +41,7 @@ fi # Append dist/all to the NODE_PATH so that cjs module resolver finds find the packages that use # absolute module ids (e.g. @angular/core) -export NODE_PATH=${NODE_PATH}:$(pwd)/../../dist/all +export NODE_PATH=${NODE_PATH}:$(pwd)/../../dist/all:$(pwd)/../../dist/tools export LOGS_DIR=/tmp/angular-build/logs if [[ ${TRAVIS} ]]; then diff --git a/scripts/ci-lite/test_js.sh b/scripts/ci-lite/test_js.sh index 2a2ecc73a0b39..246ca9af0a3f3 100755 --- a/scripts/ci-lite/test_js.sh +++ b/scripts/ci-lite/test_js.sh @@ -15,20 +15,33 @@ source ./env.sh cd ../.. +echo 'travis_fold:start:test.unit.tools' + +# Run unit tests in tools +node ./dist/tools/tsc-watch/ tools triggerCmds + +echo 'travis_fold:end:test.unit.tools' + + echo 'travis_fold:start:test.unit.node' -gulp test.compiler_cli # Run unit tests in node -node ./dist/tools/tsc-watch/ node +node ./dist/tools/tsc-watch/ node triggerCmds echo 'travis_fold:end:test.unit.node' +echo 'travis_fold:start:test.compiler_cli.node' -echo 'travis_fold:start:test.unit.localChrome' +# Run compiler_cli integration tests in node +node dist/tools/cjs-jasmine -- @angular/compiler_cli/integrationtest/**/*_spec.js + +echo 'travis_fold:end:test.compiler_cli.node' # rebuild since codegen has overwritten some files. -$(npm bin)/ng2tc -p modules/tsconfig.json +node dist/all/@angular/compiler_cli/src/main -p modules/tsconfig.json + +echo 'travis_fold:start:test.unit.localChrome' # Run unit tests in local chrome if [[ ${TRAVIS} ]]; then diff --git a/tools/cjs-jasmine/index-tools.ts b/tools/cjs-jasmine/index-tools.ts new file mode 100644 index 0000000000000..f66215695270e --- /dev/null +++ b/tools/cjs-jasmine/index-tools.ts @@ -0,0 +1,51 @@ +'use strict'; + +var glob = require('glob'); +var JasmineRunner = require('jasmine'); +var path = require('path'); +// require('es6-shim/es6-shim.js'); +require('zone.js/dist/zone-node.js'); +require('zone.js/dist/long-stack-trace-zone.js'); +require('zone.js/dist/async-test.js'); +require('zone.js/dist/fake-async-test.js'); + +var jrunner = new JasmineRunner(); +var toolsDir = process.cwd() + '/dist/tools'; +function toolsDirRequire(moduleId) { + return require(path.join(toolsDir, moduleId)); +} + +// Tun on full stack traces in errors to help debugging +Error['stackTraceLimit'] = Infinity; + +jrunner.jasmine.DEFAULT_TIMEOUT_INTERVAL = 100; + +// Support passing multiple globs +var globsIndex = process.argv.indexOf('--'); +var args; +if (globsIndex < 0) { + args = [process.argv[2]]; +} else { + args = process.argv.slice(globsIndex + 1); +} + +var specFiles = + args.map(function(globstr) { + return glob.sync(globstr, { + cwd: toolsDir + }); + }) + .reduce(function(specFiles, paths) { return specFiles.concat(paths); }, []); + +jasmine.DEFAULT_TIMEOUT_INTERVAL = 100; + +jrunner.configureDefaultReporter({showColors: process.argv.indexOf('--no-color') === -1}); + +jrunner.onComplete(function(passed) { process.exit(passed ? 0 : 1); }); +jrunner.projectBaseDir = path.resolve(__dirname, '../../'); +jrunner.specDir = ''; +require('zone.js/dist/jasmine-patch.js'); +specFiles.forEach((file) => { + toolsDirRequire(file); +}); +jrunner.execute(); diff --git a/tools/compiler_cli/src/compiler_private.ts b/tools/compiler_cli/src/compiler_private.ts deleted file mode 100644 index 82c6bfeb97988..0000000000000 --- a/tools/compiler_cli/src/compiler_private.ts +++ /dev/null @@ -1,7 +0,0 @@ -import {__compiler_private__ as _} from '@angular/compiler'; - -export var AssetUrl: typeof _.AssetUrl = _.AssetUrl; -export type AssetUrl = _.AssetUrl; - -export var ImportGenerator: typeof _.ImportGenerator = _.ImportGenerator; -export type ImportGenerator = _.ImportGenerator; diff --git a/tools/compiler_cli/src/index.ts b/tools/compiler_cli/src/index.ts deleted file mode 100644 index 51bc86fb62c6a..0000000000000 --- a/tools/compiler_cli/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export {CodeGenerator} from './codegen'; -export {NodeReflectorHost} from './reflector_host'; -export {TsickleHost, MetadataWriterHost} from './compiler_host'; diff --git a/tools/compiler_cli/src/tsconfig.json b/tools/compiler_cli/src/tsconfig.json deleted file mode 100644 index 1549e0e9221c3..0000000000000 --- a/tools/compiler_cli/src/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es5", - "lib": ["es6", "dom"], - "noImplicitAny": true, - "sourceMap": true, - "baseUrl": "../../..", - "paths": { - "@angular/*": ["dist/all/@angular/*"], - "@angular/core": ["dist/all/@angular/core/"], - "@angular/compiler": ["dist/all/@angular/compiler/"], - "ts-metadata-collector": ["dist/tools/metadata"] - }, - "experimentalDecorators": true, - "rootDir": ".", - // Write to a directory that has the node_modules symlink in a parent - "outDir": "../../../dist/tools/compiler_cli", - "declaration": true - }, - "exclude": ["test"] -} diff --git a/tools/compiler_cli/test/tsconfig.json b/tools/compiler_cli/test/tsconfig.json deleted file mode 100644 index 1c404d285f00e..0000000000000 --- a/tools/compiler_cli/test/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "angularCompilerOptions": { - // For TypeScript 1.8, we have to lay out generated files - // in the same source directory with your code. - "genDir": ".", - "legacyPackageLayout": false - }, - - "compilerOptions": { - "target": "es6", - "experimentalDecorators": true, - "noImplicitAny": false, - "moduleResolution": "node", - "outDir": "../../../dist/tools/compiler_cli/test/built", - "rootDir": "src", - "declaration": true, - - /** - * These options are only needed because the test depends - * on locally-built sources, not NPM distributions. - */ - "baseUrl": "../../..", - "paths": { - "@angular/*": ["dist/all/@angular/*"], - "@angular/core": ["dist/all/@angular/core/"], - "@angular/compiler": ["dist/all/@angular/compiler/"], - "rxjs/*": ["node_modules/rxjs/*"], - "ts-metadata-collector": ["dist/tools/metadata"] - } - } -} diff --git a/tools/tsc-watch/index.ts b/tools/tsc-watch/index.ts index 45fac6918806b..558d087b5bd1b 100644 --- a/tools/tsc-watch/index.ts +++ b/tools/tsc-watch/index.ts @@ -4,51 +4,49 @@ import {writeFileSync, mkdirSync, existsSync} from 'fs'; export * from './tsc_watch'; import 'reflect-metadata'; -const OFFLINE_COMPILE = - [ - 'output/output_emitter_codegen_untyped', - 'output/output_emitter_codegen_typed', - 'offline_compiler_codegen_untyped', - 'offline_compiler_codegen_typed' - ] +const OFFLINE_COMPILE = [ + 'output/output_emitter_codegen_untyped', + 'output/output_emitter_codegen_typed', + 'offline_compiler_codegen_untyped', + 'offline_compiler_codegen_typed' +]; - function - processOutputEmitterCodeGen(): - Promise { - return new Promise((resolve, reject) => { - var outDir = 'dist/all/@angular/compiler/test/'; - var promises = []; - console.log('Processing codegen...'); - OFFLINE_COMPILE.forEach((file: string) => { - var codegen = require('../../all/@angular/compiler/test/' + file + '.js'); - if (codegen.emit) { - console.log(` ${file} has changed, regenerating...`); - promises.push( - Promise.resolve(codegen.emit()) - .then((code) => { writeFileSync(outDir + file + '.ts', code); })); - } - }); - if (promises.length) { - Promise.all(promises) - .then(() => { - var args = [ - '--project', - 'tools/cjs-jasmine/tsconfig-output_emitter_codegen.json' - ]; - console.log(' compiling changes: tsc ' + args.join(' ')); - var tsc = spawn(TSC, args, {stdio: 'pipe'}); - tsc.stdout.on('data', (data) => process.stdout.write(data)); - tsc.stderr.on('data', (data) => process.stderr.write(data)); - tsc.on('close', (code) => code ? reject('Tsc exited with: ' + code) : - resolve(code)); - }) - .catch(reportError); - } else { - resolve(0); - } - }) - .catch(reportError); - } +function processOutputEmitterCodeGen(): + Promise { + return new Promise((resolve, reject) => { + var outDir = 'dist/all/@angular/compiler/test/'; + var promises = []; + console.log('Processing codegen...'); + OFFLINE_COMPILE.forEach((file: string) => { + var codegen = require('../../all/@angular/compiler/test/' + file + '.js'); + if (codegen.emit) { + console.log(` ${file} has changed, regenerating...`); + promises.push( + Promise.resolve(codegen.emit()) + .then((code) => { writeFileSync(outDir + file + '.ts', code); })); + } + }); + if (promises.length) { + Promise.all(promises) + .then(() => { + var args = [ + '--project', + 'tools/cjs-jasmine/tsconfig-output_emitter_codegen.json' + ]; + console.log(' compiling changes: tsc ' + args.join(' ')); + var tsc = spawn(TSC, args, {stdio: 'pipe'}); + tsc.stdout.on('data', (data) => process.stdout.write(data)); + tsc.stderr.on('data', (data) => process.stderr.write(data)); + tsc.on('close', (code) => code ? reject('Tsc exited with: ' + code) : + resolve(code)); + }) + .catch(reportError); + } else { + resolve(0); + } + }) + .catch(reportError); + } function md(dir: string, folders: string[]) { if (folders.length) { @@ -63,7 +61,7 @@ function md(dir: string, folders: string[]) { var tscWatch: TscWatch = null; var platform = process.argv.length >= 3 ? process.argv[2] : null; -var watch: boolean = process.argv.length >= 4 ? !!process.argv[3] : false; +var runMode: string = process.argv.length >= 4 ? process.argv[3] : null; if (platform == 'node') { tscWatch = new TscWatch({ @@ -73,7 +71,7 @@ if (platform == 'node') { complete: 'Compilation complete. Watching for file changes.', onChangeCmds: [ processOutputEmitterCodeGen, - ['node', 'dist/tools/cjs-jasmine', '--', '{@angular,benchpress}/**/*_spec.js'] + ['node', 'dist/tools/cjs-jasmine', '--', '{@angular,benchpress}/**/*_spec.js', '@angular/compiler_cli/test/**/*_spec.js'] ] }); } else if (platform == 'browser') { @@ -86,6 +84,24 @@ if (platform == 'node') { [['node', 'node_modules/karma/bin/karma', 'start', '--no-auto-watch', 'karma-js.conf.js']], onChangeCmds: [['node', 'node_modules/karma/bin/karma', 'run', 'karma-js.conf.js']] }); +} else if (platform == 'tools') { + tscWatch = new TscWatch({ + tsconfig: 'tools/tsconfig.json', + start: 'File change detected. Starting incremental compilation...', + error: 'error', + complete: 'Compilation complete. Watching for file changes.', + onChangeCmds: [ + // TODO: fix and enable tests for public_api_spec again! + // ['node', 'dist/tools/cjs-jasmine/index-tools', '--', '{metadata,public_api_guard}/**/*{_,.}spec.js'] + ['node', 'dist/tools/cjs-jasmine/index-tools', '--', 'metadata/**/*{_,.}spec.js'] + ] + }); } -watch ? tscWatch.watch() : tscWatch.run(); +if (runMode === 'watch') { + tscWatch.watch(); +} else if (runMode === 'triggerCmds') { + tscWatch.triggerCmds(); +} else { + tscWatch.run(); +} diff --git a/tools/tsc-watch/tsc_watch.ts b/tools/tsc-watch/tsc_watch.ts index 80b519d65337e..e64f5a77f64f4 100644 --- a/tools/tsc-watch/tsc_watch.ts +++ b/tools/tsc-watch/tsc_watch.ts @@ -8,7 +8,6 @@ enum State { } export const TSC = 'node_modules/typescript/bin/tsc'; -export const NG2TC = 'node_modules/.bin/ng2tc'; export type Command = (stdIn, stdErr) => Promise; export class TscWatch { @@ -40,10 +39,7 @@ export class TscWatch { } watch() { - // TODO(tbosch): We don't support ng2tc in watch mode yet, - // so we fall back to plain tsc. However, we don't use - // the preprocessing of tsickle regarding decorators... - var args = [this.runOnce ? NG2TC : TSC, '--project', this.tsconfig]; + var args = [TSC, '--project', this.tsconfig]; if (!this.runOnce) args.push('--watch'); var tsc = this.runCmd(args, {}, (d) => this.consumeLine(d, false), (d) => this.consumeLine(d, true)); diff --git a/tools/tsconfig.json b/tools/tsconfig.json index 3d0987aa3db7a..5af81d3523a6a 100644 --- a/tools/tsconfig.json +++ b/tools/tsconfig.json @@ -15,7 +15,6 @@ "target": "es5" }, "exclude": [ - "node_modules", - "compiler_cli" + "node_modules" ] }