diff --git a/CHANGELOG.md b/CHANGELOG.md index c8cdb94b5a6..858b722d192 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# [3.4.0-alpha.1](https://github.com/vuejs/core/compare/v3.3.7...v3.4.0-alpha.1) (2023-10-28) + + +### Features + +* **compiler-core:** export error message ([#8729](https://github.com/vuejs/core/issues/8729)) ([f7e80ee](https://github.com/vuejs/core/commit/f7e80ee4a065a9eaba98720abf415d9e87756cbd)) +* **compiler-sfc:** expose resolve type-based props and emits ([#8874](https://github.com/vuejs/core/issues/8874)) ([9e77580](https://github.com/vuejs/core/commit/9e77580c0c2f0d977bd0031a1d43cc334769d433)) +* export runtime error strings ([#9301](https://github.com/vuejs/core/issues/9301)) ([feb2f2e](https://github.com/vuejs/core/commit/feb2f2edce2d91218a5e9a52c81e322e4033296b)) +* **reactivity:** more efficient reactivity system ([#5912](https://github.com/vuejs/core/issues/5912)) ([16e06ca](https://github.com/vuejs/core/commit/16e06ca08f5a1e2af3fc7fb35de153dbe0c3087d)), closes [#311](https://github.com/vuejs/core/issues/311) [#1811](https://github.com/vuejs/core/issues/1811) [#6018](https://github.com/vuejs/core/issues/6018) [#7160](https://github.com/vuejs/core/issues/7160) [#8714](https://github.com/vuejs/core/issues/8714) [#9149](https://github.com/vuejs/core/issues/9149) [#9419](https://github.com/vuejs/core/issues/9419) [#9464](https://github.com/vuejs/core/issues/9464) +* **runtime-core:** add `once` option to watch ([#9034](https://github.com/vuejs/core/issues/9034)) ([a645e7a](https://github.com/vuejs/core/commit/a645e7aa51006516ba668b3a4365d296eb92ee7d)) + + + ## [3.3.7](https://github.com/vuejs/core/compare/v3.3.6...v3.3.7) (2023-10-24) diff --git a/package.json b/package.json index 092feef1382..1655ff8b546 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.3.7", + "version": "3.4.0-alpha.1", "packageManager": "pnpm@8.9.2", "type": "module", "scripts": { diff --git a/packages/compiler-core/__tests__/transforms/vBind.spec.ts b/packages/compiler-core/__tests__/transforms/vBind.spec.ts index 322cf9d1bde..2e94dc1f7de 100644 --- a/packages/compiler-core/__tests__/transforms/vBind.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vBind.spec.ts @@ -72,6 +72,60 @@ describe('compiler: transform v-bind', () => { }) }) + test('no expression', () => { + const node = parseWithVBind(`
`) + const props = (node.codegenNode as VNodeCall).props as ObjectExpression + expect(props.properties[0]).toMatchObject({ + key: { + content: `id`, + isStatic: true, + loc: { + start: { + line: 1, + column: 13, + offset: 12 + }, + end: { + line: 1, + column: 15, + offset: 14 + } + } + }, + value: { + content: `id`, + isStatic: false, + loc: { + start: { + line: 1, + column: 1, + offset: 0 + }, + end: { + line: 1, + column: 1, + offset: 0 + } + } + } + }) + }) + + test('no expression (shorthand)', () => { + const node = parseWithVBind(``) + const props = (node.codegenNode as VNodeCall).props as ObjectExpression + expect(props.properties[0]).toMatchObject({ + key: { + content: `id`, + isStatic: true + }, + value: { + content: `id`, + isStatic: false + } + }) + }) + test('dynamic arg', () => { const node = parseWithVBind(``) const props = (node.codegenNode as VNodeCall).props as CallExpression @@ -98,9 +152,9 @@ describe('compiler: transform v-bind', () => { }) }) - test('should error if no expression', () => { + test('should error if empty expression', () => { const onError = vi.fn() - const node = parseWithVBind(``, { onError }) + const node = parseWithVBind(``, { onError }) const props = (node.codegenNode as VNodeCall).props as ObjectExpression expect(onError.mock.calls[0][0]).toMatchObject({ code: ErrorCodes.X_V_BIND_NO_EXPRESSION, @@ -111,7 +165,7 @@ describe('compiler: transform v-bind', () => { }, end: { line: 1, - column: 16 + column: 19 } } }) @@ -142,6 +196,21 @@ describe('compiler: transform v-bind', () => { }) }) + test('.camel modifier w/ no expression', () => { + const node = parseWithVBind(``) + const props = (node.codegenNode as VNodeCall).props as ObjectExpression + expect(props.properties[0]).toMatchObject({ + key: { + content: `fooBar`, + isStatic: true + }, + value: { + content: `fooBar`, + isStatic: false + } + }) + }) + test('.camel modifier w/ dynamic arg', () => { const node = parseWithVBind(``) const props = (node.codegenNode as VNodeCall).props as CallExpression @@ -219,6 +288,21 @@ describe('compiler: transform v-bind', () => { }) }) + test('.prop modifier w/ no expression', () => { + const node = parseWithVBind(``) + const props = (node.codegenNode as VNodeCall).props as ObjectExpression + expect(props.properties[0]).toMatchObject({ + key: { + content: `.fooBar`, + isStatic: true + }, + value: { + content: `fooBar`, + isStatic: false + } + }) + }) + test('.prop modifier w/ dynamic arg', () => { const node = parseWithVBind(``) const props = (node.codegenNode as VNodeCall).props as CallExpression @@ -296,6 +380,21 @@ describe('compiler: transform v-bind', () => { }) }) + test('.prop modifier (shortband) w/ no expression', () => { + const node = parseWithVBind(``) + const props = (node.codegenNode as VNodeCall).props as ObjectExpression + expect(props.properties[0]).toMatchObject({ + key: { + content: `.fooBar`, + isStatic: true + }, + value: { + content: `fooBar`, + isStatic: false + } + }) + }) + test('.attr modifier', () => { const node = parseWithVBind(``) const props = (node.codegenNode as VNodeCall).props as ObjectExpression @@ -310,4 +409,19 @@ describe('compiler: transform v-bind', () => { } }) }) + + test('.attr modifier w/ no expression', () => { + const node = parseWithVBind(``) + const props = (node.codegenNode as VNodeCall).props as ObjectExpression + expect(props.properties[0]).toMatchObject({ + key: { + content: `^foo-bar`, + isStatic: true + }, + value: { + content: `fooBar`, + isStatic: false + } + }) + }) }) diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index 8c9f06f3543..e32771ab1cc 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.3.7", + "version": "3.4.0-alpha.1", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", @@ -33,7 +33,7 @@ "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-core#readme", "dependencies": { "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.7", + "@vue/shared": "3.4.0-alpha.1", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" }, diff --git a/packages/compiler-core/src/index.ts b/packages/compiler-core/src/index.ts index 4898a181dfc..588bb92cc5f 100644 --- a/packages/compiler-core/src/index.ts +++ b/packages/compiler-core/src/index.ts @@ -24,6 +24,7 @@ export { export { generate, type CodegenContext, type CodegenResult } from './codegen' export { ErrorCodes, + errorMessages, createCompilerError, type CoreCompilerError, type CompilerError diff --git a/packages/compiler-core/src/transforms/vBind.ts b/packages/compiler-core/src/transforms/vBind.ts index ffaf903b9e8..9f85d6b3d63 100644 --- a/packages/compiler-core/src/transforms/vBind.ts +++ b/packages/compiler-core/src/transforms/vBind.ts @@ -3,17 +3,19 @@ import { createObjectProperty, createSimpleExpression, ExpressionNode, + locStub, NodeTypes } from '../ast' import { createCompilerError, ErrorCodes } from '../errors' import { camelize } from '@vue/shared' import { CAMELIZE } from '../runtimeHelpers' +import { processExpression } from './transformExpression' // v-bind without arg is handled directly in ./transformElements.ts due to it affecting // codegen for the entire props object. This transform here is only for v-bind // *with* args. export const transformBind: DirectiveTransform = (dir, _node, context) => { - const { exp, modifiers, loc } = dir + const { modifiers, loc } = dir const arg = dir.arg! if (arg.type !== NodeTypes.SIMPLE_EXPRESSION) { @@ -46,6 +48,18 @@ export const transformBind: DirectiveTransform = (dir, _node, context) => { } } + // :arg is replaced by :arg="arg" + let { exp } = dir + if (!exp && arg.type === NodeTypes.SIMPLE_EXPRESSION) { + const propName = camelize(arg.loc.source) + const simpleExpression = createSimpleExpression(propName, false, { + ...locStub, + source: propName + }) + + exp = dir.exp = processExpression(simpleExpression, context) + } + if ( !exp || (exp.type === NodeTypes.SIMPLE_EXPRESSION && !exp.content.trim()) diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index 4e6ea338bb9..f39057c076b 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.3.7", + "version": "3.4.0-alpha.1", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", @@ -37,7 +37,7 @@ }, "homepage": "https://github.com/vuejs/core/tree/main/packages/compiler-dom#readme", "dependencies": { - "@vue/shared": "3.3.7", - "@vue/compiler-core": "3.3.7" + "@vue/shared": "3.4.0-alpha.1", + "@vue/compiler-core": "3.4.0-alpha.1" } } diff --git a/packages/compiler-dom/src/index.ts b/packages/compiler-dom/src/index.ts index 2c6f71cefbb..a2f4aff2e4c 100644 --- a/packages/compiler-dom/src/index.ts +++ b/packages/compiler-dom/src/index.ts @@ -68,5 +68,9 @@ export function parse(template: string, options: ParserOptions = {}): RootNode { export * from './runtimeHelpers' export { transformStyle } from './transforms/transformStyle' -export { createDOMCompilerError, DOMErrorCodes } from './errors' +export { + createDOMCompilerError, + DOMErrorCodes, + DOMErrorMessages +} from './errors' export * from '@vue/compiler-core' diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap index 35b87c4ec71..f97eef6094e 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap @@ -79,7 +79,6 @@ exports[`source map 1`] = ` exports[`template errors 1`] = ` [ [SyntaxError: Error parsing JavaScript expression: Unexpected token (1:3)], - [SyntaxError: v-bind is missing expression.], [SyntaxError: v-model can only be used on ,