trm-core 6.5.1 → 6.7.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 (41) hide show
  1. package/changelog.txt +17 -0
  2. package/dist/actions/findDependencies/index.d.ts +1 -0
  3. package/dist/actions/findDependencies/setTrmDependencies.js +5 -0
  4. package/dist/actions/install/generateInstallTransport.js +3 -1
  5. package/dist/actions/publish/findDependencies.js +9 -2
  6. package/dist/actions/publish/generateTadirTransport.js +0 -5
  7. package/dist/actions/publish/getSourceCode.js +16 -4
  8. package/dist/actions/publish/index.d.ts +0 -1
  9. package/dist/actions/publish/init.js +3 -1
  10. package/dist/actions/publish/setManifestValues.js +45 -6
  11. package/dist/actions/publish/setTransportTarget.js +1 -1
  12. package/dist/client/Login.d.ts +1 -1
  13. package/dist/client/RESTClient.d.ts +7 -2
  14. package/dist/client/RESTClient.js +50 -9
  15. package/dist/client/RFCClient.d.ts +7 -2
  16. package/dist/client/RFCClient.js +71 -9
  17. package/dist/client/components/PROGNAME.d.ts +1 -0
  18. package/dist/client/components/PROGNAME.js +2 -0
  19. package/dist/client/components/index.d.ts +1 -0
  20. package/dist/client/components/index.js +1 -0
  21. package/dist/client/struct/ZTY_SER_OBJ.d.ts +7 -0
  22. package/dist/client/struct/ZTY_SER_OBJ.js +2 -0
  23. package/dist/client/struct/ZTY_TRM_PACKAGE.d.ts +13 -0
  24. package/dist/client/struct/ZTY_TRM_PACKAGE.js +2 -0
  25. package/dist/client/struct/index.d.ts +2 -0
  26. package/dist/client/struct/index.js +2 -0
  27. package/dist/commons/getAxiosInstance.js +12 -1
  28. package/dist/manifest/PostActivity.d.ts +1 -0
  29. package/dist/manifest/PostActivity.js +33 -15
  30. package/dist/systemConnector/ISystemConnector.d.ts +6 -2
  31. package/dist/systemConnector/RESTSystemConnector.d.ts +7 -2
  32. package/dist/systemConnector/RESTSystemConnector.js +10 -2
  33. package/dist/systemConnector/RFCSystemConnector.d.ts +7 -2
  34. package/dist/systemConnector/RFCSystemConnector.js +11 -3
  35. package/dist/systemConnector/SystemConnector.d.ts +6 -2
  36. package/dist/systemConnector/SystemConnector.js +9 -2
  37. package/dist/systemConnector/SystemConnectorBase.d.ts +2 -0
  38. package/dist/systemConnector/SystemConnectorBase.js +48 -4
  39. package/dist/transport/Transport.d.ts +3 -2
  40. package/dist/transport/Transport.js +41 -34
  41. package/package.json +4 -2
package/changelog.txt CHANGED
@@ -8,6 +8,23 @@ Legend
8
8
  + : added
9
9
  - : removed
10
10
 
11
+ 2025-05-14 v6.7.0
12
+ -------------------
13
+ ! trm-server ^3.0.0
14
+ * abapgit ignored objects
15
+ + post activity pre check
16
+ + get installed packages from backend where possible
17
+ + regen SAPLZTRM before post activity
18
+ * rest sap-client
19
+ + keep track of post activities based on latest release
20
+
21
+ 2025-05-08 v6.6.0
22
+ -------------------
23
+ * no integrity with trm-server/trm-rest dependency allowed
24
+ ! REST Client and RFC Client error generic -> specific
25
+ ! REST Client error xml body parsing with title as message
26
+ ! trm-server ^2.2.2
27
+
11
28
  2025-05-08 v6.5.1
12
29
  -------------------
13
30
  ! rest error handling
