diff --git a/packages/babel-core/src/transformation/file/merge-map.ts b/packages/babel-core/src/transformation/file/merge-map.ts index 1742db173f67..4b902c27bf82 100644 --- a/packages/babel-core/src/transformation/file/merge-map.ts +++ b/packages/babel-core/src/transformation/file/merge-map.ts @@ -6,8 +6,14 @@ export default function mergeSourceMap( map: SourceMap, source: string, ): SourceMap { + // Prevent an infinite recursion if one of the input map's sources has the + // same resolved path as the input map. In the case, it would keep find the + // input map, then get it's sources which will include a path like the input + // map, on and on. + let found = false; const result = remapping(rootless(map), (s, ctx) => { - if (s === source) { + if (s === source && !found) { + found = true; // We empty the source location, which will prevent the sourcemap from // becoming relative to the input's location. Eg, if we're transforming a // file 'foo/bar.js', and it is a transformation of a `baz.js` file in the diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/input.js b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/input.js new file mode 100644 index 000000000000..eab60fa14718 --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/input.js @@ -0,0 +1,6 @@ +var foo = function () { + return 4; +}; + +//# sourceMappingURL=input.js.map + diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/input.js.map b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/input.js.map new file mode 100644 index 000000000000..b7c811bfd09b --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/input.js.map @@ -0,0 +1,11 @@ +{ + "version": 3, + "sources": [ + "source-maps/input-source-map-same-location/input.js" + ], + "names": [], + "mappings": "AAAA,UAAU,Y;SAAM,C;CAAC", + "sourcesContent": [ + "var foo = () => 4;" + ] +} diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/options.json b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/options.json new file mode 100644 index 000000000000..0e6084f210d8 --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/options.json @@ -0,0 +1,3 @@ +{ + "inputSourceMap": true +} diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/output.js b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/output.js new file mode 100644 index 000000000000..cf3efeceb306 --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/output.js @@ -0,0 +1,3 @@ +var foo = function () { + return 4; +}; diff --git a/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/source-map.json b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/source-map.json new file mode 100644 index 000000000000..f538878eed17 --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/source-maps/input-source-map-same-location/source-map.json @@ -0,0 +1,7 @@ +{ + "mappings": "AAAA,UAAU,Y;SAAM;AAAC,CAAjB", + "names": [], + "sources": ["source-maps/input-source-map-same-location/input.js"], + "sourcesContent": ["var foo = () => 4;"], + "version": 3 +}