chore(build): move more broccoli support inside the TypeScript boundary

This commit is contained in:
Alex Eagle 2015-04-13 09:52:02 -07:00
parent dbfc4c1c16
commit 34501aaae6
4 changed files with 81 additions and 80 deletions

View File

@ -1,5 +1,3 @@
var broccoliBuild = require('./tools/broccoli/gulp');
var format = require('gulp-clang-format'); var format = require('gulp-clang-format');
var gulp = require('gulp'); var gulp = require('gulp');
var gulpPlugins = require('gulp-load-plugins')(); var gulpPlugins = require('gulp-load-plugins')();
@ -33,7 +31,12 @@ var util = require('./tools/build/util');
var bundler = require('./tools/build/bundle'); var bundler = require('./tools/build/bundle');
var replace = require('gulp-replace'); var replace = require('gulp-replace');
var insert = require('gulp-insert'); var insert = require('gulp-insert');
var makeBroccoliTree = require('./tools/broccoli/make-broccoli-tree');
// dynamic require in build.broccoli.tools so we can bootstrap TypeScript compilation
function missingDynamicBroccoli() {
throw new Error('ERROR: build.broccoli.tools task should have been run before using broccoli');
}
var makeBroccoliTree = missingDynamicBroccoli, broccoliBuild = missingDynamicBroccoli;
// Note: when DART_SDK is not found, all gulp tasks ending with `.dart` will be skipped. // Note: when DART_SDK is not found, all gulp tasks ending with `.dart` will be skipped.
@ -769,7 +772,11 @@ gulp.task('build.dart', function(done) {
gulp.task('build.broccoli.tools', function() { gulp.task('build.broccoli.tools', function() {
var tsResult = gulp.src('tools/broccoli/**/*.ts') var tsResult = gulp.src('tools/broccoli/**/*.ts')
.pipe(tsc({ target: 'ES5', module: 'commonjs' })); .pipe(tsc({ target: 'ES5', module: 'commonjs' }));
return tsResult.js.pipe(gulp.dest('dist/broccoli')); return tsResult.js.pipe(gulp.dest('dist/broccoli'))
.on('end', function() {
makeBroccoliTree = require('./dist/broccoli/make-broccoli-tree');
broccoliBuild = require('./dist/broccoli/gulp');
});
}); });
gulp.task('broccoli.js.dev', ['build.broccoli.tools'], function() { gulp.task('broccoli.js.dev', ['build.broccoli.tools'], function() {

View File

@ -1,5 +1,3 @@
'use strict';
var broccoli = require('broccoli'); var broccoli = require('broccoli');
var copyDereferenceSync = require('copy-dereference').sync; var copyDereferenceSync = require('copy-dereference').sync;
var fse = require('fs-extra'); var fse = require('fs-extra');
@ -33,7 +31,8 @@ function broccoliBuild(tree, outputRoot) {
var builder = new broccoli.Builder(tree); var builder = new broccoli.Builder(tree);
return builder.build() return builder.build()
.then(function(hash) { .then(function(hash) {
console.log('=== Stats for %s (total: %ds) ===', outputRoot, Math.round(hash.totalTime/1000000)/1000); console.log('=== Stats for %s (total: %ds) ===', outputRoot,
Math.round(hash.totalTime / 1000000) / 1000);
printSlowTrees(hash.graph); printSlowTrees(hash.graph);
var dir = hash.directory; var dir = hash.directory;
@ -47,9 +46,7 @@ function broccoliBuild(tree, outputRoot) {
} }
}) })
.finally(function() { .finally(function() {
time('Build cleanup', function() { time('Build cleanup', function() { builder.cleanup(); });
builder.cleanup();
});
console.log('=== Done building %s ===', outputRoot); console.log('=== Done building %s ===', outputRoot);
}) })
@ -70,7 +67,6 @@ function broccoliBuild(tree, outputRoot) {
function time(label, work) { function time(label, work) {
var start = Date.now(); var start = Date.now();
work(); work();
var duration = Date.now() - start; var duration = Date.now() - start;

View File

@ -3,8 +3,9 @@ var path = require('path');
module.exports = read; module.exports = read;
function read(file) { function read(file) {
var content = fs.readFileSync(path.join(__dirname, file + '.html'), {encoding: 'utf-8'}); var content = fs.readFileSync(path.join('tools/broccoli/html-replace', file + '.html'),
// TODO(broccoli): we don't really need this, it's here to make the output match the tools/build/html {encoding: 'utf-8'});
// TODO(broccoli): we don't really need this, it's here to make the output match the
// tools/build/html
return content.substring(0, content.lastIndexOf("\n")); return content.substring(0, content.lastIndexOf("\n"));
} }

View File

@ -8,34 +8,33 @@ var path = require('path');
var renderLodashTemplate = require('broccoli-lodash'); var renderLodashTemplate = require('broccoli-lodash');
var replace = require('broccoli-replace'); var replace = require('broccoli-replace');
var stew = require('broccoli-stew'); var stew = require('broccoli-stew');
var ts2dart; var ts2dart = require('./broccoli-ts2dart');
var TraceurCompiler; var TraceurCompiler = require('./traceur');
var TypescriptCompiler; var TypescriptCompiler = require('./typescript');
var projectRootDir = path.normalize(path.join(__dirname, '..', '..')); var projectRootDir = path.normalize(path.join(__dirname, '..', '..'));
module.exports = function makeBroccoliTree(name) { module.exports = function makeBroccoliTree(name) {
if (!TraceurCompiler) TraceurCompiler = require('../../dist/broccoli/traceur');
if (!TypescriptCompiler) TypescriptCompiler = require('../../dist/broccoli/typescript');
if (!ts2dart) ts2dart = require('../../dist/broccoli/broccoli-ts2dart');
switch (name) { switch (name) {
case 'dev': return makeBrowserTree({name: name, typeAssertions: true}); case 'dev':
case 'prod': return makeBrowserTree({name: name, typeAssertions: false}); return makeBrowserTree({name: name, typeAssertions: true});
case 'cjs': return makeCjsTree(); case 'prod':
case 'dart': return makeDartTree(); return makeBrowserTree({name: name, typeAssertions: false});
default: throw new Error('Unknown build type: ' + name); case 'cjs':
return makeCjsTree();
case 'dart':
return makeDartTree();
default:
throw new Error('Unknown build type: ' + name);
} }
}; };
function makeBrowserTree(options) { function makeBrowserTree(options) {
var modulesTree = new Funnel('modules', { var modulesTree = new Funnel(
include: ['**/**'], 'modules',
exclude: ['**/*.cjs', 'benchmarks/e2e_test/**'], {include: ['**/**'], exclude: ['**/*.cjs', 'benchmarks/e2e_test/**'], destDir: '/'});
destDir: '/'
});
// Use Traceur to transpile original sources to ES6 // Use Traceur to transpile original sources to ES6
var es6Tree = new TraceurCompiler(modulesTree, '.es6', '.map', { var es6Tree = new TraceurCompiler(modulesTree, '.es6', '.map', {
@ -52,11 +51,11 @@ function makeBrowserTree(options) {
// Call Traceur again to lower the ES6 build tree to ES5 // Call Traceur again to lower the ES6 build tree to ES5
var es5Tree = new TraceurCompiler(es6Tree, '.js', '.js.map', {modules: 'instantiate', sourceMaps: true}); var es5Tree =
new TraceurCompiler(es6Tree, '.js', '.js.map', {modules: 'instantiate', sourceMaps: true});
// Now we add a few more files to the es6 tree that Traceur should not see // Now we add a few more files to the es6 tree that Traceur should not see
['angular2', 'rtts_assert'].forEach( ['angular2', 'rtts_assert'].forEach(function(destDir) {
function (destDir) {
var extras = new Funnel('tools/build', {files: ['es5build.js'], destDir: destDir}); var extras = new Funnel('tools/build', {files: ['es5build.js'], destDir: destDir});
es6Tree = mergeTrees([es6Tree, extras]); es6Tree = mergeTrees([es6Tree, extras]);
}); });
@ -161,8 +160,7 @@ function makeCjsTree() {
}); });
// Now we add the LICENSE file into all the folders that will become npm packages // Now we add the LICENSE file into all the folders that will become npm packages
outputPackages.forEach( outputPackages.forEach(function(destDir) {
function(destDir) {
var license = new Funnel('.', {files: ['LICENSE'], destDir: destDir}); var license = new Funnel('.', {files: ['LICENSE'], destDir: destDir});
cjsTree = mergeTrees([cjsTree, license]); cjsTree = mergeTrees([cjsTree, license]);
}); });
@ -191,11 +189,10 @@ function makeCjsTree() {
}; };
// Add a .template extension since renderLodashTemplate strips one extension // Add a .template extension since renderLodashTemplate strips one extension
var packageJsons = stew.rename(new Funnel(modulesTree, {include: ['**/package.json']}), '.json', '.json.template'); var packageJsons = stew.rename(new Funnel(modulesTree, {include: ['**/package.json']}), '.json',
packageJsons = renderLodashTemplate(packageJsons, { '.json.template');
files: ["**/**"], packageJsons = renderLodashTemplate(
context: { 'packageJson': COMMON_PACKAGE_JSON } packageJsons, {files: ["**/**"], context: {'packageJson': COMMON_PACKAGE_JSON}});
});
var typescriptTree = new TypescriptCompiler(modulesTree, { var typescriptTree = new TypescriptCompiler(modulesTree, {
@ -251,7 +248,7 @@ function makeDartTree() {
return path.join.apply(path, parts); return path.join.apply(path, parts);
} }
} }
throw new Error('Failed to match any path', relativePath); throw new Error('Failed to match any path: ' + relativePath);
}); });
// Move the tree under the 'dart' folder. // Move the tree under the 'dart' folder.