@@ -29,6 +29,7 @@ export type SapEntriesDependency = {
29
29
  export type TrmDependency = {
30
30
  devclass: DEVCLASS;
31
31
  package: TrmPackage;
32
+ ignoreNoIntegrity: boolean;
32
33
  integrity?: string;
33
34
  sapEntries: SapEntriesDependency[];
34
35
  };
@@ -98,6 +98,7 @@ const _getTadirDependencies = (tadirDependencies) => __awaiter(void 0, void 0, v
98
98
  var arrayIndex1;
99
99
  var arrayIndex2;
100
100
  var append;
101
+ var ignoreNoIntegrity;
101
102
  if (trmServerPackage.package && trmServerPackage.package.getDevclass() === tadir.devclass) {
102
103
  trm_commons_1.Logger.log(`Dependency with TRM SERVER package`, true);
103
104
  devclass = trmServerPackage.package.getDevclass();
@@ -110,6 +111,7 @@ const _getTadirDependencies = (tadirDependencies) => __awaiter(void 0, void 0, v
110
111
  trmServerPackage.integrity = integrity;
111
112
  }
112
113
  append = true;
114
+ ignoreNoIntegrity = true;
113
115
  }
114
116
  else if (trmRestPackage.package && trmRestPackage.package.getDevclass() === tadir.devclass) {
115
117
  trm_commons_1.Logger.log(`Dependency with TRM REST package`, true);
@@ -123,8 +125,10 @@ const _getTadirDependencies = (tadirDependencies) => __awaiter(void 0, void 0, v
123
125
  trmRestPackage.integrity = integrity;
124
126
  }
125
127
  append = true;
128
+ ignoreNoIntegrity = true;
126
129
  }
127
130
  else {
131
+ ignoreNoIntegrity = false;
128
132
  trm_commons_1.Logger.log(`Searching transports for object ${tadir.pgmid} ${tadir.object} ${tadir.objName}`, true);
129
133
  const allTransports = yield transport_1.Transport.getTransportsFromObject(tadir, transportsObjectCache);
130
134
  trm_commons_1.Logger.log(`Found ${allTransports.length} transports for object ${tadir.pgmid} ${tadir.object} ${tadir.objName}`, true);
@@ -213,6 +217,7 @@ const _getTadirDependencies = (tadirDependencies) => __awaiter(void 0, void 0, v
213
217
  devclass,
214
218
  package: trmPackage,
215
219
  integrity,
220
+ ignoreNoIntegrity,
216
221
  sapEntries: []
217
222
  });
218
223
  arrayIndex1--;
@@ -32,15 +32,17 @@ exports.generateInstallTransport = {
32
32
  trm_commons_1.Logger.warning(`Install transport was not generated because the package contains non-transportable objects.`);
33
33
  return;
34
34
  }
35
- trm_commons_1.Logger.loading(`Generating install transport...`);
35
+ trm_commons_1.Logger.loading(`Checking install transport...`);
36
36
  context.runtime.installData.transport = yield systemConnector_1.SystemConnector.getPackageWorkbenchTransport(context.runtime.remotePackageData.trmPackage);
37
37
  if (context.runtime.installData.transport) {
38
38
  trm_commons_1.Logger.log(`Install transport (${context.runtime.installData.transport.trkorr}) already exists, won't create a new one.`, true);
39
+ trm_commons_1.Logger.loading(`Updating install transport...`);
39
40
  if (commons_1.TrmServerUpgrade.getInstance().removeComments()) {
40
41
  yield context.runtime.installData.transport.removeComments();
41
42
  }
42
43
  }
43
44
  else {
45
+ trm_commons_1.Logger.loading(`Generating install transport...`);
44
46
  context.runtime.installData.transport = yield transport_1.Transport.createWb({
45
47
  text: `TRM generated transport`,
46
48
  target: context.rawInput.installData.installTransport.targetSystem || ''
@@ -73,9 +73,16 @@ exports.findDependencies = {
73
73
  const dependencyVersionRange = `^${dependencyManifest.version}`;
74
74
  const dependencyRegistry = o.package.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? undefined : o.package.registry.endpoint;
75
75
  if (!o.integrity) {
76
- throw new Error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name}: Integrity not found!`);
76
+ if (o.ignoreNoIntegrity) {
77
+ trm_commons_1.Logger.warning(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name}: ${dependencyVersionRange} (Integrity not found!)`);
78
+ }
79
+ else {
80
+ throw new Error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name}: Integrity not found!`);
81
+ }
82
+ }
83
+ else {
84
+ trm_commons_1.Logger.info(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name} ${dependencyVersionRange}`);
77
85
  }
78
- trm_commons_1.Logger.info(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) ${dependencyManifest.name} ${dependencyVersionRange}`);
79
86
  context.runtime.trmPackage.manifest.dependencies.push({
80
87
  name: dependencyManifest.name,
81
88
  version: dependencyVersionRange,
@@ -19,17 +19,12 @@ exports.generateTadirTransport = {
19
19
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
20
20
  trm_commons_1.Logger.log('Generate TADIR transport step', true);
21
21
  var aTadir = context.runtime.packageData.tadir.filter(o => !(o.pgmid === 'R3TR' && o.object === 'DEVC'));
22
- var ignoredObjects = 0;
23
22
  context.runtime.abapGitData.sourceCode.ignoredObjects.forEach(o => {
24
23
  const objectIndex = aTadir.findIndex(k => k.pgmid === o.pgmid && k.object === o.object && k.objName === o.objName);
25
24
  if (objectIndex >= 0) {
26
- ignoredObjects++;
27
25
  aTadir.splice(objectIndex, 1);
28
26
  }
29
27
  });
30
- if (ignoredObjects > 0) {
31
- trm_commons_1.Logger.info(`${ignoredObjects} object/s are ignored (as specified in .abapgit.xml)`);
32
- }
33
28
  if (aTadir.length === 0) {
34
29
  throw new Error(`Package ${context.rawInput.packageData.devclass} has no content.`);
35
30
  }
@@ -12,6 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getSourceCode = void 0;
13
13
  const trm_commons_1 = require("trm-commons");
14
14
  const systemConnector_1 = require("../../systemConnector");
15
+ const abapgit_1 = require("../../abapgit");
16
+ const minimatch_1 = require("minimatch");
15
17
  exports.getSourceCode = {
16
18
  name: 'get-source-code',
17
19
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
@@ -20,13 +22,23 @@ exports.getSourceCode = {
20
22
  trm_commons_1.Logger.loading(`Reading ${context.rawInput.packageData.devclass} source code...`);
21
23
  const sourceCode = yield systemConnector_1.SystemConnector.getAbapgitSource(context.rawInput.packageData.devclass);
22
24
  context.runtime.abapGitData.sourceCode.zip = sourceCode.zip;
23
- context.runtime.abapGitData.sourceCode.objects = sourceCode.objects;
25
+ context.runtime.abapGitData.dotAbapGit = yield abapgit_1.DotAbapGit.fromDevclass(context.rawInput.packageData.devclass);
26
+ const ignoredPatterns = context.runtime.abapGitData.dotAbapGit.getIgnoredFiles();
24
27
  context.runtime.packageData.tadir.forEach(o => {
25
- const object = context.runtime.abapGitData.sourceCode.objects.find(k => k.pgmid === o.pgmid && k.object === o.object && k.objName === o.objName);
26
- if (!object) {
27
- context.runtime.abapGitData.sourceCode.ignoredObjects.push(o);
28
+ const abapgitObject = sourceCode.objects.find(k => k.pgmid === o.pgmid && k.object === o.object && k.objName === o.objName);
29
+ if (abapgitObject) {
30
+ ignoredPatterns.forEach(pattern => {
31
+ if ((0, minimatch_1.minimatch)(abapgitObject.fullPath, pattern, { matchBase: true })) {
32
+ if (!context.runtime.abapGitData.sourceCode.ignoredObjects.find(k => k.pgmid === o.pgmid && k.object === o.object && k.objName === o.objName)) {
33
+ context.runtime.abapGitData.sourceCode.ignoredObjects.push(o);
34
+ }
35
+ }
36
+ });
28
37
  }
29
38
  });
39
+ if (ignoredPatterns.length > 0) {
40
+ trm_commons_1.Logger.info(`Excluding ${context.runtime.abapGitData.sourceCode.ignoredObjects.length} object(s) as configured in .abapgit.xml:\n${ignoredPatterns.join('\n ')}`);
41
+ }
30
42
  }
31
43
  catch (e) {
32
44
  trm_commons_1.Logger.error(e.toString(), true);
@@ -60,7 +60,6 @@ type WorkflowRuntime = {
60
60
  dotAbapGit?: DotAbapGit;
61
61
  sourceCode?: {
62
62
  zip: Buffer;
63
- objects: TADIR[];
64
63
  ignoredObjects: TADIR[];
65
64
  };
66
65
  };
@@ -71,6 +71,9 @@ exports.init = {
71
71
  if (context.rawInput.packageData.manifest.sapEntries === undefined) {
72
72
  context.rawInput.packageData.manifest.sapEntries = {};
73
73
  }
74
+ if (!context.rawInput.packageData.manifest.postActivities) {
75
+ context.rawInput.packageData.manifest.postActivities = [];
76
+ }
74
77
  if (typeof (context.rawInput.publishData.customizingTransports) === 'string') {
75
78
  context.rawInput.publishData.customizingTransports = context.rawInput.publishData.customizingTransports.split(',').map(o => {
76
79
  try {
@@ -161,7 +164,6 @@ exports.init = {
161
164
  dotAbapGit: undefined,
162
165
  sourceCode: {
163
166
  ignoredObjects: [],
164
- objects: [],
165
167
  zip: undefined
166
168
  }
167
169
  }
@@ -19,6 +19,7 @@ const manifest_1 = require("../../manifest");
19
19
  const chalk_1 = __importDefault(require("chalk"));
20
20
  const FileSystem_1 = require("../../registry/FileSystem");
21
21
  const validators_1 = require("../../validators");
22
+ const lodash_1 = __importDefault(require("lodash"));
22
23
  exports.setManifestValues = {
23
24
  name: 'set-manifest-values',
24
25
  run: (context) => __awaiter(void 0, void 0, void 0, function* () {
@@ -31,21 +32,59 @@ exports.setManifestValues = {
31
32
  context.runtime.trmPackage.manifest.license = context.runtime.trmPackage.manifest.license || context.runtime.trmPackage.latestReleaseManifest.license;
32
33
  context.runtime.trmPackage.manifest.website = context.runtime.trmPackage.manifest.website || context.runtime.trmPackage.latestReleaseManifest.website;
33
34
  if (context.runtime.trmPackage.manifest.authors) {
34
- if (Array.isArray(context.runtime.trmPackage.manifest.authors) && context.runtime.trmPackage.manifest.authors.length === 0) {
35
- context.runtime.trmPackage.manifest.authors = context.runtime.trmPackage.latestReleaseManifest.authors;
35
+ if (Array.isArray(context.runtime.trmPackage.latestReleaseManifest.authors)) {
36
+ if (!Array.isArray(context.runtime.trmPackage.manifest.authors)) {
37
+ context.runtime.trmPackage.manifest.authors = manifest_1.Manifest.stringAuthorsToArray(context.runtime.trmPackage.manifest.authors);
38
+ }
39
+ context.runtime.trmPackage.latestReleaseManifest.authors.forEach(o => {
40
+ if (o.email && o.name) {
41
+ if (!context.runtime.trmPackage.manifest.authors.find(k => k.email === o.email && k.name === o.name)) {
42
+ context.runtime.trmPackage.manifest.authors.push(o);
43
+ }
44
+ }
45
+ else if (o.email) {
46
+ if (!context.runtime.trmPackage.manifest.authors.find(k => k.email === o.email)) {
47
+ context.runtime.trmPackage.manifest.authors.push(o);
48
+ }
49
+ }
50
+ else if (o.name) {
51
+ if (!context.runtime.trmPackage.manifest.authors.find(k => k.name === o.name)) {
52
+ context.runtime.trmPackage.manifest.authors.push(o);
53
+ }
54
+ }
55
+ });
36
56
  }
37
57
  }
38
58
  else {
39
59
  context.runtime.trmPackage.manifest.authors = context.runtime.trmPackage.latestReleaseManifest.authors;
40
60
  }
41
61
  if (context.runtime.trmPackage.manifest.keywords) {
42
- if (Array.isArray(context.runtime.trmPackage.manifest.keywords) && context.runtime.trmPackage.manifest.keywords.length === 0) {
43
- context.runtime.trmPackage.manifest.keywords = context.runtime.trmPackage.latestReleaseManifest.keywords;
62
+ if (Array.isArray(context.runtime.trmPackage.latestReleaseManifest.keywords)) {
63
+ if (!Array.isArray(context.runtime.trmPackage.manifest.keywords)) {
64
+ context.runtime.trmPackage.manifest.keywords = manifest_1.Manifest.stringKeywordsToArray(context.runtime.trmPackage.manifest.keywords);
65
+ }
66
+ context.runtime.trmPackage.latestReleaseManifest.keywords.forEach(o => {
67
+ if (!context.runtime.trmPackage.manifest.keywords.find(k => k === o)) {
68
+ context.runtime.trmPackage.manifest.keywords.push(o);
69
+ }
70
+ });
44
71
  }
45
72
  }
46
73
  else {
47
74
  context.runtime.trmPackage.manifest.keywords = context.runtime.trmPackage.latestReleaseManifest.keywords;
48
75
  }
76
+ if (context.runtime.trmPackage.manifest.postActivities) {
77
+ if (Array.isArray(context.runtime.trmPackage.latestReleaseManifest.postActivities)) {
78
+ context.runtime.trmPackage.latestReleaseManifest.postActivities.forEach(o => {
79
+ if (!context.runtime.trmPackage.manifest.postActivities.find(k => lodash_1.default.isEqual(k, o))) {
80
+ context.runtime.trmPackage.manifest.postActivities.push(o);
81
+ }
82
+ });
83
+ }
84
+ }
85
+ else {
86
+ context.runtime.trmPackage.manifest.postActivities = context.runtime.trmPackage.latestReleaseManifest.postActivities;
87
+ }
49
88
  }
50
89
  }
51
90
  if (!context.rawInput.contextData.noInquirer) {
@@ -192,7 +231,7 @@ exports.setManifestValues = {
192
231
  }
193
232
  if (!context.rawInput.contextData.noInquirer) {
194
233
  const inq = yield trm_commons_1.Inquirer.prompt([{
195
- message: `Do you want to edit post activities?`,
234
+ message: context.runtime.trmPackage.manifest.postActivities.length > 0 ? `Do you want to edit ${context.runtime.trmPackage.manifest.postActivities.length} post activities?` : `Do you want to add post activities?`,
196
235
  type: 'confirm',
197
236
  name: 'editPostActivities',
198
237
  default: false
@@ -204,7 +243,7 @@ exports.setManifestValues = {
204
243
  when: (hash) => {
205
244
  return hash.editPostActivities;
206
245
  },
207
- default: JSON.stringify(context.runtime.trmPackage.manifest.postActivities || [], null, 2),
246
+ default: JSON.stringify(context.runtime.trmPackage.manifest.postActivities, null, 2),
208
247
  validate: (input) => {
209
248
  try {
210
249
  const parsedInput = JSON.parse(input);
@@ -29,7 +29,7 @@ exports.setTransportTarget = {
29
29
  }),
30
30
  choices: context.runtime.systemData.transportTargets.map(o => {
31
31
  return {
32
- name: `${o.sysnam} (${o.systxt})`,
32
+ name: o.systxt ? `${o.sysnam} (${o.systxt})` : o.sysnam,
33
33
  value: o.sysnam
34
34
  };
35
35
  })
@@ -2,5 +2,5 @@ export type Login = {
2
2
  user: string;
3
3
  passwd: string;
4
4
  lang: string;
5
- client?: string;
5
+ client: string;
6
6
  };
@@ -58,7 +58,12 @@ export declare class RESTClient implements IClient {
58
58
  getDotAbapgit(devclass: components.DEVCLASS): Promise<Buffer>;
59
59
  getAbapgitSource(devclass: components.DEVCLASS): Promise<{
60
60
  zip: Buffer;
61
- objects: struct.TADIR[];
61
+ objects: struct.ZTY_SER_OBJ[];
62
62
  }>;
63
- executePostActivity(data: Buffer): Promise<struct.SYMSG[]>;
63
+ executePostActivity(data: Buffer, pre?: boolean): Promise<{
64
+ messages: struct.SYMSG[];
65
+ execute?: boolean;
66
+ }>;
67
+ getInstalledPackagesBackend(): Promise<struct.ZTY_TRM_PACKAGE[]>;
68
+ regenProg(prog: components.PROGNAME): Promise<void>;
64
69
  }
@@ -59,6 +59,9 @@ class RESTClient {
59
59
  this.endpoint = this.endpoint.trim();
60
60
  this._axiosInstance = (0, commons_1.getAxiosInstance)({
61
61
  baseURL: this.endpoint,
62
+ params: {
63
+ 'sap-client': `${this._login.client}`
64
+ },
62
65
  auth: {
63
66
  username: this._login.user,
64
67
  password: this._login.passwd
@@ -69,11 +72,17 @@ class RESTClient {
69
72
  open() {
70
73
  return __awaiter(this, void 0, void 0, function* () {
71
74
  if (!this._connected) {
72
- const response = yield this._axiosInstance.get('/', {
73
- timeout: 5000
74
- });
75
+ var response;
76
+ try {
77
+ response = yield this._axiosInstance.get('/', {
78
+ timeout: 5000
79
+ });
80
+ }
81
+ catch (e) {
82
+ throw new _1.RESTClientError("ZNO_CONN", null, e, e.message);
83
+ }
75
84
  if (response.status !== 200) {
76
- throw new Error(`Couldn't reach ${this.endpoint}!`);
85
+ throw new _1.RESTClientError("ZNO_CONN", null, null, `Couldn't reach ${this.endpoint}!`);
77
86
  }
78
87
  else {
79
88
  this._connected = true;
@@ -153,7 +162,7 @@ class RESTClient {
153
162
  return msg.trim();
154
163
  }
155
164
  else {
156
- throw new Error(`Message ${msgnr}, class ${data.class}, lang ${this._cLangu} not found.`);
165
+ throw new _1.RESTClientError("ZMSG_NOT_FOUND", null, null, `Message ${msgnr}, class ${data.class}, lang ${this._cLangu} not found.`);
157
166
  }
158
167
  });
