chore(build): use a Filter plugin to write the dest folder.

This lets broccoli keep the dest folder up-to-date in 'watch' mode,
so we should be able to use that for Karma.
This commit is contained in:
Alex Eagle 2015-04-13 09:52:02 -07:00
parent 3667854a8f
commit 70433e6b73
5 changed files with 62 additions and 26 deletions

View File

@ -43,6 +43,7 @@
"angular": "1.3.5", "angular": "1.3.5",
"bower": "^1.3.12", "bower": "^1.3.12",
"broccoli": "^0.15.3", "broccoli": "^0.15.3",
"broccoli-filter": "^0.1.12",
"broccoli-flatten": "^0.1.1", "broccoli-flatten": "^0.1.1",
"broccoli-funnel": "igorminar/broccoli-funnel#perf-files", "broccoli-funnel": "igorminar/broccoli-funnel#perf-files",
"broccoli-lodash": "^0.1.1", "broccoli-lodash": "^0.1.1",
@ -52,7 +53,6 @@
"broccoli-stew": "^0.2.1", "broccoli-stew": "^0.2.1",
"broccoli-writer": "^0.1.1", "broccoli-writer": "^0.1.1",
"canonical-path": "0.0.2", "canonical-path": "0.0.2",
"copy-dereference": "^1.0.0",
"css": "mlaval/css#issue65", "css": "mlaval/css#issue65",
"del": "~1", "del": "~1",
"dgeni": "^0.4.1", "dgeni": "^0.4.1",
@ -95,8 +95,8 @@
"temp": "^0.8.1", "temp": "^0.8.1",
"ternary-stream": "^1.2.3", "ternary-stream": "^1.2.3",
"through2": "^0.6.1", "through2": "^0.6.1",
"typescript": "alexeagle/TypeScript#93dbbe2a2d0b42cefd02ac949e4bc8ab6b5b5823",
"ts2dart": "^0.3.0", "ts2dart": "^0.3.0",
"typescript": "alexeagle/TypeScript#93dbbe2a2d0b42cefd02ac949e4bc8ab6b5b5823",
"vinyl": "^0.4.6", "vinyl": "^0.4.6",
"walk-sync": "^0.1.3", "walk-sync": "^0.1.3",
"xtend": "^4.0.0", "xtend": "^4.0.0",

View File

@ -0,0 +1,33 @@
/// <reference path="./broccoli-filter.d.ts" />
/// <reference path="../typings/node/node.d.ts" />
/// <reference path="../typings/fs-extra/fs-extra.d.ts" />
import Filter = require('broccoli-filter');
import fse = require('fs-extra');
import path = require('path');
/**
* Intercepts each file as it is copied to the destination tempdir,
* and tees a copy to the given path outside the tmp dir.
*/
class DestCopy extends Filter {
constructor(private inputTree, private outputRoot: string) { super(inputTree); }
getDestFilePath(relativePath: string): string { return relativePath; }
processString(content: string, relativePath: string): string { return content; }
processFile(srcDir, destDir, relativePath): Promise<any> {
return super.processFile(srcDir, destDir, relativePath)
.then(x => {
var destFile = path.join(this.outputRoot, this.getDestFilePath(relativePath));
var dir = path.dirname(destFile);
fse.mkdirsSync(dir);
fse.copySync(path.join(srcDir, relativePath), destFile);
});
}
}
export = function destCopy(inputTree, outputRoot) {
return new DestCopy(inputTree, outputRoot);
}

11
tools/broccoli/broccoli-filter.d.ts vendored Normal file
View File

@ -0,0 +1,11 @@
/// <reference path="../typings/es6-promise/es6-promise.d.ts" />
declare class Filter {
constructor(inputTree: any);
processString(contents: string, relativePath: string): string;
// NB: This function is probably not intended as part of the public API
processFile(srcDir: string, destDir: string, relativePath: string): Promise<any>;
}
export = Filter;

View File

@ -1,5 +1,5 @@
var broccoli = require('broccoli'); var broccoli = require('broccoli');
var copyDereferenceSync = require('copy-dereference').sync; var destCopy = require('../broccoli-dest-copy');
var fse = require('fs-extra'); var fse = require('fs-extra');
var path = require('path'); var path = require('path');
var printSlowTrees = require('broccoli-slow-trees'); var printSlowTrees = require('broccoli-slow-trees');
@ -26,31 +26,23 @@ function broccoliBuild(tree, outputRoot) {
// We do a clean build every time to avoid stale outputs. // We do a clean build every time to avoid stale outputs.
// Broccoli's cache folders allow it to remain incremental without reading this dir. // Broccoli's cache folders allow it to remain incremental without reading this dir.
fse.removeSync(distPath); fse.removeSync(distPath);
fse.mkdirsSync(path.join(distPath, '..'));
tree = destCopy(tree, 'dist');
var builder = new broccoli.Builder(tree); var builder = new broccoli.Builder(tree);
return builder.build() return builder.build()
.then(function(hash) { .then(hash =>
console.log('=== Stats for %s (total: %ds) ===', outputRoot, {
Math.round(hash.totalTime / 1000000) / 1000); console.log('=== Stats for %s (total: %ds) ===', outputRoot,
printSlowTrees(hash.graph); Math.round(hash.totalTime / 1000000) / 1000);
printSlowTrees(hash.graph);
var dir = hash.directory; })
try { .finally(() =>
time('Write build output', function() { {
copyDereferenceSync(path.join(dir, outputRoot), distPath); time('Build cleanup', () => builder.cleanup());
}); console.log('=== Done building %s ===', outputRoot);
} catch (err) { })
if (err.code === 'EEXIST') err.message += ' (we cannot build into an existing directory)'; .catch(err => {
throw err;
}
})
.finally(function() {
time('Build cleanup', function() { builder.cleanup(); });
console.log('=== Done building %s ===', outputRoot);
})
.catch(function(err) {
// Should show file and line/col if present // Should show file and line/col if present
if (err.file) { if (err.file) {
console.error('File: ' + err.file); console.error('File: ' + err.file);

View File

@ -37,7 +37,7 @@ class TraceurFilter extends Writer {
// TODO: we should fix the sourceMappingURL written by Traceur instead of overriding // TODO: we should fix the sourceMappingURL written by Traceur instead of overriding
// (but we might switch to typescript first) // (but we might switch to typescript first)
var mapFilepath = filepath.replace(/\.\w+$/, '') + this.destSourceMapExtension; var mapFilepath = filepath.replace(/\.\w+$/, '') + this.destSourceMapExtension;
result.js = result.js + '\n //# sourceMappingURL=./' + path.basename(mapFilepath); result.js = result.js + '\n//# sourceMappingURL=./' + path.basename(mapFilepath);
var destFilepath = filepath.replace(/\.\w+$/, this.destExtension); var destFilepath = filepath.replace(/\.\w+$/, this.destExtension);
var destFile = path.join(destDir, destFilepath); var destFile = path.join(destDir, destFilepath);