trm-core 9.8.5 → 9.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/changelog.txt CHANGED
@@ -8,6 +8,18 @@ Legend
8
8
  + : added
9
9
  - : removed
10
10
 
11
+ 2026-07-22 v9.10.0
12
+ -------------------
13
+ + changelog publish support
14
+ ! trm-registry-types ^2.4.0
15
+ + async publish
16
+
17
+ 2026-07-20 v9.9.0
18
+ -------------------
19
+ * rest package update
20
+ + error message on unauthenticated publish in public registry
21
+ ! trm-server ^6.4.1
22
+
11
23
  2026-07-20 v9.8.5
12
24
  -------------------
13
25
  ! audit
@@ -32,6 +32,7 @@ export interface PublishActionInput {
32
32
  keepLatestReleaseManifestValues?: boolean;
33
33
  private?: boolean;
34
34
  readme?: string;
35
+ changelog?: string;
35
36
  skipCustomizingTransports?: boolean;
36
37
  customizingTransports?: string | Transport[];
37
38
  noLanguageTransport?: boolean;
@@ -33,6 +33,7 @@ const updatePackageData_1 = require("./updatePackageData");
33
33
  const publishToRegistry_1 = require("./publishToRegistry");
34
34
  const getSourceCode_1 = require("./getSourceCode");
35
35
  const checkAllObjectsReleased_1 = require("./checkAllObjectsReleased");
36
+ const setChangelog_1 = require("./setChangelog");
36
37
  ;
37
38
  const WORKFLOW_NAME = 'publish';
38
39
  function publish(inputData) {
@@ -48,6 +49,7 @@ function publish(inputData) {
48
49
  setManifestValues_1.setManifestValues,
49
50
  setCustomizingTransports_1.setCustomizingTransports,
50
51
  setReadme_1.setReadme,
52
+ setChangelog_1.setChangelog,
51
53
  getSourceCode_1.getSourceCode,
52
54
  checkAllObjectsReleased_1.checkAllObjectsReleased,
53
55
  generateDevcTransport_1.generateDevcTransport,
@@ -64,7 +64,13 @@ exports.init = {
64
64
  context.rawInput.packageData.name = parsedPackageName.fullName;
65
65
  if (registry.getRegistryType() === registry_1.RegistryType.PUBLIC) {
66
66
  trm_commons_1.Logger.log(`Public registry, checking if logged in`, true);
67
- yield registry.whoAmI();
67
+ try {
68
+ yield registry.whoAmI();
69
+ }
70
+ catch (e) {
71
+ trm_commons_1.Logger.error(`Cannot publish to public registry without being logged in!`);
72
+ throw e;
73
+ }
68
74
  }
69
75
  if (!context.rawInput.contextData) {
70
76
  context.rawInput.contextData = {};
@@ -30,7 +30,8 @@ exports.publishToRegistry = {
30
30
  yield context.runtime.trmPackage.package.publish({
31
31
  artifact: context.runtime.trmPackage.artifact,
32
32
  readme: context.rawInput.publishData.readme,
33
- tags: context.rawInput.packageData.tags
33
+ tags: context.rawInput.packageData.tags,
34
+ changelog: context.rawInput.publishData.changelog
34
35
  });
35
36
  })
36
37
  };
@@ -0,0 +1,3 @@
1
+ import { Step } from "@simonegaffurini/sammarksworkflow";
2
+ import { PublishWorkflowContext } from ".";
3
+ export declare const setChangelog: Step<PublishWorkflowContext>;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.setChangelog = void 0;
13
+ const trm_commons_1 = require("trm-commons");
14
+ const registry_1 = require("../../registry");
15
+ exports.setChangelog = {
16
+ name: 'set-changelog',
17
+ filter: (context) => __awaiter(void 0, void 0, void 0, function* () {
18
+ if (context.rawInput.publishData.changelog !== undefined) {
19
+ trm_commons_1.Logger.log(`Skipping changelog input (user provided)`, true);
20
+ return false;
21
+ }
22
+ else {
23
+ if (context.rawInput.packageData.registry.getRegistryType() === registry_1.RegistryType.LOCAL) {
24
+ trm_commons_1.Logger.log(`Skipping changelog input (registry is local)`, true);
25
+ return false;
26
+ }
27
+ else {
28
+ return true;
29
+ }
30
+ }
31
+ }),
32
+ run: (context) => __awaiter(void 0, void 0, void 0, function* () {
33
+ trm_commons_1.Logger.log('Set changelog step', true);
34
+ if (!context.rawInput.contextData.noInquirer) {
35
+ context.rawInput.publishData.changelog = (yield trm_commons_1.Inquirer.prompt([{
36
+ message: `Do you want to write a release changelog?`,
37
+ type: 'confirm',
38
+ name: 'editChangelog',
39
+ default: false
40
+ }, {
41
+ message: 'Write changelog',
42
+ type: 'editor',
43
+ name: 'changelog',
44
+ postfix: '.md',
45
+ when: (hash) => {
46
+ return hash.editChangelog;
47
+ },
48
+ default: `${context.rawInput.packageData.name} changelog
49
+ =================
50
+
51
+ Legend
52
+ ------
53
+ \`\`\`
54
+ * : fixed
55
+ ! : changed
56
+ + : added
57
+ - : removed
58
+ \`\`\`
59
+
60
+ ${new Date().toISOString().split('T')[0]} v${context.runtime.trmPackage.manifest.version}
61
+ -------------------
62
+ \`\`\`
63
+ ...
64
+ \`\`\`
65
+ `
66
+ }])).changelog;
67
+ }
68
+ })
69
+ };
@@ -3,6 +3,7 @@ import * as struct from "./struct";
3
3
  import { IClient } from "./IClient";
4
4
  import { AxiosInstance } from "axios";
5
5
  import { Login, RESTClientError, SapMessage } from ".";
6
+ import { TrmPackageUpdateData } from "../systemConnector";
6
7
  export declare class RESTClient implements IClient {
7
8
  endpoint: string;
8
9
  rfcdest: components.RFCDEST;
@@ -74,6 +75,6 @@ export declare class RESTClient implements IClient {
74
75
  readLogPolling(logID: components.ZTRM_POLLING_ID): Promise<components.ZTRM_POLLING_LAST_MSG>;
75
76
  getTransportImportStatus(trkorr: components.TRKORR, system: components.TMSSYSNAM): Promise<struct.TPSTAT>;
76
77
  getObjectsLocks(objects: struct.TADIR_KEY[]): Promise<struct.ZTRM_OBJ_LOCK[]>;
77
- updateTrmPackageData(data: any): Promise<void>;
78
+ updateTrmPackageData(data: TrmPackageUpdateData): Promise<void>;
78
79
  getTransportTargets(): Promise<components.TARSYSTEM[]>;
79
80
  }
@@ -724,8 +724,11 @@ class RESTClient {
724
724
  }
725
725
  updateTrmPackageData(data) {
726
726
  return __awaiter(this, void 0, void 0, function* () {
727
- yield this._axiosInstance.post('/update_trm_package_data', {
728
- data
727
+ const formData = new FormData.default();
728
+ formData.append('manifest', data.manifest, 'manifest.json');
729
+ formData.append('data', JSON.stringify(Object.assign(Object.assign({}, data), { manifest: undefined })));
730
+ yield this._axiosInstance.post('/update_trm_package_data', formData, {
731
+ headers: formData.getHeaders()
729
732
  });
730
733
  });
731
734
  }
@@ -2,6 +2,7 @@ import * as components from "./components";
2
2
  import * as struct from "./struct";
3
3
  import { IClient } from "./IClient";
4
4
  import { RFCClientError, SapMessage } from ".";
5
+ import { TrmPackageUpdateData } from "../systemConnector";
5
6
  export declare class RFCClient implements IClient {
6
7
  private _rfcClientArgs;
7
8
  private _cLangu;
@@ -75,6 +76,6 @@ export declare class RFCClient implements IClient {
75
76
  readLogPolling(logID: components.ZTRM_POLLING_ID): Promise<components.ZTRM_POLLING_LAST_MSG>;
76
77
  getTransportImportStatus(trkorr: components.TRKORR, system: components.TMSSYSNAM): Promise<struct.TPSTAT>;
77
78
  getObjectsLocks(objects: struct.TADIR_KEY[]): Promise<struct.ZTRM_OBJ_LOCK[]>;
78
- updateTrmPackageData(data: any): Promise<void>;
79
+ updateTrmPackageData(data: TrmPackageUpdateData): Promise<void>;
79
80
  getTransportTargets(): Promise<components.TARSYSTEM[]>;
80
81
  }
@@ -13,7 +13,7 @@ export declare abstract class AbstractRegistry {
13
13
  abstract getPackage: (fullName: string, version: string) => Promise<Package>;
14
14
  abstract downloadArtifact: (fullName: string, version: string) => Promise<TrmArtifact>;
15
15
  abstract validatePublish: (fullName: string, version: string, isPrivate: boolean) => Promise<void>;
16
- abstract publish: (fullName: string, version: string, artifact: TrmArtifact, readme?: string, tags?: string) => Promise<Package | void>;
16
+ abstract publish: (fullName: string, version: string, artifact: TrmArtifact, readme?: string, tags?: string, changelog?: string) => Promise<Package | void>;
17
17
  abstract unpublish: (fullName: string, version: string) => Promise<void>;
18
18
  abstract deprecate: (fullName: string, version: string, deprecate: Deprecate) => Promise<void>;
19
19
  abstract addDistTag: (fullName: string, distTag: DistTagAdd) => Promise<void>;
@@ -26,7 +26,7 @@ export declare class RegistryV2 implements AbstractRegistry {
26
26
  getPackage(fullName: string, version?: string): Promise<Package>;
27
27
  downloadArtifact(fullName: string, version?: string): Promise<TrmArtifact>;
28
28
  validatePublish(fullName: string, version: string, isPrivate: boolean): Promise<void>;
29
- publish(fullName: string, version: string, artifact: TrmArtifact, readme?: string, tags?: string): Promise<void>;
29
+ publish(fullName: string, version: string, artifact: TrmArtifact, readme?: string, tags?: string, changelog?: string): Promise<void>;
30
30
  unpublish(fullName: string, version: string): Promise<void>;
31
31
  deprecate(fullName: string, version: string, deprecate: Deprecate): Promise<void>;
32
32
  addDistTag(fullName: string, distTag: DistTagAdd): Promise<void>;
@@ -459,7 +459,7 @@ class RegistryV2 {
459
459
  }
460
460
  });
461
461
  }
462
- publish(fullName, version, artifact, readme, tags) {
462
+ publish(fullName, version, artifact, readme, tags, changelog) {
463
463
  return __awaiter(this, void 0, void 0, function* () {
464
464
  const fileName = `${fullName}_v${version}`.replace('.', '_') + '.trm';
465
465
  const formData = new FormData.default();
@@ -473,14 +473,46 @@ class RegistryV2 {
473
473
  contentType: 'text/markdown'
474
474
  });
475
475
  }
476
+ if (changelog) {
477
+ formData.append('changelog', Buffer.from(changelog), {
478
+ filename: 'changelog.md',
479
+ contentType: 'text/markdown'
480
+ });
481
+ }
476
482
  var params = { version, tags };
477
483
  if (!tags) {
478
484
  delete params.tags;
479
485
  }
480
- yield this._axiosInstance.post(`/publish/${fullName}`, formData, {
486
+ const response = yield this._axiosInstance.post(`/publish/${fullName}`, formData, {
481
487
  params,
482
488
  headers: formData.getHeaders()
483
489
  });
490
+ if (response.status === 202) {
491
+ let publishStatus = response.data;
492
+ const progressPoolUrl = publishStatus.progress_pool_url;
493
+ const logProgress = trm_commons_1.Logger.progressbar(`↑ ${fullName} ${version} [{bar}] {value}/{total} {message} | Last refresh: {lastRefresh}`, '>');
494
+ logProgress.start(publishStatus.steps, publishStatus.current_step, {
495
+ message: publishStatus.current_step_message || '',
496
+ lastRefresh: new Date().toLocaleTimeString()
497
+ });
498
+ try {
499
+ while (publishStatus.current_step < publishStatus.steps) {
500
+ yield new Promise(resolve => setTimeout(resolve, 5000));
501
+ publishStatus = (yield this._axiosInstance.get(progressPoolUrl)).data;
502
+ logProgress.update(publishStatus.current_step, {
503
+ message: publishStatus.current_step_message || '',
504
+ lastCheck: new Date().toLocaleTimeString()
505
+ });
506
+ }
507
+ }
508
+ catch (e) {
509
+ trm_commons_1.Logger.error(e.toString());
510
+ trm_commons_1.Logger.warning(`Unable to check status on registry, check manually`);
511
+ }
512
+ finally {
513
+ logProgress.stop();
514
+ }
515
+ }
484
516
  });
485
517
  }
486
518
  unpublish(fullName, version) {
@@ -5,6 +5,14 @@ import { ISystemConnectorBase } from "./ISystemConnectorBase";
5
5
  import { RESTConnection } from "./RESTConnection";
6
6
  import { RFCConnection } from "./RFCConnection";
7
7
  import { SystemConnectorSupportedBulk } from "./SystemConnectorSupportedBulk";
8
+ export interface TrmPackageUpdateData {
9
+ package_name: string;
10
+ package_registry: string;
11
+ manifest: Buffer;
12
+ trkorr: string;
13
+ integrity: string;
14
+ devclass: string;
15
+ }
8
16
  export interface ISystemConnector extends ISystemConnectorBase {
9
17
  supportedBulk: SystemConnectorSupportedBulk;
10
18
  isStateless: boolean;
@@ -64,6 +72,6 @@ export interface ISystemConnector extends ISystemConnectorBase {
64
72
  readLogPolling: (logID: components.ZTRM_POLLING_ID) => Promise<components.ZTRM_POLLING_LAST_MSG>;
65
73
  getTransportImportStatus: (trkorr: components.TRKORR, system: components.TMSSYSNAM) => Promise<struct.TPSTAT>;
66
74
  getObjectsLocks: (objects: struct.TADIR_KEY[]) => Promise<struct.ZTRM_OBJ_LOCK[]>;
67
- updateTrmPackageData: (data: any) => Promise<void>;
75
+ updateTrmPackageData: (data: TrmPackageUpdateData) => Promise<void>;
68
76
  getTransportTargets: () => Promise<components.TARSYSTEM[]>;
69
77
  }
@@ -1,7 +1,7 @@
1
1
  import { DEVCLASS } from "../client/components";
2
2
  import { TADIR } from "../client/struct";
3
3
  import { Login } from "../client/Login";
4
- import { ISystemConnector } from "./ISystemConnector";
4
+ import { ISystemConnector, TrmPackageUpdateData } from "./ISystemConnector";
5
5
  import * as components from "../client/components";
6
6
  import * as struct from "../client/struct";
7
7
  import { SystemConnectorBase } from "./SystemConnectorBase";
@@ -90,6 +90,6 @@ export declare class RESTSystemConnector extends SystemConnectorBase implements
90
90
  readLogPolling(logID: components.ZTRM_POLLING_ID): Promise<components.ZTRM_POLLING_LAST_MSG>;
91
91
  getTransportImportStatus(trkorr: components.TRKORR, system: components.TMSSYSNAM): Promise<struct.TPSTAT>;
92
92
  getObjectsLocks(objects: struct.TADIR_KEY[]): Promise<struct.ZTRM_OBJ_LOCK[]>;
93
- updateTrmPackageData(data: any): Promise<void>;
93
+ updateTrmPackageData(data: TrmPackageUpdateData): Promise<void>;
94
94
  getTransportTargets(): Promise<components.TARSYSTEM[]>;
95
95
  }
@@ -3,7 +3,7 @@ import { DEVCLASS } from "../client/components";
3
3
  import { TADIR } from "../client/struct";
4
4
  import { RFCConnection } from "./RFCConnection";
5
5
  import { Login } from "../client/Login";
6
- import { ISystemConnector } from "./ISystemConnector";
6
+ import { ISystemConnector, TrmPackageUpdateData } from "./ISystemConnector";
7
7
  import * as components from "../client/components";
8
8
  import * as struct from "../client/struct";
9
9
  import { SystemConnectorBase } from "./SystemConnectorBase";
@@ -88,6 +88,6 @@ export declare class RFCSystemConnector extends SystemConnectorBase implements I
88
88
  readLogPolling(logID: components.ZTRM_POLLING_ID): Promise<components.ZTRM_POLLING_LAST_MSG>;
89
89
  getTransportImportStatus(trkorr: components.TRKORR, system: components.TMSSYSNAM): Promise<struct.TPSTAT>;
90
90
  getObjectsLocks(objects: struct.TADIR_KEY[]): Promise<struct.ZTRM_OBJ_LOCK[]>;
91
- updateTrmPackageData(data: any): Promise<void>;
91
+ updateTrmPackageData(data: TrmPackageUpdateData): Promise<void>;
92
92
  getTransportTargets(): Promise<components.TARSYSTEM[]>;
93
93
  }
@@ -1,7 +1,7 @@
1
1
  import { TRKORR, DEVCLASS, TDEVC, TADIR, PGMID, TROBJTYPE, SOBJ_NAME, ClientError } from "../client";
2
2
  import { AbstractRegistry } from "../registry";
3
3
  import { TrmPackage } from "../trmPackage";
4
- import { ISystemConnector } from "./ISystemConnector";
4
+ import { ISystemConnector, TrmPackageUpdateData } from "./ISystemConnector";
5
5
  import { InstallPackage } from "./InstallPackage";
6
6
  import { SapMessage } from "../client/SapMessage";
7
7
  import * as components from "../client/components";
@@ -104,5 +104,5 @@ export declare namespace SystemConnector {
104
104
  function getTransportImportStatus(trkorr: components.TRKORR, system: components.TMSSYSNAM): Promise<struct.TPSTAT>;
105
105
  function getTimezone(): Promise<string>;
106
106
  function getObjectsLocks(objects: struct.TADIR_KEY[]): Promise<struct.ZTRM_OBJ_LOCK[]>;
107
- function updateTrmPackageData(data: any): Promise<void>;
107
+ function updateTrmPackageData(data: TrmPackageUpdateData): Promise<void>;
108
108
  }
@@ -25,6 +25,7 @@ export declare class TrmPackage {
25
25
  artifact: TrmArtifact;
26
26
  readme?: string;
27
27
  tags?: string[];
28
+ changelog?: string;
28
29
  }): Promise<TrmPackage>;
29
30
  compareRegistry(registry: AbstractRegistry): boolean;
30
31
  compareName(name: string): boolean;
@@ -51,7 +51,7 @@ class TrmPackage {
51
51
  tags = data.tags.join(',');
52
52
  }
53
53
  trm_commons_1.Logger.loading(`Publishing "${packageName}" ${packageVersion} to registry "${this.registry.name}"...`, false);
54
- yield this.registry.publish(packageName, packageVersion, artifact, data.readme, tags);
54
+ yield this.registry.publish(packageName, packageVersion, artifact, data.readme, tags, data.changelog);
55
55
  this.manifest = new manifest_1.Manifest(trmManifest);
56
56
  return this;
57
57
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trm-core",
3
- "version": "9.8.5",
3
+ "version": "9.10.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": "^6.2.0"
37
+ "trm-server": "^6.4.1"
38
38
  },
39
39
  "dependencies": {
40
40
  "@esm2cjs/normalize-url": "^8.0.0",
@@ -62,7 +62,7 @@
62
62
  "semver": "^7.5.4",
63
63
  "semver-sort": "^1.0.0",
64
64
  "spdx-license-ids": "^3.0.13",
65
- "trm-registry-types": "^2.1.0",
65
+ "trm-registry-types": "^2.4.0",
66
66
  "xml-beautify": "^1.2.3",
67
67
  "xml-js": "^1.6.11"
68
68
  },