Skip to content

Commit d6003ee

Browse files
committed
chore(build): Add traceur transpiler for broccoli.
This exactly reproduces the output tree from one of the gulp tasks, which is now removed. Next step is to migrate another sibling task to broccoli.
1 parent bc248e9 commit d6003ee

File tree

6 files changed

+188
-10
lines changed

6 files changed

+188
-10
lines changed

Brocfile.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* Build pipeline for Angular2.
3+
* First time setup:
4+
* $ npm install --global broccoli-cli
5+
*/
6+
var merge = require('merge');
7+
var TraceurCompiler = require('./tools/broccoli/traceur');
8+
var Funnel = require('broccoli-funnel');
9+
var stew = require('broccoli-stew');
10+
11+
var _COMPILER_CONFIG_JS_DEFAULT = {
12+
sourceMaps: true,
13+
annotations: true, // parse annotations
14+
types: true, // parse types
15+
script: false, // parse as a module
16+
memberVariables: true, // parse class fields
17+
modules: 'instantiate'
18+
};
19+
20+
var modulesTree = new Funnel('modules', {include: ['**/**'], destDir: '/'});
21+
22+
var transpiledTree = new TraceurCompiler(modulesTree, merge(true, _COMPILER_CONFIG_JS_DEFAULT, {
23+
typeAssertionModule: 'rtts_assert/rtts_assert',
24+
typeAssertions: true,
25+
outputLanguage: 'es6'
26+
}));
27+
28+
transpiledTree = stew.rename(transpiledTree, function(relativePath) {
29+
return relativePath.replace(/\.(js|es6)\.map$/, '.map')
30+
.replace(/\.js$/, '.es6');
31+
});
32+
transpiledTree = stew.mv(transpiledTree, 'js/dev/es6')
33+
34+
//transpiledTree = stew.log(transpiledTree);
35+
36+
37+
module.exports = transpiledTree;
38+

gulpfile.js

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
var broccoli = require('broccoli');
2+
var copyDereferenceSync = require('copy-dereference').sync;
3+
var fse = require('fs-extra');
4+
15
var format = require('gulp-clang-format');
26
var gulp = require('gulp');
37
var gulpPlugins = require('gulp-load-plugins')();
@@ -278,6 +282,47 @@ var CONFIG = {
278282
};
279283
CONFIG.test.js.cjs = CONFIG.test.js.cjs.map(function(s) {return CONFIG.dest.js.cjs + s});
280284

285+
// ------------
286+
// integration point to run broccoli build
287+
288+
var broccoliExecuted = false;
289+
290+
gulp.task('broccoli', function() {
291+
if (broccoliExecuted) {
292+
throw new Error('The broccoli task can be called only once!');
293+
}
294+
broccoliExecuted = true;
295+
296+
var broccoliDist = path.join('dist', 'js', 'dev', 'es6');
297+
fse.removeSync(broccoliDist);
298+
fse.mkdirsSync(path.join('dist', 'js', 'dev'));
299+
300+
var tree = broccoli.loadBrocfile();
301+
var builder = new broccoli.Builder(tree);
302+
return builder.build()
303+
.then(function (hash) {
304+
var dir = hash.directory;
305+
try {
306+
copyDereferenceSync(path.join(dir, 'js', 'dev', 'es6'), broccoliDist);
307+
} catch (err) {
308+
if (err.code === 'EEXIST') err.message += ' (we cannot build into an existing directory)';
309+
throw err;
310+
}
311+
})
312+
.finally(function () {
313+
builder.cleanup();
314+
})
315+
.catch(function (err) {
316+
// Should show file and line/col if present
317+
if (err.file) {
318+
console.error('File: ' + err.file);
319+
}
320+
console.error(err.stack);
321+
console.error('\nBuild failed');
322+
process.exit(1);
323+
});
324+
});
325+
281326
// ------------
282327
// clean
283328

@@ -317,15 +362,6 @@ gulp.task('build/transpile.ts.cjs', function() {
317362
]);
318363
});
319364

