@istanbul/app
Version:
App package of istanbul framework
119 lines (118 loc) • 5.41 kB
JavaScript
;
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;