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.
Files changed (126) hide show
  1. package/changelog.txt +6 -0
  2. package/dist/actions/checkPackageDependencies/analyze.js +7 -7
  3. package/dist/actions/checkPackageDependencies/index.js +3 -3
  4. package/dist/actions/checkPackageDependencies/init.js +2 -2
  5. package/dist/actions/checkSapEntries/analyze.js +8 -8
  6. package/dist/actions/checkSapEntries/index.js +3 -3
  7. package/dist/actions/checkSapEntries/init.js +2 -2
  8. package/dist/actions/commons/setSystemPackages.js +3 -3
  9. package/dist/actions/findDependencies/index.js +3 -3
  10. package/dist/actions/findDependencies/init.js +4 -4
  11. package/dist/actions/findDependencies/parseSenvi.js +10 -10
  12. package/dist/actions/findDependencies/print.js +4 -4
  13. package/dist/actions/findDependencies/readRepositoryEnvironment.js +6 -6
  14. package/dist/actions/findDependencies/setObjects.js +6 -7
  15. package/dist/actions/findDependencies/setTrmDependencies.js +16 -16
  16. package/dist/actions/install/addNamespace.js +10 -11
  17. package/dist/actions/install/checkAlreadyInstalled.js +6 -6
  18. package/dist/actions/install/checkDependencies.js +9 -9
  19. package/dist/actions/install/checkIntegrity.js +6 -6
  20. package/dist/actions/install/checkObjectTypes.js +6 -6
  21. package/dist/actions/install/checkSapEntries.js +8 -8
  22. package/dist/actions/install/checkTransports.js +32 -32
  23. package/dist/actions/install/executePostActivities.js +15 -8
  24. package/dist/actions/install/generateDevclass.js +17 -11
  25. package/dist/actions/install/generateInstallTransport.js +26 -24
  26. package/dist/actions/install/importCustTransport.js +10 -10
  27. package/dist/actions/install/importDevcTransport.js +11 -11
  28. package/dist/actions/install/importLangTransport.js +10 -10
  29. package/dist/actions/install/importTadirTransport.js +22 -17
  30. package/dist/actions/install/index.js +5 -3
  31. package/dist/actions/install/init.js +11 -11
  32. package/dist/actions/install/installDependencies.js +16 -17
  33. package/dist/actions/install/migrate.js +5 -5
  34. package/dist/actions/install/readDevc.js +5 -5
  35. package/dist/actions/install/readTadir.js +9 -9
  36. package/dist/actions/install/refreshTmsTxt.js +11 -6
  37. package/dist/actions/install/setInstallDevclass.js +5 -6
  38. package/dist/actions/install/setPackageIntegrity.js +3 -3
  39. package/dist/actions/install/setR3trans.js +7 -7
  40. package/dist/actions/install/setTrmServerUpgradeService.d.ts +3 -0
  41. package/dist/actions/install/setTrmServerUpgradeService.js +32 -0
  42. package/dist/actions/installDependency/findInstallRelease.js +2 -2
  43. package/dist/actions/installDependency/index.js +3 -3
  44. package/dist/actions/installDependency/init.js +6 -7
  45. package/dist/actions/installDependency/installRelease.js +4 -4
  46. package/dist/actions/publish/finalizePublish.js +7 -7
  47. package/dist/actions/publish/findDependencies.js +21 -22
  48. package/dist/actions/publish/generateCustTransport.js +10 -10
  49. package/dist/actions/publish/generateDevcTransport.js +8 -8
  50. package/dist/actions/publish/generateLangTransport.js +12 -12
  51. package/dist/actions/publish/generateTadirTransport.js +9 -9
  52. package/dist/actions/publish/getSourceCode.js +5 -5
  53. package/dist/actions/publish/index.js +3 -3
  54. package/dist/actions/publish/init.js +16 -16
  55. package/dist/actions/publish/publishToRegistry.js +4 -4
  56. package/dist/actions/publish/releaseTransports.js +8 -9
  57. package/dist/actions/publish/setCustomizingTransports.js +10 -11
  58. package/dist/actions/publish/setDevclass.js +10 -10
  59. package/dist/actions/publish/setManifestValues.js +11 -11
  60. package/dist/actions/publish/setReadme.js +5 -6
  61. package/dist/actions/publish/setTransportTarget.js +7 -7
  62. package/dist/client/ClientError.d.ts +7 -0
  63. package/dist/client/ClientError.js +13 -0
  64. package/dist/client/RESTClient.js +13 -14
  65. package/dist/client/RESTClientError.d.ts +10 -0
  66. package/dist/client/RESTClientError.js +15 -0
  67. package/dist/client/RFCClient.js +32 -28
  68. package/dist/client/RFCClientError.d.ts +8 -0
  69. package/dist/client/RFCClientError.js +15 -0
  70. package/dist/client/index.d.ts +3 -0
  71. package/dist/client/index.js +3 -0
  72. package/dist/commons/TrmServerUpgradeService.d.ts +15 -0
  73. package/dist/commons/TrmServerUpgradeService.js +81 -0
  74. package/dist/commons/getAxiosInstance.js +8 -8
  75. package/dist/commons/getNodePackage.js +47 -6
  76. package/dist/commons/getNpmGlobalPath.js +3 -3
  77. package/dist/commons/index.d.ts +1 -0
  78. package/dist/commons/index.js +1 -0
  79. package/dist/index.d.ts +0 -2
  80. package/dist/index.js +0 -2
  81. package/dist/manifest/Manifest.js +3 -3
  82. package/dist/manifest/PostActivity.js +5 -5
  83. package/dist/registry/Registry.js +12 -13
  84. package/dist/systemConnector/RESTSystemConnector.js +6 -6
  85. package/dist/systemConnector/RFCSystemConnector.js +4 -4
  86. package/dist/systemConnector/SystemConnectorBase.js +29 -29
  87. package/dist/transport/Transport.js +48 -50
  88. package/dist/trmPackage/TrmArtifact.js +11 -11
  89. package/dist/trmPackage/TrmPackage.js +2 -2
  90. package/dist/{inquirer/validators → validators}/validateDevclass.d.ts +1 -1
  91. package/dist/{inquirer/validators → validators}/validateDevclass.js +1 -1
  92. package/dist/{inquirer/validators → validators}/validatePackageVisibility.d.ts +1 -1
  93. package/dist/{inquirer/validators → validators}/validatePackageVisibility.js +2 -2
  94. package/dist/{inquirer/validators → validators}/validateTransportTarget.d.ts +1 -1
  95. package/package.json +2 -4
  96. package/dist/inquirer/CliInquirer.d.ts +0 -10
  97. package/dist/inquirer/CliInquirer.js +0 -103
  98. package/dist/inquirer/IInquirer.d.ts +0 -7
  99. package/dist/inquirer/IInquirer.js +0 -2
  100. package/dist/inquirer/Inquirer.d.ts +0 -9
  101. package/dist/inquirer/Inquirer.js +0 -31
  102. package/dist/inquirer/Question.d.ts +0 -12
  103. package/dist/inquirer/Question.js +0 -2
  104. package/dist/inquirer/index.d.ts +0 -5
  105. package/dist/inquirer/index.js +0 -21
  106. package/dist/logger/CliLogFileLogger.d.ts +0 -25
  107. package/dist/logger/CliLogFileLogger.js +0 -92
  108. package/dist/logger/CliLogger.d.ts +0 -25
  109. package/dist/logger/CliLogger.js +0 -227
  110. package/dist/logger/ConsoleLogger.d.ts +0 -21
  111. package/dist/logger/ConsoleLogger.js +0 -104
  112. package/dist/logger/DummyLogger.d.ts +0 -20
  113. package/dist/logger/DummyLogger.js +0 -22
  114. package/dist/logger/ILogger.d.ts +0 -18
  115. package/dist/logger/ILogger.js +0 -2
  116. package/dist/logger/JSONLog.d.ts +0 -4
  117. package/dist/logger/JSONLog.js +0 -2
  118. package/dist/logger/Logger.d.ts +0 -21
  119. package/dist/logger/Logger.js +0 -86
  120. package/dist/logger/TreeLog.d.ts +0 -4
  121. package/dist/logger/TreeLog.js +0 -2
  122. package/dist/logger/index.d.ts +0 -8
  123. package/dist/logger/index.js +0 -24
  124. /package/dist/{inquirer/validators → validators}/index.d.ts +0 -0
  125. /package/dist/{inquirer/validators → validators}/index.js +0 -0
  126. /package/dist/{inquirer/validators → validators}/validateTransportTarget.js +0 -0
