UNPKG

trm-core

Version:

TRM (Transport Request Manager) Core

175 lines (174 loc) 9.72 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.findDependencies = void 0; const logger_1 = require("../../logger"); const __1 = require(".."); const registry_1 = require("../../registry"); const inquirer_1 = require("../../inquirer"); const SUBWORKFLOW_NAME = 'find-dependencies-sub-publish'; const _isObjectEqual = (obj1, obj2) => { const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; return keys1.every(key => obj2.hasOwnProperty(key) && obj1[key] === obj2[key]); }; exports.findDependencies = { name: 'find-dependencies', filter: (context) => __awaiter(void 0, void 0, void 0, function* () { if (context.rawInput.publishData.noDependenciesDetection) { logger_1.Logger.log(`Skipping automatic dependencies detection (user input)`, true); logger_1.Logger.warning(`Skipping automatic dependency detection can cause your package to fail activation during install. Make sure to manually edit the dependencies later if necessary.`); return false; } else { return true; } }), run: (context) => __awaiter(void 0, void 0, void 0, function* () { logger_1.Logger.log('Find dependencies step', true); logger_1.Logger.loading(`Searching for dependencies in package "${context.rawInput.packageData.devclass}"...`); const inputData = { packageData: { package: context.rawInput.packageData.devclass, objects: context.runtime.packageData.tadir }, contextData: { noInquirer: context.rawInput.contextData.noInquirer }, printOptions: { sapObjectDependencies: false, trmDependencies: false } }; logger_1.Logger.log(`Ready to execute sub-workflow ${SUBWORKFLOW_NAME}, input data: ${(0, logger_1.inspect)(inputData, { breakLength: Infinity, compact: true })}`, true); const result = yield (0, __1.findDependencies)(inputData); logger_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, logger_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true); const aUnknownDependencyDevclass = (result.trmPackageDependencies.withoutTrmPackage).map(o => o.devclass); if (aUnknownDependencyDevclass.length > 0) { logger_1.Logger.error(`Package "${context.rawInput.packageData.devclass}" has ${aUnknownDependencyDevclass.length} missing ${aUnknownDependencyDevclass.length === 1 ? 'dependency' : 'dependencies'}:`); aUnknownDependencyDevclass.forEach((d, i) => { logger_1.Logger.error(` (${i + 1}/${aUnknownDependencyDevclass.length}) ${d}`); }); throw new Error(`Resolve missing dependencies by publishing them as TRM packages.`); } logger_1.Logger.info(`Package "${context.rawInput.packageData.devclass}" has ${result.trmPackageDependencies.withTrmPackage.length} TRM package ${result.trmPackageDependencies.withTrmPackage.length === 1 ? 'dependency' : 'dependencies'} and ${result.objectDependencies.sapObjects.reduce((sum, obj) => sum + obj.dependencies.length, 0)} required SAP ${result.objectDependencies.sapObjects.reduce((sum, obj) => sum + obj.dependencies.length, 0) === 1 ? 'object' : 'objects'}.`); logger_1.Logger.log(`Adding TRM package dependencies to manifest`, true); logger_1.Logger.loading(`Updating manifest...`); result.trmPackageDependencies.withTrmPackage.forEach((o, i) => { if (o.package.manifest) { const dependencyManifest = o.package.manifest.get(); const dependencyVersionRange = `^${dependencyManifest.version}`; const dependencyRegistry = o.package.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? undefined : o.package.registry.endpoint; if (!o.integrity) { throw new Error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name}: Integrity not found!`); } logger_1.Logger.info(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name} ${dependencyVersionRange}`); context.runtime.trmPackage.manifest.dependencies.push({ name: dependencyManifest.name, version: dependencyVersionRange, integrity: o.integrity, registry: dependencyRegistry }); } else { logger_1.Logger.error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) Cannot find manifest of dependency in ABAP package "${o.devclass}"`); } }); if (!context.rawInput.contextData.noInquirer) { const inq = yield inquirer_1.Inquirer.prompt([{ message: `Do you want to manually edit dependencies?`, type: 'confirm', name: 'editDependencies', default: false }, { message: 'Editor dependencies', type: 'editor', name: 'dependencies', postfix: '.json', when: (hash) => { return hash.editDependencies; }, default: JSON.stringify(context.runtime.trmPackage.manifest.dependencies, null, 2), validate: (input) => { try { const parsedInput = JSON.parse(input); if (Array.isArray(parsedInput)) { return true; } else { return 'Invalid array'; } } catch (e) { return 'Invalid JSON'; } } }]); if (inq.dependencies) { logger_1.Logger.log(`Dependencies were manually changed: before -> ${JSON.stringify(context.runtime.trmPackage.manifest.dependencies)}, after -> ${JSON.parse(inq.dependencies)}`, true); context.runtime.trmPackage.manifest.dependencies = JSON.parse(inq.dependencies); } } logger_1.Logger.log(`Adding SAP objects dependencies to manifest`, true); logger_1.Logger.loading(`Updating manifest...`); result.objectDependencies.sapObjects.forEach(o => { if (!context.runtime.trmPackage.manifest.sapEntries[o.table]) { context.runtime.trmPackage.manifest.sapEntries[o.table] = []; } o.dependencies.forEach(k => { var tableKeys = k.object; if (o.table === 'TADIR') { delete tableKeys['DEVCLASS']; } if (!context.runtime.trmPackage.manifest.sapEntries[o.table].some(o => _isObjectEqual(o, tableKeys))) { context.runtime.trmPackage.manifest.sapEntries[o.table].push(tableKeys); } }); }); if (!context.rawInput.contextData.noInquirer) { const inq = yield inquirer_1.Inquirer.prompt([{ message: `Do you want to manually required SAP objects?`, type: 'confirm', name: 'editSapEntries', default: false }, { message: 'Edit SAP entries', type: 'editor', name: 'sapEntries', postfix: '.json', when: (hash) => { return hash.editSapEntries; }, default: JSON.stringify(context.runtime.trmPackage.manifest.sapEntries, null, 2), validate: (input) => { try { const parsedInput = JSON.parse(input); if (typeof (parsedInput) === 'object' && !Array.isArray(parsedInput)) { return true; } else { return 'Invalid object'; } } catch (e) { return 'Invalid JSON'; } } }]); if (inq.sapEntries) { logger_1.Logger.log(`SAP entries were manually changed: before -> ${JSON.stringify(context.runtime.trmPackage.manifest.sapEntries)}, after -> ${JSON.parse(inq.sapEntries)}`, true); context.runtime.trmPackage.manifest.sapEntries = JSON.parse(inq.sapEntries); } } }) };