UNPKG

@istanbul/app

Version:

App package of istanbul framework

111 lines (110 loc) 4.42 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.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;