320-
gulp.task('build/transpile.js.dev.es6', transpile(gulp, gulpPlugins, {
321-
src: CONFIG.transpile.src.js,
322-
dest: CONFIG.dest.js.dev.es6,
323-
outputExt: 'es6',
324-
options: CONFIG.transpile.options.js.dev,
325-
srcFolderInsertion: CONFIG.srcFolderInsertion.js
326-
}));
327-
328-
329365
gulp.task('build/transpile.ts.dev.es5', function() {
330366
var tsResult = gulp.src(CONFIG.transpile.src.ts)
331367
.pipe(sourcemaps.init())
@@ -353,7 +389,7 @@ gulp.task('build/transpile.js.dev.es5', function() {
353389

354390
gulp.task('build/transpile.js.dev', function(done) {
355391
runSequence(
356-
'build/transpile.js.dev.es6',
392+
// broccoli runs the ES6 version of this task
357393
'build/transpile.js.dev.es5',
358394
done
359395
);
@@ -806,6 +842,7 @@ gulp.task('build.dart', function(done) {
806842

807843
gulp.task('build.js.dev', function(done) {
808844
runSequence(
845+
'broccoli',
809846
['build/transpile.js.dev', 'build/html.js.dev', 'build/copy.js.dev', 'build/multicopy.js.dev.es6'],
810847
'build/checkCircularDependencies',
811848
done

package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
},
2727
"dependencies": {
2828
"es6-module-loader": "^0.9.2",
29+
"fs-extra": "^0.18.0",
2930
"googleapis": "1.0.x",
3031
"gulp-insert": "^0.4.0",
3132
"gulp-modify": "0.0.4",
@@ -41,7 +42,12 @@
4142
"devDependencies": {
4243
"angular": "1.3.5",
4344
"bower": "^1.3.12",
45+
"broccoli": "^0.15.3",
46+
"broccoli-funnel": "^0.2.3",
47+
"broccoli-stew": "^0.2.1",
48+
"broccoli-writer": "^0.1.1",
4449
"canonical-path": "0.0.2",
50+
"copy-dereference": "^1.0.0",
4551
"css": "mlaval/css#issue65",
4652
"del": "~1",
4753
"dgeni": "^0.4.1",
@@ -87,6 +93,8 @@
8793
"through2": "^0.6.1",
8894
"typescript": "alexeagle/TypeScript#93dbbe2a2d0b42cefd02ac949e4bc8ab6b5b5823",
8995
"vinyl": "^0.4.6",
96+
"walk-sync": "^0.1.3",
97+
"xtend": "^4.0.0",
9098
"yargs": "2.3.*"
9199
}
92100
}

tools/broccoli/traceur/index.js

Lines changed: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/broccoli/traceur/index.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
var fs = require('fs');
2+
var fse = require('fs-extra');
3+
var path = require('path');
4+
var traceur = require('../../transpiler');
5+
var walkSync = require('walk-sync');
6+
var Writer = require('broccoli-writer');
7+
var xtend = require('xtend');
8+
9+
class TraceurFilter extends Writer {
10+
constructor(private inputTree, private options = {}) {}
11+
12+
write(readTree, destDir) {
13+
return readTree(this.inputTree)
14+
.then(srcDir => {
15+
walkSync(srcDir)
16+
.filter(filepath => {
17+
var extension = path.extname(filepath).toLowerCase();
18+
return extension === '.js' || extension === '.es6';
19+
})
20+
.map(filepath => {
21+
var options = xtend({filename: filepath}, this.options);
22+
23+
var fsOpts = {encoding: 'utf-8'};
24+
var sourcecode = fs.readFileSync(path.join(srcDir, filepath), fsOpts);
25+
26+
var result = traceur.compile(options, filepath, sourcecode);
27+
28+
result.js = result.js + '\n//# sourceMappingURL=./' + path.basename(filepath).replace(/\.\w+$/, '.map');
29+
30+
var destFilepath = filepath.replace(/\.\w+$/, '.es6');
31+
var destFile = path.join(destDir, destFilepath);
32+
fse.mkdirsSync(path.dirname(destFile));
33+
var destMap = path.join(destDir, filepath + '.map');
34+
35+
36+
fs.writeFileSync(destFile, result.js, fsOpts);
37+
result.sourceMap.file = destFilepath;
38+
fs.writeFileSync(destMap, JSON.stringify(result.sourceMap), fsOpts);
39+
});
40+
});
41+
}
42+
}
43+
44+
module.exports = TraceurFilter;

tools/build/html.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var path = require('path');
55
var fs = require('fs');
66
var VinylFile = require('vinyl');
77

8+
// used for generating html files and bootstrapping benchmarks and examples
89
module.exports = function(gulp, plugins, config) {
910
return function() {
1011
return gulp.src(config.src)

0 commit comments

Comments
 (0)