diff --git a/lib/babel.js b/lib/babel.js index a792a85c34..dbd299ffd5 100644 --- a/lib/babel.js +++ b/lib/babel.js @@ -1,6 +1,13 @@ 'use strict'; +var cacheDir = require('xdg-basedir').cache; +var tmpDir = require('os-tmpdir'); var debug = require('debug')('ava'); +var hasha = require('hasha'); +var cacha = require('cacha'); +var join = require('path').join; + +var cache = cacha(join(cacheDir || tmpDir(), 'ava')); var opts = JSON.parse(process.argv[2]); @@ -36,24 +43,17 @@ sourceMapSupport.install({ } }); -var createEspowerPlugin = require('babel-plugin-espower/create'); var requireFromString = require('require-from-string'); var loudRejection = require('loud-rejection/api')(process); var serializeError = require('serialize-error'); -var babel = require('babel-core'); var send = require('./send'); var testPath = opts.file; -// initialize power-assert -var powerAssert = createEspowerPlugin(babel, { - patterns: require('./enhance-assert').PATTERNS -}); - // if generators are not supported, use regenerator var options = { presets: ['stage-2', 'es2015'], - plugins: [powerAssert, 'transform-runtime'], + plugins: ['transform-runtime'], sourceMaps: true }; @@ -70,11 +70,43 @@ if (inputSourceMap) { } // include test file -var transpiled = babel.transformFileSync(testPath, options); -sourceMapCache[testPath] = transpiled.map; -requireFromString(transpiled.code, testPath, { - appendPaths: module.paths -}); +var cachePath = hasha(testPath); +var hashPath = hasha(testPath) + '_hash'; + +var prevHash = cache.getSync(hashPath, {encoding: 'utf8'}); +var currHash = hasha.fromFileSync(testPath); + +if (prevHash === currHash) { + var cached = JSON.parse(cache.getSync(cachePath)); + + sourceMapCache[testPath] = cached.map; + requireFromString(cached.code, testPath, { + appendPaths: module.paths + }); +} else { + var createEspowerPlugin = require('babel-plugin-espower/create'); + var babel = require('babel-core'); + + // initialize power-assert + var powerAssert = createEspowerPlugin(babel, { + patterns: require('./enhance-assert').PATTERNS + }); + + options.plugins.push(powerAssert); + + var transpiled = babel.transformFileSync(testPath, options); + + cache.setSync(hashPath, currHash); + cache.setSync(cachePath, JSON.stringify({ + code: transpiled.code, + map: transpiled.map + })); + + sourceMapCache[testPath] = transpiled.map; + requireFromString(transpiled.code, testPath, { + appendPaths: module.paths + }); +} process.on('uncaughtException', function (exception) { send('uncaughtException', {exception: serializeError(exception)}); diff --git a/package.json b/package.json index ed58a32cf5..ad12101f18 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "babel-preset-stage-2": "^6.3.13", "babel-runtime": "^6.3.19", "bluebird": "^3.0.0", + "cacha": "^1.0.3", "chalk": "^1.0.0", "co-with-promise": "^4.6.0", "core-assert": "^0.1.0", @@ -97,6 +98,7 @@ "figures": "^1.4.0", "fn-name": "^2.0.0", "globby": "^4.0.0", + "hasha": "^2.0.2", "is-generator-fn": "^1.0.0", "is-observable": "^0.1.0", "is-promise": "^2.1.0", @@ -105,6 +107,7 @@ "meow": "^3.6.0", "object-assign": "^4.0.1", "observable-to-promise": "^0.1.0", + "os-tmpdir": "^1.0.1", "plur": "^2.0.0", "power-assert-formatter": "^1.3.0", "power-assert-renderers": "^0.1.0", @@ -116,7 +119,8 @@ "source-map-support": "^0.4.0", "squeak": "^1.2.0", "time-require": "^0.1.2", - "update-notifier": "^0.5.0" + "update-notifier": "^0.5.0", + "xdg-basedir": "^2.0.0" }, "devDependencies": { "coveralls": "^2.11.4",