@sap/modules-exploration
Version:
SAP Modules Exploration
135 lines • 6.38 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.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