159
168
  }
@@ -609,16 +618,48 @@ class RESTClient {
609
618
  };
610
619
  }
611
620
  catch (e) {
612
- throw new Error(`Can't parse api data.`);
621
+ throw new _1.RESTClientError("ZPARSE_API_DATA", null, null, `Can't parse api data.`);
613
622
  }
614
623
  });
615
624
  }
616
- executePostActivity(data) {
625
+ executePostActivity(data, pre) {
617
626
  return __awaiter(this, void 0, void 0, function* () {
618
- const result = (yield this._axiosInstance.post('/execute_post_activity', data, {
627
+ const formData = new FormData.default();
628
+ formData.append('data', data, 'data');
629
+ formData.append('pre', pre ? 'X' : '');
630
+ const result = (yield this._axiosInstance.post('/execute_post_activity', formData, {
619
631
  timeout: 60000
620
632
  })).data;
621
- return result.messages;
633
+ return {
634
+ messages: result.messages,
635
+ execute: result.execute === 'X'
636
+ };
637
+ });
638
+ }
639
+ getInstalledPackagesBackend() {
640
+ return __awaiter(this, void 0, void 0, function* () {
641
+ const result = (yield this._axiosInstance.get('/get_installed_packages')).data;
642
+ return result.packages.map(o => {
643
+ o.xmanifest = o.xmanifest ? Buffer.from(o.xmanifest, 'base64').toString('utf8') : undefined;
644
+ return {
645
+ name: o.name,
646
+ version: o.version,
647
+ registry: o.registry,
648
+ manifest: o.xmanifest,
649
+ tdevc: o.tdevc,
650
+ transport: {
651
+ trkorr: o.transport ? o.transport.trkorr : undefined,
652
+ migration: o.transport ? o.transport.migration === 'X' : undefined
653
+ }
654
+ };
655
+ });
656
+ });
657
+ }
658
+ regenProg(prog) {
659
+ return __awaiter(this, void 0, void 0, function* () {
660
+ yield this._axiosInstance.post('/regen_prog', {
661
+ progname: prog
662
+ });
622
663
  });
623
664
  }
624
665
  }
@@ -57,7 +57,12 @@ export declare class RFCClient implements IClient {
57
57
  getDotAbapgit(devclass: components.DEVCLASS): Promise<Buffer>;
58
58
  getAbapgitSource(devclass: components.DEVCLASS): Promise<{
59
59
  zip: Buffer;
60
- objects: struct.TADIR[];
60
+ objects: struct.ZTY_SER_OBJ[];
61
61
  }>;
62
- executePostActivity(data: Buffer): Promise<struct.SYMSG[]>;
62
+ executePostActivity(data: Buffer, pre?: boolean): Promise<{
63
+ messages: struct.SYMSG[];
64
+ execute?: boolean;
65
+ }>;
66
+ getInstalledPackagesBackend(): Promise<struct.ZTY_TRM_PACKAGE[]>;
67
+ regenProg(prog: components.PROGNAME): Promise<void>;
63
68
  }
@@ -51,6 +51,7 @@ const trm_commons_1 = require("trm-commons");
51
51
  const fs_1 = require("fs");
52
52
  const path_1 = __importDefault(require("path"));
53
53
  const _1 = require(".");
54
+ const xml = __importStar(require("xml-js"));
54
55
  const nodeRfcLib = 'node-rfc';
55
56
  class RFCClient {
56
57
  constructor(_rfcClientArgs, _cLangu, traceDir) {
@@ -73,7 +74,7 @@ class RFCClient {
73
74
  const libPath = path_1.default.join(globalPath, nodeRfcLib);
74
75
  trm_commons_1.Logger.log(`Node RFC lib path: ${libPath}`, true);
75
76
  if (!(0, fs_1.existsSync)(libPath)) {
76
- throw new Error(`${nodeRfcLib} not found. Run command "npm install ${nodeRfcLib} -g" to continue.`);
77
+ throw new _1.RFCClientError("ZRFC_LIB_NOT_FOUND", null, null, `${nodeRfcLib} not found. Run command "npm install ${nodeRfcLib} -g" to continue.`);
77
78
  }
78
79
  this._rfcClient = new (yield Promise.resolve(`${libPath}`).then(s => __importStar(require(s)))).Client(this._rfcClientArgs);
79
80
  }
@@ -82,9 +83,14 @@ class RFCClient {
82
83
  }
83
84
  open() {
84
85
  return __awaiter(this, void 0, void 0, function* () {
85
- trm_commons_1.Logger.loading(`Opening RFC connection`, true);
86
- yield (yield this.getRfcClient()).open();
87
- trm_commons_1.Logger.success(`RFC open`, true);
86
+ try {
87
+ trm_commons_1.Logger.loading(`Opening RFC connection`, true);
88
+ yield (yield this.getRfcClient()).open();
89
+ trm_commons_1.Logger.success(`RFC open`, true);
90
+ }
91
+ catch (e) {
92
+ throw new _1.RFCClientError("ZNO_CONN", null, e, e.message);
93
+ }
88
94
  });
89
95
  }
90
96
  checkConnection() {
@@ -194,7 +200,7 @@ class RFCClient {
194
200
  return msg.trim();
195
201
  }
196
202
  else {
197
- throw new Error(`Message ${msgnr}, class ${data.class}, lang ${this._cLangu} not found.`);
203
+ throw new _1.RFCClientError("ZMSG_NOT_FOUND", null, null, `Message ${msgnr}, class ${data.class}, lang ${this._cLangu} not found.`);
198
204
  }
199
205
  });
200
206
  }
@@ -572,18 +578,74 @@ class RFCClient {
572
578
  const result = yield this._call("ZTRM_GET_ABAPGIT_SOURCE", {
573
579
  iv_devclass: devclass
574
580
  });
581
+ const sXml = result['evObjects'].toString().replace(/&/g, "&amp;").replace(/-/g, "&#45;");
582
+ const oAbapXml = xml.xml2js(sXml, { compact: true });
583
+ const objects = oAbapXml['asx:abap']['asx:values']['OBJECTS'].item.map(o => {
584
+ return {
585
+ pgmid: o['PGMID']['_text'],
586
+ object: o['OBJECT']['_text'],
587
+ objName: o['OBJ_NAME']['_text'],
588
+ fullPath: o['FULL_PATH']['_text']
589
+ };
590
+ });
575
591
  return {
576
592
  zip: result['evZip'],
577
- objects: result['etObjects']
593
+ objects
578
594
  };
579
595
  });
580
596
  }
581
- executePostActivity(data) {
597
+ executePostActivity(data, pre) {
582
598
  return __awaiter(this, void 0, void 0, function* () {
583
599
  const result = yield this._call("ZTRM_EXECUTE_POST_ACTIVITY", {
584
- iv_data: data
600
+ iv_data: data,
601
+ iv_pre: pre ? 'X' : ''
602
+ });
603
+ return {
604
+ messages: result['etMessages'],
605
+ execute: result['evExecute'] === 'X'
606
+ };
607
+ });
608
+ }
609
+ getInstalledPackagesBackend() {
610
+ return __awaiter(this, void 0, void 0, function* () {
611
+ const result = yield this._call("ZTRM_GET_INSTALLED_PACKAGES");
612
+ const sXml = result['evPackages'].toString().replace(/&/g, "&amp;").replace(/-/g, "&#45;");
613
+ const oAbapXml = xml.xml2js(sXml, { compact: true });
614
+ return oAbapXml['asx:abap']['asx:values']['PACKAGES'].item.map(o => {
615
+ var flatTdevc = [];
616
+ if (o['TDEVC'] && o['TDEVC']['TDEVC']) {
617
+ if (!Array.isArray(o['TDEVC']['TDEVC'])) {
618
+ o['TDEVC']['TDEVC'] = [o['TDEVC']['TDEVC']];
619
+ }
620
+ flatTdevc = o['TDEVC']['TDEVC'].map((item) => {
621
+ const flattened = {};
622
+ for (const [key, value] of Object.entries(item)) {
623
+ if (typeof value === 'object' && value !== null && '_text' in value) {
624
+ flattened[key] = value._text;
625
+ }
626
+ }
627
+ return flattened;
628
+ });
629
+ }
630
+ return {
631
+ name: o['NAME']['_text'],
632
+ version: o['VERSION']['_text'],
633
+ registry: o['REGISTRY']['_text'],
634
+ manifest: o['XMANIFEST']['_text'] ? Buffer.from(o['XMANIFEST']['_text'], 'base64').toString('utf8') : undefined,
635
+ transport: {
636
+ trkorr: o['TRANSPORT']['TRKORR']['_text'],
637
+ migration: o['TRANSPORT']['MIGRATION']['_text'] === 'X',
638
+ },
639
+ tdevc: (0, commons_1.normalize)(flatTdevc)
640
+ };
641
+ });
642
+ });
643
+ }
644
+ regenProg(prog) {
645
+ return __awaiter(this, void 0, void 0, function* () {
646
+ yield this._call("ZTRM_REGEN_PROG", {
647
+ iv_progname: prog
585
648
  });
586
- return result['etMessages'];
587
649
  });
588
650
  }
589
651
  }
@@ -0,0 +1 @@
1
+ export type PROGNAME = string;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -54,3 +54,4 @@ export * from "./SYMSGV";
54
54
  export * from "./SEOCLSNAME";
55
55
  export * from "./LANGU";
56
56
  export * from "./SEODESCR";
57
+ export * from "./PROGNAME";
@@ -70,3 +70,4 @@ __exportStar(require("./SYMSGV"), exports);
70
70
  __exportStar(require("./SEOCLSNAME"), exports);
71
71
  __exportStar(require("./LANGU"), exports);
72
72
  __exportStar(require("./SEODESCR"), exports);
73
+ __exportStar(require("./PROGNAME"), exports);
@@ -0,0 +1,7 @@
1
+ import { PGMID, TROBJTYPE, SOBJ_NAME } from "../components";
2
+ export type ZTY_SER_OBJ = {
3
+ pgmid: PGMID;
4
+ object: TROBJTYPE;
5
+ objName: SOBJ_NAME;
6
+ fullPath: string;
7
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { TRKORR } from "../components";
2
+ import { TDEVC } from "./TDEVC";
3
+ export type ZTY_TRM_PACKAGE = {
4
+ name: string;
5
+ version: string;
6
+ registry?: string;
7
+ manifest?: string;
8
+ tdevc: TDEVC[];
9
+ transport: {
10
+ trkorr?: TRKORR;
11
+ migration?: boolean;
12
+ };
13
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -22,3 +22,5 @@ export * from "./TRNSPACET";
22
22
  export * from "./TRNSPACETT";
23
23
  export * from "./SYMSG";
24
24
  export * from "./SEOCLASSTX";
25
+ export * from "./ZTY_SER_OBJ";
26
+ export * from "./ZTY_TRM_PACKAGE";
@@ -38,3 +38,5 @@ __exportStar(require("./TRNSPACET"), exports);
38
38
  __exportStar(require("./TRNSPACETT"), exports);
39
39
  __exportStar(require("./SYMSG"), exports);
40
40
  __exportStar(require("./SEOCLASSTX"), exports);
41
+ __exportStar(require("./ZTY_SER_OBJ"), exports);
42
+ __exportStar(require("./ZTY_TRM_PACKAGE"), exports);
@@ -8,6 +8,7 @@ exports.getAxiosInstance = getAxiosInstance;
8
8
  const axios_1 = __importDefault(require("axios"));
9
9
  const util_1 = require("util");
10
10
  const trm_commons_1 = require("trm-commons");
11
+ const node_html_parser_1 = require("node-html-parser");
11
12
  const uuid_1 = require("uuid");
12
13
  exports.AXIOS_SESSION_HEADER = 'X-TRM-SESSION-ID';
13
14
  exports.AXIOS_INTERNAL_HEADER = 'X-TRM-REQUEST-ID';
@@ -68,7 +69,17 @@ function getAxiosInstance(config, sCtx) {
68
69
  sError = error.response.data.message;
69
70
  }
70
71
  else if (typeof (error.response.data) === 'string') {
71
- sError = error.response.data;
72
+ if (error.response.data[0] === '<') {
73
+ try {
74
+ sError = (0, node_html_parser_1.parse)(error.response.data).querySelector('title').innerText;
75
+ }
76
+ catch (e) {
77
+ sError = error.response.data;
78
+ }
79
+ }
80
+ else {
81
+ sError = error.response.data;
82
+ }
72
83
  }
73
84
  else {
74
85
  sError = error.response.statusText;
@@ -6,6 +6,7 @@ export declare class PostActivity {
6
6
  constructor(data: TrmManifestPostActivity);
7
7
  execute(silent?: boolean): Promise<void>;
8
8
  getDescription(): Promise<string>;
9
+ private printMessages;
9
10
  private getAbapXml;
10
11
  static exists(className: string): Promise<boolean>;
11
12
  }
@@ -56,28 +56,31 @@ class PostActivity {
56
56
  }
57
57
  execute(silent) {
58
58
  return __awaiter(this, void 0, void 0, function* () {
59
- trm_commons_1.Logger.loading(`Executing post activity: ${this.data.name}`, silent);
59
+ const data = Buffer.from(this._xml, 'utf8');
60
+ trm_commons_1.Logger.loading(`Post activity: ${this.data.name}`, silent);
60
61
  if (!PostActivity.exists(this.data.name)) {
61
62
  throw new Error(`Class "${this.data.name}" doesn't exist.`);
62
63
  }
63
64
  const description = yield this.getDescription();
64
- trm_commons_1.Logger.loading(`Executing post activity: ${description}`, silent);
65
- const messages = yield systemConnector_1.SystemConnector.executePostActivity(Buffer.from(this._xml, 'utf8'));
66
- if (messages && messages.length > 0) {
67
- for (const message of messages) {
68
- const parsedMessage = yield systemConnector_1.SystemConnector.getMessage({
69
- class: message.msgid,
70
- no: message.msgno,
71
- v1: message.msgv1,
72
- v2: message.msgv2,
73
- v3: message.msgv3,
74
- v4: message.msgv4,
75
- });
76
- trm_commons_1.Logger.msgty(message.msgty, parsedMessage, silent);
65
+ if (description) {
66
+ trm_commons_1.Logger.loading(`Post activity: ${description}`, silent);
67
+ }
68
+ yield systemConnector_1.SystemConnector.regenProg('SAPLZTRM');
69
+ const pre = yield systemConnector_1.SystemConnector.executePostActivity(data, true);
70
+ if (pre.messages) {
71
+ yield this.printMessages(pre.messages, silent);
72
+ }
73
+ if (pre.execute) {
74
+ const paExecute = yield systemConnector_1.SystemConnector.executePostActivity(data, false);
75
+ if (paExecute.messages && paExecute.messages.length > 0) {
76
+ yield this.printMessages(paExecute.messages, silent);
77
+ }
78
+ else {
79
+ trm_commons_1.Logger.success(`Executed post activity: ${description}`, silent);
77
80
  }
78
81
  }
79
82
  else {
80
- trm_commons_1.Logger.success(`Executed post activity: ${description}`, silent);
83
+ trm_commons_1.Logger.info(`Pre check for post activity ${description} skipped execution`, true);
81
84
  }
82
85
  });
83
86
  }
@@ -99,6 +102,21 @@ class PostActivity {
99
102
  }
100
103
  });
101
104
  }
105
+ printMessages(messages, silent) {
106
+ return __awaiter(this, void 0, void 0, function* () {
107
+ for (const message of messages) {
108
+ const parsedMessage = yield systemConnector_1.SystemConnector.getMessage({
109
+ class: message.msgid,
110
+ no: message.msgno,
111
+ v1: message.msgv1,
112
+ v2: message.msgv2,
113
+ v3: message.msgv3,
114
+ v4: message.msgv4,
115
+ });
116
+ trm_commons_1.Logger.msgty(message.msgty, parsedMessage, silent);
117
+ }
118
+ });
119
+ }
102
120
  getAbapXml(data) {
103
121
  var oAbapXml = {
104
122
  "_declaration": {
@@ -52,7 +52,11 @@ export interface ISystemConnector extends ISystemConnectorBase {
52
52
  getDotAbapgit: (devclass: components.DEVCLASS) => Promise<Buffer>;
53
53
  getAbapgitSource: (devclass: components.DEVCLASS) => Promise<{
54
54
  zip: Buffer;
55
- objects: struct.TADIR[];
55
+ objects: struct.ZTY_SER_OBJ[];
56
56
  }>;
57
- executePostActivity: (data: Buffer) => Promise<struct.SYMSG[]>;
57
+ executePostActivity: (data: Buffer, pre?: boolean) => Promise<{
58
+ messages: struct.SYMSG[];
59
+ execute?: boolean;
60
+ }>;
61
+ regenProg: (prog: components.PROGNAME) => Promise<void>;
58
62
  }
@@ -27,6 +27,7 @@ export declare class RESTSystemConnector extends SystemConnectorBase implements
27
27
  protected listDevclassObjects(devclass: DEVCLASS): Promise<TADIR[]>;
28
28
  protected tdevcInterface(devclass: components.DEVCLASS, parentcl?: components.DEVCLASS, rmParentCl?: boolean, devlayer?: components.DEVLAYER): Promise<void>;
29
29
  protected getR3transInfo(): Promise<string>;
30
+ protected getInstalledPackagesBackend(): Promise<struct.ZTY_TRM_PACKAGE[]>;
30
31
  getConnectionData(): RESTConnection;
31
32
  getLogonUser(): string;
32
33
  connect(): Promise<void>;
@@ -70,7 +71,11 @@ export declare class RESTSystemConnector extends SystemConnectorBase implements
70
71
  getDotAbapgit(devclass: components.DEVCLASS): Promise<Buffer>;
71
72
  getAbapgitSource(devclass: components.DEVCLASS): Promise<{
72
73
  zip: Buffer;
73
- objects: struct.TADIR[];
74
+ objects: struct.ZTY_SER_OBJ[];
74
75
  }>;
75
- executePostActivity(data: Buffer): Promise<struct.SYMSG[]>;
76
+ executePostActivity(data: Buffer, pre?: boolean): Promise<{
77
+ messages: struct.SYMSG[];
78
+ execute?: boolean;
79
+ }>;
80
+ regenProg(prog: components.PROGNAME): Promise<void>;
76
81
  }
@@ -96,6 +96,9 @@ class RESTSystemConnector extends SystemConnectorBase_1.SystemConnectorBase {
96
96
  return this._client.getR3transInfo();
97
97
  });
98
98
  }
99
+ getInstalledPackagesBackend() {
100
+ return this._client.getInstalledPackagesBackend();
101
+ }
99
102
  getConnectionData() {
100
103
  return this._connection;
101
104
  }
@@ -311,9 +314,14 @@ class RESTSystemConnector extends SystemConnectorBase_1.SystemConnectorBase {
311
314
  return this._client.getAbapgitSource(devclass);
312
315
  });
313
316
  }
314
- executePostActivity(data) {
317
+ executePostActivity(data, pre) {
318
+ return __awaiter(this, void 0, void 0, function* () {
319
+ return this._client.executePostActivity(data, pre);
320
+ });
321
+ }
322
+ regenProg(prog) {
315
323
  return __awaiter(this, void 0, void 0, function* () {
316
- return this._client.executePostActivity(data);
324
+ return this._client.regenProg(prog);
317
325
  });
318
326
  }
319
327
  }
@@ -27,6 +27,7 @@ export declare class RFCSystemConnector extends SystemConnectorBase implements I
27
27
  protected listDevclassObjects(devclass: DEVCLASS): Promise<TADIR[]>;
28
28
  protected tdevcInterface(devclass: components.DEVCLASS, parentcl?: components.DEVCLASS, rmParentCl?: boolean, devlayer?: components.DEVLAYER): Promise<void>;
29
29
  protected getR3transInfo(): Promise<string>;
30
+ protected getInstalledPackagesBackend(): Promise<struct.ZTY_TRM_PACKAGE[]>;
30
31
  getConnectionData(): RFCConnection;
31
32
  getLogonUser(): string;
32
33
  connect(): Promise<void>;
@@ -68,7 +69,11 @@ export declare class RFCSystemConnector extends SystemConnectorBase implements I
68
69
  getDotAbapgit(devclass: components.DEVCLASS): Promise<Buffer>;
69
70
  getAbapgitSource(devclass: components.DEVCLASS): Promise<{
70
71
  zip: Buffer;
71
- objects: struct.TADIR[];
72
+ objects: struct.ZTY_SER_OBJ[];
72
73
  }>;
73
- executePostActivity(data: Buffer): Promise<struct.SYMSG[]>;
74
+ executePostActivity(data: Buffer, pre?: boolean): Promise<{
75
+ messages: struct.SYMSG[];
76
+ execute?: boolean;
77
+ }>;
78
+ regenProg(prog: components.PROGNAME): Promise<void>;
74
79
  }
