Rich-Harris / magic-string

Manipulate strings like a wizard

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

source mapping bug with multiple sources

kzc opened this issue · comments

commented

The fix in #159 wasn't general enough - see rollup/rollup#3001 (comment).

Using magic-string@0.25.6:

$ cat bug.js
const MagicString = require('./dist/magic-string.umd.js')
const SourceMapConsumer = require( 'source-map' ).SourceMapConsumer;

const s1 = 'ABCDE';
const ms1 = new MagicString(s1, { filename: 'first' });

const s2 = 'VWXYZ';
const ms2 = new MagicString(s2, { filename: 'second' });

const bundle = new MagicString.Bundle();
bundle.addSource(ms1);
bundle.addSource(ms2);

ms1.remove(1,4);   // AE
ms1.move(0, 1, 5); // EA

ms2.remove(2,4);   // VWZ
ms2.move(0, 1, 5); // WZV

const map = bundle.generateMap({file: 'result', hires: true, includeContent: true});
const smc = new SourceMapConsumer(map);

let output = '';
output += bundle.toString() + '\n';;

const result1 = ms1.toString();
const result2 = ms2.toString();

var line = 1;
for (let i = 0; i < result1.length; i++) {
    let loc = smc.originalPositionFor({ line: line, column: i });
    output += `${s1[loc.column]} = ${result1[i]}\n`;
}

var line = 2;
for (let i = 0; i < result2.length; i++) {
    let loc = smc.originalPositionFor({ line: line, column: i });
    output += `${s2[loc.column]} = ${result2[i]}\n`;
}

output += map.toString();
console.log(output);

Incorrect result:

$ cat bug.js | node
EA
WZV
E = E
A = A
W = W
X = Z
V = V
{"version":3,"file":"result","sources":["first","second"],"sourcesContent":["ABCDE","VWXYZ"],"names":[],"mappings":"AAAI,CAAJ;ACAC,CAAC,AAAE,CAAJ"}

Here's the fix:

--- a/src/utils/Mappings.js
+++ b/src/utils/Mappings.js
@@ -48,9 +48,7 @@ export default class Mappings {
                        originalCharIndex += 1;
                }
 
-               this.pending = sourceIndex > 0
-                       ? [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]
-                       : null;
+               this.pending = null;
        }
 
        advance(str) {

Correct result with fix:

$ cat bug.js | node
EA
WZV
E = E
A = A
W = W
Z = Z
V = V
{"version":3,"file":"result","sources":["first","second"],"sourcesContent":["ABCDE","VWXYZ"],"names":[],"mappings":"AAAI,CAAJ;ACAC,CAAG,CAAJ"}