trm-client 7.3.5 → 7.4.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 +7 -0
- package/dist/command/AbstractCommand.js +2 -2
- package/dist/command/implementations/Info.d.ts +1 -1
- package/dist/command/implementations/Info.js +64 -59
- package/dist/command/implementations/Install.js +1 -3
- package/dist/command/implementations/Publish.js +0 -2
- package/dist/command/prompts/connect.js +6 -6
- package/dist/registryAlias/RegistryAlias.js +1 -1
- package/dist/utils/CacheData.d.ts +1 -0
- package/dist/utils/DummyConnector.d.ts +3 -1
- package/dist/utils/DummyConnector.js +7 -1
- package/dist/utils/GlobalContext.d.ts +3 -2
- package/dist/utils/GlobalContext.js +65 -25
- package/dist/utils/SettingsData.d.ts +2 -1
- package/dist/utils/checkCliUpdate.js +2 -11
- package/dist/utils/getClientNodeDependencies.js +2 -1
- package/dist/utils/getClientVersion.js +2 -1
- package/dist/utils/getCoreVersion.d.ts +1 -0
- package/dist/utils/getCoreVersion.js +9 -0
- package/dist/utils/getNodeRfcPackage.d.ts +1 -0
- package/dist/utils/getNodeRfcPackage.js +12 -0
- package/dist/utils/getNpmPackageLatestVersion.d.ts +4 -1
- package/dist/utils/getNpmPackageLatestVersion.js +12 -2
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -0
- package/package.json +5 -5
package/changelog.txt
CHANGED
|
@@ -8,6 +8,13 @@ Legend
|
|
|
8
8
|
+ : added
|
|
9
9
|
- : removed
|
|
10
10
|
|
|
11
|
+
2026-03-03 v7.4.0
|
|
12
|
+
-------------------
|
|
13
|
+
! trm-core ^8.4.0
|
|
14
|
+
! removed npm global path from settings
|
|
15
|
+
! update cache usage
|
|
16
|
+
! info command with latest in range
|
|
17
|
+
|
|
11
18
|
2026-02-23 v7.3.5
|
|
12
19
|
-------------------
|
|
13
20
|
* 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
|
-
|
|
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
|
-
|
|
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,35 +57,54 @@ 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
|
|
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
|
|
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
|
|
98
|
+
const nodeRfcPackage = (0, utils_1.getNodeRfcPackage)();
|
|
80
99
|
const packages = yield this.getSystemPackages();
|
|
81
100
|
const trmRest = packages.find(o => o.compareName("trm-rest") && o.compareRegistry(trm_core_1.RegistryProvider.getRegistry()));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
}
|
|
101
|
+
var dependenciesTree = [];
|
|
102
|
+
for (const d of Object.keys(dependencies)) {
|
|
103
|
+
const dText = ` -> ${dependencies[d].installedVersion} ${yield this.getNpmLatestForText(d, dependencies[d].installedVersion, dependencies[d].range)}`;
|
|
104
|
+
dependenciesTree.push({
|
|
105
|
+
text: `${d} ${dependencies[d].range}${dText}`,
|
|
106
|
+
children: []
|
|
107
|
+
});
|
|
97
108
|
}
|
|
98
109
|
var serverDependenciesTree = [];
|
|
99
110
|
if (trmDependencies) {
|
|
@@ -111,9 +122,15 @@ class Info extends AbstractCommand_1.AbstractCommand {
|
|
|
111
122
|
if (dInstalledVersion) {
|
|
112
123
|
dText = ` -> ${dInstalledVersion}`;
|
|
113
124
|
try {
|
|
114
|
-
const dLatestVersion =
|
|
115
|
-
|
|
116
|
-
|
|
125
|
+
const dLatestVersion = yield oTrmPackage.registry.getPackage(oTrmPackage.packageName, 'latest');
|
|
126
|
+
const dMax = (0, semver_1.maxSatisfying)(dLatestVersion.versions, trmDependencies[d]);
|
|
127
|
+
if ((0, semver_1.gte)(dInstalledVersion, dMax)) {
|
|
128
|
+
if (!(0, semver_1.eq)(dLatestVersion.dist_tags.latest, dMax)) {
|
|
129
|
+
dText += ` ${chalk_1.default.bgGreen('LATEST COMPATIBLE')}`;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
dText += ` ${chalk_1.default.bgGreen('LATEST')}`;
|
|
133
|
+
}
|
|
117
134
|
}
|
|
118
135
|
else {
|
|
119
136
|
dText += ` ${chalk_1.default.bold('v' + dLatestVersion + ' available')}`;
|
|
@@ -155,11 +172,11 @@ class Info extends AbstractCommand_1.AbstractCommand {
|
|
|
155
172
|
}
|
|
156
173
|
var clientChildrenTree = [{
|
|
157
174
|
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:
|
|
175
|
+
children: dependenciesTree
|
|
159
176
|
}];
|
|
160
|
-
if (
|
|
177
|
+
if (nodeRfcPackage && nodeRfcPackage.version) {
|
|
161
178
|
clientChildrenTree.push({
|
|
162
|
-
text: yield this.getNpmLatestForText('node-rfc',
|
|
179
|
+
text: `node-rfc ${nodeRfcPackage.version} ${yield this.getNpmLatestForText('node-rfc', nodeRfcPackage.version)}`,
|
|
163
180
|
children: []
|
|
164
181
|
});
|
|
165
182
|
}
|
|
@@ -169,18 +186,6 @@ class Info extends AbstractCommand_1.AbstractCommand {
|
|
|
169
186
|
children: []
|
|
170
187
|
});
|
|
171
188
|
}
|
|
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
189
|
const clientTree = {
|
|
185
190
|
text: chalk_1.default.bold(`Client`),
|
|
186
191
|
children: clientChildrenTree
|
|
@@ -197,11 +202,11 @@ class Info extends AbstractCommand_1.AbstractCommand {
|
|
|
197
202
|
try {
|
|
198
203
|
const installedVersion = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(plugin.location, 'package.json')).toString()).version;
|
|
199
204
|
pluginsTree.children.push({
|
|
200
|
-
text: yield this.getNpmLatestForText(plugin.name, installedVersion
|
|
205
|
+
text: `${plugin.name} ${installedVersion} ${yield this.getNpmLatestForText(plugin.name, installedVersion)}`,
|
|
201
206
|
children: []
|
|
202
207
|
});
|
|
203
208
|
}
|
|
204
|
-
catch (
|
|
209
|
+
catch (_a) {
|
|
205
210
|
pluginsTree.children.push({
|
|
206
211
|
text: plugin.name,
|
|
207
212
|
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(`--
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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) {
|
|
@@ -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<
|
|
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* () {
|
|
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
|
-
|
|
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().
|
|
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
|
-
|
|
87
|
-
|
|
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.
|
|
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
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
184
|
+
const defaultSettings = this.getDefaultSettings();
|
|
148
185
|
const filePath = this.getSettingsFilePath();
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
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
|
-
|
|
207
|
+
catch (e) { }
|
|
168
208
|
this.generateSettingsFile(defaultSettings, filePath);
|
|
169
209
|
return defaultSettings;
|
|
170
210
|
}
|
|
@@ -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
|
-
|
|
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
|
|
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
|
+
}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/utils/index.js
CHANGED
|
@@ -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
|
+
"version": "7.4.0",
|
|
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.
|
|
49
|
-
"trm-commons": "^3.5.
|
|
50
|
-
"trm-core": "^8.
|
|
48
|
+
"semver": "^7.7.4",
|
|
49
|
+
"trm-commons": "^3.5.1",
|
|
50
|
+
"trm-core": "^8.4.0",
|
|
51
51
|
"trm-registry-types": "^2.1.0",
|
|
52
52
|
"xml2js": "^0.6.2"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"trm-commons": "^3.5.
|
|
55
|
+
"trm-commons": "^3.5.1"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@types/ini": "^1.3.31",
|