import { PluginObject } from 'vue' import { superEach, superEachAsync } from '../utils' import { validateCore, extractCore, assignmentCore, assignmentAsyncCore, extractAsyncCore, validateAsyncCore } from './core' import { TypeSource } from './type' export interface IOptions { } export const defaultOptions: IOptions = { } export const banana = { async validateAsync (...sources: TypeSource[]) { await superEachAsync(sources, validateAsyncCore) return await this.extractAsync(...sources) }, async extractAsync (...sources: TypeSource[]) { const result = {} await superEachAsync(sources, async (source) => { Object.assign(result, await extractAsyncCore(source)) }) return result }, async assignmentAsync (data: {}, ...sources: TypeSource[]) { await superEachAsync(sources, async (sources) => { await assignmentAsyncCore(data, sources) }) }, validate (...sources: TypeSource[]) { superEach(sources, validateCore) return this.extract(...sources) }, extract (...sources: TypeSource[]) { const result = {} superEach(sources, (source) => { Object.assign(result, extractCore(source)) }) return result }, assignment (data: {}, ...sources: TypeSource[]) { superEach(sources, (sources) => { assignmentCore(data, sources) }) }, filter(data: {}, rules: any[] = ['', null, undefined]) { return Object.keys(data).reduce((r, k) => { const v = data[k] if (!rules.includes(v)) r[k] = v return r }, {}) } } const Banana: PluginObject = { install(Vue, options) { this.setDefaultOptions(options) Vue.prototype.$banana = banana }, // 设置默认配置 setDefaultOptions (options?: IOptions) { Object.assign(defaultOptions, options) }, } export default Banana