@@ -78,6 +78,9 @@ class RFCSystemConnector extends SystemConnectorBase_1.SystemConnectorBase {
78
78
  return this._client.getR3transInfo();
79
79
  });
80
80
  }
81
+ getInstalledPackagesBackend() {
82
+ return this._client.getInstalledPackagesBackend();
83
+ }
81
84
  getConnectionData() {
82
85
  return this._connection;
83
86
  }
@@ -104,7 +107,7 @@ class RFCSystemConnector extends SystemConnectorBase_1.SystemConnectorBase {
104
107
  }
105
108
  ping() {
106
109
  return __awaiter(this, void 0, void 0, function* () {
107
- return yield this._client.trmServerPing();
110
+ return this._client.trmServerPing();
108
111
  });
109
112
  }
110
113
  getFileSystem() {
@@ -282,9 +285,14 @@ class RFCSystemConnector extends SystemConnectorBase_1.SystemConnectorBase {
282
285
  return this._client.getAbapgitSource(devclass);
283
286
  });
284
287
  }
285
- executePostActivity(data) {
288
+ executePostActivity(data, pre) {
289
+ return __awaiter(this, void 0, void 0, function* () {
290
+ return this._client.executePostActivity(data, pre);
291
+ });
292
+ }
293
+ regenProg(prog) {
286
294
  return __awaiter(this, void 0, void 0, function* () {
287
- return this._client.executePostActivity(data);
295
+ return this._client.regenProg(prog);
288
296
  });
289
297
  }
290
298
  }
