diff --git a/packages/compiler-core/__tests__/transforms/vFor.spec.ts b/packages/compiler-core/__tests__/transforms/vFor.spec.ts
index 7fabcbb579c..e434b8888a6 100644
--- a/packages/compiler-core/__tests__/transforms/vFor.spec.ts
+++ b/packages/compiler-core/__tests__/transforms/vFor.spec.ts
@@ -202,6 +202,18 @@ describe('compiler: v-for', () => {
expect(forNode.valueAlias).toBeUndefined()
expect((forNode.source as SimpleExpressionNode).content).toBe('items')
})
+
+ test('source containing string expression with spaces', () => {
+ const { node: forNode } = parseWithForTransform(
+ ``,
+ )
+ expect(forNode.keyAlias).toBeUndefined()
+ expect(forNode.objectIndexAlias).toBeUndefined()
+ expect((forNode.valueAlias as SimpleExpressionNode).content).toBe('item')
+ expect((forNode.source as SimpleExpressionNode).content).toBe(
+ "state ['my items']",
+ )
+ })
})
describe('errors', () => {
@@ -253,6 +265,18 @@ describe('compiler: v-for', () => {
)
})
+ test('missing source and have multiple spaces with', () => {
+ const onError = vi.fn()
+ parseWithForTransform('', { onError })
+
+ expect(onError).toHaveBeenCalledTimes(1)
+ expect(onError).toHaveBeenCalledWith(
+ expect.objectContaining({
+ code: ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION,
+ }),
+ )
+ })
+
test('missing value', () => {
const onError = vi.fn()
parseWithForTransform('', { onError })
diff --git a/packages/compiler-core/src/utils.ts b/packages/compiler-core/src/utils.ts
index 99a2c5b61a8..aa596028440 100644
--- a/packages/compiler-core/src/utils.ts
+++ b/packages/compiler-core/src/utils.ts
@@ -499,4 +499,4 @@ export function getMemoedVNodeCall(node: BlockCodegenNode | MemoExpression) {
}
}
-export const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/
+export const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/