@@ -10,17 +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.addNamespace = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const commons_1 = require("../../commons");
15
15
  const systemConnector_1 = require("../../systemConnector");
16
- const inquirer_1 = require("../../inquirer");
17
16
  exports.addNamespace = {
18
17
  name: 'add-namespace',
19
18
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
20
- logger_1.Logger.log('Add namespace step', true);
19
+ trm_commons_1.Logger.log('Add namespace step', true);
21
20
  context.runtime.rollback = true;
22
21
  var originalNamespace = (0, commons_1.getPackageNamespace)(context.runtime.originalData.hierarchy.devclass);
23
- logger_1.Logger.log(`Package original namespace is ${originalNamespace}`, true);
22
+ trm_commons_1.Logger.log(`Package original namespace is ${originalNamespace}`, true);
24
23
  if (!context.rawInput.installData.installDevclass.keepOriginal && context.rawInput.installData.installDevclass.replacements.length > 0) {
25
24
  context.runtime.installData.namespace = (0, commons_1.getPackageNamespace)(context.rawInput.installData.installDevclass.replacements[0].installDevclass);
26
25
  }
@@ -28,17 +27,17 @@ exports.addNamespace = {
28
27
  context.runtime.installData.namespace = originalNamespace;
29
28
  }
30
29
  if (context.runtime.installData.namespace[0] !== '/') {
31
- logger_1.Logger.log(`Package install namespace is ${context.runtime.installData.namespace}`, true);
30
+ trm_commons_1.Logger.log(`Package install namespace is ${context.runtime.installData.namespace}`, true);
32
31
  return;
33
32
  }
34
- logger_1.Logger.loading(`Checking namespace ${context.runtime.installData.namespace}...`);
33
+ trm_commons_1.Logger.loading(`Checking namespace ${context.runtime.installData.namespace}...`);
35
34
  var namespace;
36
35
  const namespaceCheck = yield systemConnector_1.SystemConnector.getNamespace(context.runtime.installData.namespace);
37
36
  if (namespaceCheck) {
38
37
  namespace = namespaceCheck.trnspacet;
39
38
  }
40
39
  if (namespace) {
41
- logger_1.Logger.log(`Namespace ${context.runtime.installData.namespace} already defined`, true);
40
+ trm_commons_1.Logger.log(`Namespace ${context.runtime.installData.namespace} already defined`, true);
42
41
  return;
43
42
  }
44
43
  var replicense;
@@ -46,7 +45,7 @@ exports.addNamespace = {
46
45
  var aTexts = [];
47
46
  if (context.runtime.installData.namespace !== originalNamespace) {
48
47
  if (!context.rawInput.contextData.noInquirer) {
49
- replicense = (yield inquirer_1.Inquirer.prompt({
48
+ replicense = (yield trm_commons_1.Inquirer.prompt({
50
49
  message: `Input repair license for namespace ${context.runtime.installData.namespace}`,
51
50
  name: 'replicense',
52
51
  type: 'input',
@@ -59,7 +58,7 @@ exports.addNamespace = {
59
58
  }
60
59
  }
61
60
  })).replicense;
62
- texts = yield inquirer_1.Inquirer.prompt([{
61
+ texts = yield trm_commons_1.Inquirer.prompt([{
63
62
  message: `dummy`,
64
63
  name: 'namespace',
65
64
  type: 'input',
@@ -94,7 +93,7 @@ exports.addNamespace = {
94
93
  }
95
94
  else {
96
95
  if (!context.rawInput.contextData.noInquirer) {
97
- texts = (yield inquirer_1.Inquirer.prompt({
96
+ texts = (yield trm_commons_1.Inquirer.prompt({
98
97
  type: 'list',
99
98
  message: 'Choose namespace install text',
100
99
  name: 'choice',
@@ -127,7 +126,7 @@ exports.addNamespace = {
127
126
  aTexts.push(Object.assign(Object.assign({}, texts), { spras: systemConnector_1.SystemConnector.getLogonLanguage(true) }));
128
127
  }
129
128
  }
130
- logger_1.Logger.loading(`Installing namespace ${context.runtime.installData.namespace}...`);
129
+ trm_commons_1.Logger.loading(`Installing namespace ${context.runtime.installData.namespace}...`);
131
130
  yield systemConnector_1.SystemConnector.addNamespace(context.runtime.installData.namespace, replicense, aTexts);
132
131
  context.runtime.generatedData.namespace = context.runtime.installData.namespace;
133
132
  }),
@@ -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.checkAlreadyInstalled = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const manifest_1 = require("../../manifest");
15
15
  const semver_1 = require("semver");
16
16
  exports.checkAlreadyInstalled = {
17
17
  name: 'check-already-installed',
18
18
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
19
- logger_1.Logger.log('Check already installed step', true);
19
+ trm_commons_1.Logger.log('Check already installed step', true);
20
20
  const installedPackages = context.rawInput.contextData.systemPackages;
21
21
  const manifest = context.runtime.remotePackageData.manifest;
22
22
  const trmManifest = context.runtime.remotePackageData.trmManifest;
@@ -27,7 +27,7 @@ exports.checkAlreadyInstalled = {
27
27
  context.runtime.update = true;
28
28
  if ((0, semver_1.eq)(installVersion, installedVersion)) {
29
29
  if (context.rawInput.packageData.overwrite) {
30
- logger_1.Logger.info(`Package "${trmManifest.name}" version ${installedVersion} already installed.`);
30
+ trm_commons_1.Logger.info(`Package "${trmManifest.name}" version ${installedVersion} already installed.`);
31
31
  }
32
32
  else {
33
33
  throw new Error(`Package "${trmManifest.name}" version ${installedVersion} already installed.`);
@@ -35,16 +35,16 @@ exports.checkAlreadyInstalled = {
35
35
  }
36
36
  else {
37
37
  if ((0, semver_1.gt)(installVersion, installedVersion)) {
38
- logger_1.Logger.info(`Upgrading ${installedVersion} -> ${installVersion}`);
38
+ trm_commons_1.Logger.info(`Upgrading ${installedVersion} -> ${installVersion}`);
39
39
  }
40
40
  else {
41
- logger_1.Logger.warning(`Downgrading ${installedVersion} -> ${installVersion}`);
41
+ trm_commons_1.Logger.warning(`Downgrading ${installedVersion} -> ${installVersion}`);
42
42
  }
43
43
  }
44
44
  }
45
45
  else {
46
46
  context.runtime.update = false;
47
- logger_1.Logger.info(`Package not installed yet`, true);
47
+ trm_commons_1.Logger.info(`Package not installed yet`, true);
48
48
  }
49
49
  })
50
50
  };
@@ -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.checkDependencies = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const checkPackageDependencies_1 = require("../checkPackageDependencies");
15
15
  const SUBWORKFLOW_NAME = 'check-package-dependencies-sub-install';
16
16
  exports.checkDependencies = {
17
17
  name: 'check-dependencies',
18
18
  filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
19
19
  if (context.rawInput.installData.checks.noDependencies) {
20
- logger_1.Logger.log(`Skipping dependencies check (user input)`, true);
20
+ trm_commons_1.Logger.log(`Skipping dependencies check (user input)`, true);
21
21
  return false;
22
22
  }
23
23
  else {
@@ -25,7 +25,7 @@ exports.checkDependencies = {
25
25
  }
26
26
  }),
27
27
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
28
- logger_1.Logger.log('Check dependencies step', true);
28
+ trm_commons_1.Logger.log('Check dependencies step', true);
29
29
  const inputData = {
30
30
  packageData: {
31
31
  package: context.runtime.remotePackageData.trmPackage
@@ -38,16 +38,16 @@ exports.checkDependencies = {
38
38
  information: false
39
39
  }
40
40
  };
41
- logger_1.Logger.loading(`Checking dependencies...`);
42
- logger_1.Logger.log(`Ready to execute sub-workflow ${SUBWORKFLOW_NAME}, input data: ${(0, logger_1.inspect)(inputData, { breakLength: Infinity, compact: true })}`, true);
41
+ trm_commons_1.Logger.loading(`Checking dependencies...`);
42
+ 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);
43
43
  const result = yield (0, checkPackageDependencies_1.checkPackageDependencies)(inputData);
44
- logger_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, logger_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
44
+ trm_commons_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, trm_commons_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
45
45
  if (result.dependencies.length > 0) {
46
46
  if (result.dependencies.length === 1) {
47
- logger_1.Logger.info(`"${context.rawInput.packageData.name}" has ${result.dependencies.length} dependency: ${result.dependencyStatus.filter(o => o.match).length} installed, ${result.dependencyStatus.filter(o => !o.match).length} missing.`);
47
+ trm_commons_1.Logger.info(`"${context.rawInput.packageData.name}" has ${result.dependencies.length} dependency: ${result.dependencyStatus.filter(o => o.match).length} installed, ${result.dependencyStatus.filter(o => !o.match).length} missing.`);
48
48
  }
49
49
  else {
50
- logger_1.Logger.info(`"${context.rawInput.packageData.name}" has ${result.dependencies.length} dependencies: ${result.dependencyStatus.filter(o => o.match).length} installed, ${result.dependencyStatus.filter(o => !o.match).length} missing.`);
50
+ trm_commons_1.Logger.info(`"${context.rawInput.packageData.name}" has ${result.dependencies.length} dependencies: ${result.dependencyStatus.filter(o => o.match).length} installed, ${result.dependencyStatus.filter(o => !o.match).length} missing.`);
51
51
  }
52
52
  }
53
53
  result.dependencyStatus.forEach(o => {
@@ -60,7 +60,7 @@ exports.checkDependencies = {
60
60
  throw new Error(`Dependency "${o.dependency.name}" is installed, but integrity doesn't match.`);
61
61
  }
62
62
  else {
63
- logger_1.Logger.warning(`Dependency "${o.dependency.name}" is installed, but integrity doesn't match.`);
63
+ trm_commons_1.Logger.warning(`Dependency "${o.dependency.name}" is installed, but integrity doesn't match.`);
64
64
  }
65
65
  }
66
66
  }
@@ -10,11 +10,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.checkIntegrity = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  exports.checkIntegrity = {
15
15
  name: 'check-integrity',
16
16
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
17
- logger_1.Logger.log('Check integrity step', true);
17
+ trm_commons_1.Logger.log('Check integrity step', true);
18
18
  const inputIntegrity = context.rawInput.packageData.integrity;
19
19
  const safe = context.rawInput.installData.checks.safe;
20
20
  if (!inputIntegrity) {
@@ -28,11 +28,11 @@ exports.checkIntegrity = {
28
28
  const trmManifest = context.runtime.remotePackageData.trmManifest;
29
29
  const installIntegrity = context.runtime.remotePackageData.integrity;
30
30
  if (installIntegrity !== inputIntegrity) {
31
- logger_1.Logger.warning(`ATTENTION!! Integrity check failed on package ${trmManifest.name}, version ${trmManifest.version}.`);
32
- logger_1.Logger.warning(` Local: ${inputIntegrity}`);
33
- logger_1.Logger.warning(` Remote: ${installIntegrity}`);
31
+ trm_commons_1.Logger.warning(`ATTENTION!! Integrity check failed on package ${trmManifest.name}, version ${trmManifest.version}.`);
32
+ trm_commons_1.Logger.warning(` Local: ${inputIntegrity}`);
33
+ trm_commons_1.Logger.warning(` Remote: ${installIntegrity}`);
34
34
  if (safe) {
35
- logger_1.Logger.warning(` Install will continue.`);
35
+ trm_commons_1.Logger.warning(` Install will continue.`);
36
36
  }
37
37
  else {
38
38
  throw new Error(`Safe mode: package installation aborted due to integrity check failure.`);
@@ -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.checkObjectTypes = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const systemConnector_1 = require("../../systemConnector");
15
15
  exports.checkObjectTypes = {
16
16
  name: 'check-object-types',
17
17
  filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
18
18
  if (context.rawInput.installData.checks.noObjectTypes) {
19
- logger_1.Logger.log(`Skipping object types check (user input)`, true);
19
+ trm_commons_1.Logger.log(`Skipping object types check (user input)`, true);
20
20
  return false;
21
21
  }
22
22
  else {
@@ -24,8 +24,8 @@ exports.checkObjectTypes = {
24
24
  }
25
25
  }),
26
26
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
27
- logger_1.Logger.log('Check object types step', true);
28
- logger_1.Logger.loading(`Checking package objects types...`);
27
+ trm_commons_1.Logger.log('Check object types step', true);
28
+ trm_commons_1.Logger.loading(`Checking package objects types...`);
29
29
  const systemObjectList = yield systemConnector_1.SystemConnector.getObjectsList();
30
30
  var unsupportedObjectTypes = [];
31
31
  context.runtime.packageTransportsData.e071.forEach(o => {
@@ -40,9 +40,9 @@ exports.checkObjectTypes = {
40
40
  }
41
41
  });
42
42
  if (unsupportedObjectTypes.length > 0) {
43
- logger_1.Logger.error(`Package contains ${unsupportedObjectTypes.length} unsupported objects:`);
43
+ trm_commons_1.Logger.error(`Package contains ${unsupportedObjectTypes.length} unsupported objects:`);
44
44
  unsupportedObjectTypes.forEach(o => {
45
- logger_1.Logger.error(` ${o.text}`);
45
+ trm_commons_1.Logger.error(` ${o.text}`);
46
46
  });
47
47
  throw new Error(`Package is not supported on ${systemConnector_1.SystemConnector.getDest()}.`);
48
48
  }
@@ -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.checkSapEntries = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const checkSapEntries_1 = require("../checkSapEntries");
15
15
  const SUBWORKFLOW_NAME = 'check-sap-entries-sub-install';
16
16
  exports.checkSapEntries = {
17
17
  name: 'check-sap-entries',
18
18
  filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
19
19
  if (context.rawInput.installData.checks.noSapEntries) {
20
- logger_1.Logger.log(`Skipping SAP entries check (user input)`, true);
20
+ trm_commons_1.Logger.log(`Skipping SAP entries check (user input)`, true);
21
21
  return false;
22
22
  }
23
23
  else {
@@ -25,7 +25,7 @@ exports.checkSapEntries = {
25
25
  }
26
26
  }),
27
27
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
28
- logger_1.Logger.log('Check sap entries step', true);
28
+ trm_commons_1.Logger.log('Check sap entries step', true);
29
29
  const inputData = {
30
30
  packageData: {
31
31
  package: context.runtime.remotePackageData.trmPackage
@@ -35,21 +35,21 @@ exports.checkSapEntries = {
35
35
  information: false
36
36
  }
37
37
  };
38
- logger_1.Logger.loading(`Checking SAP entries...`);
39
- logger_1.Logger.log(`Ready to execute sub-workflow ${SUBWORKFLOW_NAME}, input data: ${(0, logger_1.inspect)(inputData, { breakLength: Infinity, compact: true })}`, true);
38
+ trm_commons_1.Logger.loading(`Checking SAP entries...`);
39
+ 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);
40
40
  const result = yield (0, checkSapEntries_1.checkSapEntries)(inputData);
41
- logger_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, logger_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
41
+ trm_commons_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, trm_commons_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
42
42
  const sapEntriesOutput = result.sapEntriesStatus;
43
43
  var missingEntries = [];
44
44
  Object.keys(sapEntriesOutput).forEach(t => {
45
45
  missingEntries = missingEntries.concat(sapEntriesOutput[t].filter(o => !o.status));
46
46
  });
47
47
  if (missingEntries.length > 0) {
48
- logger_1.Logger.error(JSON.stringify(missingEntries), true);
48
+ trm_commons_1.Logger.error(JSON.stringify(missingEntries), true);
49
49
  throw new Error(`Package requires ${missingEntries.length} SAP entries that don't exist on your system (run in verbose for more detail).`);
50
50
  }
51
51
  else {
52
- logger_1.Logger.success(`SAP entries checked.`);
52
+ trm_commons_1.Logger.success(`SAP entries checked.`);
53
53
  }
54
54
  })
55
55
  };
@@ -10,19 +10,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.checkTransports = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const transport_1 = require("../../transport");
15
15
  const commons_1 = require("../../commons");
16
- const inquirer_1 = require("../../inquirer");
16
+ const trm_commons_2 = require("trm-commons");
17
17
  const systemConnector_1 = require("../../systemConnector");
18
18
  exports.checkTransports = {
19
19
  name: 'check-transports',
20
20
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
21
- logger_1.Logger.log('Check transports step', true);
21
+ trm_commons_1.Logger.log('Check transports step', true);
22
22
  var checkExistance = [];
23
- logger_1.Logger.loading(`Checking package transports...`);
23
+ trm_commons_1.Logger.loading(`Checking package transports...`);
24
24
  const aTransports = yield context.runtime.remotePackageData.artifact.getTransportBinaries(context.rawInput.contextData.r3transOptions);
25
- logger_1.Logger.log(`Package content: ${aTransports.map(o => {
25
+ trm_commons_1.Logger.log(`Package content: ${aTransports.map(o => {
26
26
  return {
27
27
  trkorr: o.trkorr,
28
28
  type: o.type
@@ -31,10 +31,10 @@ exports.checkTransports = {
31
31
  for (const transport of aTransports) {
32
32
  const valid = yield context.runtime.r3trans.isTransportValid(transport.binaries.data);
33
33
  if (valid) {
34
- logger_1.Logger.log(`Transport ${transport.trkorr} is valid.`, true);
34
+ trm_commons_1.Logger.log(`Transport ${transport.trkorr} is valid.`, true);
35
35
  }
36
36
  else {
37
- logger_1.Logger.error(`Transport ${transport.trkorr} is invalid.`, true);
37
+ trm_commons_1.Logger.error(`Transport ${transport.trkorr} is invalid.`, true);
38
38
  throw new Error(`Package contains invalid transports`);
39
39
  }
40
40
  }
@@ -43,32 +43,32 @@ exports.checkTransports = {
43
43
  const aLangTransports = aTransports.filter(o => o.type === transport_1.TrmTransportIdentifier.LANG);
44
44
  const aCustTransports = aTransports.filter(o => o.type === transport_1.TrmTransportIdentifier.CUST);
45
45
  if (aDevcTransports.length !== 1) {
46
- logger_1.Logger.error(`Zero or multiple DEVC transports found`, true);
46
+ trm_commons_1.Logger.error(`Zero or multiple DEVC transports found`, true);
47
47
  throw new Error(`Unexpected content in package.`);
48
48
  }
49
49
  else {
50
50
  context.runtime.packageTransports.devc.binaries = aDevcTransports[0];
51
- logger_1.Logger.log(`DEVC transport is ${context.runtime.packageTransports.devc.binaries.trkorr}.`, true);
51
+ trm_commons_1.Logger.log(`DEVC transport is ${context.runtime.packageTransports.devc.binaries.trkorr}.`, true);
52
52
  if (context.rawInput.installData.installDevclass.keepOriginal) {
53
53
  checkExistance.push(context.runtime.packageTransports.devc.binaries.trkorr);
54
54
  }
55
55
  }
56
56
  if (aTadirTransports.length !== 1) {
57
- logger_1.Logger.error(`Zero or multiple TADIR transports found`, true);
57
+ trm_commons_1.Logger.error(`Zero or multiple TADIR transports found`, true);
58
58
  throw new Error(`Unexpected content in package.`);
59
59
  }
60
60
  else {
61
61
  context.runtime.packageTransports.tadir.binaries = aTadirTransports[0];
62
- logger_1.Logger.log(`TADIR transport is ${context.runtime.packageTransports.tadir.binaries.trkorr}.`, true);
62
+ trm_commons_1.Logger.log(`TADIR transport is ${context.runtime.packageTransports.tadir.binaries.trkorr}.`, true);
63
63
  checkExistance.push(context.runtime.packageTransports.tadir.binaries.trkorr);
64
64
  const tadirE071 = (0, commons_1.normalize)(yield context.runtime.r3trans.getTableEntries(context.runtime.packageTransports.tadir.binaries.binaries.data, 'E071'));
65
- logger_1.Logger.log(`TADIR E071: ${JSON.stringify(tadirE071)}`, true);
65
+ trm_commons_1.Logger.log(`TADIR E071: ${JSON.stringify(tadirE071)}`, true);
66
66
  context.runtime.packageTransportsData.e071 = context.runtime.packageTransportsData.e071.concat(tadirE071);
67
67
  }
68
68
  if (aLangTransports.length > 0) {
69
69
  if (context.rawInput.installData.import.noLang === undefined) {
70
70
  if (!context.rawInput.contextData.noInquirer) {
71
- context.rawInput.installData.import.noLang = !(yield inquirer_1.Inquirer.prompt({
71
+ context.rawInput.installData.import.noLang = !(yield trm_commons_2.Inquirer.prompt({
72
72
  type: `confirm`,
73
73
  name: `noLang`,
74
74
  message: `Import translations transport?`,
@@ -78,23 +78,23 @@ exports.checkTransports = {
78
78
  }
79
79
  if (!context.rawInput.installData.import.noLang) {
80
80
  if (aLangTransports.length !== 1) {
81
- logger_1.Logger.error(`Multiple LANG transports found`, true);
81
+ trm_commons_1.Logger.error(`Multiple LANG transports found`, true);
82
82
  throw new Error(`Unexpected content in package.`);
83
83
  }
84
84
  context.runtime.packageTransports.lang.binaries = aLangTransports[0];
85
- logger_1.Logger.log(`LANG transport is ${context.runtime.packageTransports.lang.binaries.trkorr}.`, true);
85
+ trm_commons_1.Logger.log(`LANG transport is ${context.runtime.packageTransports.lang.binaries.trkorr}.`, true);
86
86
  if (!context.rawInput.installData.import.noLang) {
87
87
  checkExistance.push(context.runtime.packageTransports.lang.binaries.trkorr);
88
88
  }
89
89
  const langE071 = (0, commons_1.normalize)(yield context.runtime.r3trans.getTableEntries(context.runtime.packageTransports.lang.binaries.binaries.data, 'E071'));
90
- logger_1.Logger.log(`LANG E071: ${JSON.stringify(langE071)}`, true);
90
+ trm_commons_1.Logger.log(`LANG E071: ${JSON.stringify(langE071)}`, true);
91
91
  context.runtime.packageTransportsData.e071 = context.runtime.packageTransportsData.e071.concat(langE071);
92
92
  }
93
93
  }
94
94
  if (aCustTransports.length > 0) {
95
95
  if (context.rawInput.installData.import.noCust === undefined) {
96
96
  if (!context.rawInput.contextData.noInquirer) {
97
- context.rawInput.installData.import.noCust = !(yield inquirer_1.Inquirer.prompt({
97
+ context.rawInput.installData.import.noCust = !(yield trm_commons_2.Inquirer.prompt({
98
98
  type: `confirm`,
99
99
  name: `noCust`,
100
100
  message: `Import customizing transport?`,
@@ -104,16 +104,16 @@ exports.checkTransports = {
104
104
  }
105
105
  if (!context.rawInput.installData.import.noCust) {
106
106
  if (aCustTransports.length !== 1) {
107
- logger_1.Logger.error(`Multiple CUST transports found`, true);
107
+ trm_commons_1.Logger.error(`Multiple CUST transports found`, true);
108
108
  throw new Error(`Unexpected content in package.`);
109
109
  }
110
110
  context.runtime.packageTransports.cust.binaries = aCustTransports[0];
111
- logger_1.Logger.log(`CUST transport is ${context.runtime.packageTransports.cust.binaries.trkorr}.`, true);
111
+ trm_commons_1.Logger.log(`CUST transport is ${context.runtime.packageTransports.cust.binaries.trkorr}.`, true);
112
112
  if (!context.rawInput.installData.import.noCust) {
113
113
  checkExistance.push(context.runtime.packageTransports.cust.binaries.trkorr);
114
114
  }
115
115
  const custE071 = (0, commons_1.normalize)(yield context.runtime.r3trans.getTableEntries(context.runtime.packageTransports.cust.binaries.binaries.data, 'E071'));
116
- logger_1.Logger.log(`CUST E071: ${JSON.stringify(custE071)}`, true);
116
+ trm_commons_1.Logger.log(`CUST E071: ${JSON.stringify(custE071)}`, true);
117
117
  context.runtime.packageTransportsData.e071 = context.runtime.packageTransportsData.e071.concat(custE071);
118
118
  }
119
119
  }
@@ -121,45 +121,45 @@ exports.checkTransports = {
121
121
  throw new Error(`Package has undeclared devclass.`);
122
122
  }
123
123
  var devcE071 = (0, commons_1.normalize)(yield context.runtime.r3trans.getTableEntries(context.runtime.packageTransports.devc.binaries.binaries.data, 'E071'));
124
- logger_1.Logger.log(`DEVC E071: ${JSON.stringify(devcE071)}`, true);
124
+ trm_commons_1.Logger.log(`DEVC E071: ${JSON.stringify(devcE071)}`, true);
125
125
  devcE071 = devcE071.filter(o => o.pgmid === 'R3TR' && o.object === 'DEVC');
126
126
  if (devcE071.length === 0) {
127
127
  throw new Error(`Package has no devclass.`);
128
128
  }
129
129
  context.runtime.packageTransportsData.e071 = context.runtime.packageTransportsData.e071.concat(devcE071);
130
130
  context.runtime.installData.entries = context.runtime.packageTransportsData.e071;
131
- logger_1.Logger.loading(`Checking if ${checkExistance.length} transports exist before importing them`, true);
131
+ trm_commons_1.Logger.loading(`Checking if ${checkExistance.length} transports exist before importing them`, true);
132
132
  for (const trkorr of checkExistance) {
133
133
  const oTransport = new transport_1.Transport(trkorr);
134
134
  const e070 = yield oTransport.getE070();
135
135
  if (e070) {
136
- logger_1.Logger.warning(`${trkorr} already exists in system!`, true);
136
+ trm_commons_1.Logger.warning(`${trkorr} already exists in system!`, true);
137
137
  const trmRelevant = yield oTransport.isTrmRelevant();
138
138
  const linkedPackage = yield oTransport.getLinkedPackage();
139
139
  if (linkedPackage) {
140
- logger_1.Logger.log(`${trkorr} package is ${linkedPackage.packageName}`, true);
140
+ trm_commons_1.Logger.log(`${trkorr} package is ${linkedPackage.packageName}`, true);
141
141
  if (linkedPackage.compareName(context.runtime.remotePackageData.trmManifest.name) && linkedPackage.compareRegistry(context.runtime.registry)) {
142
- logger_1.Logger.log(`${trkorr} same package (updating?)`, true);
142
+ trm_commons_1.Logger.log(`${trkorr} same package (updating?)`, true);
143
143
  }
144
144
  else {
145
- logger_1.Logger.log(`${trkorr} is linked to another package, will later be migrated`, true);
145
+ trm_commons_1.Logger.log(`${trkorr} is linked to another package, will later be migrated`, true);
146
146
  context.runtime.generatedData.migrations.push(oTransport);
147
147
  context.runtime.generatedData.tmsTxtRefresh.push(oTransport);
148
148
  }
149
149
  }
150
150
  else if (trmRelevant) {
151
- logger_1.Logger.log(`${trkorr} is TRM relevant but no linked package (could be DEVC, LANG etc..). No migration, just tms refresh`, true);
151
+ trm_commons_1.Logger.log(`${trkorr} is TRM relevant but no linked package (could be DEVC, LANG etc..). No migration, just tms refresh`, true);
152
152
  context.runtime.generatedData.tmsTxtRefresh.push(oTransport);
153
153
  }
154
154
  else {
155
155
  if (yield oTransport.isReleased()) {
156
- logger_1.Logger.warning(`Transport ${trkorr} already exists in target system ${systemConnector_1.SystemConnector.getDest()}`);
157
- logger_1.Logger.warning(`If you continue, TRM will replace the content of transport ${trkorr} with the content of the transport with the same number of package "${context.runtime.remotePackageData.trmManifest.name}".`);
158
- logger_1.Logger.warning(`All of the content of the existing transport will remain untouched, however you need to manually create a new transport if you want to use it again in the future.`);
156
+ trm_commons_1.Logger.warning(`Transport ${trkorr} already exists in target system ${systemConnector_1.SystemConnector.getDest()}`);
157
+ trm_commons_1.Logger.warning(`If you continue, TRM will replace the content of transport ${trkorr} with the content of the transport with the same number of package "${context.runtime.remotePackageData.trmManifest.name}".`);
158
+ trm_commons_1.Logger.warning(`All of the content of the existing transport will remain untouched, however you need to manually create a new transport if you want to use it again in the future.`);
159
159
  if (!context.rawInput.installData.import.replaceExistingTransports) {
160
160
  var continueInstall;
161
161
  if (!context.rawInput.contextData.noInquirer) {
162
- continueInstall = (yield inquirer_1.Inquirer.prompt({
162
+ continueInstall = (yield trm_commons_2.Inquirer.prompt({
163
163
  name: `continue`,
164
164
  message: `Continue install?`,
165
165
  type: `confirm`,
@@ -183,7 +183,7 @@ exports.checkTransports = {
183
183
  }
184
184
  }
185
185
  else {
186
- logger_1.Logger.success(`${trkorr} does not exist in system.`, true);
186
+ trm_commons_1.Logger.success(`${trkorr} does not exist in system.`, true);
187
187
  }
188
188
  }
189
189
  })
@@ -10,31 +10,38 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.executePostActivities = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const manifest_1 = require("../../manifest");
15
+ const commons_1 = require("../../commons");
15
16
  exports.executePostActivities = {
16
17
  name: 'execute-post-activities',
17
18
  filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
18
19
  if (context.rawInput.installData.skipPostActivities) {
19
- logger_1.Logger.log(`Skipping post activities (user input)`, true);
20
+ trm_commons_1.Logger.log(`Skipping post activities (user input)`, true);
20
21
  return false;
21
22
  }
22
23
  else {
23
24
  if (context.runtime.remotePackageData.trmManifest.postActivities && context.runtime.remotePackageData.trmManifest.postActivities.length > 0) {
24
- return true;
25
+ if (commons_1.TrmServerUpgrade.getInstance().executePostActivities()) {
26
+ return true;
27
+ }
28
+ else {
29
+ trm_commons_1.Logger.warning(`Coudln't execute post activities! After trm-server upgrade, run them manually!`, true);
30
+ return false;
31
+ }
25
32
  }
26
33
  else {
27
- logger_1.Logger.log(`Skipping post activities (none defined)`, true);
34
+ trm_commons_1.Logger.log(`Skipping post activities (none defined)`, true);
28
35
  return false;
29
36
  }
30
37
  }
31
38
  }),
32
39
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
33
- logger_1.Logger.log('Execute post activities step', true);
40
+ trm_commons_1.Logger.log('Execute post activities step', true);
34
41
  var counter = 0;
35
42
  for (var data of context.runtime.remotePackageData.trmManifest.postActivities) {
36
43
  counter++;
37
- logger_1.Logger.setPrefix(`(${counter}/${context.runtime.remotePackageData.trmManifest.postActivities.length}) `);
44
+ trm_commons_1.Logger.setPrefix(`(${counter}/${context.runtime.remotePackageData.trmManifest.postActivities.length}) `);
38
45
  try {
39
46
  if (Array.isArray(data.parameters)) {
40
47
  data.parameters.forEach(param => {
@@ -54,9 +61,9 @@ exports.executePostActivities = {
54
61
  yield postActivity.execute();
55
62
  }
56
63
  catch (e) {
57
- logger_1.Logger.error(`Failed execution of post activity: ${e.toString()}`);
64
+ trm_commons_1.Logger.error(`Failed execution of post activity: ${e.toString()}`);
58
65
  }
59
- logger_1.Logger.removePrefix();
66
+ trm_commons_1.Logger.removePrefix();
60
67
  }
61
68
  })
62
69
  };
@@ -10,14 +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.generateDevclass = void 0;
13
- const logger_1 = require("../../logger");
13
+ const trm_commons_1 = require("trm-commons");
14
14
  const commons_1 = require("../../commons");
15
15
  const systemConnector_1 = require("../../systemConnector");
16
+ const TrmServerUpgradeService_1 = require("../../commons/TrmServerUpgradeService");
16
17
  exports.generateDevclass = {
17
18
  name: 'generate-devclass',
18
19
  filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
19
20
  if (context.rawInput.installData.installDevclass.keepOriginal) {
20
- logger_1.Logger.log(`Skipping generate devclass devclass (user input)`, true);
21
+ trm_commons_1.Logger.log(`Skipping generate devclass devclass (user input)`, true);
21
22
  return false;
22
23
  }
23
24
  else {
@@ -26,26 +27,26 @@ exports.generateDevclass = {
26
27
  }),
27
28
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
28
29
  var _a, _b;
29
- logger_1.Logger.log('Generate devclass step', true);
30
- logger_1.Logger.loading(`Checking ABAP packages...`);
30
+ trm_commons_1.Logger.log('Generate devclass step', true);
31
+ trm_commons_1.Logger.loading(`Checking ABAP packages...`);
31
32
  var generate = [];
32
33
  for (const replacement of context.rawInput.installData.installDevclass.replacements) {
33
- logger_1.Logger.loading(`Checking existance of devclass ${replacement.installDevclass}...`, true);
34
+ trm_commons_1.Logger.loading(`Checking existance of devclass ${replacement.installDevclass}...`, true);
34
35
  const oDevclass = yield systemConnector_1.SystemConnector.getDevclass(replacement.installDevclass);
35
36
  if (oDevclass) {
36
- logger_1.Logger.log(`Devclass ${replacement.installDevclass} exists, skipping generation`, true);
37
+ trm_commons_1.Logger.log(`Devclass ${replacement.installDevclass} exists, skipping generation`, true);
37
38
  }
38
39
  else {
39
- logger_1.Logger.log(`Devclass ${replacement.installDevclass} doesn't exist, will be generated`, true);
40
+ trm_commons_1.Logger.log(`Devclass ${replacement.installDevclass} doesn't exist, will be generated`, true);
40
41
  generate.push(replacement.installDevclass);
41
42
  }
42
43
  }
43
44
  if (generate.length > 0) {
44
45
  const dlvunit = context.runtime.installData.namespace === '$' ? 'LOCAL' : 'HOME';
45
46
  for (const devclass of generate) {
46
- logger_1.Logger.loading(`Creating package ${devclass}...`);
47
+ trm_commons_1.Logger.loading(`Creating package ${devclass}...`);
47
48
  const originalDevclass = context.rawInput.installData.installDevclass.replacements.find(o => o.installDevclass === devclass).originalDevclass;
48
- logger_1.Logger.log(`Original devclass ${originalDevclass}`, true);
49
+ trm_commons_1.Logger.log(`Original devclass ${originalDevclass}`, true);
49
50
  const ctext = ((_a = context.runtime.packageTransportsData.tdevct.find(o => o.devclass === originalDevclass)) === null || _a === void 0 ? void 0 : _a.ctext) || `TRM ${context.rawInput.packageData.name}`;
50
51
  yield systemConnector_1.SystemConnector.createPackage({
51
52
  as4user: systemConnector_1.SystemConnector.getLogonUser(),
@@ -66,7 +67,7 @@ exports.generateDevclass = {
66
67
  }
67
68
  }
68
69
  }
69
- logger_1.Logger.loading(`Updating ABAP packages hierarchy...`);
70
+ trm_commons_1.Logger.loading(`Updating ABAP packages hierarchy...`);
70
71
  const aDummyTdevc = [];
71
72
  const originalPackageHierarchy = (0, commons_1.getPackageHierarchy)(context.runtime.packageTransportsData.tdevc);
72
73
  for (const packageReplacement of context.rawInput.installData.installDevclass.replacements) {
@@ -97,7 +98,12 @@ exports.generateDevclass = {
97
98
  const installParentCl = (_b = context.rawInput.installData.installDevclass.replacements.find(o => o.originalDevclass === originalParentCl)) === null || _b === void 0 ? void 0 : _b.installDevclass;
98
99
  if (installParentCl) {
99
100
  if (!installRoot) {
100
- yield systemConnector_1.SystemConnector.setPackageSuperpackage(packageReplacement.installDevclass, installParentCl);
101
+ try {
102
+ yield systemConnector_1.SystemConnector.setPackageSuperpackage(packageReplacement.installDevclass, installParentCl);
103
+ }
104
+ catch (e) {
105
+ TrmServerUpgradeService_1.TrmServerUpgrade.getInstance().throwError(e);
106
+ }
101
107
  }
102
108
  }
103
109
  }