@@ -84,8 +84,12 @@ export declare namespace SystemConnector {
84
84
  function getDotAbapgit(devclass: components.DEVCLASS): Promise<Buffer>;
85
85
  function getAbapgitSource(devclass: components.DEVCLASS): Promise<{
86
86
  zip: Buffer;
87
- objects: struct.TADIR[];
87
+ objects: struct.ZTY_SER_OBJ[];
88
+ }>;
89
+ function executePostActivity(data: Buffer, pre?: boolean): Promise<{
90
+ messages: struct.SYMSG[];
91
+ execute?: boolean;
88
92
  }>;
89
- function executePostActivity(data: Buffer): Promise<struct.SYMSG[]>;
90
93
  function readClassDescriptions(clsname: components.SEOCLSNAME): Promise<struct.SEOCLASSTX[]>;
94
+ function regenProg(prog: components.PROGNAME): Promise<void>;
91
95
  }
@@ -506,10 +506,10 @@ var SystemConnector;
506
506
  });
507
507
  }
508
508
  SystemConnector.getAbapgitSource = getAbapgitSource;
509
- function executePostActivity(data) {
509
+ function executePostActivity(data, pre) {
510
510
  return __awaiter(this, void 0, void 0, function* () {
511
511
  yield checkSystemConnector();
512
- return SystemConnector.systemConnector.executePostActivity(data);
512
+ return SystemConnector.systemConnector.executePostActivity(data, pre);
513
513
  });
514
514
  }
515
515
  SystemConnector.executePostActivity = executePostActivity;
@@ -520,4 +520,11 @@ var SystemConnector;
520
520
  });
