diff --git a/package-lock.json b/package-lock.json index 617c851fa6..ed76890400 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "devDependencies": { "@ampproject/remapping": "^0.3.0", "@jridgewell/sourcemap-codec": "^1.4.14", + "@jridgewell/trace-mapping": "^0.3.17", "@rollup/plugin-commonjs": "^11.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^11.2.1", @@ -168,6 +169,25 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5485,6 +5505,24 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", diff --git a/package.json b/package.json index c04043e346..f76e3cd00a 100644 --- a/package.json +++ b/package.json @@ -121,6 +121,7 @@ "devDependencies": { "@ampproject/remapping": "^0.3.0", "@jridgewell/sourcemap-codec": "^1.4.14", + "@jridgewell/trace-mapping": "^0.3.17", "@rollup/plugin-commonjs": "^11.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^11.2.1", diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index 0d6a329dcb..4b6c27c7b2 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -1,3 +1,4 @@ +import { TraceMap, originalPositionFor } from '@jridgewell/trace-mapping'; import { walk } from 'estree-walker'; import { getLocator } from 'locate-character'; import Stats from '../Stats'; @@ -143,8 +144,16 @@ export default class Component { .replace(process.cwd(), '') .replace(regex_leading_directory_separator, '') : compile_options.filename); - this.locate = getLocator(this.source, { offsetLine: 1 }); - + const locator = getLocator(this.source, { offsetLine: 1 }); + const tracer = compile_options.sourcemap ? new TraceMap(compile_options.sourcemap) : undefined; + this.locate = (c) => { + let location:{line:number,column:number} = locator(c); + if (tracer) { + location = originalPositionFor(tracer, location); + } + location.line += 1; // make line one based + return location; + }; // styles this.stylesheet = new Stylesheet({ source, diff --git a/test/runtime/samples/element-source-location/_config.js b/test/runtime/samples/element-source-location/_config.js index be528d15eb..46aac049ee 100644 --- a/test/runtime/samples/element-source-location/_config.js +++ b/test/runtime/samples/element-source-location/_config.js @@ -11,14 +11,14 @@ export default { assert.deepEqual(h1.__svelte_meta.loc, { file: path.relative(process.cwd(), path.resolve(__dirname, 'main.svelte')), - line: 4, + line: 5, column: 0, char: 53 }); assert.deepEqual(p.__svelte_meta.loc, { file: path.relative(process.cwd(), path.resolve(__dirname, 'Foo.svelte')), - line: 1, + line: 2, column: 1, char: 7 });