trm-core
Version:
TRM (Transport Request Manager) Core
175 lines (174 loc) • 9.72 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.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);
}
}
})
};