define([ 'js/system/events', 'js/system/globals' ], function ( events, globals ) { //Store templates here after loading them const templates = []; const extenders = []; //Bound Methods const hookEvent = function (e, cb) { if (!this.eventList[e]) this.eventList[e] = []; this.eventList[e].push(cb); events.on(e, cb); }; const unhookEvents = function () { Object.entries(this.eventList).forEach(([eventName, callbacks]) => { callbacks.forEach(c => events.off(eventName, c)); }); }; //Helpers const loadComponent = cpn => { return new Promise(res => { require([cpn.path], tpl => { if (cpn.type) templates.push(tpl); if (cpn.extends) extenders.push(tpl); res(); }); }); }; //Init Methods const loadComponents = paths => { return Promise.all( paths.map(p => loadComponent(p)) ); }; const buildComponents = () => { templates.forEach(t => { const extensions = extenders.filter(e => e.extends === t.type); extensions.forEach(e => $.extend(true, t, e)); t.eventList = {}; t.hookEvent = hookEvent; t.unhookEvents = unhookEvents; }); }; //Export return { init: async function () { const paths = globals.clientConfig.clientComponents; await loadComponents(paths); buildComponents(); }, getTemplate: function (type) { if (type === 'lightpatch') type = 'lightPatch'; return templates.find(t => t.type === type) || { type: type }; } }; });