@istanbul/app
Version:
App package of istanbul framework
111 lines (110 loc) • 4.42 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.createApp = void 0;
const inject_1 = require("@istanbul/inject");
const plugins_1 = require("../plugins");
const warning_1 = require("../warning/warning");
const app_events_1 = require("../events/app.events");
const types_1 = require("util/types");
const util_type_1 = require("../types/util.type");
const events_hooks_1 = require("./events.hooks");
const module_events_1 = require("../events/module.events");
const plugins = new Set();
const corePlugins = new Map();
const lastCorePlugins = new Map();
const modules = new Map();
const createApp = (rootModule) => {
app_events_1.appCreatedEvent.publish(true);
const installCorePlugins = (corePlugins, instance) => __awaiter(void 0, void 0, void 0, function* () {
const stack = [];
for (const plugin of corePlugins.values()) {
if (plugin.forceWait) {
yield plugin.install(instance, corePlugins, modules);
}
else {
const install = plugin.install(instance, corePlugins, modules);
if ((0, types_1.isPromise)(install))
stack.push(install);
}
}
yield Promise.all(stack);
});
return {
version: __VERSION__,
module: rootModule,
config: {
production: __PROD__,
},
store: (0, inject_1.createInjector)(),
use(plugin, ...options) {
if ((0, util_type_1.isConstructor)(plugin)) {
plugin = new plugin();
}
if (!plugin.multiple && plugins.has(plugin)) {
!this.config.production &&
(0, warning_1.warn)(`Plugin ${plugin.name} is already registered`);
}
else {
plugins.add(plugin);
plugin.install(this, ...options);
if ((0, module_events_1.isOnAppStarted)(plugin)) {
app_events_1.appStartedEvent.addListener(plugin.onAppStarted);
}
}
return this;
},
register(plugin, ...options) {
let instance;
if ((0, util_type_1.isPluginCreator)(plugin)) {
instance = plugin.build();
}
else {
instance = plugin;
}
if (corePlugins.has(instance.name)) {
!this.config.production &&
(0, warning_1.warn)(`Plugin ${instance.name} is already registered`);
}
else {
if (instance.loadLast) {
lastCorePlugins.set(instance.name, instance);
}
else {
corePlugins.set(instance.name, instance);
}
if ((0, plugins_1.isCloseable)(instance)) {
app_events_1.appFinishedEvent.addListener(instance.close);
}
}
return this;
},
start() {
return __awaiter(this, void 0, void 0, function* () {
yield installCorePlugins(corePlugins, this);
if (this.module)
yield this.module.install(this, modules);
yield installCorePlugins(lastCorePlugins, this);
app_events_1.appStartedEvent.publish(this);
});
},
close() {
app_events_1.appFinishedEvent.publish("");
},
enableShutdownEvents() {
(0, events_hooks_1.listenPlatformEvents)(corePlugins);
},
onStarted(hook) {
app_events_1.appStartedEvent.addListener(hook);
},
};
};
exports.createApp = createApp;