Skip to content

Commit 69bba9b

Browse files
committed
feat(build): transpile to es6
Transpile all sources first to es6 which we can publish and then to es5. Also merge the generated source maps into once map.
1 parent 4b24734 commit 69bba9b

5 files changed

Lines changed: 139 additions & 17 deletions

File tree

gulpfile.js

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var rundartpackage = require('./tools/build/rundartpackage');
1717
var multicopy = require('./tools/build/multicopy');
1818
var karma = require('karma').server;
1919
var minimist = require('minimist');
20+
var es5build = require('./tools/build/es5build');
2021

2122
var DART_SDK = require('./tools/build/dartdetect')(gulp);
2223
// -----------------------
@@ -67,8 +68,14 @@ var CONFIG = {
6768
dest: {
6869
js: {
6970
all: 'dist/js',
70-
dev: 'dist/js/dev',
71-
prod: 'dist/js/prod',
71+
dev: {
72+
es6: 'dist/js/dev/es6',
73+
es5: 'dist/js/dev/es5'
74+
},
75+
prod: {
76+
es6: 'dist/js/prod/es6',
77+
es5: 'dist/js/prod/es5'
78+
},
7279
dart2js: 'dist/js/dart2js'
7380
},
7481
dart: 'dist/dart',
@@ -131,10 +138,12 @@ var CONFIG = {
131138
js: {
132139
dev: merge(true, _COMPILER_CONFIG_JS_DEFAULT, {
133140
typeAssertionModule: 'rtts_assert/rtts_assert',
134-
typeAssertions: true
141+
typeAssertions: true,
142+
outputLanguage: 'es6'
135143
}),
136144
prod: merge(true, _COMPILER_CONFIG_JS_DEFAULT, {
137-
typeAssertions: false
145+
typeAssertions: false,
146+
outputLanguage: 'es6'
138147
})
139148
},
140149
dart: {
@@ -212,12 +221,12 @@ gulp.task('build/clean.docs', clean(gulp, gulpPlugins, {
212221

213222
gulp.task('build/deps.js.dev', deps(gulp, gulpPlugins, {
214223
src: CONFIG.deps.js,
215-
dest: CONFIG.dest.js.dev
224+
dest: CONFIG.dest.js.dev.es5
216225
}));
217226

218227
gulp.task('build/deps.js.prod', deps(gulp, gulpPlugins, {
219228
src: CONFIG.deps.js,
220-
dest: CONFIG.dest.js.prod
229+
dest: CONFIG.dest.js.prod.es5
221230
}));
222231

223232
gulp.task('build/deps.js.dart2js', deps(gulp, gulpPlugins, {
@@ -228,24 +237,50 @@ gulp.task('build/deps.js.dart2js', deps(gulp, gulpPlugins, {
228237
// ------------
229238
// transpile
230239

231-
gulp.task('build/transpile.js.dev', transpile(gulp, gulpPlugins, {
240+
gulp.task('build/transpile.js.dev.es6', transpile(gulp, gulpPlugins, {
232241
src: CONFIG.transpile.src.js,
233242
copy: CONFIG.transpile.copy.js,
234-
dest: CONFIG.dest.js.dev,
235-
outputExt: 'js',
243+
dest: CONFIG.dest.js.dev.es6,
244+
outputExt: 'es6',
236245
options: CONFIG.transpile.options.js.dev,
237246
srcFolderInsertion: CONFIG.srcFolderInsertion.js
238247
}));
239248

240-
gulp.task('build/transpile.js.prod', transpile(gulp, gulpPlugins, {
249+
gulp.task('build/transpile.js.dev.es5', es5build({
250+
src: CONFIG.dest.js.dev.es6,
251+
dest: CONFIG.dest.js.dev.es5,
252+
modules: 'instantiate'
253+
}));
254+
255+
gulp.task('build/transpile.js.dev', function() {
256+
return runSequence(
257+
'build/transpile.js.dev.es6',
258+
'build/transpile.js.dev.es5'
259+
);
260+
});
261+
262+
gulp.task('build/transpile.js.prod.es6', transpile(gulp, gulpPlugins, {
241263
src: CONFIG.transpile.src.js,
242264
copy: CONFIG.transpile.copy.js,
243-
dest: CONFIG.dest.js.prod,
244-
outputExt: 'js',
265+
dest: CONFIG.dest.js.prod.es6,
266+
outputExt: 'es6',
245267
options: CONFIG.transpile.options.js.prod,
246268
srcFolderInsertion: CONFIG.srcFolderInsertion.js
247269
}));
248270

271+
gulp.task('build/transpile.js.prod.es5', es5build({
272+
src: CONFIG.dest.js.prod.es6,
273+
dest: CONFIG.dest.js.prod.es5,
274+
modules: 'instantiate'
275+
}));
276+
277+
gulp.task('build/transpile.js.prod', function() {
278+
return runSequence(
279+
'build/transpile.js.prod.es6',
280+
'build/transpile.js.prod.es5'
281+
);
282+
});
283+
249284
gulp.task('build/transpile.dart', transpile(gulp, gulpPlugins, {
250285
src: CONFIG.transpile.src.dart,
251286
copy: CONFIG.transpile.copy.dart,
@@ -278,14 +313,14 @@ gulp.task('build/transpile/e2eTest.cjs', transpile(gulp, gulpPlugins, {
278313

279314
gulp.task('build/html.js.dev', html(gulp, gulpPlugins, {
280315
src: CONFIG.html.src.js,
281-
dest: CONFIG.dest.js.dev,
316+
dest: CONFIG.dest.js.dev.es5,
282317
srcFolderInsertion: CONFIG.srcFolderInsertion.js,
283318
scriptsPerFolder: CONFIG.html.scriptsPerFolder.js
284319
}));
285320

286321
gulp.task('build/html.js.prod', html(gulp, gulpPlugins, {
287322
src: CONFIG.html.src.js,
288-
dest: CONFIG.dest.js.prod,
323+
dest: CONFIG.dest.js.prod.es5,
289324
srcFolderInsertion: CONFIG.srcFolderInsertion.js,
290325
scriptsPerFolder: CONFIG.html.scriptsPerFolder.js
291326
}));
@@ -354,12 +389,12 @@ gulp.task('build/format.dart', rundartpackage(gulp, gulpPlugins, {
354389
// ------------------
355390
// web servers
356391
gulp.task('serve.js.dev', jsserve(gulp, gulpPlugins, {
357-
path: CONFIG.dest.js.dev,
392+
path: CONFIG.dest.js.dev.es5,
358393
port: 8000
359394
}));
360395

361396
gulp.task('serve.js.prod', jsserve(gulp, gulpPlugins, {
362-
path: CONFIG.dest.js.prod,
397+
path: CONFIG.dest.js.prod.es5,
363398
port: 8001
364399
}));
365400

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
"node-uuid": "1.4.x"
2323
},
2424
"devDependencies": {
25+
"yargs": "2.3.*",
26+
"gulp-sourcemaps": "1.3.*",
27+
"gulp-traceur": "0.16.*",
2528
"angular": "1.3.5",
2629
"bower": "^1.3.12",
2730
"canonical-path": "0.0.2",

tools/build/es5build.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/usr/bin/env node
2+
3+
// Attention: This file will be distributed with our npm packages!
4+
var gulp = require('gulp');
5+
var traceur = require('gulp-traceur');
6+
var rename = require('gulp-rename');
7+
var sourcemaps = require('gulp-sourcemaps');
8+
var through2 = require('through2');
9+
var fs = require('fs');
10+
var path = require('path');
11+
12+
module.exports = run;
13+
14+
if (!module.parent) {
15+
var argv = require('yargs')
16+
.usage('Transpile to es5.\n\n'+
17+
'Usage: $0 -m [format] -s [folder] -d [folder]')
18+
.example('$0 -d tmp', 'transpile in `instantate` format to tmp/')
19+
.options({
20+
's': {
21+
alias: 'source',
22+
describe: 'source folder',
23+
default: '.'
24+
},
25+
'd': {
26+
alias: 'dest',
27+
describe: 'output folder',
28+
demand: true
29+
},
30+
'm': {
31+
alias: 'modules',
32+
describe: 'module format, https://github.com/google/traceur-compiler/wiki/Options-for-Compiling',
33+
default: 'instantiate'
34+
}
35+
})
36+
.help('help')
37+
.wrap(40)
38+
.strict()
39+
.argv
40+
;
41+
run({
42+
src: argv.s,
43+
dest: argv.d,
44+
modules: argv.m
45+
});
46+
}
47+
48+
function run(config) {
49+
var src = ['!node_modules', '!node_modules/**', './**/*.es6'];
50+
gulp.src(src, {cwd: config.src})
51+
.pipe(rename(function(file) {
52+
file.extname = file.extname.replace('.es6', '.js');
53+
}))
54+
// TODO(tbosch): Using sourcemaps.init({loadMaps:true}) does not combine
55+
// the sourcemaps correctly!
56+
.pipe(sourcemaps.init())
57+
.pipe(through2.obj(function(file, encoding, done) {
58+
var self = this;
59+
fs.readFile(file.path.replace('.js', '.map'), function(error, buffer) {
60+
if (error) {
61+
return done(error);
62+
}
63+
file.sourceMap = JSON.parse(buffer.toString());
64+
// The filename needs to be the same as the one that is transpiled
65+
// so that gulp-sourcemaps can update the mapping
66+
file.sourceMap.file = file.relative;
67+
file.sourceMap.sourceRoot = path.dirname(file.relative);
68+
self.push(file);
69+
done();
70+
});
71+
}))
72+
.pipe(traceur({
73+
modules: config.modules,
74+
sourceMaps: true
75+
}))
76+
.pipe(sourcemaps.write('.'))
77+
.pipe(gulp.dest(config.dest));
78+
};

tools/transpiler/gulp-traceur.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function gulpTraceur(options, resolveModuleName) {
3434

3535
if (sourceMap) {
3636
var sourceMapFile = cloneFile(file, {
37-
path: file.path.replace(/\.js$/, '.map'),
37+
path: file.path.replace(/\.\w+$/, '.map'),
3838
contents: JSON.stringify(sourceMap)
3939
});
4040

tools/transpiler/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var fs = require('fs');
44
var glob = require('glob');
55
var path = require('path');
66
var traceur = require('traceur');
7+
var assert = require('assert');
78

89
exports.RUNTIME_PATH = traceur.RUNTIME_PATH;
910
var TRACEUR_PATH = traceur.RUNTIME_PATH.replace('traceur-runtime.js', 'traceur.js');
@@ -55,6 +56,11 @@ exports.compile = function compile(options, paths, source) {
5556
result.sourceMap = JSON.parse(sourceMapString);
5657
}
5758

59+
if (localOptions.outputLanguage === 'es6' && source.indexOf('$traceurRuntime') === -1) {
60+
assert(result.js.indexOf('$traceurRuntime') === -1,
61+
'Transpile to ES6 must not add references to $traceurRuntime, '
62+
+ inputPath + ' is transpiled to:\n' + result.js);
63+
}
5864
return result;
5965
};
6066

0 commit comments

Comments
 (0)