add tests, fix empty map.sources, cleanup gitignore

pull/5428/head
Milan Hauth 5 years ago
parent 1073120a16
commit cf600f7a9f

4
.gitignore vendored

@ -18,10 +18,6 @@ node_modules
/coverage/
/coverage.lcov
/test/*/samples/_
/test/sourcemaps/samples/*/output.js
/test/sourcemaps/samples/*/output.js.map
/test/sourcemaps/samples/*/output.css
/test/sourcemaps/samples/*/output.css.map
/yarn-error.log
_actual*.*
_output

@ -132,7 +132,7 @@ export default async function preprocess(
// sourcemap_list is sorted in reverse order from last map (index 0) to first map (index -1)
// so we use sourcemap_list.unshift() to add new maps
// https://github.com/ampproject/remapping#multiple-transformations-of-a-file
const sourcemap_list: Array<Processed['map']> = [];
let sourcemap_list: Array<Processed['map']> = [];
for (const fn of markup) {
@ -213,14 +213,22 @@ export default async function preprocess(
sourcemap_list.unshift(res.map);
}
// https://github.com/ampproject/remapping#usage
// https://github.com/mozilla/source-map#new-sourcemapconsumerrawsourcemap
// remapper can throw error
// `Transformation map ${i} must have exactly one source file.`
sourcemap_list = sourcemap_list
.map(sourcemap => {
if ((sourcemap as any).sources.filter(Boolean).length == 0)
// fix missing source file
(sourcemap as any).sources = [filename];
return sourcemap;
});
const map: ReturnType<typeof remapper> =
sourcemap_list.length == 0
? null
: remapper(sourcemap_list as any, () => null, true); // true: skip optional field `sourcesContent`
if (map) delete map.file; // skip optional field `file`
if (map && !map.file) delete map.file; // skip optional field `file`
return {
// TODO return separated output, in future version where svelte.compile supports it:

@ -29,11 +29,20 @@ describe("sourcemaps", () => {
input.code = fs.readFileSync(inputFile, "utf-8");
input.locate = getLocator(input.code);
const preprocessed = await svelte.preprocess(
input.code,
config.preprocess, {
filename: "input.svelte"
});
let preprocessed;
try {
preprocessed = await svelte.preprocess(
input.code,
config.preprocess, {
filename: "input.svelte"
});
} catch (error) {
preprocessed = {
error,
code: '',
map: null
};
}
const { js, css } = svelte.compile(
preprocessed.code, {

@ -0,0 +1,29 @@
import MagicString from 'magic-string';
function replace(search, replace, content, src, options = {}) {
let idx = -1;
while ((idx = content.indexOf(search, idx + 1)) != -1) {
src.overwrite(idx, idx + search.length, replace, options);
}
}
function result(src, filename) {
return {
code: src.toString(),
map: src.generateDecodedMap({ // return decoded sourcemap
source: filename,
hires: true,
includeContent: false
})
};
}
export default {
preprocess: {
markup: ({ content, filename }) => {
const src = new MagicString(content);
replace('replace me', 'success', content, src);
return result(src, filename);
}
}
};

@ -0,0 +1,2 @@
<h1>decoded-sourcemap</h1>
<div>replace me</div>

@ -0,0 +1,19 @@
export function test({ assert, input, preprocessed }) {
const expected = input.locate('replace me');
const start = preprocessed.locate('success');
const actualbar = preprocessed.mapConsumer.originalPositionFor({
line: start.line + 1,
column: start.column
});
assert.deepEqual(actualbar, {
source: 'input.svelte',
name: null,
line: expected.line + 1,
column: expected.column
});
}

@ -0,0 +1,46 @@
import MagicString from 'magic-string';
function add(bundle, filename, source) {
bundle.addSource({
filename: filename,
content: new MagicString(source)
});
}
function result(bundle, filename) {
return {
code: bundle.toString(),
map: bundle.generateMap({
file: filename,
includeContent: true,
hires: true
})
};
}
export default {
preprocess: [
{
script: ({ content, filename }) => {
const bundle = new MagicString.Bundle();
add(bundle, filename, content);
add(bundle, 'foo.js', 'var answer = 42;');
add(bundle, 'bar.js', 'console.log(answer);');
return result(bundle, filename);
}
},
{
script: ({ content, filename }) => {
const bundle = new MagicString.Bundle();
add(bundle, filename, content);
add(bundle, 'foo2.js', 'var answer2 = 84;');
add(bundle, 'bar2.js', 'console.log(answer2);');
return result(bundle, filename);
}
}
]
};

@ -0,0 +1,4 @@
<script>
export let name;
</script>
<h1>sourcemap-sources</h1>

@ -0,0 +1,12 @@
export function test({ assert, preprocessed, js, css }) {
const msg_expected = 'Transformation map 0 must have exactly one source file.';
assert.notEqual(preprocessed.error, undefined, 'expected preprocessed.error');
assert.equal(
preprocessed.error.message.slice(0, msg_expected.length),
msg_expected
);
}
Loading…
Cancel
Save