Skip to content

Commit 2a214e3

Browse files
committed
move babel to main thread
There are many failing tests, but it basically works.
1 parent d4d8310 commit 2a214e3

File tree

4 files changed

+84
-34
lines changed

4 files changed

+84
-34
lines changed

api.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ var Promise = require('bluebird');
88
var figures = require('figures');
99
var globby = require('globby');
1010
var chalk = require('chalk');
11+
var assign = require('object-assign');
1112
var fork = require('./lib/fork');
1213
var formatter = require('./lib/enhance-assert').formatter();
14+
var precompileTest = require('./lib/test-transformer');
1315

1416
function Api(files, options) {
1517
if (!(this instanceof Api)) {
@@ -40,7 +42,15 @@ util.inherits(Api, EventEmitter);
4042
module.exports = Api;
4143

4244
Api.prototype._runFile = function (file) {
43-
return fork(file, this.options)
45+
var precompiled = {};
46+
precompiled[file.testPath] = {
47+
sourcePath: file.tempPath,
48+
mapPath: file.mapPath
49+
};
50+
var options = assign({}, this.options, {
51+
precompiled: precompiled
52+
});
53+
return fork(file.testPath, options)
4454
.on('stats', this._handleStats)
4555
.on('test', this._handleTest)
4656
.on('unhandledRejections', this._handleRejections)
@@ -129,6 +139,7 @@ Api.prototype.run = function () {
129139
.map(function (file) {
130140
return path.resolve(file);
131141
})
142+
.map(precompileTest)
132143
.then(function (files) {
133144
if (files.length === 0) {
134145
return Promise.reject(new Error('Couldn\'t find any files to test'));

lib/babel.js

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,62 +23,41 @@ var resolveCwd = require('resolve-cwd');
2323

2424
var sourceMapCache = Object.create(null);
2525

26+
var fs = require('fs');
2627
var sourceMapSupport = require('source-map-support');
2728
sourceMapSupport.install({
2829
handleUncaughtExceptions: false,
2930
retrieveSourceMap: function (source) {
3031
if (sourceMapCache[source]) {
3132
return {
3233
url: source,
33-
map: sourceMapCache[source]
34+
map: fs.readFileSync(sourceMapCache[source], 'utf8')
3435
};
3536
}
3637
}
3738
});
3839

39-
var createEspowerPlugin = require('babel-plugin-espower/create');
40-
var requireFromString = require('require-from-string');
4140
var loudRejection = require('loud-rejection/api')(process);
42-
var hasGenerator = require('has-generator');
4341
var serializeError = require('serialize-error');
44-
var babel = require('babel-core');
4542
var send = require('./send');
43+
var installPrecompiler = require('require-precompiled');
4644

4745
var testPath = opts.file;
4846

49-
// initialize power-assert
50-
var powerAssert = createEspowerPlugin(babel, {
51-
patterns: require('./enhance-assert').PATTERNS
52-
});
53-
54-
// if generators are not supported, use regenerator
55-
var options = {
56-
blacklist: hasGenerator ? ['regenerator'] : [],
57-
optional: hasGenerator ? ['asyncToGenerator', 'runtime'] : ['runtime'],
58-
plugins: [powerAssert],
59-
sourceMaps: true,
60-
inputSourceMap: null
61-
};
62-
6347
// check if test files required ava and show error, when they didn't
6448
exports.avaRequired = false;
6549

66-
// try to load an input source map for the test file, in case the file was
67-
// already compiled once by the user
68-
var inputSourceMap = sourceMapSupport.retrieveSourceMap(testPath);
69-
if (inputSourceMap) {
70-
// source-map-support returns the source map as a json-encoded string, but
71-
// babel requires an actual object
72-
options.inputSourceMap = JSON.parse(inputSourceMap.map);
73-
}
74-
75-
// include test file
76-
var transpiled = babel.transformFileSync(testPath, options);
77-
sourceMapCache[testPath] = transpiled.map;
78-
requireFromString(transpiled.code, testPath, {
79-
appendPaths: module.paths
50+
installPrecompiler(function (filename) {
51+
var precompiled = opts.precompiled[filename];
52+
if (precompiled) {
53+
sourceMapCache[filename] = precompiled.mapPath;
54+
return fs.readFileSync(precompiled.sourcePath, 'utf8');
55+
}
56+
return null;
8057
});
8158

59+
require(testPath);
60+
8261
process.on('uncaughtException', function (exception) {
8362
send('uncaughtException', {exception: serializeError(exception)});
8463
});

lib/test-transformer.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
var createEspowerPlugin = require('babel-plugin-espower/create');
2+
var sourceMapSupport = require('source-map-support');
3+
var hasGenerator = require('has-generator');
4+
var babel = require('babel-core');
5+
var Promise = require('bluebird');
6+
var tempWrite = require('temp-write');
7+
var transformFile = Promise.promisify(babel.transformFile);
8+
var enhanceAssert = require('./enhance-assert');
9+
10+
var cache = {};
11+
12+
module.exports = precompile;
13+
14+
function precompile(testPath) {
15+
return cache[testPath] || (cache[testPath] = _precompile(testPath));
16+
}
17+
18+
function _precompile(testPath) {
19+
// initialize power-assert
20+
var powerAssert = createEspowerPlugin(babel, {
21+
patterns: enhanceAssert.PATTERNS
22+
});
23+
24+
// if generators are not supported, use regenerator
25+
var options = {
26+
blacklist: hasGenerator ? ['regenerator'] : [],
27+
optional: hasGenerator ? ['asyncToGenerator', 'runtime'] : ['runtime'],
28+
plugins: [powerAssert],
29+
sourceMaps: true,
30+
ast: false,
31+
inputSourceMap: null
32+
};
33+
34+
// try to load an input source map for the test file, in case the file was
35+
// already compiled once by the user
36+
var inputSourceMap = sourceMapSupport.retrieveSourceMap(testPath);
37+
if (inputSourceMap) {
38+
// source-map-support returns the source map as a json-encoded string, but
39+
// babel requires an actual object
40+
options.inputSourceMap = JSON.parse(inputSourceMap.map);
41+
}
42+
43+
return transformFile(testPath, options)
44+
.then(function (result) {
45+
return Promise.all([
46+
tempWrite(result.code, testPath),
47+
tempWrite(JSON.stringify(result.map), testPath + '.map')
48+
])
49+
.spread(function (tempPath, mapPath) {
50+
result.mapPath = mapPath;
51+
result.tempPath = tempPath;
52+
result.testPath = testPath;
53+
return result;
54+
});
55+
});
56+
}
57+

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,14 @@
108108
"power-assert-renderers": "^0.1.0",
109109
"pretty-ms": "^2.0.0",
110110
"require-from-string": "^1.1.0",
111+
"require-precompiled": "^0.1.0",
111112
"resolve-cwd": "^1.0.0",
113+
"resolve-from": "^2.0.0",
112114
"serialize-error": "^1.1.0",
113115
"set-immediate-shim": "^1.0.1",
114116
"source-map-support": "^0.4.0",
115117
"squeak": "^1.2.0",
118+
"temp-write": "^2.1.0",
116119
"time-require": "^0.1.2",
117120
"update-notifier": "^0.5.0"
118121
},

0 commit comments

Comments
 (0)