]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core): ensure mapping is added only if node source is available (#13285)
authoredison <daiwei521@126.com>
Fri, 16 May 2025 00:22:37 +0000 (08:22 +0800)
committerGitHub <noreply@github.com>
Fri, 16 May 2025 00:22:37 +0000 (08:22 +0800)
close #13261
close vitejs/vite-plugin-vue#368

packages/compiler-core/src/codegen.ts
packages/compiler-sfc/__tests__/compileTemplate.spec.ts

index 70116cfb61a9f7d6e662b64c3df79f08c7f50b23..6b4559fabb20c7c56396ea2d139413e09ec56848 100644 (file)
@@ -188,7 +188,9 @@ function createCodegenContext(
               name = content
             }
           }
-          addMapping(node.loc.start, name)
+          if (node.loc.source) {
+            addMapping(node.loc.start, name)
+          }
         }
         if (newlineIndex === NewlineType.Unknown) {
           // multiple newlines, full iteration
@@ -225,7 +227,7 @@ function createCodegenContext(
             context.column = code.length - newlineIndex
           }
         }
-        if (node && node.loc !== locStub) {
+        if (node && node.loc !== locStub && node.loc.source) {
           addMapping(node.loc.end)
         }
       }
index 2ea1eb9d3780c91d7dc204f66a205dee0c6a81e3..22623299a02521e30ea36528cfd5807c6e81a0ef 100644 (file)
@@ -157,6 +157,35 @@ test('source map', () => {
   ).toMatchObject(getPositionInCode(template.content, `foobar`))
 })
 
+test('source map: v-if generated comment should not have original position', () => {
+  const template = parse(
+    `
+      <template>
+        <div v-if="true"></div>
+      </template>
+    `,
+    { filename: 'example.vue', sourceMap: true },
+  ).descriptor.template!
+
+  const { code, map } = compile({
+    filename: 'example.vue',
+    source: template.content,
+  })
+
+  expect(map!.sources).toEqual([`example.vue`])
+  expect(map!.sourcesContent).toEqual([template.content])
+
+  const consumer = new SourceMapConsumer(map as RawSourceMap)
+  const commentNode = code.match(/_createCommentVNode\("v-if", true\)/)
+  expect(commentNode).not.toBeNull()
+  const commentPosition = getPositionInCode(code, commentNode![0])
+  const originalPosition = consumer.originalPositionFor(commentPosition)
+  // the comment node should not be mapped to the original source
+  expect(originalPosition.column).toBeNull()
+  expect(originalPosition.line).toBeNull()
+  expect(originalPosition.source).toBeNull()
+})
+
 test('should work w/ AST from descriptor', () => {
   const source = `
   <template>