From 2142dfd05d6b6ebc5f55883ca13a15847cdb07fa Mon Sep 17 00:00:00 2001 From: dpiercey Date: Sat, 14 Dec 2024 14:45:10 -0700 Subject: [PATCH] fix: script tag sourcemap locations --- .changeset/pink-trainers-cross.md | 7 ++++++ .changeset/shy-pots-act.md | 7 ++++++ .../src/babel-types/generator/patch.js | 12 ++++++++- packages/compiler/src/babel-utils/parse.js | 18 +++++++++---- .../src/translator/core/script.ts | 25 ++++++------------- 5 files changed, 46 insertions(+), 23 deletions(-) create mode 100644 .changeset/pink-trainers-cross.md create mode 100644 .changeset/shy-pots-act.md diff --git a/.changeset/pink-trainers-cross.md b/.changeset/pink-trainers-cross.md new file mode 100644 index 000000000..430e00c9f --- /dev/null +++ b/.changeset/pink-trainers-cross.md @@ -0,0 +1,7 @@ +--- +"@marko/runtime-tags": patch +"@marko/compiler": patch +"marko": patch +--- + +Use statement parsing for script tag to improve sourcemap accuracy. diff --git a/.changeset/shy-pots-act.md b/.changeset/shy-pots-act.md new file mode 100644 index 000000000..f42c9e098 --- /dev/null +++ b/.changeset/shy-pots-act.md @@ -0,0 +1,7 @@ +--- +"@marko/runtime-tags": patch +"@marko/compiler": patch +"marko": patch +--- + +Fix issue where negative sourcemap offets leaning to the previous line were outputting incorrect values. diff --git a/packages/compiler/src/babel-types/generator/patch.js b/packages/compiler/src/babel-types/generator/patch.js index 42e683fa6..4765d3646 100644 --- a/packages/compiler/src/babel-types/generator/patch.js +++ b/packages/compiler/src/babel-types/generator/patch.js @@ -204,7 +204,17 @@ Object.assign(Printer.prototype, { if (attributes.length) { if (tagName === "script") { for (let i = attributes.length; i--; ) { - if (attributes[i].value.fromBody) { + const attr = attributes[i]; + if ( + attr.name === "value" && + (attr.value.type === "ArrowFunctionExpression" || + attr.value.type === "FunctionExpression") && + !( + attr.value.generator || + attr.value.returnType || + attr.value.typeParameters + ) + ) { bodyOverride = attributes[i].value.body.body; attributes = toSpliced(attributes, i); break; diff --git a/packages/compiler/src/babel-utils/parse.js b/packages/compiler/src/babel-utils/parse.js index f5d85981c..5a042c182 100644 --- a/packages/compiler/src/babel-utils/parse.js +++ b/packages/compiler/src/babel-utils/parse.js @@ -75,7 +75,7 @@ export function parseTemplateLiteral(file, str, sourceStart, sourceEnd) { ); if (parsed.type === "TemplateLiteral") { - return parsed; + return t.templateLiteral(parsed.quasis, parsed.expressions); } return ensureParseError(file, parsed, sourceStart, sourceEnd); @@ -119,11 +119,19 @@ function tryParse( const { parserOpts } = file.opts; if (typeof sourceStart === "number") { - const startIndex = sourceStart - (sourceOffset || 0); - const startLoc = getLoc(file, startIndex); + const startLoc = getLoc(file, sourceStart); + const startLine = startLoc.line; + let startIndex = sourceStart; + let startColumn = startLoc.column; + + if (sourceOffset) { + startIndex -= sourceOffset; + startColumn -= sourceOffset; + } + + parserOpts.startLine = startLine; parserOpts.startIndex = startIndex; - parserOpts.startColumn = startLoc.column; - parserOpts.startLine = startLoc.line; + parserOpts.startColumn = startColumn; try { return isExpression diff --git a/packages/runtime-tags/src/translator/core/script.ts b/packages/runtime-tags/src/translator/core/script.ts index 5d43c2f19..0d0d530f8 100644 --- a/packages/runtime-tags/src/translator/core/script.ts +++ b/packages/runtime-tags/src/translator/core/script.ts @@ -3,7 +3,7 @@ import { assertNoArgs, assertNoAttributeTags, assertNoParams, - parseExpression, + parseStatements, type Tag, } from "@marko/compiler/babel-utils"; @@ -24,9 +24,7 @@ export default { const { node } = tag; const { body } = node.body; if (body.length) { - const codePrefix = "async ()=>{"; - const codeSuffix = "}"; - let code = codePrefix; + let code = ""; for (const child of body) { if (child.type !== "MarkoText") { throw tag.hub.file.hub.buildError( @@ -39,24 +37,17 @@ export default { code += child.value; } - code += codeSuffix; const start = body[0]?.start; const end = body[body.length - 1]?.end; - const bodyExpression = parseExpression( - tag.hub.file, - code, - start, - end, - codePrefix.length, + const bodyStatements = parseStatements(tag.hub.file, code, start, end); + const valueFn = t.arrowFunctionExpression( + [], + t.blockStatement(bodyStatements), + traverseContains(bodyStatements, isAwaitExpression), ); - bodyExpression.async = traverseContains( - bodyExpression.body, - isAwaitExpression, - ); - (bodyExpression as any).fromBody = true; - node.attributes.push(t.markoAttribute("value", bodyExpression)); + node.attributes.push(t.markoAttribute("value", valueFn)); node.body.body = []; } },