From e97951dd2e9c3d6894d34eb5a2b4f8f0e46f4db4 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 16 Oct 2019 16:33:23 -0400 Subject: [PATCH] feat: emit compiler error for invalid JavaScript expressions --- .../__tests__/transforms/transformExpressions.spec.ts | 4 +++- packages/compiler-core/src/errors.ts | 2 ++ packages/compiler-core/src/transforms/transformExpression.ts | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts index 3b2c70de..d6c142bd 100644 --- a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts @@ -379,6 +379,8 @@ describe('compiler: expression transform', () => { test('should handle parse error', () => { const onError = jest.fn() parseWithExpressionTransform(`{{ a( }}`, { onError }) - expect(onError.mock.calls[0][0].message).toMatch(`Unexpected token (1:4)`) + expect(onError.mock.calls[0][0].message).toMatch( + `Invalid JavaScript expression. (1:4)` + ) }) }) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index 30b83905..ebd113c5 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -82,6 +82,7 @@ export const enum ErrorCodes { X_V_MODEL_NO_EXPRESSION, X_V_MODEL_MALFORMED_EXPRESSION, X_V_MODEL_ON_SCOPE_VARIABLE, + X_INVALID_EXPRESSION, // generic errors X_PREFIX_ID_NOT_SUPPORTED, @@ -173,6 +174,7 @@ export const errorMessages: { [code: number]: string } = { [ErrorCodes.X_V_MODEL_NO_EXPRESSION]: `v-model is missing expression.`, [ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION]: `v-model value must be a valid JavaScript member expression.`, [ErrorCodes.X_V_MODEL_ON_SCOPE_VARIABLE]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`, + [ErrorCodes.X_INVALID_EXPRESSION]: `Invalid JavaScript expression.`, // generic errors [ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED]: `"prefixIdentifiers" option is not supported in this build of compiler.`, diff --git a/packages/compiler-core/src/transforms/transformExpression.ts b/packages/compiler-core/src/transforms/transformExpression.ts index 2894e33e..6e10782e 100644 --- a/packages/compiler-core/src/transforms/transformExpression.ts +++ b/packages/compiler-core/src/transforms/transformExpression.ts @@ -24,6 +24,7 @@ import { walkJS } from '../utils' import { isGloballyWhitelisted, makeMap } from '@vue/shared' +import { createCompilerError, ErrorCodes } from '../errors' const isLiteralWhitelisted = /*#__PURE__*/ makeMap('true,false,null,this') @@ -105,7 +106,9 @@ export function processExpression( try { ast = parseJS(source, { ranges: true }) } catch (e) { - context.onError(e) + context.onError( + createCompilerError(ErrorCodes.X_INVALID_EXPRESSION, node.loc) + ) return node }