trm-client 7.3.5 → 7.4.1

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-03-03 v7.4.1
12
+ -------------------
13
+ ! trm-core ^8.4.1
14
+ * fix version not satisfied in info command
15
+
16
+ 2026-03-03 v7.4.0
17
+ -------------------
18
+ ! trm-core ^8.4.0
19
+ ! removed npm global path from settings
20
+ ! update cache usage
21
+ ! info command with latest in range
22
+
11
23
  2026-02-23 v7.3.5
12
24
  -------------------
13
25
  * info command
@@ -162,7 +162,7 @@ class AbstractCommand {
162
162
  return __awaiter(this, void 0, void 0, function* () {
163
163
  if (!this.trmDependenciesCheck) {
164
164
  const packages = yield this.getSystemPackages();
165
- this.trmDependenciesCheck = yield Core.checkCoreTrmDependencies(packages);
165
+ this.trmDependenciesCheck = yield Core.checkCoreTrmDependencies(packages, utils_1.GlobalContext.getInstance().getGlobalNodeModules());
166
166
  }
167
167
  return this.trmDependenciesCheck;
168
168
  });
@@ -252,7 +252,7 @@ class AbstractCommand {
252
252
  checkTrmDependencies() {
253
253
  return __awaiter(this, void 0, void 0, function* () {
254
254
  const trmDependenciesCheck = yield this.getTrmDependenciesCheck();
255
- const trmDependencies = Core.getCoreTrmDependencies();
255
+ const trmDependencies = Core.getCoreTrmDependencies(utils_1.GlobalContext.getInstance().getGlobalNodeModules());
256
256
  trmDependenciesCheck.missingDependencies.forEach(missingDependency => {
257
257
  if (this.onTrmDepMissing(missingDependency)) {
258
258
  throw new Error(`Package "${missingDependency}" is not installed on ${Core.SystemConnector.getDest()}.`);
@@ -4,7 +4,7 @@ export declare class Info extends AbstractCommand {
4
4
  protected init(): void;
5
5
  protected onTrmDepMissing(dependency: string): boolean;
6
6
  protected onTrmDepVersionNotSatisfied(trmPackage: TrmPackage): boolean;
7
- private getNodeRfcVersion;
8
7
  private getNpmLatestForText;
8
+ private flat;
9
9
  protected handler(): Promise<void>;
10
10
  }
@@ -34,29 +34,21 @@ class Info extends AbstractCommand_1.AbstractCommand {
34
34
  onTrmDepVersionNotSatisfied(trmPackage) {
35
35
  return false;
36
36
  }
37
- getNodeRfcVersion(npmGlobal) {
38
- var file;
39
- try {
40
- file = (0, fs_1.readFileSync)((0, path_1.join)(npmGlobal, `/node-rfc/package.json`));
41
- }
42
- catch (e) {
43
- }
44
- if (!file) {
45
- trm_commons_1.Logger.warning(`Library node-rfc was not found!`, true);
46
- }
47
- else {
48
- return JSON.parse(file.toString()).version;
49
- }
50
- }
51
- getNpmLatestForText(packageName, installedVersion, text) {
37
+ getNpmLatestForText(packageName, installedVersion, range) {
52
38
  return __awaiter(this, void 0, void 0, function* () {
39
+ var text = ``;
53
40
  try {
54
- const latestVersion = yield (0, utils_1.getNpmPackageLatestVersion)(packageName);
55
- if ((0, semver_1.gte)(installedVersion, latestVersion)) {
56
- text += ` ${chalk_1.default.bgGreen('LATEST')}`;
41
+ const latestVersion = yield (0, utils_1.getNpmPackageLatestVersion)(packageName, range);
42
+ if ((0, semver_1.gte)(installedVersion, latestVersion.latest)) {
43
+ if (!(0, semver_1.eq)(latestVersion.latest, latestVersion.actualLatest)) {
44
+ text += ` ${chalk_1.default.bgGreen('LATEST COMPATIBLE')}`;
45
+ }
46
+ else {
47
+ text += ` ${chalk_1.default.bgGreen('LATEST')}`;
48
+ }
57
49
  }
58
50
  else {
59
- text += ` ${chalk_1.default.bold('v' + latestVersion + ' available')}`;
51
+ text += ` ${chalk_1.default.bold('v' + latestVersion.latest + ' available')}`;
60
52
  }
61
53
  }
62
54
  catch (e) {
@@ -65,41 +57,61 @@ class Info extends AbstractCommand_1.AbstractCommand {
65
57
  return text;
66
58
  });
67
59
  }
60
+ flat(deps, globalNodeModulesPath) {
61
+ var _a;
62
+ const isWanted = (k) => k.startsWith("trm-") || k === "node-r3trans";
63
+ const out = {};
64
+ const seen = new Set();
65
+ const q = Object.entries(deps).filter(([k]) => isWanted(k));
66
+ while (q.length) {
67
+ const [k, v] = q.pop();
68
+ if (seen.has(k))
69
+ continue;
70
+ seen.add(k);
71
+ const pkg = (0, trm_core_1.getNodePackage)(globalNodeModulesPath, k);
72
+ const installedVersion = pkg === null || pkg === void 0 ? void 0 : pkg.version;
73
+ if (!out[k]) {
74
+ out[k] = {
75
+ range: v,
76
+ installedVersion
77
+ };
78
+ }
79
+ const d = (_a = pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) !== null && _a !== void 0 ? _a : {};
80
+ for (const [kk, vv] of Object.entries(d)) {
81
+ if (isWanted(kk) && !seen.has(kk)) {
82
+ q.push([kk, vv]);
83
+ }
84
+ }
85
+ }
86
+ return out;
87
+ }
68
88
  handler() {
69
89
  return __awaiter(this, void 0, void 0, function* () {
70
- var _a, _b;
71
90
  trm_commons_1.Logger.loading(`Reading data...`);
72
- const npmGlobal = utils_1.GlobalContext.getInstance().getSettings().globalNodeModules;
91
+ const globalNodeModulesPath = utils_1.GlobalContext.getInstance().getGlobalNodeModules();
73
92
  const clientLatest = yield this.getCliVersionStatus();
74
93
  const clientVersion = (0, utils_1.getClientVersion)();
75
- const clientDependencies = (0, utils_1.getClientNodeDependencies)();
76
- const trmDependencies = (0, trm_core_1.getCoreTrmDependencies)();
94
+ const dependencies = this.flat((0, utils_1.getClientNodeDependencies)(), globalNodeModulesPath);
95
+ const trmDependencies = (0, trm_core_1.getCoreTrmDependencies)(globalNodeModulesPath);
77
96
  const trmDependenciesInstances = (yield this.getTrmDependenciesCheck()).dependencies;
78
97
  const trmMissingDependencies = (yield this.getTrmDependenciesCheck()).missingDependencies;
79
- const nodeRfcVersion = this.getNodeRfcVersion(npmGlobal);
98
+ const trmNotSatisfiedDependencies = (yield this.getTrmDependenciesCheck()).versionNotSatisfiedDependencies;
99
+ const nodeRfcPackage = (0, utils_1.getNodeRfcPackage)();
80
100
  const packages = yield this.getSystemPackages();
81
101
  const trmRest = packages.find(o => o.compareName("trm-rest") && o.compareRegistry(trm_core_1.RegistryProvider.getRegistry()));
82
- const nodeR3transVersion = (_a = (0, trm_core_1.getNodePackage)("node-r3trans")) === null || _a === void 0 ? void 0 : _a.version;
83
- var clientDependenciesTree = [];
84
- if (clientDependencies) {
85
- for (const d of Object.keys(clientDependencies).filter(k => k.startsWith('trm'))) {
86
- var dText = ``;
87
- var dInstalledVersion = (_b = (0, trm_core_1.getNodePackage)(d)) === null || _b === void 0 ? void 0 : _b.version;
88
- if (dInstalledVersion) {
89
- dText = ` -> ${dInstalledVersion}`;
90
- dText = yield this.getNpmLatestForText(d, dInstalledVersion, dText);
91
- }
92
- clientDependenciesTree.push({
93
- text: `${d} ${clientDependencies[d]}${dText}`,
94
- children: []
95
- });
96
- }
102
+ var dependenciesTree = [];
103
+ for (const d of Object.keys(dependencies)) {
104
+ const dText = ` -> ${dependencies[d].installedVersion} ${yield this.getNpmLatestForText(d, dependencies[d].installedVersion, dependencies[d].range)}`;
105
+ dependenciesTree.push({
106
+ text: `${d} ${dependencies[d].range}${dText}`,
107
+ children: []
108
+ });
97
109
  }
98
110
  var serverDependenciesTree = [];
99
111
  if (trmDependencies) {
100
112
  for (const d of Object.keys(trmDependencies)) {
101
113
  var dText = ``;
102
- const oTrmPackage = trmDependenciesInstances.find(o => o.compareName(d));
114
+ const oTrmPackage = trmDependenciesInstances.concat(trmNotSatisfiedDependencies).find(o => o.compareName(d));
103
115
  if (oTrmPackage) {
104
116
  var dInstalledVersion;
105
117
  try {
@@ -111,12 +123,18 @@ class Info extends AbstractCommand_1.AbstractCommand {
111
123
  if (dInstalledVersion) {
112
124
  dText = ` -> ${dInstalledVersion}`;
113
125
  try {
114
- const dLatestVersion = (yield oTrmPackage.registry.getPackage(oTrmPackage.packageName, 'latest')).manifest.version;
115
- if ((0, semver_1.gte)(dInstalledVersion, dLatestVersion)) {
116
- dText += ` ${chalk_1.default.bgGreen('LATEST')}`;
126
+ const dLatestVersion = yield oTrmPackage.registry.getPackage(oTrmPackage.packageName, 'latest');
127
+ const dMax = (0, semver_1.maxSatisfying)(dLatestVersion.versions, trmDependencies[d]);
128
+ if ((0, semver_1.gte)(dInstalledVersion, dMax)) {
129
+ if (!(0, semver_1.eq)(dLatestVersion.dist_tags.latest, dMax)) {
130
+ dText += ` ${chalk_1.default.bgGreen('LATEST COMPATIBLE')}`;
131
+ }
132
+ else {
133
+ dText += ` ${chalk_1.default.bgGreen('LATEST')}`;
134
+ }
117
135
  }
118
136
  else {
119
- dText += ` ${chalk_1.default.bold('v' + dLatestVersion + ' available')}`;
137
+ dText += ` ${chalk_1.default.bold('v' + dLatestVersion.dist_tags.latest + ' available')}`;
120
138
  }
121
139
  }
122
140
  catch (e) {
@@ -125,13 +143,7 @@ class Info extends AbstractCommand_1.AbstractCommand {
125
143
  }
126
144
  }
127
145
  else {
128
- const missingDependency = trmMissingDependencies.find(o => {
129
- if (typeof (o) === 'string') {
130
- if (o === d) {
131
- return o;
132
- }
133
- }
134
- });
146
+ const missingDependency = trmMissingDependencies.find(o => o === d);
135
147
  if (missingDependency) {
136
148
  try {
137
149
  dText = ` -> ${chalk_1.default.bgRed(missingDependency.manifest.get().version)}`;
@@ -155,11 +167,11 @@ class Info extends AbstractCommand_1.AbstractCommand {
155
167
  }
156
168
  var clientChildrenTree = [{
157
169
  text: `trm-client ${clientVersion} ${(0, semver_1.gte)(clientLatest.localVersion, clientLatest.latestVersion) ? chalk_1.default.bgGreen('LATEST') : chalk_1.default.bold('v' + clientLatest.latestVersion + ' available')}`,
158
- children: clientDependenciesTree
170
+ children: dependenciesTree
159
171
  }];
160
- if (nodeRfcVersion) {
172
+ if (nodeRfcPackage && nodeRfcPackage.version) {
161
173
  clientChildrenTree.push({
162
- text: yield this.getNpmLatestForText('node-rfc', nodeRfcVersion, `node-rfc ${nodeRfcVersion}`),
174
+ text: `node-rfc ${nodeRfcPackage.version} ${yield this.getNpmLatestForText('node-rfc', nodeRfcPackage.version)}`,
163
175
  children: []
164
176
  });
165
177
  }
@@ -169,18 +181,6 @@ class Info extends AbstractCommand_1.AbstractCommand {
169
181
  children: []
170
182
  });
171
183
  }
172
- if (nodeR3transVersion) {
173
- clientChildrenTree.push({
174
- text: yield this.getNpmLatestForText('node-r3trans', nodeR3transVersion, `node-r3trans ${nodeR3transVersion}`),
175
- children: []
176
- });
177
- }
178
- else {
179
- clientChildrenTree.push({
180
- text: `node-r3trans ${chalk_1.default.bold('not found')}`,
181
- children: []
182
- });
183
- }
184
184
  const clientTree = {
185
185
  text: chalk_1.default.bold(`Client`),
186
186
  children: clientChildrenTree
@@ -197,11 +197,11 @@ class Info extends AbstractCommand_1.AbstractCommand {
197
197
  try {
198
198
  const installedVersion = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(plugin.location, 'package.json')).toString()).version;
199
199
  pluginsTree.children.push({
200
- text: yield this.getNpmLatestForText(plugin.name, installedVersion, `${plugin.name} ${installedVersion}`),
200
+ text: `${plugin.name} ${installedVersion} ${yield this.getNpmLatestForText(plugin.name, installedVersion)}`,
201
201
  children: []
202
202
  });
203
203
  }
204
- catch (_c) {
204
+ catch (_a) {
205
205
  pluginsTree.children.push({
206
206
  text: plugin.name,
207
207
  children: []
@@ -49,7 +49,6 @@ class Install extends AbstractCommand_1.AbstractCommand {
49
49
  this.command.argument(`<filename>`, `Name (or path) of the file.`);
50
50
  this.command.description(`Import a package (as a file) into system.`);
51
51
  }
52
- this.command.option(`-t, --timeout <seconds>`, `Transport import timeout (in seconds)`, `180`);
53
52
  this.command.option(`-T, --transport-layer <transport layer>`, `Package transport layer. (default: System default)`);
54
53
  this.command.option(`--no-deps`, `Do not install dependencies.`);
55
54
  this.command.option(`--no-obj-type`, `Do not check object types before import.`);
@@ -58,7 +57,7 @@ class Install extends AbstractCommand_1.AbstractCommand {
58
57
  this.command.option(`--no-lang-tr`, `Do not import language (translation) transport.`);
59
58
  this.command.option(`--no-cust-tr`, `Do not import customizing transports.`);
60
59
  this.command.option(`--no-install-tr`, `Do not create install transport.`);
61
- this.command.option(`--no-namespace`, `Do not import namespace.`);
60
+ this.command.option(`--namespace`, `Import customer namespace.`);
62
61
  this.command.option(`--package-replacements <replacements>`, `SAP Package replacements (JSON or path to JSON file)`);
63
62
  this.command.option(`--install-tr-target <target>`, `Install transport target system`);
64
63
  this.command.option(`--no-prompts`, `No prompts (will force some decisions).`);
@@ -177,7 +176,6 @@ class Install extends AbstractCommand_1.AbstractCommand {
177
176
  import: {
178
177
  noLang: !this.args.langTr,
179
178
  noCust: !this.args.custTr,
180
- timeout: this.parseNumberArg('timeout'),
181
179
  replaceExistingTransports: false
182
180
  },
183
181
  installDevclass: {
@@ -39,7 +39,6 @@ class Publish extends AbstractCommand_1.AbstractCommand {
39
39
  this.command.option(`--no-keep-manifest`, `Don't default to previous release manifest values.`);
40
40
  }
41
41
  this.command.option(`-P, --sap-package <sap package>`, `SAP Package.`);
42
- this.command.option(`-t, --timeout <seconds>`, `Transport release timeout (in seconds)`, `180`);
43
42
  this.command.option(`-T, --target <target>`, `Transport release target.`);
44
43
  this.command.option(`--no-lang-tr`, `Do not generate language (translation) transport.`);
45
44
  this.command.option(`--no-cust-tr`, `Do not generate customizing transport.`);
@@ -134,7 +133,6 @@ class Publish extends AbstractCommand_1.AbstractCommand {
134
133
  readme: this.parseTextArg('readme')
135
134
  },
136
135
  systemData: {
137
- releaseTimeout: this.parseNumberArg('timeout'),
138
136
  transportTarget: this.args.target
139
137
  }
140
138
  });
@@ -71,13 +71,13 @@ function connect(commandArgs_1) {
71
71
  const force = commandArgs.force ? true : false;
72
72
  var type = commandArgs.type;
73
73
  var aInputType = [];
74
- var aSapLogonConnections;
74
+ var aSapLogonConnections = [];
75
75
  const aAlias = systemAlias_1.SystemAlias.getAll();
76
- try {
77
- aSapLogonConnections = yield (0, utils_1.getSapLogonConnections)();
78
- }
79
- catch (e) {
80
- aSapLogonConnections = [];
76
+ if ((0, utils_1.getNodeRfcPackage)()) {
77
+ try {
78
+ aSapLogonConnections = yield (0, utils_1.getSapLogonConnections)();
79
+ }
80
+ catch (_a) { }
81
81
  }
82
82
  if (addNoConnection) {
83
83
  aInputType.push({
@@ -58,7 +58,7 @@ class RegistryAlias {
58
58
  return this;
59
59
  }
60
60
  getRegistry() {
61
- return new trm_core_1.RegistryV2(this._endpoint, this._name);
61
+ return new trm_core_1.RegistryV2(this._endpoint, this._name, (0, utils_1.getCoreVersion)());
62
62
  }
63
63
  static generateFile(content, filePath) {
64
64
  if (!filePath) {
@@ -4,4 +4,5 @@ export type Cache = {
4
4
  };
5
5
  export type CacheData = {
6
6
  latestVersion?: Cache;
7
+ globalNpmPath?: Cache;
7
8
  };
@@ -7,7 +7,7 @@ export declare class DummyConnector implements ISystemConnector {
7
7
  getLogonLanguage: (c: boolean) => "X" | "XX";
8
8
  getLogonUser: () => string;
9
9
  connect: () => Promise<void>;
10
- closeConnection: () => Promise<any>;
10
+ closeConnection: () => Promise<void>;
11
11
  checkConnection: () => Promise<boolean>;
12
12
  ping: () => Promise<string>;
13
13
  getFileSystem: () => Promise<any>;
@@ -88,4 +88,6 @@ export declare class DummyConnector implements ISystemConnector {
88
88
  getObjectDependencies: () => Promise<any>;
89
89
  getTableKeys: () => Promise<any>;
90
90
  getRootDevclass: () => Promise<any>;
91
+ getTransportImportStatus: () => Promise<any>;
92
+ getTimezone: () => Promise<string>;
91
93
  }
@@ -30,7 +30,9 @@ class DummyConnector {
30
30
  this.connect = () => __awaiter(this, void 0, void 0, function* () {
31
31
  return;
32
32
  });
33
- this.closeConnection = () => __awaiter(this, void 0, void 0, function* () { return this._throw(); });
33
+ this.closeConnection = () => __awaiter(this, void 0, void 0, function* () {
34
+ return;
35
+ });
34
36
  this.checkConnection = () => __awaiter(this, void 0, void 0, function* () { return true; });
35
37
  this.ping = () => __awaiter(this, void 0, void 0, function* () { return 'PONG'; });
36
38
  this.getFileSystem = () => __awaiter(this, void 0, void 0, function* () { return this._throw(); });
@@ -115,6 +117,10 @@ class DummyConnector {
115
117
  this.getObjectDependencies = () => __awaiter(this, void 0, void 0, function* () { return this._throw(); });
116
118
  this.getTableKeys = () => __awaiter(this, void 0, void 0, function* () { return this._throw(); });
117
119
  this.getRootDevclass = () => __awaiter(this, void 0, void 0, function* () { return this._throw(); });
120
+ this.getTransportImportStatus = () => __awaiter(this, void 0, void 0, function* () { return this._throw(); });
121
+ this.getTimezone = () => __awaiter(this, void 0, void 0, function* () {
122
+ return 'UTC';
123
+ });
118
124
  }
119
125
  _throw() {
120
126
  throw new Error(`No connection to SAP server.`);
@@ -1,4 +1,3 @@
1
- import { CacheData } from ".";
2
1
  import { SettingsData } from ".";
3
2
  import { IConnect, PluginModule } from "trm-commons";
4
3
  export declare class GlobalContext {
@@ -10,7 +9,8 @@ export declare class GlobalContext {
10
9
  private _plugins;
11
10
  constructor();
12
11
  getSettings(): SettingsData;
13
- getCache(): CacheData;
12
+ getGlobalNodeModules(): string;
13
+ getLatestVersion(): string;
14
14
  load(): Promise<void>;
15
15
  getPlugins(): PluginModule[];
16
16
  getConnections(): IConnect[];
@@ -21,6 +21,7 @@ export declare class GlobalContext {
21
21
  private getSettingsFilePath;
22
22
  private getCacheFilePath;
23
23
  private getDefaultSettings;
24
+ private setGlobalNpmPathInternal;
24
25
  private getSettingsInternal;
25
26
  private getCacheInternal;
26
27
  private generateSettingsFile;
@@ -63,7 +63,7 @@ class RESTConnectExtended extends trm_commons_1.RESTConnect {
63
63
  class RFCConnectExtended extends trm_commons_1.RFCConnect {
64
64
  getSystemConnector() {
65
65
  const data = this.getData();
66
- return new trm_core_1.RFCSystemConnector(data, data, (0, _1.getTempFolder)(), GlobalContext.getInstance().getSettings().globalNodeModules);
66
+ return new trm_core_1.RFCSystemConnector(data, data, (0, _1.getTempFolder)(), GlobalContext.getInstance().getGlobalNodeModules());
67
67
  }
68
68
  }
69
69
  class GlobalContext {
@@ -83,15 +83,32 @@ class GlobalContext {
83
83
  getSettings() {
84
84
  return this._settings;
85
85
  }
86
- getCache() {
87
- return this._cache;
86
+ getGlobalNodeModules() {
87
+ if (!this._cache.globalNpmPath) {
88
+ this.setGlobalNpmPathInternal();
89
+ }
90
+ return this._cache.globalNpmPath.data;
91
+ }
92
+ getLatestVersion() {
93
+ return this._cache.latestVersion.data;
88
94
  }
89
95
  load() {
90
96
  return __awaiter(this, void 0, void 0, function* () {
97
+ this.setGlobalNpmPathInternal();
98
+ const latestVersionCache = this._cache.latestVersion;
99
+ if (!latestVersionCache || (latestVersionCache.ts && Date.now() - latestVersionCache.ts > this.getSettings().cliUpdateCheckCache * 1000)) {
100
+ trm_commons_1.Logger.loading(`Cache expired, setting client latest version...`, true);
101
+ const version = (yield (0, _1.getNpmPackageLatestVersion)('trm-client')).latest;
102
+ trm_commons_1.Logger.log(`Client latest version set to ${version}`, true);
103
+ this.setCache('latestVersion', version);
104
+ }
91
105
  if (!this._pluginsLoaded) {
106
+ trm_commons_1.Logger.loading(`Loading plugins...`, true);
92
107
  this._plugins = yield trm_commons_1.Plugin.load({
93
- globalNodeModulesPath: this._settings.globalNodeModules
108
+ globalNodeModulesPath: this.getGlobalNodeModules()
94
109
  });
110
+ trm_commons_1.Logger.log(`Loaded ${this._plugins.length} plugins: ${this._plugins.map(o => o.name).join(', ')}`, true);
111
+ trm_commons_1.Logger.loading(`Calling event onContextLoadConnections...`, true);
95
112
  this._connections = yield trm_commons_1.Plugin.call("client", "onContextLoadConnections", [new RESTConnectExtended(), new RFCConnectExtended()]);
96
113
  this._pluginsLoaded = true;
97
114
  }
@@ -132,39 +149,62 @@ class GlobalContext {
132
149
  return path_1.default.join((0, _1.getRoamingFolder)(), CACHE_FILE_NAME);
133
150
  }
134
151
  getDefaultSettings() {
135
- var sapLandscape = path_1.default.join((0, _1.getRoamingPath)(), process.platform === 'win32' ? 'SAP\\Common\\SAPUILandscape.xml' : 'SAP/SAPGUILandscape.xml');
136
- if (!fs.existsSync(sapLandscape)) {
152
+ var sapLandscape;
153
+ switch (process.platform) {
154
+ case 'win32':
155
+ sapLandscape = path_1.default.join((0, _1.getRoamingPath)(), 'SAP', 'Common', 'SAPUILandscape.xml');
156
+ break;
157
+ case 'darwin':
158
+ sapLandscape = path_1.default.join((0, _1.getRoamingPath)(), 'SAP', 'SAPGUILandscape.xml');
159
+ break;
160
+ default:
161
+ break;
162
+ }
163
+ if (!sapLandscape || !fs.existsSync(sapLandscape)) {
137
164
  sapLandscape = undefined;
138
165
  }
139
166
  return {
140
167
  loggerType: 'CLI',
141
168
  logOutputFolder: 'default',
142
- globalNodeModules: (0, trm_commons_1.getGlobalNodeModules)() || '',
169
+ cliUpdateCheckCache: 60,
170
+ npmGlobalPathCheckCache: 180,
143
171
  sapLandscape
144
172
  };
145
173
  }
174
+ setGlobalNpmPathInternal() {
175
+ const globalNpmPathCache = this._cache.globalNpmPath;
176
+ if (!globalNpmPathCache || (globalNpmPathCache.ts && Date.now() - globalNpmPathCache.ts > this.getSettings().npmGlobalPathCheckCache * 1000)) {
177
+ trm_commons_1.Logger.loading(`Cache expired, setting npm global modules path...`, true);
178
+ const path = (0, trm_commons_1.getGlobalNodeModules)();
179
+ trm_commons_1.Logger.log(`Npm global modules path set to ${path}`, true);
180
+ this.setCache('globalNpmPath', path);
181
+ }
182
+ }
146
183
  getSettingsInternal() {
147
- var defaultSettings;
184
+ const defaultSettings = this.getDefaultSettings();
148
185
  const filePath = this.getSettingsFilePath();
149
- if (fs.existsSync(filePath)) {
150
- try {
151
- const sIni = fs.readFileSync(filePath).toString();
152
- const settingsData = ini.decode(sIni);
153
- if (!settingsData.globalNodeModules || !settingsData.sapLandscape) {
154
- defaultSettings = this.getDefaultSettings();
155
- if (!settingsData.globalNodeModules) {
156
- settingsData.globalNodeModules = defaultSettings.globalNodeModules;
157
- }
158
- if (!settingsData.sapLandscape) {
159
- settingsData.sapLandscape = defaultSettings.sapLandscape;
160
- }
161
- this.generateSettingsFile(settingsData, filePath);
162
- }
163
- return settingsData;
186
+ try {
187
+ const sIni = fs.readFileSync(filePath).toString();
188
+ const settingsData = ini.decode(sIni);
189
+ if (!settingsData.sapLandscape) {
190
+ settingsData.sapLandscape = defaultSettings.sapLandscape;
191
+ this.generateSettingsFile(settingsData, filePath);
164
192
  }
165
- catch (e) { }
193
+ if (!settingsData.cliUpdateCheckCache) {
194
+ settingsData.cliUpdateCheckCache = defaultSettings.cliUpdateCheckCache;
195
+ this.generateSettingsFile(settingsData, filePath);
196
+ }
197
+ if (!settingsData.npmGlobalPathCheckCache) {
198
+ settingsData.npmGlobalPathCheckCache = defaultSettings.npmGlobalPathCheckCache;
199
+ this.generateSettingsFile(settingsData, filePath);
200
+ }
201
+ if (settingsData.globalNodeModules) {
202
+ delete settingsData.globalNodeModules;
203
+ this.generateSettingsFile(settingsData, filePath);
204
+ }
205
+ return settingsData;
166
206
  }
167
- defaultSettings = this.getDefaultSettings();
207
+ catch (e) { }
168
208
  this.generateSettingsFile(defaultSettings, filePath);
169
209
  return defaultSettings;
170
210
  }
@@ -1,7 +1,8 @@
1
1
  export type SettingsData = {
2
2
  loggerType: string;
3
3
  logOutputFolder: string;
4
- globalNodeModules: string;
4
+ cliUpdateCheckCache: number;
5
+ npmGlobalPathCheckCache: number;
5
6
  sapLandscape?: string;
6
7
  r3transDocker?: boolean;
7
8
  r3transDockerName?: string;
@@ -16,26 +16,17 @@ exports.checkCliUpdate = checkCliUpdate;
16
16
  const semver_1 = require("semver");
17
17
  const getClientVersion_1 = require("./getClientVersion");
18
18
  const chalk_1 = __importDefault(require("chalk"));
19
- const getNpmPackageLatestVersion_1 = require("./getNpmPackageLatestVersion");
20
19
  const trm_commons_1 = require("trm-commons");
21
20
  const GlobalContext_1 = require("./GlobalContext");
22
21
  function checkCliUpdate(print) {
23
22
  return __awaiter(this, void 0, void 0, function* () {
24
23
  try {
25
- var latestVersion;
26
- const cache = GlobalContext_1.GlobalContext.getInstance().getCache().latestVersion;
27
- if (cache && cache.ts && Date.now() - cache.ts <= 60000) {
28
- latestVersion = cache.data;
29
- }
30
- else {
31
- latestVersion = yield (0, getNpmPackageLatestVersion_1.getNpmPackageLatestVersion)('trm-client');
32
- GlobalContext_1.GlobalContext.getInstance().setCache('latestVersion', latestVersion);
33
- }
24
+ const latestVersion = GlobalContext_1.GlobalContext.getInstance().getLatestVersion();
34
25
  const localVersion = (0, getClientVersion_1.getClientVersion)();
35
26
  const versionDiff = (0, semver_1.diff)(localVersion, latestVersion);
36
27
  if ((versionDiff === 'minor' || versionDiff === 'major') && (0, semver_1.gt)(latestVersion, localVersion)) {
37
28
  if (print) {
38
- trm_commons_1.Logger.warning(`A newer release of trm-client (v${chalk_1.default.bold(latestVersion)}) is available.`);
29
+ trm_commons_1.Logger.warning(`A new ${chalk_1.default.bold(versionDiff)} release of trm-client (v${chalk_1.default.bold(latestVersion)}) is available.`);
39
30
  trm_commons_1.Logger.warning(`New releases can introduce features and bug fixes.`);
40
31
  trm_commons_1.Logger.warning(`It is recommended to update your client by running the command`);
41
32
  trm_commons_1.Logger.warning(` ${chalk_1.default.bold('trm update')}`);
@@ -2,7 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getClientNodeDependencies = getClientNodeDependencies;
4
4
  const trm_core_1 = require("trm-core");
5
+ const GlobalContext_1 = require("./GlobalContext");
5
6
  function getClientNodeDependencies() {
6
- const trmClientPackage = (0, trm_core_1.getNodePackage)("trm-client");
7
+ const trmClientPackage = (0, trm_core_1.getNodePackage)(GlobalContext_1.GlobalContext.getInstance().getGlobalNodeModules(), "trm-client");
7
8
  return trmClientPackage.dependencies || {};
8
9
  }
@@ -2,7 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getClientVersion = getClientVersion;
4
4
  const trm_core_1 = require("trm-core");
5
+ const GlobalContext_1 = require("./GlobalContext");
5
6
  function getClientVersion() {
6
- const trmClientPackage = (0, trm_core_1.getNodePackage)("trm-client");
7
+ const trmClientPackage = (0, trm_core_1.getNodePackage)(GlobalContext_1.GlobalContext.getInstance().getGlobalNodeModules(), "trm-client");
7
8
  return trmClientPackage.version;
8
9
  }
@@ -0,0 +1 @@
1
+ export declare function getCoreVersion(): string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCoreVersion = getCoreVersion;
4
+ const trm_core_1 = require("trm-core");
5
+ const GlobalContext_1 = require("./GlobalContext");
6
+ function getCoreVersion() {
7
+ const trmCorePackage = (0, trm_core_1.getNodePackage)(GlobalContext_1.GlobalContext.getInstance().getGlobalNodeModules());
8
+ return trmCorePackage.version;
9
+ }
@@ -0,0 +1 @@
1
+ export declare function getNodeRfcPackage(): any;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNodeRfcPackage = getNodeRfcPackage;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const GlobalContext_1 = require("./GlobalContext");
7
+ function getNodeRfcPackage() {
8
+ try {
9
+ return JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(GlobalContext_1.GlobalContext.getInstance().getGlobalNodeModules(), `/node-rfc/package.json`)).toString());
10
+ }
11
+ catch (_a) { }
12
+ }
@@ -1 +1,4 @@
1
- export declare function getNpmPackageLatestVersion(packageName: string): Promise<string>;
1
+ export declare function getNpmPackageLatestVersion(packageName: string, range?: string): Promise<{
2
+ actualLatest: string;
3
+ latest: string;
4
+ }>;
@@ -14,9 +14,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getNpmPackageLatestVersion = getNpmPackageLatestVersion;
16
16
  const axios_1 = __importDefault(require("axios"));
17
- function getNpmPackageLatestVersion(packageName) {
17
+ const semver_1 = require("semver");
18
+ function getNpmPackageLatestVersion(packageName, range) {
18
19
  return __awaiter(this, void 0, void 0, function* () {
19
20
  const response = yield axios_1.default.get(`https://registry.npmjs.org/${packageName}`);
20
- return response.data['dist-tags'].latest;
21
+ const actualLatest = response.data['dist-tags'].latest;
22
+ if (!range) {
23
+ return { actualLatest, latest: actualLatest };
24
+ }
25
+ else {
26
+ return {
27
+ latest: (0, semver_1.maxSatisfying)(Object.keys(response.data.versions || {}), range),
28
+ actualLatest
29
+ };
30
+ }
21
31
  });
22
32
  }
@@ -5,6 +5,7 @@ export * from "./getSapLogonConnections";
5
5
  export * from "./logError";
6
6
  export * from "./checkCliUpdate";
7
7
  export * from "./getClientVersion";
8
+ export * from "./getCoreVersion";
8
9
  export * from "./getTempFolder";
9
10
  export * from "./getLogFolder";
10
11
  export * from "./getClientNodeDependencies";
@@ -14,3 +15,4 @@ export * from "./SettingsData";
14
15
  export * from "./CacheData";
15
16
  export * from "./GlobalContext";
16
17
  export * from "./isDockerRunning";
18
+ export * from "./getNodeRfcPackage";
@@ -21,6 +21,7 @@ __exportStar(require("./getSapLogonConnections"), exports);
21
21
  __exportStar(require("./logError"), exports);
22
22
  __exportStar(require("./checkCliUpdate"), exports);
23
23
  __exportStar(require("./getClientVersion"), exports);
24
+ __exportStar(require("./getCoreVersion"), exports);
24
25
  __exportStar(require("./getTempFolder"), exports);
25
26
  __exportStar(require("./getLogFolder"), exports);
26
27
  __exportStar(require("./getClientNodeDependencies"), exports);
@@ -30,3 +31,4 @@ __exportStar(require("./SettingsData"), exports);
30
31
  __exportStar(require("./CacheData"), exports);
31
32
  __exportStar(require("./GlobalContext"), exports);
32
33
  __exportStar(require("./isDockerRunning"), exports);
34
+ __exportStar(require("./getNodeRfcPackage"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trm-client",
3
- "version": "7.3.5",
3
+ "version": "7.4.1",
4
4
  "description": "TRM (Transport Request Manager) Client",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -45,14 +45,14 @@
45
45
  "i": "^0.3.7",
46
46
  "ini": "^4.1.1",
47
47
  "lodash": "^4.17.21",
48
- "semver": "^7.5.4",
49
- "trm-commons": "^3.5.0",
50
- "trm-core": "^8.3.0",
48
+ "semver": "^7.7.4",
49
+ "trm-commons": "^3.5.1",
50
+ "trm-core": "^8.4.1",
51
51
  "trm-registry-types": "^2.1.0",
52
52
  "xml2js": "^0.6.2"
53
53
  },
54
54
  "peerDependencies": {
55
- "trm-commons": "^3.5.0"
55
+ "trm-commons": "^3.5.1"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/ini": "^1.3.31",