UNPKG

@istanbul/app

Version:

App package of istanbul framework

119 lines (118 loc) 5.41 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createModule = void 0; const module_type_1 = require("../types/module.type"); const app_events_1 = require("../events/app.events"); const Util_1 = require("../util/Util"); const util_type_1 = require("../types/util.type"); const module_events_1 = require("../events/module.events"); const globalProviders = {}; const createModule = (name, params = {}) => { var _a, _b, _c, _d; const _dependencies = new Map(); const registers = new Map(); const providers = new Map(); const exports = []; (_a = params.imports) === null || _a === void 0 ? void 0 : _a.forEach((dependency) => { if ((0, module_type_1.isModule)(dependency)) { _dependencies.set(Util_1.Util.toCamelCase(dependency.name), dependency); } else { registers.set(dependency.key, dependency); } }); (_b = params.providers) === null || _b === void 0 ? void 0 : _b.forEach((provider) => { providers.set(Util_1.Util.toCamelCase(provider.name), provider); }); (_c = params.exports) === null || _c === void 0 ? void 0 : _c.forEach((exportKey) => { exports.push(Util_1.Util.toCamelCase(exportKey.name)); }); const installAllRegisters = () => { registers.forEach((register) => { if (register.install) register.install(); }); }; const checkEvents = (module, providers) => __awaiter(void 0, void 0, void 0, function* () { if ((0, module_events_1.isOnModuleInstalled)(module)) { yield module.onModuleInstalled(providers); } if ((0, module_events_1.isOnAppStarted)(module)) { app_events_1.appStartedEvent.addListener(module.onAppStarted); } if ((0, module_events_1.isOnAppFinished)(module)) { app_events_1.appFinishedEvent.addListener(module.onAppFinished); } }); return { name: name, dependencies: _dependencies, providers: {}, exports: new Map(), installed: false, global: (_d = params.global) !== null && _d !== void 0 ? _d : false, install(app, modules) { return __awaiter(this, void 0, void 0, function* () { installAllRegisters(); if (!this.installed) { this.installed = true; const _providers = Object.assign({}, globalProviders); for (const dependency of this.dependencies.values()) { if (!dependency.installed) yield dependency.install(app, modules); for (const [key, value] of dependency.exports.entries()) { _providers[Util_1.Util.toCamelCase(key)] = value; } } for (const key of registers.keys()) { const injected = app.store.inject(key, true); if (injected) { _providers[Util_1.Util.toCamelCase(key)] = injected; } } for (const [key, creator] of providers.entries()) { let _key = key; let _value; if (typeof creator === "object") { _value = creator.value; _key = creator.name; } else if ((0, util_type_1.isConstructor)(creator)) { _value = new creator(_providers); } else { _value = creator(_providers); } yield checkEvents(_value, _providers); _key = Util_1.Util.toCamelCase(_key); _providers[_key] = _value; if (exports.includes(_key)) { this.exports.set(_key, _value); if (this.global) { globalProviders[_key] = _value; } } } name = Util_1.Util.toCamelCase(name); if (!modules.has(name)) { modules.set(name, this); } this.providers = _providers; } for (const dependency of this.dependencies.values()) { yield dependency.install(app, modules); } }); }, }; }; exports.createModule = createModule;