From 6892d51472fd9f5e8d4b76c3776273de15585ccf Mon Sep 17 00:00:00 2001 From: Andrew Neitsch Date: Wed, 18 Mar 2020 15:34:19 -0600 Subject: [PATCH] Add path separator to `@babel/register` sourceRoot (#11249) --- packages/babel-register/src/node.js | 2 +- .../test/fixtures/source-map/foo/bar.js | 3 ++ .../test/fixtures/source-map/index.js | 7 +++ packages/babel-register/test/index.js | 44 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 packages/babel-register/test/fixtures/source-map/foo/bar.js create mode 100644 packages/babel-register/test/fixtures/source-map/index.js diff --git a/packages/babel-register/src/node.js b/packages/babel-register/src/node.js index 84dbe8b5cd1a..ed527cdac549 100644 --- a/packages/babel-register/src/node.js +++ b/packages/babel-register/src/node.js @@ -41,7 +41,7 @@ function compile(code, filename) { const opts = new OptionManager().init( // sourceRoot can be overwritten { - sourceRoot: path.dirname(filename), + sourceRoot: path.dirname(filename) + path.sep, ...deepClone(transformOpts), filename, }, diff --git a/packages/babel-register/test/fixtures/source-map/foo/bar.js b/packages/babel-register/test/fixtures/source-map/foo/bar.js new file mode 100644 index 000000000000..86eb6d1316ee --- /dev/null +++ b/packages/babel-register/test/fixtures/source-map/foo/bar.js @@ -0,0 +1,3 @@ +function add(a, b) { + return a + b; +} diff --git a/packages/babel-register/test/fixtures/source-map/index.js b/packages/babel-register/test/fixtures/source-map/index.js new file mode 100644 index 000000000000..7da2f9e4511d --- /dev/null +++ b/packages/babel-register/test/fixtures/source-map/index.js @@ -0,0 +1,7 @@ +const { retrieveSourceMap } = require('source-map-support'); + +const path = require.resolve('./foo/bar'); + +require('./foo/bar'); + +console.log(JSON.stringify(retrieveSourceMap(path))); diff --git a/packages/babel-register/test/index.js b/packages/babel-register/test/index.js index a61a8cb19163..eb1b93dad513 100644 --- a/packages/babel-register/test/index.js +++ b/packages/babel-register/test/index.js @@ -1,5 +1,6 @@ import fs from "fs"; import path from "path"; +import child from "child_process"; let currentHook; let currentOptions; @@ -8,6 +9,10 @@ let sourceMapSupport = false; const registerFile = require.resolve("../lib/node"); const testFile = require.resolve("./fixtures/babelrc/es2015"); const testFileContent = fs.readFileSync(testFile); +const sourceMapTestFile = require.resolve("./fixtures/source-map/index"); +const sourceMapNestedTestFile = require.resolve( + "./fixtures/source-map/foo/bar", +); jest.mock("pirates", () => { return { @@ -110,6 +115,45 @@ describe("@babel/register", function() { expect(sourceMapSupport).toBe(false); }); + it("returns concatenatable sourceRoot and sources", callback => { + // The Source Maps R3 standard https://sourcemaps.info/spec.html states + // that `sourceRoot` is “prepended to the individual entries in the + // ‘source’ field.” If `sources` contains file names, and `sourceRoot` + // is intended to refer to a directory but doesn’t end with a trailing + // slash, any consumers of the source map are in for a bad day. + // + // The underlying problem seems to only get triggered if one file + // requires() another with @babel/register active, and I couldn’t get + // that working inside a test, possibly because of jest’s mocking + // hooks, so we spawn a separate process. + + const args = ["-r", registerFile, sourceMapTestFile]; + const spawn = child.spawn(process.execPath, args, { cwd: __dirname }); + + let output = ""; + + for (const stream of [spawn.stderr, spawn.stdout]) { + stream.on("data", chunk => { + output += chunk; + }); + } + + spawn.on("close", function() { + let err; + + try { + const sourceMap = JSON.parse(output); + expect(sourceMap.map.sourceRoot + sourceMap.map.sources[0]).toBe( + sourceMapNestedTestFile, + ); + } catch (e) { + err = e; + } + + callback(err); + }); + }); + test("hook transpiles with config", () => { setupRegister({ babelrc: false,