521
521
  }
522
522
  SystemConnector.readClassDescriptions = readClassDescriptions;
523
+ function regenProg(prog) {
524
+ return __awaiter(this, void 0, void 0, function* () {
525
+ yield checkSystemConnector();
526
+ return SystemConnector.systemConnector.regenProg(prog);
527
+ });
528
+ }
529
+ SystemConnector.regenProg = regenProg;
523
530
  })(SystemConnector || (exports.SystemConnector = SystemConnector = {}));
@@ -8,6 +8,7 @@ import * as struct from "../client/struct";
8
8
  import { ISystemConnectorBase } from "./ISystemConnectorBase";
9
9
  import { AbstractRegistry } from "../registry";
10
10
  export declare const TRM_SERVER_PACKAGE_NAME: string;
11
+ export declare const TRM_SERVER_INTF: string;
11
12
  export declare const TRM_REST_PACKAGE_NAME: string;
12
13
  export declare const SRC_TRKORR_TABL = "ZTRM_SRC_TRKORR";
13
14
  export declare const SKIP_TRKORR_TABL = "ZTRM_SKIP_TRKORR";
@@ -25,6 +26,7 @@ export declare abstract class SystemConnectorBase implements ISystemConnectorBas
25
26
  protected abstract listDevclassObjects(devclass: components.DEVCLASS): Promise<struct.TADIR[]>;
