Skip to content

Commit

Permalink
add: import decoded sourcemaps from SourceMapGenerator
Browse files Browse the repository at this point in the history
  • Loading branch information
milahu committed Nov 29, 2020
1 parent 910348f commit 9788885
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 0 deletions.
74 changes: 74 additions & 0 deletions src/compiler/preprocess/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { RawSourceMap, DecodedSourceMap } from '@ampproject/remapping/dist/types
import { decode as decode_mappings } from 'sourcemap-codec';
import { getLocator } from 'locate-character';
import { StringWithSourcemap, sourcemap_add_offset, combine_sourcemaps } from '../utils/string_with_sourcemap';
import { compareByGeneratedPositionsInflated } from 'source-map/lib/util';

export interface Processed {
code: string;
Expand Down Expand Up @@ -83,6 +84,72 @@ async function replace_async(
return out.concat(final_content);
}



// import decoded sourcemap from mozilla/source-map/SourceMapGenerator
// forked from source-map/lib/source-map-generator.js
// from methods _serializeMappings and toJSON
function DecodedSourcemapFromSourceMapGenerator(this: any) {
function convertMappings(this: any) {
let previousGeneratedLine = 1;
const result = [[]];
let resultLine;
let resultSegment;
let mapping;

const sourceIdx = this._sources.toArray().reduce((acc, val, idx) => (acc[val] = idx, acc), {});
const nameIdx = this._names.toArray().reduce((acc, val, idx) => (acc[val] = idx, acc), {});

const mappings = this._mappings.toArray();
resultLine = result[0];

for (let i = 0, len = mappings.length; i < len; i++) {
mapping = mappings[i];

if (mapping.generatedLine > previousGeneratedLine) {
while (mapping.generatedLine > previousGeneratedLine) {
result.push([]);
previousGeneratedLine++;
}
resultLine = result[mapping.generatedLine - 1]; // line is one-based
} else if (i > 0) {
if (
!compareByGeneratedPositionsInflated(mapping, mappings[i - 1])
) {
continue;
}
}
resultLine.push([mapping.generatedColumn]);
resultSegment = resultLine[resultLine.length - 1];

if (mapping.source != null) {
resultSegment.push(...[
sourceIdx[mapping.source],
mapping.originalLine - 1, // line is one-based
mapping.originalColumn
]);
if (mapping.name != null) {
resultSegment.push(nameIdx[mapping.name]);
}
}
}
return result;
}
const map = {
version: this._version,
sources: this._sources.toArray(),
names: this._names.toArray(),
mappings: convertMappings.apply(this)
};
if (this._file != null) {
(map as any).file = this._file;
}
// not needed: map.sourcesContent and map.sourceRoot
return map;
}



/**
* Convert a preprocessor output and its leading prefix and trailing suffix into StringWithSourceMap
*/
Expand All @@ -109,6 +176,13 @@ function get_replacement(
if (typeof(decoded_map.mappings) === 'string') {
decoded_map.mappings = decode_mappings(decoded_map.mappings);
}
if (
(decoded_map as any)._mappings &&
decoded_map.constructor.name == 'SourceMapGenerator'
) {
// import decoded sourcemap from mozilla/source-map/SourceMapGenerator
decoded_map = DecodedSourcemapFromSourceMapGenerator.apply(decoded_map);
}
sourcemap_add_offset(decoded_map, get_location(offset + prefix.length));
}
const processed_with_map = StringWithSourcemap.from_processed(processed.code, decoded_map);
Expand Down
25 changes: 25 additions & 0 deletions test/sourcemaps/samples/source-map-generator/_config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import MagicString from 'magic-string';
import { SourceMapConsumer, SourceMapGenerator } from 'source-map';

export default {
preprocess: {
style: async ({ content, filename }) => {
const src = new MagicString(content);
const idx = content.indexOf('baritone');
src.overwrite(idx, idx+'baritone'.length, 'bar');

const map = SourceMapGenerator.fromSourceMap(
await new SourceMapConsumer(
// sourcemap must be encoded for SourceMapConsumer
src.generateMap({
source: filename,
hires: true,
includeContent: false
})
)
);

return { code: src.toString(), map };
}
}
};
12 changes: 12 additions & 0 deletions test/sourcemaps/samples/source-map-generator/input.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<h1>Testing Styles</h1>
<h2>Testing Styles 2</h2>
<script>export const b = 2;</script>
<style>
h1 {
--baritone: red;
}
h2 {
--baz: blue;
}
</style>
1 change: 1 addition & 0 deletions test/sourcemaps/samples/source-map-generator/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { test } from '../preprocessed-styles/test';

0 comments on commit 9788885

Please sign in to comment.