import { isObject } from 'lodash' import { inject, InjectionKey, isRef, provide, readonly, shallowReadonly } from 'vue' import { ReadonlyInjectionKey } from '@/symbols' import { logger } from '@/utils' export const use = (value: T, cb: (arg: T) => void) => { if (typeof value === 'undefined' || value === null) { return } cb(value) } export const arrayify = (maybeArray: T | Array) => ([] as Array).concat(maybeArray) // @ts-ignore export const noop = () => { } export const limitBy = (arr: T[], count: number, offset: number = 0): T[] => arr.slice(offset, offset + count) export const provideReadonly = (key: ReadonlyInjectionKey, value: T, deep = true, mutator?: Closure) => { mutator = mutator || (v => isRef(value) ? (value.value = v) : (value = v)) if (!isObject(value)) { logger.warn(`value cannot be made readonly: ${value}`) provide(key, [value, mutator]) } else { provide(key, [deep ? readonly(value) : shallowReadonly(value), mutator]) } } export const requireInjection = (key: InjectionKey, defaultValue?: T) => { const value = inject(key, defaultValue) if (typeof value === 'undefined') { throw new Error(`Missing injection: ${key.toString()}`) } return value }