From b3ae64b37ac155196fac3576af147fdc20f96f22 Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 15 Sep 2021 12:46:32 -0700 Subject: [PATCH 1/7] Send paths of client components and wait for them to load --- src/client/js/components/components.js | 124 ++++++++++-------- src/client/js/main.js | 6 +- .../clientComponents}/animation.js | 0 .../clientComponents}/attackAnimation.js | 0 .../clientComponents}/bumpAnimation.js | 0 .../clientComponents}/chatter.js | 0 .../clientComponents}/chest.js | 0 .../clientComponents}/dialogue.js | 0 .../clientComponents}/effects.js | 0 .../clientComponents}/events.js | 0 .../clientComponents}/explosion.js | 0 .../clientComponents}/fadeInOut.js | 0 .../clientComponents}/flash.js | 0 .../clientComponents}/gatherer.js | 0 .../clientComponents}/inventory.js | 0 .../clientComponents}/keyboardMover.js | 0 .../clientComponents}/light.js | 0 .../clientComponents}/lightPatch.js | 0 .../clientComponents}/lightningEffect.js | 0 .../clientComponents}/mouseMover.js | 0 .../clientComponents}/moveAnimation.js | 0 .../clientComponents}/particles.js | 0 .../clientComponents}/passives.js | 0 .../clientComponents}/pather.js | 0 .../clientComponents}/player.js | 0 .../clientComponents}/projectile.js | 0 .../clientComponents}/quests.js | 0 .../clientComponents}/reputation.js | 0 .../clientComponents}/resourceNode.js | 0 .../clientComponents}/serverActions.js | 0 .../clientComponents}/social.js | 0 .../clientComponents}/sound.js | 0 .../clientComponents}/spellbook.js | 0 .../clientComponents}/stash.js | 0 .../clientComponents}/stats.js | 0 .../clientComponents}/touchMover.js | 0 .../clientComponents}/trade.js | 0 .../clientComponents}/whirlwind.js | 0 src/server/config/clientConfig.js | 12 ++ src/server/server/requestHandlers.js | 14 +- 40 files changed, 93 insertions(+), 63 deletions(-) rename src/{client/js/components => server/clientComponents}/animation.js (100%) rename src/{client/js/components => server/clientComponents}/attackAnimation.js (100%) rename src/{client/js/components => server/clientComponents}/bumpAnimation.js (100%) rename src/{client/js/components => server/clientComponents}/chatter.js (100%) rename src/{client/js/components => server/clientComponents}/chest.js (100%) rename src/{client/js/components => server/clientComponents}/dialogue.js (100%) rename src/{client/js/components => server/clientComponents}/effects.js (100%) rename src/{client/js/components => server/clientComponents}/events.js (100%) rename src/{client/js/components => server/clientComponents}/explosion.js (100%) rename src/{client/js/components => server/clientComponents}/fadeInOut.js (100%) rename src/{client/js/components => server/clientComponents}/flash.js (100%) rename src/{client/js/components => server/clientComponents}/gatherer.js (100%) rename src/{client/js/components => server/clientComponents}/inventory.js (100%) rename src/{client/js/components => server/clientComponents}/keyboardMover.js (100%) rename src/{client/js/components => server/clientComponents}/light.js (100%) rename src/{client/js/components => server/clientComponents}/lightPatch.js (100%) rename src/{client/js/components => server/clientComponents}/lightningEffect.js (100%) rename src/{client/js/components => server/clientComponents}/mouseMover.js (100%) rename src/{client/js/components => server/clientComponents}/moveAnimation.js (100%) rename src/{client/js/components => server/clientComponents}/particles.js (100%) rename src/{client/js/components => server/clientComponents}/passives.js (100%) rename src/{client/js/components => server/clientComponents}/pather.js (100%) rename src/{client/js/components => server/clientComponents}/player.js (100%) rename src/{client/js/components => server/clientComponents}/projectile.js (100%) rename src/{client/js/components => server/clientComponents}/quests.js (100%) rename src/{client/js/components => server/clientComponents}/reputation.js (100%) rename src/{client/js/components => server/clientComponents}/resourceNode.js (100%) rename src/{client/js/components => server/clientComponents}/serverActions.js (100%) rename src/{client/js/components => server/clientComponents}/social.js (100%) rename src/{client/js/components => server/clientComponents}/sound.js (100%) rename src/{client/js/components => server/clientComponents}/spellbook.js (100%) rename src/{client/js/components => server/clientComponents}/stash.js (100%) rename src/{client/js/components => server/clientComponents}/stats.js (100%) rename src/{client/js/components => server/clientComponents}/touchMover.js (100%) rename src/{client/js/components => server/clientComponents}/trade.js (100%) rename src/{client/js/components => server/clientComponents}/whirlwind.js (100%) diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index 04535e62..0e5b5985 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -1,50 +1,51 @@ -let components = [ - 'keyboardMover', - 'mouseMover', - 'touchMover', - 'player', - 'pather', - 'attackAnimation', - 'lightningEffect', - 'moveAnimation', - 'bumpAnimation', - 'animation', - 'light', - 'lightPatch', - 'projectile', - 'particles', - 'explosion', - 'spellbook', - 'inventory', - 'stats', - 'chest', - 'effects', - 'quests', - 'events', - 'resourceNode', - 'gatherer', - 'stash', - 'flash', - 'chatter', - 'dialogue', - 'trade', - 'reputation', - 'serverActions', - 'social', - 'passives', - 'sound', - 'whirlwind', - 'fadeInOut' -].map(function (c) { - return 'js/components/' + c; -}); +// let components = [ +// 'keyboardMover', +// 'mouseMover', +// 'touchMover', +// 'player', +// 'pather', +// 'attackAnimation', +// 'lightningEffect', +// 'moveAnimation', +// 'bumpAnimation', +// 'animation', +// 'light', +// 'lightPatch', +// 'projectile', +// 'particles', +// 'explosion', +// 'spellbook', +// 'inventory', +// 'stats', +// 'chest', +// 'effects', +// 'quests', +// 'events', +// 'resourceNode', +// 'gatherer', +// 'stash', +// 'flash', +// 'chatter', +// 'dialogue', +// 'trade', +// 'reputation', +// 'serverActions', +// 'social', +// 'passives', +// 'sound', +// 'whirlwind', +// 'fadeInOut' +// ].map(function (c) { +// return 'js/components/' + c; +// }); define([ - ...components, - '../system/events' -], function () { - const events = arguments[arguments.length - 1]; - + 'js/system/events', + 'js/system/globals' +], function ( + events, + globals +) { const hookEvent = function (e, cb) { if (!this.eventList[e]) this.eventList[e] = []; @@ -59,26 +60,35 @@ define([ }); }; - let templates = {}; + return { + templates: {}, + + init: function () { + let cpns = globals.clientConfig.clientComponents; + return Promise.all(cpns.map(c => this.getComponent(c))); + }, - [].forEach.call(arguments, function (t, i) { - //Don't do this for the events module - if (i === arguments[2].length - 1) - return; + getComponent: function (cpn) { + return new Promise(resolve => { + require([cpn.path], this.onGetComponent.bind(this, resolve, cpn)); + }); + }, - t.eventList = {}; - t.hookEvent = hookEvent; - t.unhookEvents = unhookEvents; + onGetComponent: function (resolve, cpn, template) { + template.eventList = {}; + template.hookEvent = hookEvent; + template.unhookEvents = unhookEvents; - templates[t.type] = t; - }); + this.templates[cpn.type] = template; - return { + resolve(); + }, + getTemplate: function (type) { if (type === 'lightpatch') type = 'lightPatch'; - let template = templates[type] || { + let template = this.templates[type] || { type: type }; diff --git a/src/client/js/main.js b/src/client/js/main.js index 6c76dde9..25120e9c 100644 --- a/src/client/js/main.js +++ b/src/client/js/main.js @@ -10,6 +10,7 @@ define([ 'js/resources', 'js/sound/sound', 'js/system/globals', + 'js/components/components', 'ui/templates/online/online', 'ui/templates/tooltips/tooltips' ], function ( @@ -23,7 +24,8 @@ define([ events, resources, sound, - globals + globals, + components ) { let fnQueueTick = null; const getQueueTick = updateMethod => { @@ -69,6 +71,8 @@ define([ globals.clientConfig = config; await resources.init(); + await components.init(); + events.emit('onResourcesLoaded'); this.start(); diff --git a/src/client/js/components/animation.js b/src/server/clientComponents/animation.js similarity index 100% rename from src/client/js/components/animation.js rename to src/server/clientComponents/animation.js diff --git a/src/client/js/components/attackAnimation.js b/src/server/clientComponents/attackAnimation.js similarity index 100% rename from src/client/js/components/attackAnimation.js rename to src/server/clientComponents/attackAnimation.js diff --git a/src/client/js/components/bumpAnimation.js b/src/server/clientComponents/bumpAnimation.js similarity index 100% rename from src/client/js/components/bumpAnimation.js rename to src/server/clientComponents/bumpAnimation.js diff --git a/src/client/js/components/chatter.js b/src/server/clientComponents/chatter.js similarity index 100% rename from src/client/js/components/chatter.js rename to src/server/clientComponents/chatter.js diff --git a/src/client/js/components/chest.js b/src/server/clientComponents/chest.js similarity index 100% rename from src/client/js/components/chest.js rename to src/server/clientComponents/chest.js diff --git a/src/client/js/components/dialogue.js b/src/server/clientComponents/dialogue.js similarity index 100% rename from src/client/js/components/dialogue.js rename to src/server/clientComponents/dialogue.js diff --git a/src/client/js/components/effects.js b/src/server/clientComponents/effects.js similarity index 100% rename from src/client/js/components/effects.js rename to src/server/clientComponents/effects.js diff --git a/src/client/js/components/events.js b/src/server/clientComponents/events.js similarity index 100% rename from src/client/js/components/events.js rename to src/server/clientComponents/events.js diff --git a/src/client/js/components/explosion.js b/src/server/clientComponents/explosion.js similarity index 100% rename from src/client/js/components/explosion.js rename to src/server/clientComponents/explosion.js diff --git a/src/client/js/components/fadeInOut.js b/src/server/clientComponents/fadeInOut.js similarity index 100% rename from src/client/js/components/fadeInOut.js rename to src/server/clientComponents/fadeInOut.js diff --git a/src/client/js/components/flash.js b/src/server/clientComponents/flash.js similarity index 100% rename from src/client/js/components/flash.js rename to src/server/clientComponents/flash.js diff --git a/src/client/js/components/gatherer.js b/src/server/clientComponents/gatherer.js similarity index 100% rename from src/client/js/components/gatherer.js rename to src/server/clientComponents/gatherer.js diff --git a/src/client/js/components/inventory.js b/src/server/clientComponents/inventory.js similarity index 100% rename from src/client/js/components/inventory.js rename to src/server/clientComponents/inventory.js diff --git a/src/client/js/components/keyboardMover.js b/src/server/clientComponents/keyboardMover.js similarity index 100% rename from src/client/js/components/keyboardMover.js rename to src/server/clientComponents/keyboardMover.js diff --git a/src/client/js/components/light.js b/src/server/clientComponents/light.js similarity index 100% rename from src/client/js/components/light.js rename to src/server/clientComponents/light.js diff --git a/src/client/js/components/lightPatch.js b/src/server/clientComponents/lightPatch.js similarity index 100% rename from src/client/js/components/lightPatch.js rename to src/server/clientComponents/lightPatch.js diff --git a/src/client/js/components/lightningEffect.js b/src/server/clientComponents/lightningEffect.js similarity index 100% rename from src/client/js/components/lightningEffect.js rename to src/server/clientComponents/lightningEffect.js diff --git a/src/client/js/components/mouseMover.js b/src/server/clientComponents/mouseMover.js similarity index 100% rename from src/client/js/components/mouseMover.js rename to src/server/clientComponents/mouseMover.js diff --git a/src/client/js/components/moveAnimation.js b/src/server/clientComponents/moveAnimation.js similarity index 100% rename from src/client/js/components/moveAnimation.js rename to src/server/clientComponents/moveAnimation.js diff --git a/src/client/js/components/particles.js b/src/server/clientComponents/particles.js similarity index 100% rename from src/client/js/components/particles.js rename to src/server/clientComponents/particles.js diff --git a/src/client/js/components/passives.js b/src/server/clientComponents/passives.js similarity index 100% rename from src/client/js/components/passives.js rename to src/server/clientComponents/passives.js diff --git a/src/client/js/components/pather.js b/src/server/clientComponents/pather.js similarity index 100% rename from src/client/js/components/pather.js rename to src/server/clientComponents/pather.js diff --git a/src/client/js/components/player.js b/src/server/clientComponents/player.js similarity index 100% rename from src/client/js/components/player.js rename to src/server/clientComponents/player.js diff --git a/src/client/js/components/projectile.js b/src/server/clientComponents/projectile.js similarity index 100% rename from src/client/js/components/projectile.js rename to src/server/clientComponents/projectile.js diff --git a/src/client/js/components/quests.js b/src/server/clientComponents/quests.js similarity index 100% rename from src/client/js/components/quests.js rename to src/server/clientComponents/quests.js diff --git a/src/client/js/components/reputation.js b/src/server/clientComponents/reputation.js similarity index 100% rename from src/client/js/components/reputation.js rename to src/server/clientComponents/reputation.js diff --git a/src/client/js/components/resourceNode.js b/src/server/clientComponents/resourceNode.js similarity index 100% rename from src/client/js/components/resourceNode.js rename to src/server/clientComponents/resourceNode.js diff --git a/src/client/js/components/serverActions.js b/src/server/clientComponents/serverActions.js similarity index 100% rename from src/client/js/components/serverActions.js rename to src/server/clientComponents/serverActions.js diff --git a/src/client/js/components/social.js b/src/server/clientComponents/social.js similarity index 100% rename from src/client/js/components/social.js rename to src/server/clientComponents/social.js diff --git a/src/client/js/components/sound.js b/src/server/clientComponents/sound.js similarity index 100% rename from src/client/js/components/sound.js rename to src/server/clientComponents/sound.js diff --git a/src/client/js/components/spellbook.js b/src/server/clientComponents/spellbook.js similarity index 100% rename from src/client/js/components/spellbook.js rename to src/server/clientComponents/spellbook.js diff --git a/src/client/js/components/stash.js b/src/server/clientComponents/stash.js similarity index 100% rename from src/client/js/components/stash.js rename to src/server/clientComponents/stash.js diff --git a/src/client/js/components/stats.js b/src/server/clientComponents/stats.js similarity index 100% rename from src/client/js/components/stats.js rename to src/server/clientComponents/stats.js diff --git a/src/client/js/components/touchMover.js b/src/server/clientComponents/touchMover.js similarity index 100% rename from src/client/js/components/touchMover.js rename to src/server/clientComponents/touchMover.js diff --git a/src/client/js/components/trade.js b/src/server/clientComponents/trade.js similarity index 100% rename from src/client/js/components/trade.js rename to src/server/clientComponents/trade.js diff --git a/src/client/js/components/whirlwind.js b/src/server/clientComponents/whirlwind.js similarity index 100% rename from src/client/js/components/whirlwind.js rename to src/server/clientComponents/whirlwind.js diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index 5c401b38..9f90deca 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -1,6 +1,7 @@ const imageSize = require('image-size'); const events = require('../misc/events'); +const fileLister = require('../misc/fileLister'); const tos = require('./tos'); const config = { @@ -197,6 +198,7 @@ const config = { player: [], npc: [] }, + clientComponents: [], sounds: { ui: [] }, @@ -207,6 +209,16 @@ module.exports = { config, init: async function () { + fileLister.getFolder('./clientComponents').forEach(f => { + const type = f.split('.')[0]; + const path = 'server/clientComponents/' + f; + + config.clientComponents.push({ + type, + path + }); + }); + events.emit('onBeforeGetClientConfig', config); //Deprecated diff --git a/src/server/server/requestHandlers.js b/src/server/server/requestHandlers.js index b3a9704f..46833af1 100644 --- a/src/server/server/requestHandlers.js +++ b/src/server/server/requestHandlers.js @@ -11,13 +11,17 @@ const appFile = (req, res) => { let file = req.params[0]; file = file.replace('/' + root + '/', ''); - + const validRequest = ( root !== 'server' || - ( - file.includes('mods/') && - validModPatterns.some(v => file.includes(v)) - ) + ( + root === 'server' && + file.startsWith('clientComponents/') + ) || + ( + file.includes('mods/') && + validModPatterns.some(v => file.includes(v)) + ) ); if (!validRequest) From 677cc168ef935e7b87ffc5c19d0a89ea925d5585 Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 15 Sep 2021 12:48:33 -0700 Subject: [PATCH 2/7] Remove comment --- src/client/js/components/components.js | 41 -------------------------- 1 file changed, 41 deletions(-) diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index 0e5b5985..945b5fca 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -1,44 +1,3 @@ -// let components = [ -// 'keyboardMover', -// 'mouseMover', -// 'touchMover', -// 'player', -// 'pather', -// 'attackAnimation', -// 'lightningEffect', -// 'moveAnimation', -// 'bumpAnimation', -// 'animation', -// 'light', -// 'lightPatch', -// 'projectile', -// 'particles', -// 'explosion', -// 'spellbook', -// 'inventory', -// 'stats', -// 'chest', -// 'effects', -// 'quests', -// 'events', -// 'resourceNode', -// 'gatherer', -// 'stash', -// 'flash', -// 'chatter', -// 'dialogue', -// 'trade', -// 'reputation', -// 'serverActions', -// 'social', -// 'passives', -// 'sound', -// 'whirlwind', -// 'fadeInOut' -// ].map(function (c) { -// return 'js/components/' + c; -// }); - define([ 'js/system/events', 'js/system/globals' From dc8fc1098a7b717f16057536e1c1b76e311122d7 Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 15 Sep 2021 14:23:13 -0700 Subject: [PATCH 3/7] clientComponents should use the client linting rules --- src/server/clientComponents/.eslintrc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/server/clientComponents/.eslintrc diff --git a/src/server/clientComponents/.eslintrc b/src/server/clientComponents/.eslintrc new file mode 100644 index 00000000..7658189f --- /dev/null +++ b/src/server/clientComponents/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../../client/.eslintrc" +} \ No newline at end of file From 2dceb2c0ef1dd7fd2056feb6ff1160ab1b4ca46b Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 15 Sep 2021 15:33:10 -0700 Subject: [PATCH 4/7] Linting server needs the requirejs eslint plugin now --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3f45d484..44c31c2e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,7 +16,7 @@ audit: lint-server: stage: test script: - - npm install eslint eslint-plugin-prettier prettier babel-eslint + - npm install eslint eslint-plugin-prettier prettier babel-eslint eslint-plugin-requirejs - cd src/server - ../../node_modules/.bin/eslint . only: From deab4acc3d5da726d728a88eb68a66118ab4f2a5 Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 15 Sep 2021 15:55:52 -0700 Subject: [PATCH 5/7] clientComponents can extend another component once both are loaded --- src/client/js/components/components.js | 45 +++++++++++++++++++++----- src/server/config/clientConfig.js | 2 ++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index 945b5fca..397032cc 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -19,12 +19,20 @@ define([ }); }; + let cpns = []; + return { templates: {}, init: function () { - let cpns = globals.clientConfig.clientComponents; - return Promise.all(cpns.map(c => this.getComponent(c))); + cpns = globals.clientConfig.clientComponents; + + cpns = cpns.map(c => ({ + ...c, + promise: this.getComponent(c) + })); + + return Promise.all(cpns.map(c => c.promise)); }, getComponent: function (cpn) { @@ -34,15 +42,36 @@ define([ }, onGetComponent: function (resolve, cpn, template) { - template.eventList = {}; - template.hookEvent = hookEvent; - template.unhookEvents = unhookEvents; + if (cpn.type) { + template.eventList = {}; + template.hookEvent = hookEvent; + template.unhookEvents = unhookEvents; - this.templates[cpn.type] = template; + this.templates[cpn.type] = template; - resolve(); + resolve(); + } else if (cpn.extends) { + let target = cpn.extends; + + if (!this.templates[target]) { + let waitFor = cpns.find(c => c.type === target); + + if (waitFor) { + waitFor.promise.then(() => { + this.templates[target] = $.extend(true, this.templates[target], template); + resolve(); + }); + } + } else { + this.templates[target] = $.extend(true, this.templates[target], template); + resolve(); + } + } else { + // This shouldn't get reached + resolve(); + } }, - + getTemplate: function (type) { if (type === 'lightpatch') type = 'lightPatch'; diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index 9f90deca..a2f3934d 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -210,6 +210,8 @@ module.exports = { init: async function () { fileLister.getFolder('./clientComponents').forEach(f => { + if (!f.endsWith('.js')) return; + const type = f.split('.')[0]; const path = 'server/clientComponents/' + f; From 9661a902caad8840dc796beaf476555fbc989016 Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 15 Sep 2021 15:58:42 -0700 Subject: [PATCH 6/7] Should resolve in all cases even if missing a component --- src/client/js/components/components.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index 397032cc..50f94e3e 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -61,6 +61,9 @@ define([ this.templates[target] = $.extend(true, this.templates[target], template); resolve(); }); + } else { + // There's no file for that component type for us to extend + resolve(); } } else { this.templates[target] = $.extend(true, this.templates[target], template); From 7040fda936db833a336e8b86ab46896cb82a67c0 Mon Sep 17 00:00:00 2001 From: kckckc Date: Thu, 16 Sep 2021 00:32:57 -0700 Subject: [PATCH 7/7] Restructure clientComponent extensions --- src/client/js/components/components.js | 94 +++++++++++--------------- 1 file changed, 41 insertions(+), 53 deletions(-) diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index 50f94e3e..e0b343f6 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -5,6 +5,11 @@ define([ 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] = []; @@ -19,71 +24,54 @@ define([ }); }; - let cpns = []; - - return { - templates: {}, - - init: function () { - cpns = globals.clientConfig.clientComponents; - - cpns = cpns.map(c => ({ - ...c, - promise: this.getComponent(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(); + }); + }); + }; - return Promise.all(cpns.map(c => c.promise)); - }, + //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); - getComponent: function (cpn) { - return new Promise(resolve => { - require([cpn.path], this.onGetComponent.bind(this, resolve, cpn)); - }); - }, + extensions.forEach(e => $.extend(true, t, e)); - onGetComponent: function (resolve, cpn, template) { - if (cpn.type) { - template.eventList = {}; - template.hookEvent = hookEvent; - template.unhookEvents = unhookEvents; + t.eventList = {}; + t.hookEvent = hookEvent; + t.unhookEvents = unhookEvents; + }); + }; - this.templates[cpn.type] = template; + //Export + return { + init: async function () { + const paths = globals.clientConfig.clientComponents; - resolve(); - } else if (cpn.extends) { - let target = cpn.extends; + await loadComponents(paths); - if (!this.templates[target]) { - let waitFor = cpns.find(c => c.type === target); - - if (waitFor) { - waitFor.promise.then(() => { - this.templates[target] = $.extend(true, this.templates[target], template); - resolve(); - }); - } else { - // There's no file for that component type for us to extend - resolve(); - } - } else { - this.templates[target] = $.extend(true, this.templates[target], template); - resolve(); - } - } else { - // This shouldn't get reached - resolve(); - } + buildComponents(); }, getTemplate: function (type) { if (type === 'lightpatch') type = 'lightPatch'; - let template = this.templates[type] || { - type: type - }; - - return template; + return templates.find(t => t.type === type) || { type: type }; } }; });