vue-facing-decorator
Version:
Vue typescript class and decorator based component.
55 lines (48 loc) • 2.18 kB
text/typescript
export { Component, ComponentBase } from './component'
export { decorator as Setup } from './option/setup'
export { decorator as Ref } from './option/ref'
export { decorator as Watch } from './option/watch'
export { decorator as Prop } from './option/props'
export { decorator as Provide } from './option/provide'
export { decorator as Inject } from './option/inject'
export { decorator as Emit } from './option/emit'
export { decorator as VModel, decorator as Model } from './option/vmodel'
export { decorator as Vanilla } from './option/vanilla'
export { decorator as Hook } from './option/methodsAndHooks'
export { createDecorator } from './custom/custom'
export { mixins } from './mixins'
import type { ComponentPublicInstance } from 'vue'
import type { OptionBuilder } from './optionBuilder'
const IdentifySymbol = Symbol('vue-facing-decorator-identify')
export interface BaseTypeIdentify {
[IdentifySymbol]: undefined
}
export function TSX<Properties extends {} = {}, Events extends {} = {}>() {
type Bundle = Properties & { [index in keyof Events as `on${Capitalize<index & string>}`]: Events[index] extends Function ? Events[index] : { (param: Events[index]): any } }
return function <C extends VueCons>(cons: C) {
return cons as unknown as {
new(): Omit<ComponentPublicInstance<(InstanceType<C>['$props']) & Bundle>, keyof Bundle> & InstanceType<C>//& ComponentPublicInstance & BaseTypeIdentify
}
}
}
export type VueCons<T = {}> = {
new(optionBuilder: OptionBuilder, vueInstance: any): ComponentPublicInstance & BaseTypeIdentify & T
}
export const Base = class {
constructor(optionBuilder: OptionBuilder, vueInstance: any) {
const props = optionBuilder.props
if (props) {
Object.keys(props).forEach(key => {
(this as any)[key] = vueInstance[key];
})
}
const methods = optionBuilder.methods
if (methods) {
Object.keys(methods).forEach(key => {
(this as any)[key] = methods[key].bind(vueInstance)
})
}
}
} as VueCons
export const Vue = Base
export { toNative } from './component'