From 3724693a25c3f2dd13d70a8a1af760b03a4fb783 Mon Sep 17 00:00:00 2001 From: edison Date: Wed, 24 Apr 2024 16:32:39 +0800 Subject: [PATCH 1/5] fix(runtime-core): properly get keepAlive child (#10772) close #10771 --- .../src/components/BaseTransition.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/runtime-core/src/components/BaseTransition.ts b/packages/runtime-core/src/components/BaseTransition.ts index 5d4175128..8fa272d26 100644 --- a/packages/runtime-core/src/components/BaseTransition.ts +++ b/packages/runtime-core/src/components/BaseTransition.ts @@ -470,15 +470,17 @@ function getKeepAliveChild(vnode: VNode): VNode | undefined { const { shapeFlag, children } = vnode - if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) { - return (children as VNodeArrayChildren)[0] as VNode - } + if (children) { + if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) { + return (children as VNodeArrayChildren)[0] as VNode + } - if ( - shapeFlag & ShapeFlags.SLOTS_CHILDREN && - isFunction((children as any).default) - ) { - return (children as any).default() + if ( + shapeFlag & ShapeFlags.SLOTS_CHILDREN && + isFunction((children as any).default) + ) { + return (children as any).default() + } } } From 4253a57f1703a7f1ac701d77e0a235689203461d Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 24 Apr 2024 18:21:57 +0800 Subject: [PATCH 2/5] fix(defineModel): align prod mode runtime type generation with defineProps close #10769 --- .../__snapshots__/defineModel.spec.ts.snap | 40 ++++++++++++ .../compileScript/defineModel.spec.ts | 28 +++++++++ .../compiler-sfc/src/script/defineModel.ts | 63 ++++++++++--------- 3 files changed, 100 insertions(+), 31 deletions(-) diff --git a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap index 6e9967fd0..6fe26a639 100644 --- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap @@ -226,3 +226,43 @@ return { modelValue, fn, fnWithDefault, str, optional } })" `; + +exports[`defineModel() > w/ types, production mode, boolean + multiple types 1`] = ` +"import { useModel as _useModel, defineComponent as _defineComponent } from 'vue' + +export default /*#__PURE__*/_defineComponent({ + props: { + "modelValue": { type: [Boolean, String, Object] }, + "modelModifiers": {}, + }, + emits: ["update:modelValue"], + setup(__props, { expose: __expose }) { + __expose(); + + const modelValue = _useModel(__props, "modelValue") + +return { modelValue } +} + +})" +`; + +exports[`defineModel() > w/ types, production mode, function + runtime opts + multiple types 1`] = ` +"import { useModel as _useModel, defineComponent as _defineComponent } from 'vue' + +export default /*#__PURE__*/_defineComponent({ + props: { + "modelValue": { type: [Number, Function], ...{ default: () => 1 } }, + "modelModifiers": {}, + }, + emits: ["update:modelValue"], + setup(__props, { expose: __expose }) { + __expose(); + + const modelValue = _useModel number)>(__props, "modelValue") + +return { modelValue } +} + +})" +`; diff --git a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts index bd048a847..4550aa5c4 100644 --- a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts @@ -161,6 +161,34 @@ describe('defineModel()', () => { }) }) + test('w/ types, production mode, boolean + multiple types', () => { + const { content } = compile( + ` + + `, + { isProd: true }, + ) + assertCode(content) + expect(content).toMatch('"modelValue": { type: [Boolean, String, Object] }') + }) + + test('w/ types, production mode, function + runtime opts + multiple types', () => { + const { content } = compile( + ` + + `, + { isProd: true }, + ) + assertCode(content) + expect(content).toMatch( + '"modelValue": { type: [Number, Function], ...{ default: () => 1 } }', + ) + }) + test('get / set transformers', () => { const { content } = compile( ` diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts index e5e2ed0e5..050828002 100644 --- a/packages/compiler-sfc/src/script/defineModel.ts +++ b/packages/compiler-sfc/src/script/defineModel.ts @@ -1,12 +1,7 @@ import type { LVal, Node, TSType } from '@babel/types' import type { ScriptCompileContext } from './context' import { inferRuntimeType } from './resolveType' -import { - UNKNOWN_TYPE, - concatStrings, - isCallOf, - toRuntimeTypeString, -} from './utils' +import { UNKNOWN_TYPE, isCallOf, toRuntimeTypeString } from './utils' import { BindingTypes, unwrapTSNode } from '@vue/compiler-dom' export const DEFINE_MODEL = 'defineModel' @@ -124,44 +119,50 @@ export function genModelProps(ctx: ScriptCompileContext) { const isProd = !!ctx.options.isProd let modelPropsDecl = '' - for (const [name, { type, options }] of Object.entries(ctx.modelDecls)) { + for (const [name, { type, options: runtimeOptions }] of Object.entries( + ctx.modelDecls, + )) { let skipCheck = false - + let codegenOptions = `` let runtimeTypes = type && inferRuntimeType(ctx, type) if (runtimeTypes) { const hasBoolean = runtimeTypes.includes('Boolean') + const hasFunction = runtimeTypes.includes('Function') const hasUnknownType = runtimeTypes.includes(UNKNOWN_TYPE) - if (isProd || hasUnknownType) { - runtimeTypes = runtimeTypes.filter( - t => - t === 'Boolean' || - (hasBoolean && t === 'String') || - (t === 'Function' && options), - ) + if (hasUnknownType) { + if (hasBoolean || hasFunction) { + runtimeTypes = runtimeTypes.filter(t => t !== UNKNOWN_TYPE) + skipCheck = true + } else { + runtimeTypes = ['null'] + } + } - skipCheck = !isProd && hasUnknownType && runtimeTypes.length > 0 + if (!isProd) { + codegenOptions = + `type: ${toRuntimeTypeString(runtimeTypes)}` + + (skipCheck ? ', skipCheck: true' : '') + } else if (hasBoolean || (runtimeOptions && hasFunction)) { + // preserve types if contains boolean, or + // function w/ runtime options that may contain default + codegenOptions = `type: ${toRuntimeTypeString(runtimeTypes)}` + } else { + // able to drop types in production } } - let runtimeType = - (runtimeTypes && - runtimeTypes.length > 0 && - toRuntimeTypeString(runtimeTypes)) || - undefined - - const codegenOptions = concatStrings([ - runtimeType && `type: ${runtimeType}`, - skipCheck && 'skipCheck: true', - ]) - let decl: string - if (runtimeType && options) { + if (codegenOptions && runtimeOptions) { decl = ctx.isTS - ? `{ ${codegenOptions}, ...${options} }` - : `Object.assign({ ${codegenOptions} }, ${options})` + ? `{ ${codegenOptions}, ...${runtimeOptions} }` + : `Object.assign({ ${codegenOptions} }, ${runtimeOptions})` + } else if (codegenOptions) { + decl = `{ ${codegenOptions} }` + } else if (runtimeOptions) { + decl = runtimeOptions } else { - decl = options || (runtimeType ? `{ ${codegenOptions} }` : '{}') + decl = `{}` } modelPropsDecl += `\n ${JSON.stringify(name)}: ${decl},` From 064e82f5855f30fe0b77fe9b5e4dd22700fd634d Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 24 Apr 2024 18:28:49 +0800 Subject: [PATCH 3/5] fix(runtime-core): use normal object as internal prototype for attrs and slots to allow use of hasOwnProperty() ref https://github.com/vuejs/core/commit/6df53d85a207986128159d88565e6e7045db2add#r141304923 --- packages/runtime-core/src/internalObject.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/internalObject.ts b/packages/runtime-core/src/internalObject.ts index 0c0c39bef..8b6ff1724 100644 --- a/packages/runtime-core/src/internalObject.ts +++ b/packages/runtime-core/src/internalObject.ts @@ -4,7 +4,7 @@ * `Object.getPrototypeOf`. This is more performant than defining a * non-enumerable property. (one of the optimizations done for ssr-benchmark) */ -const internalObjectProto = Object.create(null) +const internalObjectProto = {} export const createInternalObject = () => Object.create(internalObjectProto) From 8ee69e7eaf37d7171d80d7c93f6ce729d1fa698c Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 24 Apr 2024 18:31:45 +0800 Subject: [PATCH 4/5] ci: use single thread for e2e tests on ci --- vitest.e2e.config.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vitest.e2e.config.ts b/vitest.e2e.config.ts index ecf1c9d95..90a67d229 100644 --- a/vitest.e2e.config.ts +++ b/vitest.e2e.config.ts @@ -3,6 +3,11 @@ import config from './vitest.config' export default mergeConfig(config, { test: { + poolOptions: { + threads: { + singleThread: !!process.env.CI, + }, + }, include: ['packages/vue/__tests__/e2e/*.spec.ts'], }, }) From 574c3e63bbb764c82fd7228eac979bb3e7fa731d Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 24 Apr 2024 18:37:52 +0800 Subject: [PATCH 5/5] release: v3.4.25 --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- packages/compiler-core/package.json | 2 +- packages/compiler-dom/package.json | 2 +- packages/compiler-sfc/package.json | 2 +- packages/compiler-ssr/package.json | 2 +- packages/reactivity/package.json | 2 +- packages/runtime-core/package.json | 2 +- packages/runtime-dom/package.json | 2 +- packages/server-renderer/package.json | 2 +- packages/shared/package.json | 2 +- packages/vue-compat/package.json | 2 +- packages/vue/package.json | 2 +- 13 files changed, 23 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aed60497..fe351268a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## [3.4.25](https://github.com/vuejs/core/compare/v3.4.24...v3.4.25) (2024-04-24) + + +### Bug Fixes + +* **defineModel:** align prod mode runtime type generation with defineProps ([4253a57](https://github.com/vuejs/core/commit/4253a57f1703a7f1ac701d77e0a235689203461d)), closes [#10769](https://github.com/vuejs/core/issues/10769) +* **runtime-core:** properly get keepAlive child ([#10772](https://github.com/vuejs/core/issues/10772)) ([3724693](https://github.com/vuejs/core/commit/3724693a25c3f2dd13d70a8a1af760b03a4fb783)), closes [#10771](https://github.com/vuejs/core/issues/10771) +* **runtime-core:** use normal object as internal prototype for attrs and slots ([064e82f](https://github.com/vuejs/core/commit/064e82f5855f30fe0b77fe9b5e4dd22700fd634d)), closes [/github.com/vuejs/core/commit/6df53d85a207986128159d88565e6e7045db2add#r141304923](https://github.com//github.com/vuejs/core/commit/6df53d85a207986128159d88565e6e7045db2add/issues/r141304923) + + + ## [3.4.24](https://github.com/vuejs/core/compare/v3.4.23...v3.4.24) (2024-04-22) diff --git a/package.json b/package.json index be02ea8be..a91136c80 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.4.24", + "version": "3.4.25", "packageManager": "pnpm@9.0.5", "type": "module", "scripts": { diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index bebc491d8..5a4b7f653 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index b752924f5..113dc583c 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index 11087bcb3..58564d436 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index 3e1cb919e..cb20b1743 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index 6cb042c8a..e0e789cf1 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index 23ab3e3fa..ccdca5888 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index fb364038c..152243cf3 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index 9f164e44f..e8929a1af 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.4.24", + "version": "3.4.25", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", diff --git a/packages/shared/package.json b/packages/shared/package.json index e0d7a2f9b..51b192193 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.4.24", + "version": "3.4.25", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index 855d2ebd4..642643125 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.4.24", + "version": "3.4.25", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", diff --git a/packages/vue/package.json b/packages/vue/package.json index 31aef2f48..413b523b1 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.4.24", + "version": "3.4.25", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js",