vue-facing-decorator
Version:
Vue typescript class and decorator based component.
25 lines (24 loc) • 905 B
text/typescript
import type { VueConsAny } from '../class'
import type { OptionBuilder } from '../optionBuilder'
import { filterNames, getValidOwnPropertyNames } from '../utils'
import { obtainSlot } from '../slot'
export function build(cons: VueConsAny, optionBuilder: OptionBuilder) {
optionBuilder.data ??= {}
const sample = new cons()
let names = getValidOwnPropertyNames(sample, (des, name) => {
return !!des.enumerable
&& !optionBuilder.methods?.[name]
&& !optionBuilder.props?.[name]
})
const slot = obtainSlot(cons.prototype)
//include these names:
//provide, user may access field directly
//customDecorator
names = filterNames(names, slot, ['provide', 'customDecorator'])
Object.assign(optionBuilder.data,
names.reduce<Record<string, any>>((pv, cv) => {
pv[cv] = sample[cv]
return pv
}, {})
)
}