From: 三咲智子 Kevin Deng Date: Wed, 6 Dec 2023 16:36:42 +0000 (+0800) Subject: feat(compiler-vapor): shorthand & no expression X-Git-Tag: v3.6.0-alpha.1~16^2~738 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d9f0ac614f393df26de8a33d58cfd7bce633b52;p=thirdparty%2Fvuejs%2Fcore.git feat(compiler-vapor): shorthand & no expression --- diff --git a/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap b/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap index 863f8b2588..893ffc05b2 100644 --- a/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap +++ b/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap @@ -44,11 +44,39 @@ export function render(_ctx) { }" `; +exports[`compile > directives > v-bind > no expression (shorthand) 1`] = ` +"import { template as _template, children as _children, effect as _effect, setAttr as _setAttr } from 'vue/vapor'; + +export function render(_ctx) { + const t0 = _template("
") + const n0 = t0() + const { 0: [n1],} = _children(n0) + _effect(() => { + _setAttr(n1, "camel-case", undefined, _ctx.camelCase) + }) + return n0 +}" +`; + +exports[`compile > directives > v-bind > no expression 1`] = ` +"import { template as _template, children as _children, effect as _effect, setAttr as _setAttr } from 'vue/vapor'; + +export function render(_ctx) { + const t0 = _template("
") + const n0 = t0() + const { 0: [n1],} = _children(n0) + _effect(() => { + _setAttr(n1, "id", undefined, _ctx.id) + }) + return n0 +}" +`; + exports[`compile > directives > v-bind > should error if no expression 1`] = ` "import { template as _template } from 'vue/vapor'; export function render(_ctx) { - const t0 = _template("
") + const t0 = _template("
") const n0 = t0() return n0 }" diff --git a/packages/compiler-vapor/__tests__/compile.test.ts b/packages/compiler-vapor/__tests__/compile.test.ts index 5b19c02fa1..9459ac00fd 100644 --- a/packages/compiler-vapor/__tests__/compile.test.ts +++ b/packages/compiler-vapor/__tests__/compile.test.ts @@ -71,8 +71,7 @@ describe('compile', () => { expect(code).matchSnapshot() }) - // TODO: fix this test - test.fails('should error if no expression', async () => { + test('should error if no expression', async () => { const onError = vi.fn() const code = await compile(`
`, { onError }) @@ -92,11 +91,10 @@ describe('compile', () => { expect(code).matchSnapshot() // the arg is static - expect(code).contains(JSON.stringify('
')) + expect(code).contains(JSON.stringify('
')) }) - // TODO: support shorthand syntax for v-bind #9451 - test.fails('no expression', async () => { + test('no expression', async () => { const code = await compile('
', { bindingMetadata: { id: BindingTypes.SETUP_REF, @@ -107,16 +105,17 @@ describe('compile', () => { expect(code).contains('_setAttr(n1, "id", undefined, _ctx.id)') }) - // TODO: support shorthand syntax for v-bind #9451 - test.fails('no expression (shorthand)', async () => { - const code = await compile('
', { + test('no expression (shorthand)', async () => { + const code = await compile('
', { bindingMetadata: { - id: BindingTypes.SETUP_REF, + camelCase: BindingTypes.SETUP_REF, }, }) expect(code).matchSnapshot() - expect(code).contains('_setAttr(n1, "id", undefined, _ctx.id)') + expect(code).contains( + '_setAttr(n1, "camel-case", undefined, _ctx.camelCase)', + ) }) test('dynamic arg', async () => { diff --git a/packages/compiler-vapor/src/transforms/transformElement.ts b/packages/compiler-vapor/src/transforms/transformElement.ts index 8ff3a5575f..c0d0a34508 100644 --- a/packages/compiler-vapor/src/transforms/transformElement.ts +++ b/packages/compiler-vapor/src/transforms/transformElement.ts @@ -5,8 +5,9 @@ import { ErrorCodes, createCompilerError, ElementTypes, + createSimpleExpression, } from '@vue/compiler-dom' -import { isBuiltInDirective, isVoidTag } from '@vue/shared' +import { camelize, isBuiltInDirective, isVoidTag } from '@vue/shared' import { NodeTransform, TransformContext } from '../transform' import { VaporDirectiveNode, IRNodeTypes } from '../ir' @@ -68,7 +69,7 @@ function transformProp( return } - const { arg, exp, loc } = prop + let { arg, exp, loc } = prop const directiveTransform = context.options.directiveTransforms[name] if (directiveTransform) { directiveTransform(prop, node, context) @@ -84,19 +85,22 @@ function transformProp( switch (name) { case 'bind': { - if (!exp || !exp.content.trim()) { - context.options.onError( - createCompilerError(ErrorCodes.X_V_BIND_NO_EXPRESSION, loc), - ) + if (!arg) { + // TODO support v-bind="{}" return } + if (!exp) { + // shorthand syntax https://github.com/vuejs/core/pull/9451 + const propName = camelize(arg.content) + exp = createSimpleExpression(propName, false, arg.loc) + exp.ast = null + } - if (exp === null) { - // TODO: Vue 3.4 supported shorthand syntax - // https://github.com/vuejs/core/pull/9451 - return - } else if (!arg) { - // TODO support v-bind="{}" + if (!exp.content.trim()) { + context.options.onError( + createCompilerError(ErrorCodes.X_V_BIND_NO_EXPRESSION, loc), + ) + context.template += ` ${arg.content}=""` return }