]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compat): correctly transform non-identifier expressions in legacy filter syntax...
authorHaoqun Jiang <haoqunjiang@gmail.com>
Mon, 27 May 2024 09:04:48 +0000 (17:04 +0800)
committerGitHub <noreply@github.com>
Mon, 27 May 2024 09:04:48 +0000 (17:04 +0800)
close #10852

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

index 86d11f52a600edd6de34dee5de5bc8f4d4ea5106..52b381567d59d0645458ce0a41e3b6aaec0966d1 100644 (file)
@@ -168,6 +168,8 @@ function parseFilter(node: SimpleExpressionNode, context: TransformContext) {
       expression = wrapFilter(expression, filters[i], context)
     }
     node.content = expression
+    // reset ast since the content is replaced
+    node.ast = undefined
   }
 }
 
index 45dc54a69db6e6bcbaace9850dd43f9fa2cd66d5..2ea1eb9d3780c91d7dc204f66a205dee0c6a81e3 100644 (file)
@@ -1,4 +1,5 @@
 import { type RawSourceMap, SourceMapConsumer } from 'source-map-js'
+import { parse as babelParse } from '@babel/parser'
 import {
   type SFCTemplateCompileOptions,
   compileTemplate,
@@ -452,6 +453,36 @@ test('prefixing edge case for reused AST ssr mode', () => {
   ).not.toThrowError()
 })
 
+// #10852
+test('non-identifier expression in legacy filter syntax', () => {
+  const src = `
+  <template>
+    <div>
+      Today is
+      {{ new Date() | formatDate }}
+    </div>
+  </template>
+  `
+
+  const { descriptor } = parse(src)
+  const compilationResult = compileTemplate({
+    id: 'xxx',
+    filename: 'test.vue',
+    ast: descriptor.template!.ast,
+    source: descriptor.template!.content,
+    ssr: false,
+    compilerOptions: {
+      compatConfig: {
+        MODE: 2,
+      },
+    },
+  })
+
+  expect(() => {
+    babelParse(compilationResult.code, { sourceType: 'module' })
+  }).not.toThrow()
+})
+
 interface Pos {
   line: number
   column: number