import type { ComponentInjectOptions, ComponentOptions, ComponentOptionsBase, ComponentOptionsMixin, ComponentOptionsWithArrayProps, ComponentOptionsWithObjectProps, ComponentOptionsWithoutProps, ComputedOptions, MethodOptions, RenderFunction, } from './componentOptions' import type { AllowedComponentProps, ComponentCustomProps, SetupContext, } from './component' import type { ComponentObjectPropsOptions, ComponentPropsOptions, ExtractDefaultPropTypes, ExtractPropTypes, } from './componentProps' import type { EmitsOptions, EmitsToProps } from './componentEmits' import { extend, isFunction } from '@vue/shared' import type { VNodeProps } from './vnode' import type { ComponentPublicInstanceConstructor, CreateComponentPublicInstance, } from './componentPublicInstance' import type { SlotsType } from './componentSlots' 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 = {}, > = ComponentPublicInstanceConstructor< CreateComponentPublicInstance< Props, RawBindings, D, C, M, Mixin, Extends, E, PP & Props, Defaults, true, {}, S > > & ComponentOptionsBase< Props, RawBindings, D, C, M, Mixin, Extends, E, EE, Defaults, {}, string, S > & PP export type DefineSetupFnComponent< P extends Record, E extends EmitsOptions = {}, S extends SlotsType = SlotsType, Props = P & EmitsToProps, PP = PublicProps, > = new ( props: Props & PP, ) => CreateComponentPublicInstance< Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, E, PP, {}, false, {}, S > // 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 Props)[] 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: object format with no props // (uses user defined props interface) // return type is for Vetur and TSX support export function defineComponent< Props = {}, RawBindings = {}, D = {}, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = {}, EE extends string = string, S extends SlotsType = {}, I extends ComponentInjectOptions = {}, II extends string = string, >( options: ComponentOptionsWithoutProps< Props, RawBindings, D, C, M, Mixin, Extends, E, EE, I, II, S >, ): DefineComponent< Props, RawBindings, D, C, M, Mixin, Extends, E, EE, PublicProps, ResolveProps, ExtractDefaultPropTypes, S > // overload 3: object format with array props declaration // props inferred as { [key in PropNames]?: any } // return type is for Vetur and TSX support export function defineComponent< PropNames extends string, RawBindings, D, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = {}, EE extends string = string, S extends SlotsType = {}, I extends ComponentInjectOptions = {}, II extends string = string, Props = Readonly<{ [key in PropNames]?: any }>, >( options: ComponentOptionsWithArrayProps< PropNames, RawBindings, D, C, M, Mixin, Extends, E, EE, I, II, S >, ): DefineComponent< Props, RawBindings, D, C, M, Mixin, Extends, E, EE, PublicProps, ResolveProps, ExtractDefaultPropTypes, S > // overload 4: object format with object props declaration // see `ExtractPropTypes` in ./componentProps.ts export function defineComponent< // the Readonly constraint allows TS to treat the type of { required: true } // as constant instead of boolean. PropsOptions extends Readonly, RawBindings, D, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, E extends EmitsOptions = {}, EE extends string = string, S extends SlotsType = {}, I extends ComponentInjectOptions = {}, II extends string = string, >( options: ComponentOptionsWithObjectProps< PropsOptions, RawBindings, D, C, M, Mixin, Extends, E, EE, I, II, S >, ): DefineComponent< PropsOptions, RawBindings, D, C, M, Mixin, Extends, E, EE, PublicProps, ResolveProps, ExtractDefaultPropTypes, S > // implementation, close to no-op /*! #__NO_SIDE_EFFECTS__ */ export function defineComponent( options: unknown, extraOptions?: ComponentOptions, ) { return isFunction(options) ? // #8326: extend call and options.name access are considered side-effects // by Rollup, so we have to wrap it in a pure-annotated IIFE. /*#__PURE__*/ (() => extend({ name: options.name }, extraOptions, { setup: options }))() : options }