From 8eba1aba087dccf85c10f29bdf7e78b015012a8b Mon Sep 17 00:00:00 2001
From: Cr <631807682@qq.com>
Date: Wed, 16 Oct 2019 00:23:38 +0800
Subject: [PATCH] feat(vModel): warn if v-model is used on file input (#295)
---
.../__tests__/transforms/vModel.spec.ts | 28 +++++++++++++++++++
packages/compiler-dom/src/errors.ts | 6 ++--
.../compiler-dom/src/transforms/vModel.ts | 16 +++++++++--
3 files changed, 46 insertions(+), 4 deletions(-)
create mode 100644 packages/compiler-dom/__tests__/transforms/vModel.spec.ts
diff --git a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts
new file mode 100644
index 000000000..2ed15283e
--- /dev/null
+++ b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts
@@ -0,0 +1,28 @@
+import { parse, transform, CompilerOptions } from '@vue/compiler-core'
+import { transformModel } from '../../src/transforms/vModel'
+import { transformElement } from '../../../compiler-core/src/transforms/transformElement'
+import { DOMErrorCodes } from '../../src/errors'
+
+function transformWithModel(template: string, options: CompilerOptions = {}) {
+ const ast = parse(template)
+ transform(ast, {
+ nodeTransforms: [transformElement],
+ directiveTransforms: {
+ model: transformModel
+ },
+ ...options
+ })
+ return ast
+}
+
+describe('compiler: v-model transform', () => {
+ it('should raise error if used file input element', () => {
+ const onError = jest.fn()
+ transformWithModel(``, {
+ onError
+ })
+ expect(onError.mock.calls).toMatchObject([
+ [{ code: DOMErrorCodes.X_V_MODEL_ON_FILE_INPUT_ELEMENT }]
+ ])
+ })
+})
diff --git a/packages/compiler-dom/src/errors.ts b/packages/compiler-dom/src/errors.ts
index efe55715b..b59ee0c02 100644
--- a/packages/compiler-dom/src/errors.ts
+++ b/packages/compiler-dom/src/errors.ts
@@ -26,7 +26,8 @@ export const enum DOMErrorCodes {
X_V_TEXT_NO_EXPRESSION,
X_V_TEXT_WITH_CHILDREN,
X_V_MODEL_ON_INVALID_ELEMENT,
- X_V_MODEL_ARG_ON_ELEMENT
+ X_V_MODEL_ARG_ON_ELEMENT,
+ X_V_MODEL_ON_FILE_INPUT_ELEMENT
}
export const DOMErrorMessages: { [code: number]: string } = {
@@ -35,5 +36,6 @@ export const DOMErrorMessages: { [code: number]: string } = {
[DOMErrorCodes.X_V_TEXT_NO_EXPRESSION]: `v-text is missing expression.`,
[DOMErrorCodes.X_V_TEXT_WITH_CHILDREN]: `v-text will override element children.`,
[DOMErrorCodes.X_V_MODEL_ON_INVALID_ELEMENT]: `v-model can only be used on ,