import type { ComponentInjectOptions, ComponentOptions, ComponentOptionsBase, ComponentOptionsMixin, ComponentProvideOptions, ComputedOptions, MethodOptions, RenderFunction, } from './componentOptions' import type { AllowedComponentProps, Component, ComponentCustomProps, GlobalComponents, GlobalDirectives, SetupContext, } from './component' import type { ComponentObjectPropsOptions, ComponentPropsOptions, ExtractDefaultPropTypes, ExtractPropTypes, } from './componentProps' import type { EmitsOptions, EmitsToProps, TypeEmitsToOptions, } from './componentEmits' import { type IsKeyValues, extend, isFunction } from '@vue/shared' import type { VNodeProps } from './vnode' import type { ComponentPublicInstanceConstructor, CreateComponentPublicInstanceWithMixins, } from './componentPublicInstance' import type { SlotsType } from './componentSlots' import type { Directive } from './directives' import type { ComponentTypeEmits } from './apiSetupHelpers' export type PublicProps = VNodeProps & AllowedComponentProps & ComponentCustomProps type ResolveProps = Readonly< PropsOrPropOptions extends ComponentPropsOptions ? ExtractPropTypes : PropsOrPropOptions > & ({} extends E ? {} : EmitsToProps) export type DefineComponent< PropsOrPropOptions = {}, RawBindings = {}, D = {}, C extends ComputedOptions = ComputedOptions, M extends MethodOptions = MethodOptions, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = {}, EE extends string = string, PP = PublicProps, Props = ResolveProps, Defaults = ExtractDefaultPropTypes, S extends SlotsType = {}, LC extends Record = {}, Directives extends Record = {}, Exposed extends string = string, Provide extends ComponentProvideOptions = ComponentProvideOptions, MakeDefaultsOptional extends boolean = true, TypeRefs extends Record = {}, TypeEl extends Element = any, > = ComponentPublicInstanceConstructor< CreateComponentPublicInstanceWithMixins< Props, RawBindings, D, C, M, Mixin, Extends, E, PP, Defaults, MakeDefaultsOptional, {}, S, LC & GlobalComponents, Directives & GlobalDirectives, Exposed, TypeRefs, TypeEl > > & ComponentOptionsBase< Props, RawBindings, D, C, M, Mixin, Extends, E, EE, Defaults, {}, string, S, LC & GlobalComponents, Directives & GlobalDirectives, Exposed, Provide > & PP export type DefineSetupFnComponent< P extends Record, E extends EmitsOptions = {}, S extends SlotsType = SlotsType, Props = P & EmitsToProps, PP = PublicProps, > = new ( props: Props & PP, ) => CreateComponentPublicInstanceWithMixins< Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, E, PP, {}, false, {}, S > type ToResolvedProps = Readonly & Readonly> // defineComponent is a utility that is primarily used for type inference // when declaring components. Type inference is provided in the component // options (provided as the argument). The returned value has artificial types // for TSX / manual render function / IDE support. // overload 1: direct setup function // (uses user defined props interface) export function defineComponent< Props extends Record, E extends EmitsOptions = {}, EE extends string = string, S extends SlotsType = {}, >( setup: ( props: Props, ctx: SetupContext, ) => RenderFunction | Promise, options?: Pick & { props?: (keyof NoInfer)[] emits?: E | EE[] slots?: S }, ): DefineSetupFnComponent export function defineComponent< Props extends Record, E extends EmitsOptions = {}, EE extends string = string, S extends SlotsType = {}, >( setup: ( props: Props, ctx: SetupContext, ) => RenderFunction | Promise, options?: Pick & { props?: ComponentObjectPropsOptions emits?: E | EE[] slots?: S }, ): DefineSetupFnComponent // overload 2: defineComponent with options object, infer props from options export function defineComponent< // props TypeProps, RuntimePropsOptions extends ComponentObjectPropsOptions = ComponentObjectPropsOptions, RuntimePropsKeys extends string = string, // emits TypeEmits extends ComponentTypeEmits = {}, RuntimeEmitsOptions extends EmitsOptions = {}, RuntimeEmitsKeys extends string = string, // other options Data = {}, SetupBindings = {}, Computed extends ComputedOptions = {}, Methods extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, InjectOptions extends ComponentInjectOptions = {}, InjectKeys extends string = string, Slots extends SlotsType = {}, LocalComponents extends Record = {}, Directives extends Record = {}, Exposed extends string = string, Provide extends ComponentProvideOptions = ComponentProvideOptions, // resolved types ResolvedEmits extends EmitsOptions = {} extends RuntimeEmitsOptions ? TypeEmitsToOptions : RuntimeEmitsOptions, InferredProps = IsKeyValues extends true ? TypeProps : string extends RuntimePropsKeys ? ComponentObjectPropsOptions extends RuntimePropsOptions ? {} : ExtractPropTypes : { [key in RuntimePropsKeys]?: any }, TypeRefs extends Record = {}, TypeEl extends Element = any, >( options: { props?: (RuntimePropsOptions & ThisType) | RuntimePropsKeys[] /** * @private for language-tools use only */ __typeProps?: TypeProps /** * @private for language-tools use only */ __typeEmits?: TypeEmits /** * @private for language-tools use only */ __typeRefs?: TypeRefs /** * @private for language-tools use only */ __typeEl?: TypeEl } & ComponentOptionsBase< ToResolvedProps, SetupBindings, Data, Computed, Methods, Mixin, Extends, RuntimeEmitsOptions, RuntimeEmitsKeys, {}, // Defaults InjectOptions, InjectKeys, Slots, LocalComponents, Directives, Exposed, Provide > & ThisType< CreateComponentPublicInstanceWithMixins< ToResolvedProps, SetupBindings, Data, Computed, Methods, Mixin, Extends, ResolvedEmits, {}, {}, false, InjectOptions, Slots, LocalComponents, Directives, string > >, ): DefineComponent< InferredProps, SetupBindings, Data, Computed, Methods, Mixin, Extends, ResolvedEmits, RuntimeEmitsKeys, PublicProps, ToResolvedProps, ExtractDefaultPropTypes, Slots, LocalComponents, Directives, Exposed, Provide, // MakeDefaultsOptional - if TypeProps is provided, set to false to use // user props types verbatim unknown extends TypeProps ? true : false, TypeRefs, TypeEl > // implementation, close to no-op /*@__NO_SIDE_EFFECTS__*/ export function defineComponent( options: unknown, extraOptions?: ComponentOptions, ) { return isFunction(options) ? /*@__PURE__*/ (() => extend({ name: options.name }, extraOptions, { setup: options }))() : options }