import { Vue } from './vue' import { VNode } from './vnode' import { ComponentOptions as Vue2ComponentOptions } from './options' import { EmitsOptions, SetupContext } from './v3-setup-context' import { Data, LooseRequired, UnionToIntersection } from './common' import { ComponentPropsOptions, ExtractDefaultPropTypes, ExtractPropTypes } from './v3-component-props' import { CreateComponentPublicInstance } from './v3-component-public-instance' export { ComponentPropsOptions } from './v3-component-props' /** * Interface for declaring custom options. * * @example * ```ts * declare module 'vue' { * interface ComponentCustomOptions { * beforeRouteUpdate?( * to: Route, * from: Route, * next: () => void * ): void * } * } * ``` */ export interface ComponentCustomOptions {} export type ComputedGetter = (ctx?: any) => T export type ComputedSetter = (v: T) => void export interface WritableComputedOptions { get: ComputedGetter set: ComputedSetter } export type ComputedOptions = Record< string, ComputedGetter | WritableComputedOptions > export interface MethodOptions { [key: string]: Function } export type SetupFunction< Props, RawBindings = {}, Emits extends EmitsOptions = {} > = ( this: void, props: Readonly, ctx: SetupContext ) => RawBindings | (() => VNode | null) | void type ExtractOptionProp = T extends ComponentOptionsBase< infer P, // Props any, // RawBindings any, // D any, // C any, // M any, // Mixin any, // Extends any, // EmitsOptions any // Defaults > ? unknown extends P ? {} : P : {} export interface ComponentOptionsBase< Props, RawBindings, D, C extends ComputedOptions, M extends MethodOptions, Mixin extends ComponentOptionsMixin, Extends extends ComponentOptionsMixin, Emits extends EmitsOptions, EmitNames extends string = string, Defaults = {} > extends Omit< Vue2ComponentOptions, 'data' | 'computed' | 'methods' | 'setup' | 'props' | 'mixins' | 'extends' >, ComponentCustomOptions { // allow any options [key: string]: any // rewrite options api types data?: ( this: CreateComponentPublicInstance, vm: CreateComponentPublicInstance ) => D computed?: C methods?: M mixins?: Mixin[] extends?: Extends emits?: (Emits | EmitNames[]) & ThisType setup?: SetupFunction< Readonly< LooseRequired< Props & UnionToIntersection> & UnionToIntersection> > >, RawBindings, Emits > __defaults?: Defaults } export type ComponentOptionsMixin = ComponentOptionsBase< any, any, any, any, any, any, any, any, any, any > export type ExtractComputedReturns = { [key in keyof T]: T[key] extends { get: (...args: any[]) => infer TReturn } ? TReturn : T[key] extends (...args: any[]) => infer TReturn ? TReturn : never } export type ComponentOptionsWithProps< PropsOptions = ComponentPropsOptions, RawBindings = Data, D = Data, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, Emits extends EmitsOptions = {}, EmitsNames extends string = string, Props = ExtractPropTypes, Defaults = ExtractDefaultPropTypes > = ComponentOptionsBase< Props, RawBindings, D, C, M, Mixin, Extends, Emits, EmitsNames, Defaults > & { props?: PropsOptions } & ThisType< CreateComponentPublicInstance< Props, RawBindings, D, C, M, Mixin, Extends, Emits > > export type ComponentOptionsWithArrayProps< PropNames extends string = string, RawBindings = Data, D = Data, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, Emits extends EmitsOptions = {}, EmitsNames extends string = string, Props = Readonly<{ [key in PropNames]?: any }> > = ComponentOptionsBase< Props, RawBindings, D, C, M, Mixin, Extends, Emits, EmitsNames, {} > & { props?: PropNames[] } & ThisType< CreateComponentPublicInstance< Props, RawBindings, D, C, M, Mixin, Extends, Emits > > export type ComponentOptionsWithoutProps< Props = {}, RawBindings = Data, D = Data, C extends ComputedOptions = {}, M extends MethodOptions = {}, Mixin extends ComponentOptionsMixin = ComponentOptionsMixin, Extends extends ComponentOptionsMixin = ComponentOptionsMixin, Emits extends EmitsOptions = {}, EmitsNames extends string = string > = ComponentOptionsBase< Props, RawBindings, D, C, M, Mixin, Extends, Emits, EmitsNames, {} > & { props?: undefined } & ThisType< CreateComponentPublicInstance< Props, RawBindings, D, C, M, Mixin, Extends, Emits > > export type WithLegacyAPI = T & Omit, keyof T>