vue-facing-decorator
Version:
Vue typescript class and decorator based component.
44 lines (39 loc) • 1.44 kB
text/typescript
import { VueCons } from '../class'
import { obtainSlot } from '../slot'
export const Compatible: {
fakePrototype?: any,
} = {
}
export function compatibleClassDecorator(deco: Function) {
return function (cons: VueCons, ctx?: ClassDecoratorContext) {
if (ctx) {//stage 3 arg is constructor, ctx is ClassDecoratorContext
if (ctx.kind !== 'class') {
throw 'deco stage 3 class'
}
const proto = Compatible.fakePrototype ??= {}
const slot = obtainSlot(proto)
delete Compatible.fakePrototype
obtainSlot(cons.prototype, slot)
const ret = deco(cons)
return ret
}
else {//stage 2 arg is constructor
return deco(cons)
}
}
}
export function compatibleMemberDecorator(deco: Function) {
return function (protoOrValue: any, nameOrCtx: ClassMemberDecoratorContext | string) {
if (typeof nameOrCtx === 'object') {//stage 3 arg is value, ctx is ClassMemberDecoratorContext
const ctx = nameOrCtx
const value = protoOrValue
const proto = Compatible.fakePrototype ??= {};
proto[ctx.name!] = value
return deco(proto, ctx.name)
} else { //stage 2 arg is prototype, ctx is name stirng
const name = nameOrCtx
const proto = protoOrValue
return deco(proto, name)
}
}
}