UNPKG

@sap/modules-exploration

Version:

SAP Modules Exploration

135 lines 6.38 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.ModulesExploration = void 0; const log4js_api_1 = require("@log4js-node/log4js-api"); const fsExtra = require("fs-extra"); const messages_1 = require("./i18n/messages"); const _ = require("lodash"); const path = require("path"); /** * Main module which exposes API to explore modules at runtime */ class ModulesExploration { constructor(opts, context, logger) { this.generator = _.get(context, "context.generator"); // Set defaults this.explorationOptions = { modulesPath: null, configPath: null, modulesFilter: null, }; _.assign(this.explorationOptions, opts); if (logger !== undefined) { ModulesExploration.baseLogger = logger.getChildLogger({ label: ModulesExploration.name, }); ModulesExploration.baseLogger.info("Logger instance was received and updated."); } } /** * Returns an array of explored modules metadata */ getExploredModules() { return __awaiter(this, void 0, void 0, function* () { // Filter module according to filters option return this._getFilteredModules(); }); } /** * Explores modules metadata and prompt them to the user using the given generator */ promptExploredModules(promptMsg) { return __awaiter(this, void 0, void 0, function* () { let selectedModule = ""; const message = promptMsg ? promptMsg : messages_1.messages.getSelectModuleMessage(); const modulesList = this._getFilteredModules(); const modulesNameList = _.map(modulesList, "name"); if (_.size(modulesNameList) > 0) { const moduleTypePrompt = yield this.generator.prompt([ { type: "list", name: "selectedModule", message, choices: modulesNameList, default: modulesNameList[0], }, ]); // Write selected module path to config file const moduleToRun = _.find(modulesList, (gen) => { return gen.name === moduleTypePrompt.selectedModule; }); if (moduleToRun) { selectedModule = path.join(this.explorationOptions.modulesPath, moduleToRun.type, moduleToRun.path); } } return selectedModule; }); } _getFilteredModules() { const modulesList = []; const modulesPath = this.explorationOptions.modulesPath; if (modulesPath && fsExtra.existsSync(modulesPath)) { fsExtra.readdirSync(modulesPath).forEach((moduleName) => { try { // For each module , read module.json file // eslint-disable-next-line @typescript-eslint/no-var-requires const modulesMetadata = require(path.join(modulesPath, moduleName, "modules.json")); _.forIn(modulesMetadata, (value, modulesMetadataType) => { _.forEach(modulesMetadata[modulesMetadataType], (moduleMD) => { // In case module filter passed as null in options, add all modules if (this.explorationOptions.modulesFilter === null || (moduleMD && this._passFilter(moduleMD))) { modulesList.push({ type: moduleName, name: moduleMD.name, path: moduleMD.path, entryPoint: moduleMD.entryPoint, }); } }); }); } catch (e) { const errorMsg = messages_1.messages.getNoModuleFoundMessage(modulesPath, e); console.log(errorMsg); ModulesExploration.baseLogger.debug(this._getFilteredModules.name, // tslint:disable-next-line { modulesPath: modulesPath, status: "failed", error: errorMsg }); } }); } return modulesList; } _passFilter(moduleMetadata) { /*Filtering of modules is implemented as a "white list" model according to the definition below. A module will pass the defined filter when for all provided keys in the filter: * The module defines the filter key and the value provided by the filter is found also in the module * The module defines the filter key with empty value (meaning the module knows about the key existence but it is not relevant for it) */ const moduleFeatures = _.get(moduleMetadata, "features", {}); let passes = true; _.forEach(this.explorationOptions.modulesFilter, (filter) => { _.forEach(moduleFeatures, (feature) => { if (feature.name === filter.name && _.size(_.intersection(filter.value, feature.value)) === 0) { passes = false; } }); }); // If all filter matches (true) then return true return passes; } } exports.ModulesExploration = ModulesExploration; ModulesExploration.baseLogger = log4js_api_1.getLogger(ModulesExploration.name); //# sourceMappingURL=ModulesExploration.js.map