import { defineComponent, DefineComponent } from 'vue' import { defaultIfUndefined, hasFlag } from './helpers' const sorted = 1 const optional = 2 export const Sorted = sorted export const Optional = optional export default (parentItemName: string, flags: number = 0) => { const mixin: DefineComponent = defineComponent({ inject: { parent: { from: 'o' + parentItemName } }, created() { this.newValue = defaultIfUndefined(this.value, this.parent && this.parent._nextSequence()) if (!this.parent) { if (!hasFlag(flags, optional)) { throw new Error('You should wrap ' + this.$options.name + ' in a ' + parentItemName) } } else { this.parent._registerItem(this) } }, beforeUnmount() { if (this.parent) { this.parent._unregisterItem(this) } } }) if (hasFlag(flags, sorted)) { mixin.data = () => { return { index: null } } } return mixin }