gluebert.bootstrap.js

import { ModuleLauncher } from './module/module.launcher';
import { DataObserver } from './data/data.observer';
import { DataManager } from './data/data.manager';
import { ElementBuilder } from './element/element.builder';

/**
 * Class represents Gluebert
 */
class Gluebert {

    /**
     * @param {ModuleSignature[]} modules
     * @param {DataSignature[]} data
     */
    constructor(modules, data) {

        this._modules = modules;
        this._elements = this._extractElements(modules);
        this._data = data;
        this._schemaValidator = null;
        this._templateEngine = null;

    }

    start() {
        this._init();
        return this;
    }

    /**
     * start binding methods and properties
     * @private
     */
    _init() {
        this.elementBuilder = new ElementBuilder(this._elements, this._templateEngine, this._schemaValidator);
        this.dataObserver = new DataObserver();
        this.dataManager = new DataManager(this.dataObserver, this._data);
        this.moduleLauncher = new ModuleLauncher(this._modules, this.dataObserver, this.elementBuilder);
    }

    /**
     * extract elements list from modules
     * @param {ModuleSignature[]} modules
     * @return {ElementSignature[]}
     * @private
     */
    _extractElements(modules) {

        return modules.reduce((a, b) => {
            let elements = b.getElementSignatures();
            if(elements.size) {
                a.push(...elements);
            }
            return a;
        }, []);
    }


    setSchemaValidator(schemaValidator) {
        this._schemaValidator = schemaValidator;
        return this;
    }

    setTemplateEngine(templateEngine) {
        this._templateEngine = templateEngine;
        return this;
    }


}

export {
    Gluebert,
};