Home Reference Source

src/plugins/MapPlugin.js

/**
 * @file 字典集合插件
 * @author exodia(d_xinxin@163.com)
 */

import u from '../util';
import BasePlugin from './BasePlugin';

const CACHE = Symbol('cache');

/**
 * @private
 */
export default class MapPlugin extends BasePlugin {
    static MAP_COMPONENT_CONFIG = {
        creator: Object,
        isFactory: true
    };

    static MAP_ID = `${(new Date()).getTime()}_map`;

    static has(obj) {
        return u.isObject(obj) && u.isObject(obj.$map);
    }

    get name() {
        return 'map';
    }

    constructor() {
        super();
        this[CACHE] = Object.create(null);
    }

    /**
     * @override
     */
    onContainerInit(ioc, iocConfig) {
        ioc.addComponent(this.constructor.MAP_ID, this.constructor.MAP_COMPONENT_CONFIG);
        return iocConfig;
    }

    /**
     * @override
     */
    onGetComponent(ioc, id, config) {
        if (this[CACHE][id]) {
            return config;
        }

        const {has, MAP_ID} = this.constructor;

        // {$map: {}} => {$import: Map.MAP_ID, properties: {}}
        config.args = config.args.map(
            argConfig => has(argConfig) ? {$import: MAP_ID, properties: argConfig.$map} : argConfig
        );

        let properties = config.properties;
        for (let k in properties) {
            let property = properties[k];
            if (MapPlugin.has(property)) {
                properties[k] = {$import: MAP_ID, properties: property.$map};
            }
        }

        return config;
    }
}