From bce7164bf0045102e907a520adeb99bb8a2b2a58 Mon Sep 17 00:00:00 2001 From: zhiyuanzmj <260480378@qq.com> Date: Fri, 28 Feb 2025 17:07:55 +0800 Subject: [PATCH] feat(runtime-vapor): support functional component for defineVaporComponent (#12927) --- packages/runtime-vapor/__tests__/_utils.ts | 5 +++-- .../__tests__/componentProps.spec.ts | 21 +++++++++++++++++++ .../runtime-vapor/src/apiDefineComponent.ts | 17 +++++++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/runtime-vapor/__tests__/_utils.ts b/packages/runtime-vapor/__tests__/_utils.ts index c34eb05a0..0ed645544 100644 --- a/packages/runtime-vapor/__tests__/_utils.ts +++ b/packages/runtime-vapor/__tests__/_utils.ts @@ -1,4 +1,4 @@ -import { createVaporApp, defineVaporComponent } from '../src' +import { createVaporApp } from '../src' import type { App } from '@vue/runtime-dom' import type { VaporComponent, VaporComponentInstance } from '../src/component' import type { RawProps } from '../src/componentProps' @@ -36,7 +36,8 @@ export function makeRender( }) function define(comp: C) { - const component = defineVaporComponent(comp as any) + const component = comp as any + component.__vapor = true let instance: VaporComponentInstance | undefined let app: App diff --git a/packages/runtime-vapor/__tests__/componentProps.spec.ts b/packages/runtime-vapor/__tests__/componentProps.spec.ts index 2fd0e9df1..c068e8044 100644 --- a/packages/runtime-vapor/__tests__/componentProps.spec.ts +++ b/packages/runtime-vapor/__tests__/componentProps.spec.ts @@ -127,6 +127,27 @@ describe('component: props', () => { expect(props).toBe(attrs) }) + test('functional defineVaporComponent without declaration', () => { + let props: any + let attrs: any + + const { render } = define( + defineVaporComponent((_props: any, { attrs: _attrs }: any) => { + props = _props + attrs = _attrs + return [] + }), + ) + + render({ foo: () => 1 }) + expect(props).toEqual({}) + expect(attrs).toEqual({ foo: 1 }) + + render({ bar: () => 2 }) + expect(props).toEqual({}) + expect(attrs).toEqual({ bar: 2 }) + }) + test('boolean casting', () => { let props: any const { render } = define({ diff --git a/packages/runtime-vapor/src/apiDefineComponent.ts b/packages/runtime-vapor/src/apiDefineComponent.ts index ed70a6495..430f87cdd 100644 --- a/packages/runtime-vapor/src/apiDefineComponent.ts +++ b/packages/runtime-vapor/src/apiDefineComponent.ts @@ -1,7 +1,20 @@ -import type { VaporComponent } from './component' +import type { ObjectVaporComponent, VaporComponent } from './component' +import { extend, isFunction } from '@vue/shared' /*! #__NO_SIDE_EFFECTS__ */ -export function defineVaporComponent(comp: VaporComponent): VaporComponent { +export function defineVaporComponent( + comp: VaporComponent, + extraOptions?: Omit, +): VaporComponent { + if (isFunction(comp)) { + // #8236: extend call and options.name access are considered side-effects + // by Rollup, so we have to wrap it in a pure-annotated IIFE. + return /*@__PURE__*/ (() => + extend({ name: comp.name }, extraOptions, { + setup: comp, + __vapor: true, + }))() + } // TODO type inference comp.__vapor = true return comp