Permalink
Cannot retrieve contributors at this time
207 lines (174 sloc)
6.99 KB
import { Vue, CreateElement, CombinedVueInstance } from "./vue"; | |
import { VNode, VNodeData, VNodeDirective, NormalizedScopedSlot } from "./vnode"; | |
type Constructor = { | |
new (...args: any[]): any; | |
} | |
// we don't support infer props in async component | |
// N.B. ComponentOptions<V> is contravariant, the default generic should be bottom type | |
export type Component<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> = | |
| typeof Vue | |
| FunctionalComponentOptions<Props> | |
| ComponentOptions<never, Data, Methods, Computed, Props> | |
type EsModule<T> = T | { default: T } | |
type ImportedComponent<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> | |
= EsModule<Component<Data, Methods, Computed, Props>> | |
export type AsyncComponent<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> | |
= AsyncComponentPromise<Data, Methods, Computed, Props> | |
| AsyncComponentFactory<Data, Methods, Computed, Props> | |
export type AsyncComponentPromise<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> = ( | |
resolve: (component: Component<Data, Methods, Computed, Props>) => void, | |
reject: (reason?: any) => void | |
) => Promise<ImportedComponent<Data, Methods, Computed, Props>> | void; | |
export type AsyncComponentFactory<Data=DefaultData<never>, Methods=DefaultMethods<never>, Computed=DefaultComputed, Props=DefaultProps> = () => { | |
component: Promise<ImportedComponent<Data, Methods, Computed, Props>>; | |
loading?: ImportedComponent; | |
error?: ImportedComponent; | |
delay?: number; | |
timeout?: number; | |
} | |
/** | |
* When the `Computed` type parameter on `ComponentOptions` is inferred, | |
* it should have a property with the return type of every get-accessor. | |
* Since there isn't a way to query for the return type of a function, we allow TypeScript | |
* to infer from the shape of `Accessors<Computed>` and work backwards. | |
*/ | |
export type Accessors<T> = { | |
[K in keyof T]: (() => T[K]) | ComputedOptions<T[K]> | |
} | |
type DataDef<Data, Props, V> = Data | ((this: Readonly<Props> & V) => Data) | |
/** | |
* This type should be used when an array of strings is used for a component's `props` value. | |
*/ | |
export type ThisTypedComponentOptionsWithArrayProps<V extends Vue, Data, Methods, Computed, PropNames extends string> = | |
object & | |
ComponentOptions<V, DataDef<Data, Record<PropNames, any>, V>, Methods, Computed, PropNames[], Record<PropNames, any>> & | |
ThisType<CombinedVueInstance<V, Data, Methods, Computed, Readonly<Record<PropNames, any>>>>; | |
/** | |
* This type should be used when an object mapped to `PropOptions` is used for a component's `props` value. | |
*/ | |
export type ThisTypedComponentOptionsWithRecordProps<V extends Vue, Data, Methods, Computed, Props> = | |
object & | |
ComponentOptions<V, DataDef<Data, Props, V>, Methods, Computed, RecordPropsDefinition<Props>, Props> & | |
ThisType<CombinedVueInstance<V, Data, Methods, Computed, Readonly<Props>>>; | |
type DefaultData<V> = object | ((this: V) => object); | |
type DefaultProps = Record<string, any>; | |
type DefaultMethods<V> = { [key: string]: (this: V, ...args: any[]) => any }; | |
type DefaultComputed = { [key: string]: any }; | |
export interface ComponentOptions< | |
V extends Vue, | |
Data=DefaultData<V>, | |
Methods=DefaultMethods<V>, | |
Computed=DefaultComputed, | |
PropsDef=PropsDefinition<DefaultProps>, | |
Props=DefaultProps> { | |
data?: Data; | |
props?: PropsDef; | |
propsData?: object; | |
computed?: Accessors<Computed>; | |
methods?: Methods; | |
watch?: Record<string, WatchOptionsWithHandler<any> | WatchHandler<any>>; | |
el?: Element | string; | |
template?: string; | |
// hack is for functional component type inference, should not be used in user code | |
render?(createElement: CreateElement, hack: RenderContext<Props>): VNode; | |
renderError?(createElement: CreateElement, err: Error): VNode; | |
staticRenderFns?: ((createElement: CreateElement) => VNode)[]; | |
beforeCreate?(this: V): void; | |
created?(): void; | |
beforeDestroy?(): void; | |
destroyed?(): void; | |
beforeMount?(): void; | |
mounted?(): void; | |
beforeUpdate?(): void; | |
updated?(): void; | |
activated?(): void; | |
deactivated?(): void; | |
errorCaptured?(err: Error, vm: Vue, info: string): boolean | void; | |
serverPrefetch?(this: V): Promise<void>; | |
directives?: { [key: string]: DirectiveFunction | DirectiveOptions }; | |
components?: { [key: string]: Component<any, any, any, any> | AsyncComponent<any, any, any, any> }; | |
transitions?: { [key: string]: object }; | |
filters?: { [key: string]: Function }; | |
provide?: object | (() => object); | |
inject?: InjectOptions; | |
model?: { | |
prop?: string; | |
event?: string; | |
}; | |
parent?: Vue; | |
mixins?: (ComponentOptions<Vue> | typeof Vue)[]; | |
name?: string; | |
// TODO: support properly inferred 'extends' | |
extends?: ComponentOptions<Vue> | typeof Vue; | |
delimiters?: [string, string]; | |
comments?: boolean; | |
inheritAttrs?: boolean; | |
} | |
export interface FunctionalComponentOptions<Props = DefaultProps, PropDefs = PropsDefinition<Props>> { | |
name?: string; | |
props?: PropDefs; | |
model?: { | |
prop?: string; | |
event?: string; | |
}; | |
inject?: InjectOptions; | |
functional: boolean; | |
render?(this: undefined, createElement: CreateElement, context: RenderContext<Props>): VNode | VNode[]; | |
} | |
export interface RenderContext<Props=DefaultProps> { | |
props: Props; | |
children: VNode[]; | |
slots(): any; | |
data: VNodeData; | |
parent: Vue; | |
listeners: { [key: string]: Function | Function[] }; | |
scopedSlots: { [key: string]: NormalizedScopedSlot }; | |
injections: any | |
} | |
export type Prop<T> = { (): T } | { new(...args: never[]): T & object } | { new(...args: string[]): Function } | |
export type PropType<T> = Prop<T> | Prop<T>[]; | |
export type PropValidator<T> = PropOptions<T> | PropType<T>; | |
export interface PropOptions<T=any> { | |
type?: PropType<T>; | |
required?: boolean; | |
default?: T | null | undefined | (() => T | null | undefined); | |
validator?(value: T): boolean; | |
} | |
export type RecordPropsDefinition<T> = { | |
[K in keyof T]: PropValidator<T[K]> | |
} | |
export type ArrayPropsDefinition<T> = (keyof T)[]; | |
export type PropsDefinition<T> = ArrayPropsDefinition<T> | RecordPropsDefinition<T>; | |
export interface ComputedOptions<T> { | |
get?(): T; | |
set?(value: T): void; | |
cache?: boolean; | |
} | |
export type WatchHandler<T> = string | ((val: T, oldVal: T) => void); | |
export interface WatchOptions { | |
deep?: boolean; | |
immediate?: boolean; | |
} | |
export interface WatchOptionsWithHandler<T> extends WatchOptions { | |
handler: WatchHandler<T>; | |
} | |
export interface DirectiveBinding extends Readonly<VNodeDirective> { | |
readonly modifiers: { [key: string]: boolean }; | |
} | |
export type DirectiveFunction = ( | |
el: HTMLElement, | |
binding: DirectiveBinding, | |
vnode: VNode, | |
oldVnode: VNode | |
) => void; | |
export interface DirectiveOptions { | |
bind?: DirectiveFunction; | |
inserted?: DirectiveFunction; | |
update?: DirectiveFunction; | |
componentUpdated?: DirectiveFunction; | |
unbind?: DirectiveFunction; | |
} | |
export type InjectKey = string | symbol; | |
export type InjectOptions = { | |
[key: string]: InjectKey | { from?: InjectKey, default?: any } | |
} | string[]; |