From cf600f7a9f948d66f06e09a82e9ef26c0cb65181 Mon Sep 17 00:00:00 2001 From: Milan Hauth Date: Wed, 23 Sep 2020 16:51:08 +0200 Subject: [PATCH] add tests, fix empty map.sources, cleanup gitignore --- .gitignore | 4 -- src/compiler/preprocess/index.ts | 16 +++++-- test/sourcemaps/index.js | 19 ++++++-- .../samples/decoded-sourcemap/_config.js | 29 ++++++++++++ .../samples/decoded-sourcemap/input.svelte | 2 + .../samples/decoded-sourcemap/test.js | 19 ++++++++ .../samples/sourcemap-sources/_config.js | 46 +++++++++++++++++++ .../samples/sourcemap-sources/input.svelte | 4 ++ .../samples/sourcemap-sources/test.js | 12 +++++ 9 files changed, 138 insertions(+), 13 deletions(-) create mode 100644 test/sourcemaps/samples/decoded-sourcemap/_config.js create mode 100644 test/sourcemaps/samples/decoded-sourcemap/input.svelte create mode 100644 test/sourcemaps/samples/decoded-sourcemap/test.js create mode 100644 test/sourcemaps/samples/sourcemap-sources/_config.js create mode 100644 test/sourcemaps/samples/sourcemap-sources/input.svelte create mode 100644 test/sourcemaps/samples/sourcemap-sources/test.js diff --git a/.gitignore b/.gitignore index f7fac04eba..a471c3aaa2 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/src/compiler/preprocess/index.ts b/src/compiler/preprocess/index.ts index 87dada9fba..ac7738f16f 100644 --- a/src/compiler/preprocess/index.ts +++ b/src/compiler/preprocess/index.ts @@ -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 = []; + let sourcemap_list: Array = []; 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 = 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: diff --git a/test/sourcemaps/index.js b/test/sourcemaps/index.js index 503f3c1707..b823abb8ec 100644 --- a/test/sourcemaps/index.js +++ b/test/sourcemaps/index.js @@ -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, { diff --git a/test/sourcemaps/samples/decoded-sourcemap/_config.js b/test/sourcemaps/samples/decoded-sourcemap/_config.js new file mode 100644 index 0000000000..bc0db984b2 --- /dev/null +++ b/test/sourcemaps/samples/decoded-sourcemap/_config.js @@ -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); + } + } +}; diff --git a/test/sourcemaps/samples/decoded-sourcemap/input.svelte b/test/sourcemaps/samples/decoded-sourcemap/input.svelte new file mode 100644 index 0000000000..b233d7f670 --- /dev/null +++ b/test/sourcemaps/samples/decoded-sourcemap/input.svelte @@ -0,0 +1,2 @@ +

decoded-sourcemap

+
replace me
diff --git a/test/sourcemaps/samples/decoded-sourcemap/test.js b/test/sourcemaps/samples/decoded-sourcemap/test.js new file mode 100644 index 0000000000..54d930cb97 --- /dev/null +++ b/test/sourcemaps/samples/decoded-sourcemap/test.js @@ -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 + }); + +} diff --git a/test/sourcemaps/samples/sourcemap-sources/_config.js b/test/sourcemaps/samples/sourcemap-sources/_config.js new file mode 100644 index 0000000000..df46e1348e --- /dev/null +++ b/test/sourcemaps/samples/sourcemap-sources/_config.js @@ -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); + } + } + ] +}; diff --git a/test/sourcemaps/samples/sourcemap-sources/input.svelte b/test/sourcemaps/samples/sourcemap-sources/input.svelte new file mode 100644 index 0000000000..33c8a9d9a6 --- /dev/null +++ b/test/sourcemaps/samples/sourcemap-sources/input.svelte @@ -0,0 +1,4 @@ + +

sourcemap-sources

diff --git a/test/sourcemaps/samples/sourcemap-sources/test.js b/test/sourcemaps/samples/sourcemap-sources/test.js new file mode 100644 index 0000000000..0887afddd0 --- /dev/null +++ b/test/sourcemaps/samples/sourcemap-sources/test.js @@ -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 + ); + +}