diff --git a/bin/ts-babel-node.js b/bin/ts-babel-node.js index 298774a..486dbaa 100755 --- a/bin/ts-babel-node.js +++ b/bin/ts-babel-node.js @@ -2,4 +2,4 @@ 'use strict'; require('..').registerBabel(); -require('ts-node/dist/bin'); +require('ts-node/dist/_bin'); diff --git a/index.js b/index.js index db97263..d2655a0 100644 --- a/index.js +++ b/index.js @@ -2,34 +2,59 @@ var babel = require('babel-core'); var sourceMapSupport = require('source-map-support'); +var convertSourceMap = require('convert-source-map'); var outputs = {}; // filename => { code, map } var babelOpts = { presets: [ require('babel-preset-es2015') ], - inputSourceMap: true, // load TS source maps ast: false, }; -var tsLoader = null; - exports.registerBabel = registerBabel; function registerBabel() { + overrideSourceMaps(); + // In case ts-node has already run... - tsLoader = require.extensions['.ts']; + var tsLoader = wrap(require.extensions['.ts'], hook); Object.defineProperty(require.extensions, '.ts', { enumerable: true, // In case ts-node hasn't run yet... set: function (newTSLoader) { - tsLoader = newTSLoader; + tsLoader = wrap(newTSLoader, hook); }, get: function () { - return loadPipeline; + return tsLoader; }, }); +} + +exports.register = register; +function register(opts) { + registerBabel(); + require('ts-node').register(opts); +} + +function hook(base, m, filename) { + m._compile = wrap(m._compile, compile); + base(m, filename); +} + +function compile(base, code, filename) { + var sourcemap = convertSourceMap.fromMapFileSource(code, '.').toObject(); + convertSourceMap.removeMapFileComments(code); + + var babelOutput = babel.transform(code, Object.assign({ inputSourceMap: sourcemap }, babelOpts)); + + // babelOutput has a bunch of undocumented stuff on it. Just grab what we need to save memory + outputs[filename] = { code: babelOutput.code, map: babelOutput.map }; + + return base.call(this, babelOutput.code, filename); +} +function overrideSourceMaps() { sourceMapSupport.install({ handleUncaughtExceptions: false, retrieveFile: function (filename) { @@ -40,6 +65,7 @@ function registerBabel() { if (!map) return null; + return { url: null, map: map, @@ -50,36 +76,16 @@ function registerBabel() { overrideRetrieveFile: true, overrideRetrieveSourceMap: true, }); -} - -exports.register = register; -function register(opts) { - registerBabel(); - require('ts-node').register(opts); -} -function loadPipeline(m, filename) { - m._compile(compile(filename), filename); + // Prevent ts-node from adding its own lookups. + sourceMapSupport.install = function () { }; } -function compile(filename) { - var tsOutput = mockLoad(tsLoader, filename); - var babelOutput = babel.transform(tsOutput, babelOpts); - - // babelOutput has a bunch of undocumented stuff on it. Just grab what we need to save memory - outputs[filename] = { code: babelOutput.code, map: babelOutput.map }; - - return babelOutput.code; -} - -function mockLoad(loader, filename) { - var content; - var module = { - _compile: function (_content) { - content = _content; - }, +function wrap(base, fn) { + if (!(typeof base === 'function')) return base; + return function () { + var args = Array.prototype.slice.call(arguments, 0); + args.unshift(base); + return fn.apply(this, args); }; - - loader(module, filename); - return content; } diff --git a/package.json b/package.json index d18fe31..b1bc154 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "bluebird": "^3.4.0", "code": "^4.0.0", "concat-stream": "^1.5.1", + "convert-source-map": "^1.3.0", "error-stack-parser": "^1.3.6", "eslint": "^3.8.1", "lab": "^11.1.0",