26
27
  protected abstract tdevcInterface(devclass: components.DEVCLASS, parentcl?: components.DEVCLASS, rmParentCl?: boolean, devlayer?: components.DEVLAYER): Promise<void>;
27
28
  protected abstract getR3transInfo(): Promise<string>;
29
+ protected abstract getInstalledPackagesBackend(): Promise<struct.ZTY_TRM_PACKAGE[]>;
28
30
  constructor();
29
31
  getTransportStatus(trkorr: TRKORR): Promise<string>;
30
32
  getPackageWorkbenchTransport(oPackage: TrmPackage): Promise<Transport>;
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.SystemConnectorBase = exports.SKIP_TRKORR_TABL = exports.SRC_TRKORR_TABL = exports.TRM_REST_PACKAGE_NAME = exports.TRM_SERVER_PACKAGE_NAME = void 0;
12
+ exports.SystemConnectorBase = exports.SKIP_TRKORR_TABL = exports.SRC_TRKORR_TABL = exports.TRM_REST_PACKAGE_NAME = exports.TRM_SERVER_INTF = exports.TRM_SERVER_PACKAGE_NAME = void 0;
13
13
  const semver_1 = require("semver");
14
14
  const trm_commons_1 = require("trm-commons");
15
15
  const manifest_1 = require("../manifest");
@@ -18,6 +18,7 @@ const trmPackage_1 = require("../trmPackage");
18
18
  const registry_1 = require("../registry");
19
19
  const node_r3trans_1 = require("node-r3trans");
20
20
  exports.TRM_SERVER_PACKAGE_NAME = 'trm-server';
21
+ exports.TRM_SERVER_INTF = 'ZIF_TRM';
21
22
  exports.TRM_REST_PACKAGE_NAME = 'trm-rest';
22
23
  exports.SRC_TRKORR_TABL = 'ZTRM_SRC_TRKORR';
23
24
  exports.SKIP_TRKORR_TABL = 'ZTRM_SKIP_TRKORR';
@@ -163,6 +164,8 @@ class SystemConnectorBase {
163
164
  }
