Skip to content

Commit

Permalink
Revert "Revert "Fix compressed source-maps have non-terminated segmen…
Browse files Browse the repository at this point in the history
…ts (#342)" (#381)"

This reverts commit 7c1e9cc.
  • Loading branch information
devversion committed May 20, 2022
1 parent b47c3e6 commit 5faa961
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 16 deletions.
12 changes: 11 additions & 1 deletion lib/sourcemap.js
Expand Up @@ -82,12 +82,22 @@ async function SourceMap(options) {
}

function add(source, gen_line, gen_col, orig_line, orig_col, name) {
let generatedPos = { line: gen_line, column: gen_col }

if (orig_map) {
var info = orig_map.originalPositionFor({
line: orig_line,
column: orig_col
});
if (info.source === null) {
if (generatedPos.column !== 0) {
generator.addMapping({
generated: generatedPos,
original: null,
source: null,
name: null
});
}
return;
}
source = info.source;
Expand All @@ -96,7 +106,7 @@ async function SourceMap(options) {
name = info.name || name;
}
generator.addMapping({
generated : { line: gen_line, column: gen_col },
generated : generatedPos,
original : { line: orig_line, column: orig_col },
source : source,
name : name
Expand Down
4 changes: 2 additions & 2 deletions test/input/source-maps/expect.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 17 additions & 11 deletions test/input/source-maps/input.js
@@ -1,11 +1,17 @@
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

var _require = require("bar"),
foo = _require.foo;

var _require2 = require("world"),
hello = _require2.hello;

foo.x.apply(foo, _toConsumableArray(foo.y(hello.z)));

//# sourceMappingURL=input.js.map
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
function somePromiseFn() {
return __awaiter(this, void 0, void 0, function* () {
let value = 'promise-value';
return value;
});
}
somePromiseFn().then(d => console.info(d));
14 changes: 13 additions & 1 deletion test/input/source-maps/input.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 49 additions & 1 deletion test/mocha/input-sourcemaps.js
Expand Up @@ -2,7 +2,7 @@ import assert from "assert";
import { minify } from "../../main.js";
import source_map from "source-map"

const { SourceMapConsumer } = source_map
const { SourceMapConsumer, SourceMapGenerator } = source_map

describe("input sourcemaps", function() {
var transpilemap, map;
Expand Down Expand Up @@ -65,4 +65,52 @@ describe("input sourcemaps", function() {
assert.ok(pos.line <= 2, msg);
})
});

it("Should preserve unmapped segments in output source map", async function() {
var generator = new SourceMapGenerator();

generator.addMapping({
source: "source.ts",
generated: {line: 1, column: 0},
original: {line: 1, column: 0},
});
generator.addMapping({
source: null,
generated: {line: 1, column: 37},
original: null,
});

generator.addMapping({
source: "source.ts",
generated: {line: 1, column: 50},
original: {line: 2, column: 0},
});

generator.setSourceContent("source.ts",
`function say(msg) {console.log(msg)};say('hello');\nprocess.exit(1);`)

// Everything except the "say('hello');" part is mapped to "source.ts". The "say"
// function call is not mapped to any original source location. e.g. this can
// happen when a code transformer inserts generated code in between existing code.
var inputFile = "function say(msg) {console.log(msg)};say('hello');process.exit(1);";
var result = await minify(inputFile, {
sourceMap: {
content: JSON.parse(generator.toString()),
url: 'inline'
}
});

var transformedMap = await new SourceMapConsumer(result.map);
var hasMappedSource = true;

for (let i = 0; i < result.code.length; i++) {
var info = transformedMap.originalPositionFor({line: 1, column: i});
hasMappedSource = hasMappedSource && !!info.source;
}

assert.equal(hasMappedSource, false, "Expected transformed source map to preserve the " +
"mapping without original source location");

assert.doesNotThrow(() => SourceMapGenerator.fromSourceMap(transformedMap));
});
});

0 comments on commit 5faa961

Please sign in to comment.