]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(runtime-vapor): support functional component for defineVaporComponent (#12927)
authorzhiyuanzmj <260480378@qq.com>
Fri, 28 Feb 2025 09:07:55 +0000 (17:07 +0800)
committerGitHub <noreply@github.com>
Fri, 28 Feb 2025 09:07:55 +0000 (17:07 +0800)
packages/runtime-vapor/__tests__/_utils.ts
packages/runtime-vapor/__tests__/componentProps.spec.ts
packages/runtime-vapor/src/apiDefineComponent.ts

index c34eb05a05c334a4ebb4b69f3670814e7a9ecc4a..0ed645544784c82eb4de0dda1fbc17a8ed4eb512 100644 (file)
@@ -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<C = VaporComponent>(
   })
 
   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
 
index 2fd0e9df1a0b8acfdf60f53fb3ed96f751834c1d..c068e8044cb7c1b1dd2f1a695232954f4192cb68 100644 (file)
@@ -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({
index ed70a6495a5d8f4890c490272b16e527d7565777..430f87cdd500cff8c645b59b6e301ebac5268cb0 100644 (file)
@@ -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<ObjectVaporComponent, 'setup'>,
+): 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