164
165
  getInstalledPackages() {
165
166
  return __awaiter(this, arguments, void 0, function* (includeSoruces = true, refresh, includeLocals) {
167
+ var trmPackages = [];
168
+ var fromBackend = false;
166
169
  if (!refresh) {
167
170
  if (includeSoruces && this._installedPackagesI) {
168
171
  trm_commons_1.Logger.log(`Cached version of installed packages with sources`, true);
@@ -173,11 +176,52 @@ class SystemConnectorBase {
173
176
  return this._installedPackages;
174
177
  }
175
178
  }
176
- var trmPackages = [];
177
- var packageTransports = [];
178
- trm_commons_1.Logger.log(`Ready to read installed packages`, true);
179
179
  trm_commons_1.Logger.log(`Include sources: ${includeSoruces}`, true);
180
180
  const aSourceTrkorr = includeSoruces ? (yield this.getSourceTrkorr(refresh)) : [];
181
+ const serverExists = yield this.readTable('TADIR', [{ fieldName: 'OBJ_NAME' }], `PGMID EQ 'R3TR' AND OBJECT EQ 'INTF' AND OBJ_NAME EQ '${exports.TRM_SERVER_INTF}'`);
182
+ if (serverExists.length === 1) {
183
+ trm_commons_1.Logger.log(`INTF ${exports.TRM_SERVER_INTF} exists`, true);
184
+ try {
185
+ var installedPackagesBackend = yield this.getInstalledPackagesBackend();
186
+ if (!includeSoruces) {
187
+ installedPackagesBackend = installedPackagesBackend.filter(o => !aSourceTrkorr.includes(o.transport.trkorr));
188
+ }
189
+ if (!includeLocals) {
190
+ installedPackagesBackend = installedPackagesBackend.filter(o => o.registry !== registry_1.LOCAL_RESERVED_KEYWORD);
191
+ }
192
+ for (const o of installedPackagesBackend) {
193
+ const transport = o.transport.trkorr ? new transport_1.Transport(o.transport.trkorr, null, o.transport.migration) : null;
194
+ const manifest = manifest_1.Manifest.fromAbapXml(o.manifest);
195
+ if (transport) {
196
+ manifest.setLinkedTransport(transport);
197
+ }
198
+ const trmPackage = new trmPackage_1.TrmPackage(o.name, registry_1.RegistryProvider.getRegistry(o.registry), manifest);
199
+ if (transport) {
200
+ trmPackage.setDevclass(yield transport.getDevclass(o.tdevc));
201
+ }
202
+ else {
203
+ if (o.tdevc.length === 1) {
204
+ trmPackage.setDevclass(o.tdevc[0].devclass);
205
+ }
206
+ }
207
+ trmPackages.push(trmPackage);
208
+ }
209
+ fromBackend = true;
210
+ }
211
+ catch (e) {
212
+ trmPackages = [];
213
+ trm_commons_1.Logger.error(e.toString(), true);
214
+ }
215
+ }
216
+ if (fromBackend) {
217
+ trm_commons_1.Logger.log(`Packages were fetched from backend`, true);
218
+ return trmPackages;
219
+ }
220
+ else {
221
+ trm_commons_1.Logger.log(`Packages weren't fetched from backend, continue`, true);
222
+ }
223
+ var packageTransports = [];
224
+ trm_commons_1.Logger.log(`Ready to read installed packages`, true);
181
225
  trm_commons_1.Logger.log(`Source trkorr ${JSON.stringify(aSourceTrkorr)}`, true);
182
226
  var aSkipTrkorr = yield this.getIgnoredTrkorr();
183
227
  trm_commons_1.Logger.log(`Ignored trkorr ${JSON.stringify(aSkipTrkorr)}`, true);
@@ -6,7 +6,7 @@ import { TransportContent } from "./TransportContent";
6
6
  import { Documentation } from "./Documentation";
7
7
  import { TrmTransportIdentifier } from "./TrmTransportIdentifier";
8
8
  import { TrmPackage } from "../trmPackage";
9
- import { TROBJTYPE, E070, E071, TRKORR, TR_TARGET, DEVCLASS, TROBJ_NAME, AS4TEXT, PGMID, SOBJ_NAME, TMSSYSNAM } from "../client";
9
+ import { TROBJTYPE, E070, E071, TRKORR, TR_TARGET, DEVCLASS, TROBJ_NAME, AS4TEXT, PGMID, SOBJ_NAME, TMSSYSNAM, TDEVC } from "../client";
10
10
  export declare const COMMENT_OBJ: TROBJTYPE;
11
11
  export declare class Transport {
12
12
  trkorr: TRKORR;
@@ -18,6 +18,7 @@ export declare class Transport {
18
18
  private _docs;
19
19
  private _trmRelevant;
20
20
  private _linkedTrmPackage;
21
+ private _rootDevclass;
21
22
  trmIdentifier?: TrmTransportIdentifier;
22
23
  constructor(trkorr: TRKORR, _trTarget?: TR_TARGET, _migration?: boolean);
23
24
  setTrmIdentifier(identifier?: TrmTransportIdentifier): Transport;
@@ -26,7 +27,7 @@ export declare class Transport {
26
27
  getE070(): Promise<E070>;
27
28
  getE071(): Promise<E071[]>;
28
29
  getTasks(): Promise<Transport[]>;
29
- getDevclass(): Promise<DEVCLASS>;
30
+ getDevclass(aTdevc?: TDEVC[]): Promise<DEVCLASS>;
30
31
  getDate(): Promise<Date>;
31
32
  isTrmRelevant(): Promise<boolean>;
32
33
  download(): Promise<{
@@ -134,47 +134,54 @@ class Transport {
134
134
  return tasks;
135
135
  });
136
136
  }
137
- getDevclass() {
138
- return __awaiter(this, void 0, void 0, function* () {
139
- const aE071 = yield this.getE071();
140
- var aDevclass = aE071.filter(o => o.pgmid === 'R3TR' && o.object === 'DEVC').map(o => o.objName);
141
- if (!systemConnector_1.SystemConnector.getSupportedBulk().getTransportObjects) {
142
- for (const oE071 of aE071) {
143
- if (oE071.pgmid === 'R3TR') {
144
- const tadir = yield systemConnector_1.SystemConnector.getObject(oE071.pgmid, oE071.object, oE071.objName);
145
- if (!aDevclass.includes(tadir.devclass)) {
146
- aDevclass.push(tadir.devclass);
137
+ getDevclass(aTdevc) {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ if (!this._rootDevclass) {
140
+ var aDevclass = [];
141
+ if (!aTdevc) {
142
+ const aE071 = yield this.getE071();
143
+ aDevclass = aE071.filter(o => o.pgmid === 'R3TR' && o.object === 'DEVC').map(o => o.objName);
144
+ if (!systemConnector_1.SystemConnector.getSupportedBulk().getTransportObjects) {
145
+ for (const oE071 of aE071) {
146
+ if (oE071.pgmid === 'R3TR') {
147
+ const tadir = yield systemConnector_1.SystemConnector.getObject(oE071.pgmid, oE071.object, oE071.objName);
148
+ if (!aDevclass.includes(tadir.devclass)) {
149
+ aDevclass.push(tadir.devclass);
150
+ }
151
+ }
147
152
  }
148
153
  }
149
- }
150
- }
151
- else {
152
- const aTadirObjects = yield systemConnector_1.SystemConnector.getTransportObjectsBulk(this.trkorr);
153
- aDevclass = aDevclass.concat(aTadirObjects.map(o => o.devclass));
154
- aDevclass = Array.from(new Set(aDevclass));
155
- }
156
- var aTdevc = [];
157
- for (var devclass of aDevclass) {
158
- while (devclass) {
159
- var tdevc = aTdevc.find(o => o.devclass === devclass);
160
- if (!tdevc) {
161
- tdevc = yield systemConnector_1.SystemConnector.getDevclass(devclass);
162
- aTdevc.push(tdevc);
154
+ else {
155
+ const aTadirObjects = yield systemConnector_1.SystemConnector.getTransportObjectsBulk(this.trkorr);
156
+ aDevclass = aDevclass.concat(aTadirObjects.map(o => o.devclass));
157
+ aDevclass = Array.from(new Set(aDevclass));
158
+ }
159
+ aTdevc = [];
160
+ for (var devclass of aDevclass) {
161
+ while (devclass) {
162
+ var tdevc = aTdevc.find(o => o.devclass === devclass);
163
+ if (!tdevc) {
164
+ tdevc = yield systemConnector_1.SystemConnector.getDevclass(devclass);
165
+ aTdevc.push(tdevc);
166
+ }
167
+ devclass = tdevc.parentcl;
168
+ }
163
169
  }
164
- devclass = tdevc.parentcl;
165
- }
166
- }
167
- var rootDevclass = null;
168
- while (aTdevc.length > 0 && !rootDevclass) {
169
- const hierarchy = (0, commons_1.getPackageHierarchy)(aTdevc);
170
- if (aDevclass.includes(hierarchy.devclass)) {
171
- rootDevclass = hierarchy.devclass;
172
170
  }
173
171
  else {
174
- aTdevc = aTdevc.filter(o => o.devclass !== hierarchy.devclass);
172
+ aDevclass = aTdevc.map(o => o.devclass);
173
+ }
174
+ while (aTdevc.length > 0 && !this._rootDevclass) {
175
+ const hierarchy = (0, commons_1.getPackageHierarchy)(aTdevc);
176
+ if (aDevclass.includes(hierarchy.devclass)) {
177
+ this._rootDevclass = hierarchy.devclass;
178
+ }
179
+ else {
180
+ aTdevc = aTdevc.filter(o => o.devclass !== hierarchy.devclass);
181
+ }
175
182
  }
176
183
  }
177
- return rootDevclass;
184
+ return this._rootDevclass;
178
185
  });
179
186
  }
180
187
  getDate() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trm-core",
3
- "version": "6.5.1",
3
+ "version": "6.7.0",
4
4
  "description": "TRM (Transport Request Manager) Core",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "license": "MIT",
36
36
  "trmDependencies": {
37
- "trm-server": "^2.2.0"
37
+ "trm-server": "^3.0.0"
38
38
  },
39
39
  "dependencies": {
40
40
  "@esm2cjs/normalize-url": "^8.0.0",
@@ -51,6 +51,8 @@
51
51
  "get-root-path": "^3.0.1",
52
52
  "get-stack-trace": "^3.1.1",
53
53
  "lodash": "^4.17.21",
54
+ "minimatch": "^10.0.1",
55
+ "node-html-parser": "^7.0.1",
54
56
  "node-r3trans": "^1.5.0",
55
57
  "object-keys-normalizer": "^1.0.1",
56
58
  "opener": "^1.5.2",