UNPKG

vue-facing-decorator

Version:

Vue typescript class and decorator based component.

44 lines (39 loc) 1.44 kB
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) } } }