apiDefineComponent.ts 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. import type { VaporComponentInstance, VaporComponentOptions } from './component'
  2. import {
  3. type IsKeyValues,
  4. type Prettify,
  5. extend,
  6. isFunction,
  7. } from '@vue/shared'
  8. import type {
  9. AllowedComponentProps,
  10. ComponentCustomProps,
  11. ComponentObjectPropsOptions,
  12. ComponentTypeEmits,
  13. EmitFn,
  14. EmitsOptions,
  15. EmitsToProps,
  16. ExtractDefaultPropTypes,
  17. ExtractPropTypes,
  18. ReservedProps,
  19. TypeEmitsToOptions,
  20. VNode,
  21. } from '@vue/runtime-dom'
  22. import type { StaticSlots } from './componentSlots'
  23. import type { Block } from './block'
  24. export type VaporPublicProps = ReservedProps &
  25. AllowedComponentProps &
  26. ComponentCustomProps
  27. export type VaporRenderResult<T = Block> = VNode | T | VaporRenderResult<T>[]
  28. type VaporComponentInstanceConstructor<T extends VaporComponentInstance> = {
  29. __isFragment?: never
  30. __isTeleport?: never
  31. __isSuspense?: never
  32. new (...args: any[]): T
  33. }
  34. export type DefineVaporComponent<
  35. RuntimePropsOptions = {},
  36. RuntimePropsKeys extends string = string,
  37. InferredProps = string extends RuntimePropsKeys
  38. ? ComponentObjectPropsOptions extends RuntimePropsOptions
  39. ? {}
  40. : ExtractPropTypes<RuntimePropsOptions>
  41. : { [key in RuntimePropsKeys]?: any },
  42. Emits extends EmitsOptions = {},
  43. RuntimeEmitsKeys extends string = string,
  44. Slots extends StaticSlots = StaticSlots,
  45. Exposed extends Record<string, any> = Record<string, any>,
  46. TypeBlock extends Block = Block,
  47. TypeRefs extends Record<string, unknown> = {},
  48. MakeDefaultsOptional extends boolean = true,
  49. PublicProps = VaporPublicProps,
  50. ResolvedProps = InferredProps & EmitsToProps<Emits>,
  51. Defaults = ExtractDefaultPropTypes<RuntimePropsOptions>,
  52. > = VaporComponentInstanceConstructor<
  53. VaporComponentInstance<
  54. MakeDefaultsOptional extends true
  55. ? keyof Defaults extends never
  56. ? Prettify<ResolvedProps> & PublicProps
  57. : Partial<Defaults> &
  58. Omit<Prettify<ResolvedProps> & PublicProps, keyof Defaults>
  59. : Prettify<ResolvedProps> & PublicProps,
  60. Emits,
  61. Slots,
  62. Exposed,
  63. TypeBlock,
  64. TypeRefs
  65. >
  66. > &
  67. VaporComponentOptions<
  68. RuntimePropsOptions | RuntimePropsKeys[],
  69. Emits,
  70. RuntimeEmitsKeys,
  71. Slots,
  72. Exposed
  73. >
  74. export type DefineVaporSetupFnComponent<
  75. Props extends Record<string, any> = {},
  76. Emits extends EmitsOptions = {},
  77. Slots extends StaticSlots = StaticSlots,
  78. Exposed extends Record<string, any> = Record<string, any>,
  79. TypeBlock extends Block = Block,
  80. ResolvedProps extends Record<string, any> = Props &
  81. EmitsToProps<Emits> &
  82. VaporPublicProps,
  83. > = new () => VaporComponentInstance<
  84. ResolvedProps,
  85. Emits,
  86. Slots,
  87. Exposed,
  88. TypeBlock
  89. >
  90. // overload 1: direct setup function
  91. // (uses user defined props interface)
  92. export function defineVaporComponent<
  93. Props extends Record<string, any>,
  94. Emits extends EmitsOptions = {},
  95. RuntimeEmitsKeys extends string = string,
  96. Slots extends StaticSlots = StaticSlots,
  97. Exposed extends Record<string, any> = Record<string, any>,
  98. TypeBlock extends Block = Block,
  99. >(
  100. setup: (
  101. props: Props,
  102. ctx: {
  103. emit: EmitFn<Emits>
  104. slots: Slots
  105. attrs: Record<string, any>
  106. expose: (exposed: Exposed) => void
  107. },
  108. ) => VaporRenderResult<TypeBlock> | void,
  109. extraOptions?: VaporComponentOptions<
  110. (keyof NoInfer<Props>)[],
  111. Emits,
  112. RuntimeEmitsKeys,
  113. Slots,
  114. Exposed
  115. > &
  116. ThisType<void>,
  117. ): DefineVaporSetupFnComponent<Props, Emits, Slots, Exposed, TypeBlock>
  118. export function defineVaporComponent<
  119. Props extends Record<string, any>,
  120. Emits extends EmitsOptions = {},
  121. RuntimeEmitsKeys extends string = string,
  122. Slots extends StaticSlots = StaticSlots,
  123. Exposed extends Record<string, any> = Record<string, any>,
  124. TypeBlock extends Block = Block,
  125. >(
  126. setup: (
  127. props: Props,
  128. ctx: {
  129. emit: EmitFn<Emits>
  130. slots: Slots
  131. attrs: Record<string, any>
  132. expose: (exposed: Exposed) => void
  133. },
  134. ) => VaporRenderResult<TypeBlock> | void,
  135. extraOptions?: VaporComponentOptions<
  136. ComponentObjectPropsOptions<Props>,
  137. Emits,
  138. RuntimeEmitsKeys,
  139. Slots,
  140. Exposed
  141. > &
  142. ThisType<void>,
  143. ): DefineVaporSetupFnComponent<Props, Emits, Slots, Exposed, TypeBlock>
  144. // overload 2: defineVaporComponent with options object, infer props from options
  145. export function defineVaporComponent<
  146. // props
  147. TypeProps,
  148. RuntimePropsOptions extends ComponentObjectPropsOptions =
  149. ComponentObjectPropsOptions,
  150. RuntimePropsKeys extends string = string,
  151. // emits
  152. TypeEmits extends ComponentTypeEmits = {},
  153. RuntimeEmitsOptions extends EmitsOptions = {},
  154. RuntimeEmitsKeys extends string = string,
  155. Slots extends StaticSlots = StaticSlots,
  156. Exposed extends Record<string, any> = Record<string, any>,
  157. // resolved types
  158. ResolvedEmits extends EmitsOptions = {} extends RuntimeEmitsOptions
  159. ? TypeEmitsToOptions<TypeEmits>
  160. : RuntimeEmitsOptions,
  161. InferredProps = IsKeyValues<TypeProps> extends true
  162. ? TypeProps
  163. : string extends RuntimePropsKeys
  164. ? ComponentObjectPropsOptions extends RuntimePropsOptions
  165. ? {}
  166. : ExtractPropTypes<RuntimePropsOptions>
  167. : { [key in RuntimePropsKeys]?: any },
  168. TypeRefs extends Record<string, unknown> = {},
  169. TypeBlock extends Block = Block,
  170. >(
  171. options: VaporComponentOptions<
  172. RuntimePropsOptions | RuntimePropsKeys[],
  173. ResolvedEmits,
  174. RuntimeEmitsKeys,
  175. Slots,
  176. Exposed,
  177. TypeBlock,
  178. InferredProps
  179. > & {
  180. // allow any custom options
  181. [key: string]: any
  182. /**
  183. * @private for language-tools use only
  184. */
  185. __typeProps?: TypeProps
  186. /**
  187. * @private for language-tools use only
  188. */
  189. __typeEmits?: TypeEmits
  190. /**
  191. * @private for language-tools use only
  192. */
  193. __typeRefs?: TypeRefs
  194. /**
  195. * @private for language-tools use only
  196. */
  197. __typeEl?: TypeBlock
  198. } & ThisType<void>,
  199. ): DefineVaporComponent<
  200. RuntimePropsOptions,
  201. RuntimePropsKeys,
  202. InferredProps,
  203. ResolvedEmits,
  204. RuntimeEmitsKeys,
  205. Slots,
  206. Exposed extends Block ? Record<string, any> : Exposed,
  207. TypeBlock,
  208. TypeRefs,
  209. // MakeDefaultsOptional - if TypeProps is provided, set to false to use
  210. // user props types verbatim
  211. unknown extends TypeProps ? true : false
  212. >
  213. /*@__NO_SIDE_EFFECTS__*/
  214. export function defineVaporComponent(comp: any, extraOptions?: any) {
  215. if (isFunction(comp)) {
  216. return /*@__PURE__*/ (() =>
  217. extend({ name: comp.name }, extraOptions, {
  218. setup: comp,
  219. __vapor: true,
  220. }))()
  221. }
  222. comp.__vapor = true
  223. return comp
  224. }