trm-core 6.4.1 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.txt +6 -0
- package/dist/actions/checkPackageDependencies/analyze.js +7 -7
- package/dist/actions/checkPackageDependencies/index.js +3 -3
- package/dist/actions/checkPackageDependencies/init.js +2 -2
- package/dist/actions/checkSapEntries/analyze.js +8 -8
- package/dist/actions/checkSapEntries/index.js +3 -3
- package/dist/actions/checkSapEntries/init.js +2 -2
- package/dist/actions/commons/setSystemPackages.js +3 -3
- package/dist/actions/findDependencies/index.js +3 -3
- package/dist/actions/findDependencies/init.js +4 -4
- package/dist/actions/findDependencies/parseSenvi.js +10 -10
- package/dist/actions/findDependencies/print.js +4 -4
- package/dist/actions/findDependencies/readRepositoryEnvironment.js +6 -6
- package/dist/actions/findDependencies/setObjects.js +6 -7
- package/dist/actions/findDependencies/setTrmDependencies.js +16 -16
- package/dist/actions/install/addNamespace.js +10 -11
- package/dist/actions/install/checkAlreadyInstalled.js +6 -6
- package/dist/actions/install/checkDependencies.js +9 -9
- package/dist/actions/install/checkIntegrity.js +6 -6
- package/dist/actions/install/checkObjectTypes.js +6 -6
- package/dist/actions/install/checkSapEntries.js +8 -8
- package/dist/actions/install/checkTransports.js +32 -32
- package/dist/actions/install/executePostActivities.js +15 -8
- package/dist/actions/install/generateDevclass.js +17 -11
- package/dist/actions/install/generateInstallTransport.js +26 -24
- package/dist/actions/install/importCustTransport.js +10 -10
- package/dist/actions/install/importDevcTransport.js +11 -11
- package/dist/actions/install/importLangTransport.js +10 -10
- package/dist/actions/install/importTadirTransport.js +22 -17
- package/dist/actions/install/index.js +5 -3
- package/dist/actions/install/init.js +11 -11
- package/dist/actions/install/installDependencies.js +16 -17
- package/dist/actions/install/migrate.js +5 -5
- package/dist/actions/install/readDevc.js +5 -5
- package/dist/actions/install/readTadir.js +9 -9
- package/dist/actions/install/refreshTmsTxt.js +11 -6
- package/dist/actions/install/setInstallDevclass.js +5 -6
- package/dist/actions/install/setPackageIntegrity.js +3 -3
- package/dist/actions/install/setR3trans.js +7 -7
- package/dist/actions/install/setTrmServerUpgradeService.d.ts +3 -0
- package/dist/actions/install/setTrmServerUpgradeService.js +32 -0
- package/dist/actions/installDependency/findInstallRelease.js +2 -2
- package/dist/actions/installDependency/index.js +3 -3
- package/dist/actions/installDependency/init.js +6 -7
- package/dist/actions/installDependency/installRelease.js +4 -4
- package/dist/actions/publish/finalizePublish.js +7 -7
- package/dist/actions/publish/findDependencies.js +21 -22
- package/dist/actions/publish/generateCustTransport.js +10 -10
- package/dist/actions/publish/generateDevcTransport.js +8 -8
- package/dist/actions/publish/generateLangTransport.js +12 -12
- package/dist/actions/publish/generateTadirTransport.js +9 -9
- package/dist/actions/publish/getSourceCode.js +5 -5
- package/dist/actions/publish/index.js +3 -3
- package/dist/actions/publish/init.js +16 -16
- package/dist/actions/publish/publishToRegistry.js +4 -4
- package/dist/actions/publish/releaseTransports.js +8 -9
- package/dist/actions/publish/setCustomizingTransports.js +10 -11
- package/dist/actions/publish/setDevclass.js +10 -10
- package/dist/actions/publish/setManifestValues.js +11 -11
- package/dist/actions/publish/setReadme.js +5 -6
- package/dist/actions/publish/setTransportTarget.js +7 -7
- package/dist/client/ClientError.d.ts +7 -0
- package/dist/client/ClientError.js +13 -0
- package/dist/client/RESTClient.js +13 -14
- package/dist/client/RESTClientError.d.ts +10 -0
- package/dist/client/RESTClientError.js +15 -0
- package/dist/client/RFCClient.js +32 -28
- package/dist/client/RFCClientError.d.ts +8 -0
- package/dist/client/RFCClientError.js +15 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +3 -0
- package/dist/commons/TrmServerUpgradeService.d.ts +15 -0
- package/dist/commons/TrmServerUpgradeService.js +81 -0
- package/dist/commons/getAxiosInstance.js +8 -8
- package/dist/commons/getNodePackage.js +47 -6
- package/dist/commons/getNpmGlobalPath.js +3 -3
- package/dist/commons/index.d.ts +1 -0
- package/dist/commons/index.js +1 -0
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -2
- package/dist/manifest/Manifest.js +3 -3
- package/dist/manifest/PostActivity.js +5 -5
- package/dist/registry/Registry.js +12 -13
- package/dist/systemConnector/RESTSystemConnector.js +6 -6
- package/dist/systemConnector/RFCSystemConnector.js +4 -4
- package/dist/systemConnector/SystemConnectorBase.js +29 -29
- package/dist/transport/Transport.js +48 -50
- package/dist/trmPackage/TrmArtifact.js +11 -11
- package/dist/trmPackage/TrmPackage.js +2 -2
- package/dist/{inquirer/validators → validators}/validateDevclass.d.ts +1 -1
- package/dist/{inquirer/validators → validators}/validateDevclass.js +1 -1
- package/dist/{inquirer/validators → validators}/validatePackageVisibility.d.ts +1 -1
- package/dist/{inquirer/validators → validators}/validatePackageVisibility.js +2 -2
- package/dist/{inquirer/validators → validators}/validateTransportTarget.d.ts +1 -1
- package/package.json +2 -4
- package/dist/inquirer/CliInquirer.d.ts +0 -10
- package/dist/inquirer/CliInquirer.js +0 -103
- package/dist/inquirer/IInquirer.d.ts +0 -7
- package/dist/inquirer/IInquirer.js +0 -2
- package/dist/inquirer/Inquirer.d.ts +0 -9
- package/dist/inquirer/Inquirer.js +0 -31
- package/dist/inquirer/Question.d.ts +0 -12
- package/dist/inquirer/Question.js +0 -2
- package/dist/inquirer/index.d.ts +0 -5
- package/dist/inquirer/index.js +0 -21
- package/dist/logger/CliLogFileLogger.d.ts +0 -25
- package/dist/logger/CliLogFileLogger.js +0 -92
- package/dist/logger/CliLogger.d.ts +0 -25
- package/dist/logger/CliLogger.js +0 -227
- package/dist/logger/ConsoleLogger.d.ts +0 -21
- package/dist/logger/ConsoleLogger.js +0 -104
- package/dist/logger/DummyLogger.d.ts +0 -20
- package/dist/logger/DummyLogger.js +0 -22
- package/dist/logger/ILogger.d.ts +0 -18
- package/dist/logger/ILogger.js +0 -2
- package/dist/logger/JSONLog.d.ts +0 -4
- package/dist/logger/JSONLog.js +0 -2
- package/dist/logger/Logger.d.ts +0 -21
- package/dist/logger/Logger.js +0 -86
- package/dist/logger/TreeLog.d.ts +0 -4
- package/dist/logger/TreeLog.js +0 -2
- package/dist/logger/index.d.ts +0 -8
- package/dist/logger/index.js +0 -24
- /package/dist/{inquirer/validators → validators}/index.d.ts +0 -0
- /package/dist/{inquirer/validators → validators}/index.js +0 -0
- /package/dist/{inquirer/validators → validators}/validateTransportTarget.js +0 -0
|
@@ -10,16 +10,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.readTadir = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const commons_1 = require("../../commons");
|
|
15
15
|
const systemConnector_1 = require("../../systemConnector");
|
|
16
16
|
exports.readTadir = {
|
|
17
17
|
name: 'read-tadir',
|
|
18
18
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
trm_commons_1.Logger.log('Read tadir step', true);
|
|
20
|
+
trm_commons_1.Logger.loading(`Checking package transports...`);
|
|
21
21
|
context.runtime.packageTransportsData.tadir = (0, commons_1.normalize)(yield context.runtime.r3trans.getTableEntries(context.runtime.packageTransports.tadir.binaries.binaries.data, 'TADIR'));
|
|
22
|
-
|
|
22
|
+
trm_commons_1.Logger.log(`TADIR TADIR: ${JSON.stringify(context.runtime.packageTransportsData.tadir)}`, true);
|
|
23
23
|
var existingObjects = [];
|
|
24
24
|
if (!systemConnector_1.SystemConnector.getSupportedBulk().getTransportObjects) {
|
|
25
25
|
existingObjects = yield systemConnector_1.SystemConnector.getExistingObjects(context.runtime.packageTransportsData.tadir);
|
|
@@ -27,7 +27,7 @@ exports.readTadir = {
|
|
|
27
27
|
else {
|
|
28
28
|
existingObjects = yield systemConnector_1.SystemConnector.getExistingObjectsBulk(context.runtime.packageTransportsData.tadir);
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
trm_commons_1.Logger.log(`TADIR object that already exist in system: ${JSON.stringify(existingObjects)}`, true);
|
|
31
31
|
var throwExistingObjectsError = false;
|
|
32
32
|
if (existingObjects.length > 0) {
|
|
33
33
|
const sObjs = existingObjects.map(o => `${o.pgmid} ${o.object} ${o.objName}`).join('\n');
|
|
@@ -38,14 +38,14 @@ exports.readTadir = {
|
|
|
38
38
|
const subpackages = (yield systemConnector_1.SystemConnector.getSubpackages(rootDevclass)).map(o => o.devclass);
|
|
39
39
|
existingObjects.find(o => {
|
|
40
40
|
if (subpackages.includes(o.devclass) || rootDevclass === o.devclass) {
|
|
41
|
-
|
|
41
|
+
trm_commons_1.Logger.log(`${o.pgmid} ${o.object} ${o.objName} already in system but devclass ${o.devclass} is part of the same trm package in update`, true);
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
44
44
|
if (context.rawInput.installData.checks.noExistingObjects) {
|
|
45
|
-
|
|
45
|
+
trm_commons_1.Logger.warning(`${o.pgmid} ${o.object} ${o.objName} already exist on target system ${systemConnector_1.SystemConnector.getDest()}`);
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
|
-
|
|
48
|
+
trm_commons_1.Logger.error(`${o.pgmid} ${o.object} ${o.objName} already exist on target system ${systemConnector_1.SystemConnector.getDest()}`);
|
|
49
49
|
}
|
|
50
50
|
throwExistingObjectsError = true;
|
|
51
51
|
}
|
|
@@ -62,7 +62,7 @@ exports.readTadir = {
|
|
|
62
62
|
}
|
|
63
63
|
else {
|
|
64
64
|
if (context.rawInput.installData.checks.noExistingObjects) {
|
|
65
|
-
|
|
65
|
+
trm_commons_1.Logger.warning(`${existingObjects.length} object(s) already exist on target system ${systemConnector_1.SystemConnector.getDest()}:\n${sObjs}`);
|
|
66
66
|
}
|
|
67
67
|
else {
|
|
68
68
|
throw new Error(`${existingObjects.length} object(s) already exist on target system ${systemConnector_1.SystemConnector.getDest()}, install in update mode`);
|
|
@@ -10,23 +10,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.refreshTmsTxt = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
|
+
const commons_1 = require("../../commons");
|
|
14
15
|
exports.refreshTmsTxt = {
|
|
15
16
|
name: 'refresh-tms-txt',
|
|
16
17
|
filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
18
|
if (context.runtime.generatedData.tmsTxtRefresh.length > 0) {
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
if (commons_1.TrmServerUpgrade.getInstance().refreshTmsTxt()) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
trm_commons_1.Logger.log(`Skipping TMS refresh (not supported by trm-server)`, true);
|
|
24
|
+
}
|
|
20
25
|
}
|
|
21
26
|
else {
|
|
22
|
-
|
|
27
|
+
trm_commons_1.Logger.log(`Skipping TMS refresh (no transports migrated)`, true);
|
|
23
28
|
return false;
|
|
24
29
|
}
|
|
25
30
|
}),
|
|
26
31
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
-
|
|
32
|
+
trm_commons_1.Logger.log('Refresh TMS txt step', true);
|
|
28
33
|
for (const transport of context.runtime.generatedData.tmsTxtRefresh) {
|
|
29
|
-
|
|
34
|
+
trm_commons_1.Logger.loading(`Updating TMS buffer ${transport.trkorr}...`);
|
|
30
35
|
yield transport.refreshTmsTxt();
|
|
31
36
|
}
|
|
32
37
|
})
|
|
@@ -10,10 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.setInstallDevclass = void 0;
|
|
13
|
-
const logger_1 = require("../../logger");
|
|
14
13
|
const commons_1 = require("../../commons");
|
|
15
14
|
const systemConnector_1 = require("../../systemConnector");
|
|
16
|
-
const
|
|
15
|
+
const trm_commons_1 = require("trm-commons");
|
|
17
16
|
const registry_1 = require("../../registry");
|
|
18
17
|
function _validateDevclass(input, packagesNamespace) {
|
|
19
18
|
const sInput = input.trim().toUpperCase();
|
|
@@ -36,7 +35,7 @@ exports.setInstallDevclass = {
|
|
|
36
35
|
name: 'set-install-devclass',
|
|
37
36
|
filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
37
|
if (context.rawInput.installData.installDevclass.keepOriginal) {
|
|
39
|
-
|
|
38
|
+
trm_commons_1.Logger.log(`Skipping set devclass replacements (user input)`, true);
|
|
40
39
|
return false;
|
|
41
40
|
}
|
|
42
41
|
else {
|
|
@@ -45,7 +44,7 @@ exports.setInstallDevclass = {
|
|
|
45
44
|
}),
|
|
46
45
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
46
|
var _a;
|
|
48
|
-
|
|
47
|
+
trm_commons_1.Logger.log('Set install devclass step', true);
|
|
49
48
|
if (context.rawInput.installData.installDevclass.keepOriginal) {
|
|
50
49
|
context.rawInput.installData.installDevclass.replacements = context.runtime.packageTransportsData.tdevc.map(o => {
|
|
51
50
|
return {
|
|
@@ -100,7 +99,7 @@ exports.setInstallDevclass = {
|
|
|
100
99
|
}
|
|
101
100
|
});
|
|
102
101
|
if (inq1Prompts.length > 0) {
|
|
103
|
-
const inq1 = yield
|
|
102
|
+
const inq1 = yield trm_commons_1.Inquirer.prompt(inq1Prompts);
|
|
104
103
|
Object.keys(inq1).forEach(k => {
|
|
105
104
|
context.rawInput.installData.installDevclass.replacements = context.rawInput.installData.installDevclass.replacements.filter(o => o.originalDevclass !== k);
|
|
106
105
|
context.rawInput.installData.installDevclass.replacements.push({
|
|
@@ -109,7 +108,7 @@ exports.setInstallDevclass = {
|
|
|
109
108
|
});
|
|
110
109
|
});
|
|
111
110
|
}
|
|
112
|
-
|
|
111
|
+
trm_commons_1.Logger.loading(`Updating install data...`);
|
|
113
112
|
var installDevc = [];
|
|
114
113
|
var packageRegistry;
|
|
115
114
|
if (context.rawInput.packageData.registry.getRegistryType() === registry_1.RegistryType.PUBLIC) {
|
|
@@ -10,14 +10,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.setPackageIntegrity = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const systemConnector_1 = require("../../systemConnector");
|
|
15
15
|
const registry_1 = require("../../registry");
|
|
16
16
|
exports.setPackageIntegrity = {
|
|
17
17
|
name: 'set-package-integrity',
|
|
18
18
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
trm_commons_1.Logger.log('Set package integrity step', true);
|
|
20
|
+
trm_commons_1.Logger.loading(`Finalizing install...`);
|
|
21
21
|
const packageRegistry = context.runtime.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? registry_1.PUBLIC_RESERVED_KEYWORD : context.runtime.registry.endpoint;
|
|
22
22
|
yield systemConnector_1.SystemConnector.setPackageIntegrity({
|
|
23
23
|
package_name: context.rawInput.packageData.name,
|
|
@@ -10,20 +10,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.setR3trans = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const node_r3trans_1 = require("node-r3trans");
|
|
15
15
|
exports.setR3trans = {
|
|
16
16
|
name: 'set-r3trans',
|
|
17
17
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
trm_commons_1.Logger.log('Set R3trans step', true);
|
|
19
|
+
trm_commons_1.Logger.loading(`Loading R3Trans...`);
|
|
20
20
|
const options = context.rawInput.contextData.r3transOptions;
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
trm_commons_1.Logger.log(`Loading R3Trans with options ${JSON.stringify(options)}`, true);
|
|
22
|
+
trm_commons_1.Logger.log(`R3TRANS_HOME ${process.env.R3TRANS_HOME}`, true);
|
|
23
23
|
context.runtime.r3trans = new node_r3trans_1.R3trans(options);
|
|
24
24
|
const r3transVersion = yield context.runtime.r3trans.getVersion();
|
|
25
25
|
const unicode = yield context.runtime.r3trans.isUnicode();
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
trm_commons_1.Logger.info(r3transVersion, context.rawInput.contextData.noR3transInfo);
|
|
27
|
+
trm_commons_1.Logger.log(`R3Trans unicode?: ${unicode}`, true);
|
|
28
28
|
})
|
|
29
29
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.setTrmServerUpgradeService = void 0;
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
|
+
const systemConnector_1 = require("../../systemConnector");
|
|
15
|
+
const registry_1 = require("../../registry");
|
|
16
|
+
const commons_1 = require("../../commons");
|
|
17
|
+
exports.setTrmServerUpgradeService = {
|
|
18
|
+
name: 'set-trm-server-upgrade-service',
|
|
19
|
+
filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
+
if (context.rawInput.packageData.name === systemConnector_1.TRM_SERVER_PACKAGE_NAME && context.rawInput.packageData.registry.getRegistryType() === registry_1.RegistryType.PUBLIC) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
trm_commons_1.Logger.log(`Skipping TRM Server upgrade service (not upgrading trm-server)`, true);
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}),
|
|
28
|
+
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
+
trm_commons_1.Logger.log('Set TRM Server upgrade service step', true);
|
|
30
|
+
commons_1.TrmServerUpgrade.createInstance(context.rawInput.contextData.systemPackages.find(o => o.compareName(systemConnector_1.TRM_SERVER_PACKAGE_NAME)).manifest.get().version, context.runtime.remotePackageData.trmManifest.version);
|
|
31
|
+
})
|
|
32
|
+
};
|
|
@@ -10,14 +10,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.findInstallRelease = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const semver_sort_1 = require("semver-sort");
|
|
15
15
|
const trmPackage_1 = require("../../trmPackage");
|
|
16
16
|
const crypto_1 = require("crypto");
|
|
17
17
|
exports.findInstallRelease = {
|
|
18
18
|
name: 'find-install-release',
|
|
19
19
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
-
|
|
20
|
+
trm_commons_1.Logger.log('Find install release step', true);
|
|
21
21
|
const releases = yield context.rawInput.dependencyDataPackage.registry.getReleases(context.rawInput.dependencyDataPackage.name, context.rawInput.dependencyDataPackage.versionRange);
|
|
22
22
|
if (releases.length === 0) {
|
|
23
23
|
throw new Error(`Dependency "${context.rawInput.dependencyDataPackage.name}": releases not found in range ${context.rawInput.dependencyDataPackage.versionRange}.`);
|
|
@@ -15,7 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.installDependency = installDependency;
|
|
16
16
|
const sammarksworkflow_1 = __importDefault(require("@simonegaffurini/sammarksworkflow"));
|
|
17
17
|
const util_1 = require("util");
|
|
18
|
-
const
|
|
18
|
+
const trm_commons_1 = require("trm-commons");
|
|
19
19
|
const __1 = require("..");
|
|
20
20
|
const init_1 = require("./init");
|
|
21
21
|
const findInstallRelease_1 = require("./findInstallRelease");
|
|
@@ -30,11 +30,11 @@ function installDependency(inputData) {
|
|
|
30
30
|
findInstallRelease_1.findInstallRelease,
|
|
31
31
|
installRelease_1.installRelease
|
|
32
32
|
];
|
|
33
|
-
|
|
33
|
+
trm_commons_1.Logger.log(`Ready to execute workflow ${WORKFLOW_NAME}, input data: ${(0, util_1.inspect)(inputData, { breakLength: Infinity, compact: true })}`, true);
|
|
34
34
|
const result = yield (0, sammarksworkflow_1.default)(WORKFLOW_NAME, workflow, {
|
|
35
35
|
rawInput: inputData
|
|
36
36
|
});
|
|
37
|
-
|
|
37
|
+
trm_commons_1.Logger.log(`Workflow ${WORKFLOW_NAME} result: ${(0, util_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
|
|
38
38
|
const installOutput = result.runtime.installOutput;
|
|
39
39
|
return {
|
|
40
40
|
installOutput
|
|
@@ -10,15 +10,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.init = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const commons_1 = require("../../commons");
|
|
15
15
|
const semver_1 = require("semver");
|
|
16
|
-
const inquirer_1 = require("../../inquirer");
|
|
17
16
|
const registry_1 = require("../../registry");
|
|
18
17
|
exports.init = {
|
|
19
18
|
name: 'init',
|
|
20
19
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
-
|
|
20
|
+
trm_commons_1.Logger.log('Init step', true);
|
|
22
21
|
context.rawInput.dependencyDataPackage.name = (0, commons_1.parsePackageName)({
|
|
23
22
|
fullName: context.rawInput.dependencyDataPackage.name
|
|
24
23
|
}).fullName;
|
|
@@ -47,10 +46,10 @@ exports.init = {
|
|
|
47
46
|
context.rawInput.installData.installDevclass = {};
|
|
48
47
|
}
|
|
49
48
|
if (context.rawInput.contextData.noInquirer) {
|
|
50
|
-
|
|
49
|
+
trm_commons_1.Logger.info(`Dependency "${context.rawInput.dependencyDataPackage.name}" will be installed with default options.`);
|
|
51
50
|
}
|
|
52
51
|
else {
|
|
53
|
-
const inq = yield
|
|
52
|
+
const inq = yield trm_commons_1.Inquirer.prompt([{
|
|
54
53
|
name: 'noLang',
|
|
55
54
|
message: `Dependency "${context.rawInput.dependencyDataPackage.name}": Import language transport (if exists)?`,
|
|
56
55
|
type: 'confirm',
|
|
@@ -72,9 +71,9 @@ exports.init = {
|
|
|
72
71
|
}
|
|
73
72
|
}),
|
|
74
73
|
revert: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
75
|
-
|
|
74
|
+
trm_commons_1.Logger.log('Rollback init step', true);
|
|
76
75
|
if (context.runtime && context.runtime.rollback) {
|
|
77
|
-
|
|
76
|
+
trm_commons_1.Logger.success(`Rollback executed.`);
|
|
78
77
|
}
|
|
79
78
|
})
|
|
80
79
|
};
|
|
@@ -10,13 +10,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.installRelease = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const __1 = require("..");
|
|
15
15
|
const SUBWORKFLOW_NAME = 'install-sub-install-dependency';
|
|
16
16
|
exports.installRelease = {
|
|
17
17
|
name: 'install-release',
|
|
18
18
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
-
|
|
19
|
+
trm_commons_1.Logger.log('Install release step', true);
|
|
20
20
|
if (!context.runtime.installVersion) {
|
|
21
21
|
throw new Error(`Couldn't find dependency "${context.rawInput.dependencyDataPackage.name}" on registry. Try manual install.`);
|
|
22
22
|
}
|
|
@@ -31,9 +31,9 @@ exports.installRelease = {
|
|
|
31
31
|
contextData: context.rawInput.contextData,
|
|
32
32
|
installData: context.rawInput.installData
|
|
33
33
|
};
|
|
34
|
-
|
|
34
|
+
trm_commons_1.Logger.log(`Ready to execute sub-workflow ${SUBWORKFLOW_NAME}, input data: ${(0, trm_commons_1.inspect)(inputData, { breakLength: Infinity, compact: true })}`, true);
|
|
35
35
|
const result = yield (0, __1.install)(inputData);
|
|
36
|
-
|
|
36
|
+
trm_commons_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, trm_commons_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
|
|
37
37
|
context.runtime.installOutput = result;
|
|
38
38
|
})
|
|
39
39
|
};
|
|
@@ -10,20 +10,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.finalizePublish = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const systemConnector_1 = require("../../systemConnector");
|
|
15
15
|
const crypto_1 = require("crypto");
|
|
16
16
|
const registry_1 = require("../../registry");
|
|
17
17
|
exports.finalizePublish = {
|
|
18
18
|
name: 'finalize-publish',
|
|
19
19
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
-
|
|
20
|
+
trm_commons_1.Logger.log('Finalize publish step', true);
|
|
21
21
|
try {
|
|
22
|
-
|
|
22
|
+
trm_commons_1.Logger.loading(`Finalizing...`);
|
|
23
23
|
yield systemConnector_1.SystemConnector.addSrcTrkorr(context.runtime.systemData.tadirTransport.trkorr);
|
|
24
|
-
|
|
24
|
+
trm_commons_1.Logger.log(`Generating SHA512`, true);
|
|
25
25
|
const integrity = (0, crypto_1.createHash)("sha512").update(context.runtime.trmPackage.artifact.binary).digest("hex");
|
|
26
|
-
|
|
26
|
+
trm_commons_1.Logger.log(`SHA512: ${integrity}`, true);
|
|
27
27
|
yield systemConnector_1.SystemConnector.setPackageIntegrity({
|
|
28
28
|
package_name: context.rawInput.packageData.name,
|
|
29
29
|
package_registry: context.rawInput.packageData.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? registry_1.PUBLIC_RESERVED_KEYWORD : context.rawInput.packageData.registry.endpoint,
|
|
@@ -31,8 +31,8 @@ exports.finalizePublish = {
|
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
catch (e) {
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
trm_commons_1.Logger.error(`An error occurred during publish finalize. The package has been published, however TRM on ${systemConnector_1.SystemConnector.getDest()} migh be inconsistent.`);
|
|
35
|
+
trm_commons_1.Logger.error(e.toString(), true);
|
|
36
36
|
}
|
|
37
37
|
})
|
|
38
38
|
};
|
|
@@ -10,10 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.findDependencies = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const __1 = require("..");
|
|
15
15
|
const registry_1 = require("../../registry");
|
|
16
|
-
const inquirer_1 = require("../../inquirer");
|
|
17
16
|
const SUBWORKFLOW_NAME = 'find-dependencies-sub-publish';
|
|
18
17
|
const _isObjectEqual = (obj1, obj2) => {
|
|
19
18
|
const keys1 = Object.keys(obj1);
|
|
@@ -26,8 +25,8 @@ exports.findDependencies = {
|
|
|
26
25
|
name: 'find-dependencies',
|
|
27
26
|
filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
27
|
if (context.rawInput.publishData.noDependenciesDetection) {
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
trm_commons_1.Logger.log(`Skipping automatic dependencies detection (user input)`, true);
|
|
29
|
+
trm_commons_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.`);
|
|
31
30
|
return false;
|
|
32
31
|
}
|
|
33
32
|
else {
|
|
@@ -35,8 +34,8 @@ exports.findDependencies = {
|
|
|
35
34
|
}
|
|
36
35
|
}),
|
|
37
36
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
trm_commons_1.Logger.log('Find dependencies step', true);
|
|
38
|
+
trm_commons_1.Logger.loading(`Searching for dependencies in package "${context.rawInput.packageData.devclass}"...`);
|
|
40
39
|
const inputData = {
|
|
41
40
|
packageData: {
|
|
42
41
|
package: context.rawInput.packageData.devclass,
|
|
@@ -50,23 +49,23 @@ exports.findDependencies = {
|
|
|
50
49
|
trmDependencies: false
|
|
51
50
|
}
|
|
52
51
|
};
|
|
53
|
-
|
|
52
|
+
trm_commons_1.Logger.log(`Ready to execute sub-workflow ${SUBWORKFLOW_NAME}, input data: ${(0, trm_commons_1.inspect)(inputData, { breakLength: Infinity, compact: true })}`, true);
|
|
54
53
|
const result = yield (0, __1.findDependencies)(inputData);
|
|
55
|
-
|
|
54
|
+
trm_commons_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, trm_commons_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
|
|
56
55
|
const aUnknownDependencyDevclass = (result.trmPackageDependencies.withoutTrmPackage).map(o => o.devclass);
|
|
57
56
|
if (aUnknownDependencyDevclass.length > 0) {
|
|
58
|
-
|
|
57
|
+
trm_commons_1.Logger.error(`Package "${context.rawInput.packageData.devclass}" has ${aUnknownDependencyDevclass.length} missing ${aUnknownDependencyDevclass.length === 1 ? 'dependency' : 'dependencies'}:`);
|
|
59
58
|
aUnknownDependencyDevclass.forEach((d, i) => {
|
|
60
|
-
|
|
59
|
+
trm_commons_1.Logger.error(` (${i + 1}/${aUnknownDependencyDevclass.length}) ${d}`);
|
|
61
60
|
});
|
|
62
61
|
throw new Error(`Resolve missing dependencies by publishing them as TRM packages.`);
|
|
63
62
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
trm_commons_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'}.`);
|
|
64
|
+
trm_commons_1.Logger.log(`Adding TRM package dependencies to manifest`, true);
|
|
65
|
+
trm_commons_1.Logger.loading(`Updating manifest...`);
|
|
67
66
|
result.trmPackageDependencies.withTrmPackage.forEach((o, i) => {
|
|
68
67
|
if (o.package.registry.getRegistryType() === registry_1.RegistryType.LOCAL) {
|
|
69
|
-
|
|
68
|
+
trm_commons_1.Logger.error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) Cannot have dependency with ABAP package "${o.devclass}": TRM package was installed manually`);
|
|
70
69
|
}
|
|
71
70
|
else {
|
|
72
71
|
if (o.package.manifest) {
|
|
@@ -76,7 +75,7 @@ exports.findDependencies = {
|
|
|
76
75
|
if (!o.integrity) {
|
|
77
76
|
throw new Error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name}: Integrity not found!`);
|
|
78
77
|
}
|
|
79
|
-
|
|
78
|
+
trm_commons_1.Logger.info(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name} ${dependencyVersionRange}`);
|
|
80
79
|
context.runtime.trmPackage.manifest.dependencies.push({
|
|
81
80
|
name: dependencyManifest.name,
|
|
82
81
|
version: dependencyVersionRange,
|
|
@@ -85,12 +84,12 @@ exports.findDependencies = {
|
|
|
85
84
|
});
|
|
86
85
|
}
|
|
87
86
|
else {
|
|
88
|
-
|
|
87
|
+
trm_commons_1.Logger.error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) Cannot find manifest of dependency in ABAP package "${o.devclass}"`);
|
|
89
88
|
}
|
|
90
89
|
}
|
|
91
90
|
});
|
|
92
91
|
if (!context.rawInput.contextData.noInquirer) {
|
|
93
|
-
const inq = yield
|
|
92
|
+
const inq = yield trm_commons_1.Inquirer.prompt([{
|
|
94
93
|
message: `Do you want to manually edit dependencies?`,
|
|
95
94
|
type: 'confirm',
|
|
96
95
|
name: 'editDependencies',
|
|
@@ -120,12 +119,12 @@ exports.findDependencies = {
|
|
|
120
119
|
}
|
|
121
120
|
}]);
|
|
122
121
|
if (inq.dependencies) {
|
|
123
|
-
|
|
122
|
+
trm_commons_1.Logger.log(`Dependencies were manually changed: before -> ${JSON.stringify(context.runtime.trmPackage.manifest.dependencies)}, after -> ${JSON.parse(inq.dependencies)}`, true);
|
|
124
123
|
context.runtime.trmPackage.manifest.dependencies = JSON.parse(inq.dependencies);
|
|
125
124
|
}
|
|
126
125
|
}
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
trm_commons_1.Logger.log(`Adding SAP objects dependencies to manifest`, true);
|
|
127
|
+
trm_commons_1.Logger.loading(`Updating manifest...`);
|
|
129
128
|
result.objectDependencies.sapObjects.forEach(o => {
|
|
130
129
|
if (!context.runtime.trmPackage.manifest.sapEntries[o.table]) {
|
|
131
130
|
context.runtime.trmPackage.manifest.sapEntries[o.table] = [];
|
|
@@ -141,7 +140,7 @@ exports.findDependencies = {
|
|
|
141
140
|
});
|
|
142
141
|
});
|
|
143
142
|
if (!context.rawInput.contextData.noInquirer) {
|
|
144
|
-
const inq = yield
|
|
143
|
+
const inq = yield trm_commons_1.Inquirer.prompt([{
|
|
145
144
|
message: `Do you want to manually required SAP objects?`,
|
|
146
145
|
type: 'confirm',
|
|
147
146
|
name: 'editSapEntries',
|
|
@@ -171,7 +170,7 @@ exports.findDependencies = {
|
|
|
171
170
|
}
|
|
172
171
|
}]);
|
|
173
172
|
if (inq.sapEntries) {
|
|
174
|
-
|
|
173
|
+
trm_commons_1.Logger.log(`SAP entries were manually changed: before -> ${JSON.stringify(context.runtime.trmPackage.manifest.sapEntries)}, after -> ${JSON.parse(inq.sapEntries)}`, true);
|
|
175
174
|
context.runtime.trmPackage.manifest.sapEntries = JSON.parse(inq.sapEntries);
|
|
176
175
|
}
|
|
177
176
|
}
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.generateCustTransport = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const transport_1 = require("../../transport");
|
|
15
15
|
exports.generateCustTransport = {
|
|
16
16
|
name: 'generate-cust-transport',
|
|
@@ -19,14 +19,14 @@ exports.generateCustTransport = {
|
|
|
19
19
|
return true;
|
|
20
20
|
}
|
|
21
21
|
else {
|
|
22
|
-
|
|
22
|
+
trm_commons_1.Logger.log(`Skipping CUST transport generation (no customizing transports)`, true);
|
|
23
23
|
return false;
|
|
24
24
|
}
|
|
25
25
|
}),
|
|
26
26
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
trm_commons_1.Logger.log('Generate CUST transport step', true);
|
|
28
|
+
trm_commons_1.Logger.loading(`Generating transports...`);
|
|
29
|
+
trm_commons_1.Logger.loading(`Generating CUST transport...`, true);
|
|
30
30
|
context.runtime.systemData.custTransport = yield transport_1.Transport.createToc({
|
|
31
31
|
trmIdentifier: transport_1.TrmTransportIdentifier.CUST,
|
|
32
32
|
target: context.rawInput.systemData.transportTarget,
|
|
@@ -39,26 +39,26 @@ exports.generateCustTransport = {
|
|
|
39
39
|
}
|
|
40
40
|
const e071 = yield context.runtime.systemData.custTransport.getE071();
|
|
41
41
|
if (e071.length === 0) {
|
|
42
|
-
|
|
42
|
+
trm_commons_1.Logger.info(`Customizing transport has no content, deleting.`, true);
|
|
43
43
|
yield context.runtime.systemData.custTransport.delete();
|
|
44
44
|
context.runtime.systemData.custTransport = undefined;
|
|
45
45
|
}
|
|
46
46
|
}),
|
|
47
47
|
revert: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
48
|
-
|
|
48
|
+
trm_commons_1.Logger.log('Rollback generate CUST transport step', true);
|
|
49
49
|
if (context.runtime.systemData.custTransport) {
|
|
50
50
|
try {
|
|
51
51
|
if (yield context.runtime.systemData.custTransport.canBeDeleted()) {
|
|
52
52
|
yield context.runtime.systemData.custTransport.delete();
|
|
53
|
-
|
|
53
|
+
trm_commons_1.Logger.success(`Executed rollback on transport ${context.runtime.systemData.custTransport.trkorr}`, true);
|
|
54
54
|
}
|
|
55
55
|
else {
|
|
56
56
|
throw new Error(`Transport ${context.runtime.systemData.custTransport.trkorr} cannot be deleted (released?)`);
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
catch (e) {
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
trm_commons_1.Logger.error(`Unable to rollback transport ${context.runtime.systemData.custTransport.trkorr}!`);
|
|
61
|
+
trm_commons_1.Logger.error(e.toString(), true);
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
})
|
|
@@ -10,15 +10,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.generateDevcTransport = void 0;
|
|
13
|
-
const
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const transport_1 = require("../../transport");
|
|
15
15
|
exports.generateDevcTransport = {
|
|
16
16
|
name: 'generate-devc-transport',
|
|
17
17
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
-
|
|
18
|
+
trm_commons_1.Logger.log('Generate DEVC transport step', true);
|
|
19
19
|
context.runtime.rollback = true;
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
trm_commons_1.Logger.loading(`Generating transports...`);
|
|
21
|
+
trm_commons_1.Logger.loading(`Generating DEVC transport...`, true);
|
|
22
22
|
const aDevc = context.runtime.packageData.tadir.filter(o => o.pgmid === 'R3TR' && o.object === 'DEVC');
|
|
23
23
|
context.runtime.systemData.devcTransport = yield transport_1.Transport.createToc({
|
|
24
24
|
trmIdentifier: transport_1.TrmTransportIdentifier.DEVC,
|
|
@@ -30,20 +30,20 @@ exports.generateDevcTransport = {
|
|
|
30
30
|
yield context.runtime.systemData.devcTransport.addObjects(aDevc, false);
|
|
31
31
|
}),
|
|
32
32
|
revert: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
-
|
|
33
|
+
trm_commons_1.Logger.log('Rollback generate DEVC transport step', true);
|
|
34
34
|
if (context.runtime.systemData.devcTransport) {
|
|
35
35
|
try {
|
|
36
36
|
if (yield context.runtime.systemData.devcTransport.canBeDeleted()) {
|
|
37
37
|
yield context.runtime.systemData.devcTransport.delete();
|
|
38
|
-
|
|
38
|
+
trm_commons_1.Logger.success(`Executed rollback on transport ${context.runtime.systemData.devcTransport.trkorr}`, true);
|
|
39
39
|
}
|
|
40
40
|
else {
|
|
41
41
|
throw new Error(`Transport ${context.runtime.systemData.devcTransport.trkorr} cannot be deleted (released?)`);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
catch (e) {
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
trm_commons_1.Logger.error(`Unable to rollback transport ${context.runtime.systemData.devcTransport.trkorr}!`);
|
|
46
|
+
trm_commons_1.Logger.error(e.toString(), true);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
})
|