trm-core 8.0.2 → 8.1.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 +8 -0
- package/dist/actions/install/index.d.ts +2 -0
- package/dist/actions/install/init.js +2 -3
- package/dist/actions/installDependency/findInstallRelease.js +11 -15
- package/dist/actions/installDependency/index.d.ts +2 -1
- package/dist/actions/installDependency/init.js +3 -1
- package/dist/actions/installDependency/installRelease.js +1 -1
- package/dist/actions/publish/finalizePublish.js +1 -1
- package/dist/actions/publish/index.d.ts +5 -0
- package/dist/actions/publish/init.js +78 -5
- package/dist/actions/publish/publishToRegistry.js +5 -1
- package/dist/actions/publish/setManifestValues.js +0 -28
- package/dist/commons/getPackageHierarchy.d.ts +1 -1
- package/dist/commons/getPackageHierarchy.js +4 -2
- package/dist/commons/index.d.ts +1 -0
- package/dist/commons/index.js +1 -0
- package/dist/commons/jsonStringifyWithKeyOrder.d.ts +1 -0
- package/dist/commons/jsonStringifyWithKeyOrder.js +18 -0
- package/dist/lockfile/Lockfile.d.ts +22 -0
- package/dist/lockfile/Lockfile.js +103 -0
- package/dist/lockfile/index.d.ts +1 -0
- package/dist/lockfile/index.js +17 -0
- package/dist/manifest/Manifest.d.ts +0 -1
- package/dist/manifest/Manifest.js +2 -17
- package/dist/registry/AbstractRegistry.d.ts +14 -12
- package/dist/registry/FileSystem.d.ts +4 -2
- package/dist/registry/FileSystem.js +14 -2
- package/dist/registry/RegistryV2.d.ts +6 -4
- package/dist/registry/RegistryV2.js +37 -16
- package/dist/transport/Transport.js +1 -1
- package/dist/trmPackage/TrmPackage.d.ts +3 -0
- package/dist/trmPackage/TrmPackage.js +11 -1
- package/package.json +2 -2
package/changelog.txt
CHANGED
|
@@ -8,6 +8,14 @@ Legend
|
|
|
8
8
|
+ : added
|
|
9
9
|
- : removed
|
|
10
10
|
|
|
11
|
+
2025-11-04 v8.1.1
|
|
12
|
+
-------------------
|
|
13
|
+
+ moved lock file generation to core
|
|
14
|
+
+ lock file can be used to determine dependency version
|
|
15
|
+
+ package visibility to test publish endpoint
|
|
16
|
+
+ release tags
|
|
17
|
+
! getPackageHierarchy ignore multiple roots in setDevclass method
|
|
18
|
+
|
|
11
19
|
2025-10-30 v8.0.2
|
|
12
20
|
-------------------
|
|
13
21
|
* fix no dependency detection comparison with latest release
|
|
@@ -7,6 +7,7 @@ import { DEVCLASS, E071, NAMESPACE, TADIR, TDEVC, TDEVCT } from "../../client";
|
|
|
7
7
|
import { PackageHierarchy } from "../../commons";
|
|
8
8
|
import { AbstractRegistry } from "../../registry";
|
|
9
9
|
import { Package } from "trm-registry-types";
|
|
10
|
+
import { Lockfile } from "../../lockfile/Lockfile";
|
|
10
11
|
export type InstallPackageReplacements = {
|
|
11
12
|
originalDevclass: string;
|
|
12
13
|
installDevclass: string;
|
|
@@ -25,6 +26,7 @@ export type InstallActionInputInstallData = {
|
|
|
25
26
|
replaceExistingTransports?: boolean;
|
|
26
27
|
};
|
|
27
28
|
checks?: {
|
|
29
|
+
lockfile?: Lockfile;
|
|
28
30
|
noSapEntries?: boolean;
|
|
29
31
|
noObjectTypes?: boolean;
|
|
30
32
|
noDependencies?: boolean;
|
|
@@ -37,7 +37,6 @@ exports.init = {
|
|
|
37
37
|
actualRegistry = oManifest.getPackage().registry;
|
|
38
38
|
context.rawInput.packageData.name = manifest.name;
|
|
39
39
|
}
|
|
40
|
-
context.rawInput.packageData.version = (0, semver_1.valid)(context.rawInput.packageData.version);
|
|
41
40
|
if (registry.getRegistryType() !== registry_1.RegistryType.LOCAL) {
|
|
42
41
|
trm_commons_1.Logger.loading(`Fetching package in registry ${registry.name}...`);
|
|
43
42
|
packageData = yield registry.getPackage(context.rawInput.packageData.name, context.rawInput.packageData.version || 'latest');
|
|
@@ -49,14 +48,14 @@ exports.init = {
|
|
|
49
48
|
ping = yield registry.ping();
|
|
50
49
|
}
|
|
51
50
|
catch (_b) { }
|
|
52
|
-
trm_commons_1.Logger.error(`SECURITY ISSUE! Release
|
|
51
|
+
trm_commons_1.Logger.error(`SECURITY ISSUE! Release integrity does NOT match!`);
|
|
53
52
|
trm_commons_1.Logger.error(`SECURITY ISSUE! Expected SHA is ${packageData.checksum}, current SHA is ${checksum}`);
|
|
54
53
|
trm_commons_1.Logger.error(`SECURITY ISSUE! Please, report the issue to ${ping && ping.alert_email ? ping.alert_email : 'registry moderation team'}`);
|
|
55
54
|
throw new Error(`Cannot continue due to security issues.`);
|
|
56
55
|
}
|
|
57
56
|
manifest = artifact.getManifest().get();
|
|
58
57
|
}
|
|
59
|
-
trm_commons_1.Logger.info(`Ready to install ${manifest.name} v${manifest.version}.`);
|
|
58
|
+
trm_commons_1.Logger.info(`Ready to install ${manifest.name} v${manifest.version}${!(0, semver_1.valid)(context.rawInput.packageData.version) ? ' (' + context.rawInput.packageData.version + ')' : ''}.`);
|
|
60
59
|
context.runtime = {
|
|
61
60
|
registry: actualRegistry || registry,
|
|
62
61
|
update: undefined,
|
|
@@ -13,28 +13,24 @@ exports.findInstallRelease = void 0;
|
|
|
13
13
|
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const semver_sort_1 = require("semver-sort");
|
|
15
15
|
const semver_1 = require("semver");
|
|
16
|
+
const lockfile_1 = require("../../lockfile");
|
|
16
17
|
exports.findInstallRelease = {
|
|
17
18
|
name: 'find-install-release',
|
|
18
19
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
20
|
trm_commons_1.Logger.log('Find install release step', true);
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const packageVersion = yield context.rawInput.dependencyDataPackage.registry.getPackage(context.rawInput.dependencyDataPackage.name, sortedVersion);
|
|
29
|
-
if (context.rawInput.dependencyDataPackage.integrity === packageVersion.checksum) {
|
|
30
|
-
context.runtime.installVersion = sortedVersion;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch (_a) { }
|
|
34
|
-
}
|
|
21
|
+
const lock = context.rawInput.installData.checks.lockfile ? context.rawInput.installData.checks.lockfile.getLock(context.runtime.trmPackage) : null;
|
|
22
|
+
if (lock) {
|
|
23
|
+
const testLock = yield lockfile_1.Lockfile.testReleaseByLock(lock);
|
|
24
|
+
if (!testLock) {
|
|
25
|
+
throw new Error(`Cannot continue due to security issues.`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
context.runtime.installVersion = lock.version;
|
|
35
29
|
}
|
|
36
30
|
}
|
|
37
31
|
else {
|
|
32
|
+
const packageData = yield context.rawInput.dependencyDataPackage.registry.getPackage(context.rawInput.dependencyDataPackage.name, 'latest');
|
|
33
|
+
const versions = packageData.versions.filter(v => (0, semver_1.satisfies)(v, context.rawInput.dependencyDataPackage.versionRange));
|
|
38
34
|
if (versions.length === 0) {
|
|
39
35
|
throw new Error(`Dependency "${context.rawInput.dependencyDataPackage.name}": releases not found in range ${context.rawInput.dependencyDataPackage.versionRange}.`);
|
|
40
36
|
}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { AbstractRegistry } from "../../registry";
|
|
2
2
|
import { IActionContext, InstallActionInputContextData, InstallActionInputInstallData, InstallActionOutput } from "..";
|
|
3
|
+
import { TrmPackage } from "../../trmPackage";
|
|
3
4
|
export interface InstallDependencyActionInput {
|
|
4
5
|
contextData?: InstallActionInputContextData;
|
|
5
6
|
dependencyDataPackage: {
|
|
6
7
|
name: string;
|
|
7
8
|
versionRange: string;
|
|
8
9
|
registry: AbstractRegistry;
|
|
9
|
-
integrity?: string;
|
|
10
10
|
};
|
|
11
11
|
installData?: InstallActionInputInstallData;
|
|
12
12
|
}
|
|
13
13
|
type WorkflowRuntime = {
|
|
14
|
+
trmPackage: TrmPackage;
|
|
14
15
|
installVersion: string;
|
|
15
16
|
installOutput: InstallActionOutput;
|
|
16
17
|
};
|
|
@@ -14,6 +14,7 @@ const trm_commons_1 = require("trm-commons");
|
|
|
14
14
|
const commons_1 = require("../../commons");
|
|
15
15
|
const semver_1 = require("semver");
|
|
16
16
|
const registry_1 = require("../../registry");
|
|
17
|
+
const trmPackage_1 = require("../../trmPackage");
|
|
17
18
|
exports.init = {
|
|
18
19
|
name: 'init',
|
|
19
20
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -22,13 +23,14 @@ exports.init = {
|
|
|
22
23
|
fullName: context.rawInput.dependencyDataPackage.name
|
|
23
24
|
}).fullName;
|
|
24
25
|
if (context.rawInput.dependencyDataPackage.registry.getRegistryType() === registry_1.RegistryType.LOCAL) {
|
|
25
|
-
throw new Error(`Cannot install package "${context.rawInput.dependencyDataPackage.name}": TRM package has to be installed manually.`);
|
|
26
|
+
throw new Error(`Cannot install local package "${context.rawInput.dependencyDataPackage.name}": TRM package has to be installed manually.`);
|
|
26
27
|
}
|
|
27
28
|
context.rawInput.dependencyDataPackage.versionRange = (0, semver_1.validRange)(context.rawInput.dependencyDataPackage.versionRange);
|
|
28
29
|
if (!context.rawInput.dependencyDataPackage.versionRange) {
|
|
29
30
|
throw new Error(`Dependency "${context.rawInput.dependencyDataPackage.name}", invalid version range.`);
|
|
30
31
|
}
|
|
31
32
|
context.runtime = {
|
|
33
|
+
trmPackage: new trmPackage_1.TrmPackage(context.rawInput.dependencyDataPackage.name, context.rawInput.dependencyDataPackage.registry),
|
|
32
34
|
installOutput: undefined,
|
|
33
35
|
installVersion: undefined
|
|
34
36
|
};
|
|
@@ -18,7 +18,7 @@ exports.installRelease = {
|
|
|
18
18
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
19
|
trm_commons_1.Logger.log('Install release step', true);
|
|
20
20
|
if (!context.runtime.installVersion) {
|
|
21
|
-
throw new Error(`Couldn't find dependency "${context.rawInput.dependencyDataPackage.name}" on registry
|
|
21
|
+
throw new Error(`Couldn't find dependency "${context.rawInput.dependencyDataPackage.name}" on registry.`);
|
|
22
22
|
}
|
|
23
23
|
const inputData = {
|
|
24
24
|
packageData: {
|
|
@@ -22,7 +22,7 @@ exports.finalizePublish = {
|
|
|
22
22
|
trm_commons_1.Logger.loading(`Finalizing...`);
|
|
23
23
|
yield systemConnector_1.SystemConnector.addSrcTrkorr(context.runtime.systemData.tadirTransport.trkorr);
|
|
24
24
|
trm_commons_1.Logger.log(`Generating SHA512`, true);
|
|
25
|
-
const integrity = (0, crypto_1.createHash)("sha512").update(context.runtime.trmPackage.artifact.binary).digest("
|
|
25
|
+
const integrity = (0, crypto_1.createHash)("sha512").update(context.runtime.trmPackage.artifact.binary).digest("base64");
|
|
26
26
|
trm_commons_1.Logger.log(`SHA512: ${integrity}`, true);
|
|
27
27
|
yield systemConnector_1.SystemConnector.setPackageIntegrity({
|
|
28
28
|
package_name: context.rawInput.packageData.name,
|
|
@@ -5,6 +5,7 @@ import { DEVCLASS, TADIR, TMSCSYS, TR_TARGET, TRNSPACET, TRNSPACETT } from "../.
|
|
|
5
5
|
import { TrmManifest, TrmManifestBase } from "../../manifest";
|
|
6
6
|
import { Transport } from "../../transport";
|
|
7
7
|
import { DotAbapGit } from "../../abapgit";
|
|
8
|
+
import { ReleaseType } from "semver";
|
|
8
9
|
export interface PublishActionInput {
|
|
9
10
|
contextData?: {
|
|
10
11
|
systemPackages?: TrmPackage[];
|
|
@@ -14,6 +15,10 @@ export interface PublishActionInput {
|
|
|
14
15
|
packageData: {
|
|
15
16
|
name: string;
|
|
16
17
|
version?: string;
|
|
18
|
+
inc?: ReleaseType;
|
|
19
|
+
preRelease?: boolean;
|
|
20
|
+
preReleaseIdentifier?: string;
|
|
21
|
+
tags?: string[];
|
|
17
22
|
registry: AbstractRegistry;
|
|
18
23
|
devclass?: DEVCLASS;
|
|
19
24
|
manifest?: TrmManifestBase;
|
|
@@ -8,6 +8,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
exports.init = void 0;
|
|
13
16
|
const trm_commons_1 = require("trm-commons");
|
|
@@ -17,6 +20,39 @@ const semver_1 = require("semver");
|
|
|
17
20
|
const systemConnector_1 = require("../../systemConnector");
|
|
18
21
|
const registry_1 = require("../../registry");
|
|
19
22
|
const transport_1 = require("../../transport");
|
|
23
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
24
|
+
function nextPrerelease(version, identifier) {
|
|
25
|
+
const pre = (0, semver_1.prerelease)(version);
|
|
26
|
+
const currentId = pre && typeof pre[0] === "string" ? String(pre[0]) : undefined;
|
|
27
|
+
if (identifier) {
|
|
28
|
+
return pre && currentId === identifier
|
|
29
|
+
? (0, semver_1.inc)(version, "prerelease", identifier)
|
|
30
|
+
: `${(0, semver_1.valid)(version)}-${identifier}.0`;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return (0, semver_1.inc)(version, "prerelease", currentId);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function getHighestPrerelease(versions, baseVersion, identifier) {
|
|
37
|
+
const base = (0, semver_1.parse)(baseVersion);
|
|
38
|
+
const filtered = versions.filter((v) => {
|
|
39
|
+
const parsed = (0, semver_1.parse)((0, semver_1.clean)(v) || v, { loose: true });
|
|
40
|
+
if (!parsed)
|
|
41
|
+
return false;
|
|
42
|
+
const pre = (0, semver_1.prerelease)(parsed.version);
|
|
43
|
+
if (!pre)
|
|
44
|
+
return false;
|
|
45
|
+
const vBase = `${parsed.major}.${parsed.minor}.${parsed.patch}`;
|
|
46
|
+
if (vBase !== `${base.major}.${base.minor}.${base.patch}`)
|
|
47
|
+
return false;
|
|
48
|
+
return identifier
|
|
49
|
+
? pre[0] === identifier
|
|
50
|
+
: typeof pre[0] === "number" || pre.length === 1;
|
|
51
|
+
});
|
|
52
|
+
if (filtered.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
return filtered.sort(semver_1.rcompare)[0];
|
|
55
|
+
}
|
|
20
56
|
exports.init = {
|
|
21
57
|
name: 'init',
|
|
22
58
|
run: (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -72,6 +108,9 @@ exports.init = {
|
|
|
72
108
|
}
|
|
73
109
|
});
|
|
74
110
|
}
|
|
111
|
+
if (!context.rawInput.packageData.tags) {
|
|
112
|
+
context.rawInput.packageData.tags = [];
|
|
113
|
+
}
|
|
75
114
|
trm_commons_1.Logger.loading(`Validating version...`);
|
|
76
115
|
var automaticVersion = false;
|
|
77
116
|
var releasesInRegistry;
|
|
@@ -85,20 +124,31 @@ exports.init = {
|
|
|
85
124
|
}
|
|
86
125
|
catch (_a) { }
|
|
87
126
|
if (!latestReleaseManifest) {
|
|
88
|
-
if (!context.rawInput.packageData.version) {
|
|
127
|
+
if (!context.rawInput.packageData.version || !(0, semver_1.valid)(context.rawInput.packageData.version)) {
|
|
89
128
|
context.rawInput.packageData.version = '1.0.0';
|
|
90
129
|
automaticVersion = true;
|
|
91
130
|
}
|
|
131
|
+
if (context.rawInput.packageData.preRelease) {
|
|
132
|
+
context.rawInput.packageData.version = nextPrerelease(context.rawInput.packageData.version, context.rawInput.packageData.preReleaseIdentifier);
|
|
133
|
+
}
|
|
92
134
|
}
|
|
93
135
|
else {
|
|
94
|
-
if (!context.rawInput.packageData.version) {
|
|
95
|
-
context.rawInput.packageData.version = (0, semver_1.inc)(latestReleaseManifest.version, "patch");
|
|
136
|
+
if (!context.rawInput.packageData.version || !(0, semver_1.valid)(context.rawInput.packageData.version)) {
|
|
137
|
+
context.rawInput.packageData.version = (0, semver_1.inc)(latestReleaseManifest.version, context.rawInput.packageData.inc || "patch");
|
|
96
138
|
automaticVersion = true;
|
|
97
139
|
}
|
|
98
140
|
else {
|
|
99
141
|
if (releasesInRegistry.includes(context.rawInput.packageData.version)) {
|
|
100
142
|
throw new Error(`Version "${context.rawInput.packageData.version}" already published.`);
|
|
101
143
|
}
|
|
144
|
+
if (context.rawInput.packageData.preRelease) {
|
|
145
|
+
const highestPreRelease = getHighestPrerelease(releasesInRegistry, context.rawInput.packageData.version, context.rawInput.packageData.preReleaseIdentifier);
|
|
146
|
+
if (highestPreRelease) {
|
|
147
|
+
context.rawInput.packageData.version = highestPreRelease;
|
|
148
|
+
automaticVersion = true;
|
|
149
|
+
}
|
|
150
|
+
context.rawInput.packageData.version = nextPrerelease(context.rawInput.packageData.version, context.rawInput.packageData.preReleaseIdentifier);
|
|
151
|
+
}
|
|
102
152
|
}
|
|
103
153
|
if (registry.getRegistryType() === registry_1.RegistryType.PUBLIC) {
|
|
104
154
|
trm_commons_1.Logger.log(`Public registry, checking if visibility is the same as latest release`, true);
|
|
@@ -139,12 +189,35 @@ exports.init = {
|
|
|
139
189
|
}])).version || context.rawInput.packageData.version;
|
|
140
190
|
}
|
|
141
191
|
}
|
|
192
|
+
var isPrivate;
|
|
193
|
+
if (registry.getRegistryType() === registry_1.RegistryType.LOCAL) {
|
|
194
|
+
isPrivate = true;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
isPrivate = typeof (context.rawInput.publishData.private) === 'undefined' ? (latestReleaseManifest ? latestReleaseManifest.private : undefined) : context.rawInput.publishData.private;
|
|
198
|
+
if (typeof (isPrivate) === 'undefined') {
|
|
199
|
+
isPrivate = (yield trm_commons_1.Inquirer.prompt({
|
|
200
|
+
type: "list",
|
|
201
|
+
message: "Package visibility",
|
|
202
|
+
name: "private",
|
|
203
|
+
default: isPrivate,
|
|
204
|
+
choices: [{
|
|
205
|
+
name: `Public`,
|
|
206
|
+
value: false
|
|
207
|
+
}, {
|
|
208
|
+
name: `Private`,
|
|
209
|
+
value: true
|
|
210
|
+
}]
|
|
211
|
+
})).private;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
142
214
|
trm_commons_1.Logger.loading(`Validating data...`);
|
|
143
|
-
yield registry.validatePublish(context.rawInput.packageData.name, context.rawInput.packageData.version);
|
|
215
|
+
yield registry.validatePublish(context.rawInput.packageData.name, context.rawInput.packageData.version, isPrivate);
|
|
144
216
|
if (!latestReleaseManifest) {
|
|
145
217
|
trm_commons_1.Logger.info(`First time publishing "${context.rawInput.packageData.name}". Congratulations!`, registry.getRegistryType() === registry_1.RegistryType.LOCAL);
|
|
146
218
|
}
|
|
147
219
|
trm_commons_1.Logger.info(`Ready to publish ${context.rawInput.packageData.name} v${context.rawInput.packageData.version}`);
|
|
220
|
+
trm_commons_1.Logger.info(`Package visibility: ${chalk_1.default.bold(isPrivate ? 'private' : 'public')}`);
|
|
148
221
|
context.runtime = {
|
|
149
222
|
trmPackage: {
|
|
150
223
|
package: new trmPackage_1.TrmPackage(context.rawInput.packageData.name, registry),
|
|
@@ -154,7 +227,7 @@ exports.init = {
|
|
|
154
227
|
manifest: Object.assign(Object.assign({}, context.rawInput.packageData.manifest), {
|
|
155
228
|
name: context.rawInput.packageData.name,
|
|
156
229
|
version: context.rawInput.packageData.version,
|
|
157
|
-
private:
|
|
230
|
+
private: isPrivate
|
|
158
231
|
})
|
|
159
232
|
},
|
|
160
233
|
systemData: {
|
|
@@ -23,10 +23,14 @@ exports.publishToRegistry = {
|
|
|
23
23
|
manifest: new manifest_1.Manifest(context.runtime.trmPackage.manifest),
|
|
24
24
|
sourceCode: context.runtime.abapGitData.sourceCode.zip
|
|
25
25
|
});
|
|
26
|
+
if (context.rawInput.packageData.tags.length > 0) {
|
|
27
|
+
trm_commons_1.Logger.info(`Publishing with tag${context.rawInput.packageData.tags.length === 1 ? '' : 's'}: ${context.rawInput.packageData.tags.join(', ')}`);
|
|
28
|
+
}
|
|
26
29
|
trm_commons_1.Logger.loading(`Publishing...`);
|
|
27
30
|
yield context.runtime.trmPackage.package.publish({
|
|
28
31
|
artifact: context.runtime.trmPackage.artifact,
|
|
29
|
-
readme: context.rawInput.publishData.readme
|
|
32
|
+
readme: context.rawInput.publishData.readme,
|
|
33
|
+
tags: context.rawInput.packageData.tags
|
|
30
34
|
});
|
|
31
35
|
})
|
|
32
36
|
};
|
|
@@ -16,9 +16,7 @@ exports.setManifestValues = void 0;
|
|
|
16
16
|
const trm_commons_1 = require("trm-commons");
|
|
17
17
|
const registry_1 = require("../../registry");
|
|
18
18
|
const manifest_1 = require("../../manifest");
|
|
19
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
20
19
|
const FileSystem_1 = require("../../registry/FileSystem");
|
|
21
|
-
const validators_1 = require("../../validators");
|
|
22
20
|
const lodash_1 = __importDefault(require("lodash"));
|
|
23
21
|
exports.setManifestValues = {
|
|
24
22
|
name: 'set-manifest-values',
|
|
@@ -160,26 +158,6 @@ exports.setManifestValues = {
|
|
|
160
158
|
defaultKeywords = context.runtime.trmPackage.manifest.keywords;
|
|
161
159
|
}
|
|
162
160
|
var inq = yield trm_commons_1.Inquirer.prompt([{
|
|
163
|
-
type: "list",
|
|
164
|
-
message: "Package visibility",
|
|
165
|
-
name: "private",
|
|
166
|
-
default: context.runtime.trmPackage.manifest.private,
|
|
167
|
-
choices: [{
|
|
168
|
-
name: `Public`,
|
|
169
|
-
value: false
|
|
170
|
-
}, {
|
|
171
|
-
name: `Private`,
|
|
172
|
-
value: true
|
|
173
|
-
}],
|
|
174
|
-
when: () => {
|
|
175
|
-
const r = context.rawInput.packageData.registry.getRegistryType();
|
|
176
|
-
const hasLatest = !!context.runtime.trmPackage.latestReleaseManifest;
|
|
177
|
-
return r !== registry_1.RegistryType.LOCAL && (r !== registry_1.RegistryType.PUBLIC || !hasLatest);
|
|
178
|
-
},
|
|
179
|
-
validate: (input) => {
|
|
180
|
-
return (0, validators_1.validatePackageVisibility)(context.rawInput.packageData.registry.getRegistryType(), input, context.runtime.trmPackage.latestReleaseManifest ? context.runtime.trmPackage.latestReleaseManifest.private : undefined);
|
|
181
|
-
},
|
|
182
|
-
}, {
|
|
183
161
|
type: "input",
|
|
184
162
|
message: "Short description",
|
|
185
163
|
name: "description",
|
|
@@ -251,12 +229,6 @@ exports.setManifestValues = {
|
|
|
251
229
|
}]);
|
|
252
230
|
context.runtime.trmPackage.manifest = Object.assign(Object.assign({}, context.runtime.trmPackage.manifest), inq);
|
|
253
231
|
}
|
|
254
|
-
if (context.rawInput.packageData.registry.getRegistryType() === registry_1.RegistryType.LOCAL) {
|
|
255
|
-
context.runtime.trmPackage.manifest.private = true;
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
trm_commons_1.Logger.info(`Package visibility: ${chalk_1.default.bold(context.runtime.trmPackage.manifest.private ? 'private' : 'public')}`);
|
|
259
|
-
}
|
|
260
232
|
if (context.runtime.packageData.namespace) {
|
|
261
233
|
context.runtime.trmPackage.manifest.namespace = {
|
|
262
234
|
ns: context.runtime.packageData.namespace.trnspacet.namespace,
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { TDEVC } from "../client";
|
|
2
2
|
import { PackageHierarchy } from "./PackageHierarchy";
|
|
3
|
-
export declare function getPackageHierarchy(input: TDEVC[]): PackageHierarchy;
|
|
3
|
+
export declare function getPackageHierarchy(input: TDEVC[], ignoreMultiples?: boolean): PackageHierarchy;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getPackageHierarchy = getPackageHierarchy;
|
|
4
|
-
function getPackageHierarchy(input) {
|
|
4
|
+
function getPackageHierarchy(input, ignoreMultiples) {
|
|
5
5
|
const map = new Map();
|
|
6
6
|
input.forEach(item => {
|
|
7
7
|
map.set(item.devclass, {
|
|
@@ -24,7 +24,9 @@ function getPackageHierarchy(input) {
|
|
|
24
24
|
throw new Error(`No root found in package hierarchy.`);
|
|
25
25
|
}
|
|
26
26
|
else if (roots.length > 1) {
|
|
27
|
-
|
|
27
|
+
if (!ignoreMultiples) {
|
|
28
|
+
throw new Error(`Multiple roots found in package hierarchy.`);
|
|
29
|
+
}
|
|
28
30
|
}
|
|
29
31
|
return roots[0];
|
|
30
32
|
}
|
package/dist/commons/index.d.ts
CHANGED
package/dist/commons/index.js
CHANGED
|
@@ -30,3 +30,4 @@ __exportStar(require("./getNodePackage"), exports);
|
|
|
30
30
|
__exportStar(require("./getCoreTrmDependencies"), exports);
|
|
31
31
|
__exportStar(require("./checkCoreTrmDependencies"), exports);
|
|
32
32
|
__exportStar(require("./TrmServerUpgradeService"), exports);
|
|
33
|
+
__exportStar(require("./jsonStringifyWithKeyOrder"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function jsonStringifyWithKeyOrder<T extends object>(obj: T, order: readonly (keyof T & string)[], space?: number): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.jsonStringifyWithKeyOrder = jsonStringifyWithKeyOrder;
|
|
4
|
+
function jsonStringifyWithKeyOrder(obj, order, space = 2) {
|
|
5
|
+
const out = {};
|
|
6
|
+
const seen = new Set(order);
|
|
7
|
+
for (const key of order) {
|
|
8
|
+
if (Object.prototype.hasOwnProperty.call(obj, key) && obj[key] !== undefined) {
|
|
9
|
+
out[key] = obj[key];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
for (const key of Object.keys(obj)) {
|
|
13
|
+
if (!seen.has(key) && obj[key] !== undefined) {
|
|
14
|
+
out[key] = obj[key];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return JSON.stringify(out, null, space);
|
|
18
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TrmPackage } from "../trmPackage";
|
|
2
|
+
export interface Lock {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
registry: string;
|
|
6
|
+
integrity: string;
|
|
7
|
+
}
|
|
8
|
+
export interface LockfileContent {
|
|
9
|
+
lockfileVersion: number;
|
|
10
|
+
source: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
packages?: Lock[];
|
|
14
|
+
}
|
|
15
|
+
export declare class Lockfile {
|
|
16
|
+
lockfile: LockfileContent;
|
|
17
|
+
constructor(lockfile: LockfileContent);
|
|
18
|
+
static generate(root: TrmPackage, packages?: TrmPackage[]): Promise<Lockfile>;
|
|
19
|
+
toJson(): string;
|
|
20
|
+
getLock(trmPackage: TrmPackage): Lock;
|
|
21
|
+
static testReleaseByLock(lock: Lock): Promise<boolean>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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.Lockfile = void 0;
|
|
13
|
+
const trm_commons_1 = require("trm-commons");
|
|
14
|
+
const registry_1 = require("../registry");
|
|
15
|
+
const systemConnector_1 = require("../systemConnector");
|
|
16
|
+
const commons_1 = require("../commons");
|
|
17
|
+
const crypto_1 = require("crypto");
|
|
18
|
+
class Lockfile {
|
|
19
|
+
constructor(lockfile) {
|
|
20
|
+
this.lockfile = lockfile;
|
|
21
|
+
}
|
|
22
|
+
static generate(root, packages) {
|
|
23
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
var lock = {
|
|
25
|
+
lockfileVersion: 1,
|
|
26
|
+
source: systemConnector_1.SystemConnector.getDest(),
|
|
27
|
+
packages: []
|
|
28
|
+
};
|
|
29
|
+
if (!packages) {
|
|
30
|
+
packages = yield systemConnector_1.SystemConnector.getInstalledPackages(true, true, true);
|
|
31
|
+
}
|
|
32
|
+
const rootManifest = root.manifest.get();
|
|
33
|
+
var dependencies = rootManifest.dependencies || [];
|
|
34
|
+
lock.name = rootManifest.name;
|
|
35
|
+
lock.version = rootManifest.version;
|
|
36
|
+
for (const dep of dependencies) {
|
|
37
|
+
if (dep.registry === registry_1.LOCAL_RESERVED_KEYWORD) {
|
|
38
|
+
throw new Error(`Cannot generate lockfile: dependency with local package "${dep.name}"`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const depRegistry = registry_1.RegistryProvider.getRegistry(dep.registry);
|
|
42
|
+
if (root.compareName(dep.name) && root.compareRegistry(depRegistry)) {
|
|
43
|
+
throw new Error(`Package "${dep.name}" has declared invalid dependency with itself`);
|
|
44
|
+
}
|
|
45
|
+
if (!lock.packages.find(o => o.name === dep.name && o.registry === depRegistry.endpoint)) {
|
|
46
|
+
const depPackage = packages.find(o => o.compareName(dep.name) && o.compareRegistry(depRegistry));
|
|
47
|
+
if (depPackage) {
|
|
48
|
+
const depManifest = depPackage.manifest.get();
|
|
49
|
+
const depIntegrity = yield systemConnector_1.SystemConnector.getPackageIntegrity(depPackage);
|
|
50
|
+
lock.packages.push({
|
|
51
|
+
name: dep.name,
|
|
52
|
+
version: depManifest.version,
|
|
53
|
+
registry: depRegistry.endpoint,
|
|
54
|
+
integrity: depIntegrity
|
|
55
|
+
});
|
|
56
|
+
dependencies = dependencies.concat(depManifest.dependencies || []);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
trm_commons_1.Logger.warning(`Dependency "${dep.name}", registry "${depRegistry.endpoint}" not found in system ${systemConnector_1.SystemConnector.getDest()}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return new Lockfile(lock);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
toJson() {
|
|
68
|
+
const KEYS_ORDER = [
|
|
69
|
+
"lockfileVersion",
|
|
70
|
+
"source",
|
|
71
|
+
"name",
|
|
72
|
+
"version"
|
|
73
|
+
];
|
|
74
|
+
return (0, commons_1.jsonStringifyWithKeyOrder)(this.lockfile, KEYS_ORDER, 2);
|
|
75
|
+
}
|
|
76
|
+
getLock(trmPackage) {
|
|
77
|
+
var _a;
|
|
78
|
+
const lock = (_a = this.lockfile.packages) === null || _a === void 0 ? void 0 : _a.find(o => trmPackage.compareName(o.name) && trmPackage.compareRegistry(registry_1.RegistryProvider.getRegistry(o.registry)));
|
|
79
|
+
if (!lock) {
|
|
80
|
+
throw new Error(`Lock for package "${trmPackage.packageName}", registry "${trmPackage.registry.endpoint}" not found`);
|
|
81
|
+
}
|
|
82
|
+
return lock;
|
|
83
|
+
}
|
|
84
|
+
static testReleaseByLock(lock) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
const registry = registry_1.RegistryProvider.getRegistry(lock.registry);
|
|
87
|
+
const ping = yield registry.ping();
|
|
88
|
+
const release = yield registry.getPackage(lock.name, lock.version);
|
|
89
|
+
const artifact = yield registry.downloadArtifact(lock.name, lock.version);
|
|
90
|
+
const checksum = (0, crypto_1.createHash)("sha512").update(artifact.binary).digest("base64");
|
|
91
|
+
if (release.checksum !== lock.integrity || checksum !== lock.integrity) {
|
|
92
|
+
trm_commons_1.Logger.error(`SECURITY ISSUE! Release "${lock.name}", registry "${lock.registry}", integrity in lockfile does NOT match!`);
|
|
93
|
+
trm_commons_1.Logger.error(`SECURITY ISSUE! Registry SHA is ${release.checksum}`);
|
|
94
|
+
trm_commons_1.Logger.error(`SECURITY ISSUE! Artifact SHA is ${checksum}`);
|
|
95
|
+
trm_commons_1.Logger.error(`SECURITY ISSUE! Lockfile SHA is ${lock.integrity}`);
|
|
96
|
+
trm_commons_1.Logger.error(`SECURITY ISSUE! Please, report the issue to ${ping && ping.alert_email ? ping.alert_email : 'registry moderation team'}`);
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.Lockfile = Lockfile;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Lockfile";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Lockfile"), exports);
|
|
@@ -23,5 +23,4 @@ export declare class Manifest {
|
|
|
23
23
|
static compare(o1: Manifest, o2: Manifest, checkVersion?: boolean): boolean;
|
|
24
24
|
static stringAuthorsToArray(sAuthors: string): TrmManifestAuthor[];
|
|
25
25
|
static stringKeywordsToArray(sKeywords: string): string[];
|
|
26
|
-
private jsonStringifyWithKeyOrder;
|
|
27
26
|
}
|
|
@@ -109,13 +109,13 @@ class Manifest {
|
|
|
109
109
|
"keywords",
|
|
110
110
|
"dependencies",
|
|
111
111
|
"sapEntries",
|
|
112
|
-
"postActivities"
|
|
112
|
+
"postActivities"
|
|
113
113
|
];
|
|
114
114
|
var obj = this.get(false);
|
|
115
115
|
ignoredKeys.forEach(k => {
|
|
116
116
|
delete obj[k];
|
|
117
117
|
});
|
|
118
|
-
return
|
|
118
|
+
return (0, commons_1.jsonStringifyWithKeyOrder)(obj, KEYS_ORDER, 2);
|
|
119
119
|
}
|
|
120
120
|
getAbapXml() {
|
|
121
121
|
const manifest = this.get();
|
|
@@ -823,20 +823,5 @@ class Manifest {
|
|
|
823
823
|
return [];
|
|
824
824
|
}
|
|
825
825
|
}
|
|
826
|
-
jsonStringifyWithKeyOrder(obj, order, space = 2) {
|
|
827
|
-
const out = {};
|
|
828
|
-
const seen = new Set(order);
|
|
829
|
-
for (const key of order) {
|
|
830
|
-
if (Object.prototype.hasOwnProperty.call(obj, key) && obj[key] !== undefined) {
|
|
831
|
-
out[key] = obj[key];
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
for (const key of Object.keys(obj)) {
|
|
835
|
-
if (!seen.has(key) && obj[key] !== undefined) {
|
|
836
|
-
out[key] = obj[key];
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
return JSON.stringify(out, null, space);
|
|
840
|
-
}
|
|
841
826
|
}
|
|
842
827
|
exports.Manifest = Manifest;
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import { Package, Ping, WhoAmI } from "trm-registry-types";
|
|
1
|
+
import { Deprecate, DistTagAdd, DistTagRm, Package, Ping, WhoAmI } from "trm-registry-types";
|
|
2
2
|
import { RegistryType } from "./RegistryType";
|
|
3
3
|
import { TrmArtifact } from "../trmPackage";
|
|
4
4
|
export declare abstract class AbstractRegistry {
|
|
5
5
|
endpoint: string;
|
|
6
6
|
name: string;
|
|
7
7
|
abstract compare: (registry: AbstractRegistry) => boolean;
|
|
8
|
-
getRegistryType: () => RegistryType;
|
|
9
|
-
authenticate: (defaultData: any) => Promise<AbstractRegistry>;
|
|
10
|
-
getAuthData: () => any;
|
|
11
|
-
ping: () => Promise<Ping>;
|
|
12
|
-
whoAmI: () => Promise<WhoAmI>;
|
|
13
|
-
getPackage: (fullName: string, version: string) => Promise<Package>;
|
|
14
|
-
downloadArtifact: (fullName: string, version: string) => Promise<TrmArtifact>;
|
|
15
|
-
validatePublish: (fullName: string, version: string) => Promise<void>;
|
|
16
|
-
publish: (fullName: string, version: string, artifact: TrmArtifact, readme?: string) => Promise<Package>;
|
|
17
|
-
unpublish: (fullName: string, version: string) => Promise<void>;
|
|
18
|
-
deprecate: (fullName: string, version: string,
|
|
8
|
+
abstract getRegistryType: () => RegistryType;
|
|
9
|
+
abstract authenticate: (defaultData: any) => Promise<AbstractRegistry>;
|
|
10
|
+
abstract getAuthData: () => any;
|
|
11
|
+
abstract ping: () => Promise<Ping>;
|
|
12
|
+
abstract whoAmI: () => Promise<WhoAmI>;
|
|
13
|
+
abstract getPackage: (fullName: string, version: string) => Promise<Package>;
|
|
14
|
+
abstract downloadArtifact: (fullName: string, version: string) => Promise<TrmArtifact>;
|
|
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>;
|
|
17
|
+
abstract unpublish: (fullName: string, version: string) => Promise<void>;
|
|
18
|
+
abstract deprecate: (fullName: string, version: string, deprecate: Deprecate) => Promise<void>;
|
|
19
|
+
abstract addDistTag: (fullName: string, distTag: DistTagAdd) => Promise<void>;
|
|
20
|
+
abstract rmDistTag: (fullName: string, distTag: DistTagRm) => Promise<void>;
|
|
19
21
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Package, Ping, WhoAmI } from "trm-registry-types";
|
|
1
|
+
import { Deprecate, DistTagAdd, DistTagRm, Package, Ping, WhoAmI } from "trm-registry-types";
|
|
2
2
|
import { AbstractRegistry } from "./AbstractRegistry";
|
|
3
3
|
import { RegistryType } from "./RegistryType";
|
|
4
4
|
import { TrmArtifact } from "../trmPackage";
|
|
@@ -21,5 +21,7 @@ export declare class FileSystem implements AbstractRegistry {
|
|
|
21
21
|
validatePublish(fullName: string, version: string): Promise<void>;
|
|
22
22
|
publish(fullName: string, version: string, artifact: TrmArtifact, readme?: string): Promise<Package>;
|
|
23
23
|
unpublish(fullName: string, version: string): Promise<void>;
|
|
24
|
-
deprecate(fullName: string, version: string,
|
|
24
|
+
deprecate(fullName: string, version: string, deprecate: Deprecate): Promise<void>;
|
|
25
|
+
addDistTag(fullName: string, distTag: DistTagAdd): Promise<void>;
|
|
26
|
+
rmDistTag(fullName: string, distTag: DistTagRm): Promise<void>;
|
|
25
27
|
}
|
|
@@ -103,7 +103,9 @@ class FileSystem {
|
|
|
103
103
|
if (this._filePath) {
|
|
104
104
|
return {
|
|
105
105
|
name: fullName,
|
|
106
|
-
|
|
106
|
+
dist_tags: {
|
|
107
|
+
latest: version
|
|
108
|
+
},
|
|
107
109
|
versions: [],
|
|
108
110
|
yanked_versions: [],
|
|
109
111
|
deprecated: false,
|
|
@@ -157,10 +159,20 @@ class FileSystem {
|
|
|
157
159
|
throw new Error(`File system can't delete packages!`);
|
|
158
160
|
});
|
|
159
161
|
}
|
|
160
|
-
deprecate(fullName, version,
|
|
162
|
+
deprecate(fullName, version, deprecate) {
|
|
161
163
|
return __awaiter(this, void 0, void 0, function* () {
|
|
162
164
|
throw new Error(`File system can't deprecate packages!`);
|
|
163
165
|
});
|
|
164
166
|
}
|
|
167
|
+
addDistTag(fullName, distTag) {
|
|
168
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
169
|
+
throw new Error(`File system can't add dist tags!`);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
rmDistTag(fullName, distTag) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
+
throw new Error(`File system can't remove dist tags!`);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
165
177
|
}
|
|
166
178
|
exports.FileSystem = FileSystem;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RegistryType } from "./RegistryType";
|
|
2
|
-
import { Package, Ping, WhoAmI } from "trm-registry-types";
|
|
2
|
+
import { Deprecate, DistTagAdd, DistTagRm, Package, Ping, WhoAmI } from "trm-registry-types";
|
|
3
3
|
import { TrmArtifact } from "../trmPackage/TrmArtifact";
|
|
4
4
|
import { AbstractRegistry } from "./AbstractRegistry";
|
|
5
5
|
export declare const PUBLIC_RESERVED_KEYWORD = "public";
|
|
@@ -24,8 +24,10 @@ export declare class RegistryV2 implements AbstractRegistry {
|
|
|
24
24
|
whoAmI(): Promise<WhoAmI>;
|
|
25
25
|
getPackage(fullName: string, version?: string): Promise<Package>;
|
|
26
26
|
downloadArtifact(fullName: string, version?: string): Promise<TrmArtifact>;
|
|
27
|
-
validatePublish(fullName: string, version
|
|
28
|
-
publish(fullName: string, version: string, artifact: TrmArtifact, readme?: string): Promise<Package>;
|
|
27
|
+
validatePublish(fullName: string, version: string, isPrivate: boolean): Promise<void>;
|
|
28
|
+
publish(fullName: string, version: string, artifact: TrmArtifact, readme?: string, tags?: string): Promise<Package>;
|
|
29
29
|
unpublish(fullName: string, version: string): Promise<void>;
|
|
30
|
-
deprecate(fullName: string, version: string,
|
|
30
|
+
deprecate(fullName: string, version: string, deprecate: Deprecate): Promise<void>;
|
|
31
|
+
addDistTag(fullName: string, distTag: DistTagAdd): Promise<void>;
|
|
32
|
+
rmDistTag(fullName: string, distTag: DistTagRm): Promise<void>;
|
|
31
33
|
}
|
|
@@ -368,9 +368,9 @@ class RegistryV2 {
|
|
|
368
368
|
if (!data) {
|
|
369
369
|
var ttl;
|
|
370
370
|
try {
|
|
371
|
-
data = (yield this._axiosInstance.get(`/package/${fullName}`, {
|
|
371
|
+
data = (yield this._axiosInstance.get(`/package/${encodeURIComponent(fullName)}`, {
|
|
372
372
|
params: {
|
|
373
|
-
version
|
|
373
|
+
version: encodeURIComponent(version)
|
|
374
374
|
}
|
|
375
375
|
})).data;
|
|
376
376
|
if (data.download_link_expiry) {
|
|
@@ -416,10 +416,11 @@ class RegistryV2 {
|
|
|
416
416
|
});
|
|
417
417
|
}
|
|
418
418
|
validatePublish(fullName_1) {
|
|
419
|
-
return __awaiter(this, arguments, void 0, function* (fullName, version = 'latest') {
|
|
420
|
-
const status = (yield this._axiosInstance.get(`/publish/check/${fullName}`, {
|
|
419
|
+
return __awaiter(this, arguments, void 0, function* (fullName, version = 'latest', isPrivate) {
|
|
420
|
+
const status = (yield this._axiosInstance.get(`/publish/check/${encodeURIComponent(fullName)}`, {
|
|
421
421
|
params: {
|
|
422
|
-
version
|
|
422
|
+
version: encodeURIComponent(version),
|
|
423
|
+
private: isPrivate ? 'X' : 'N'
|
|
423
424
|
}
|
|
424
425
|
})).status;
|
|
425
426
|
if (status !== 204) {
|
|
@@ -427,7 +428,7 @@ class RegistryV2 {
|
|
|
427
428
|
}
|
|
428
429
|
});
|
|
429
430
|
}
|
|
430
|
-
publish(fullName, version, artifact, readme) {
|
|
431
|
+
publish(fullName, version, artifact, readme, tags) {
|
|
431
432
|
return __awaiter(this, void 0, void 0, function* () {
|
|
432
433
|
const fileName = `${fullName}_v${version}`.replace('.', '_') + '.trm';
|
|
433
434
|
const formData = new FormData.default();
|
|
@@ -441,33 +442,53 @@ class RegistryV2 {
|
|
|
441
442
|
contentType: 'text/markdown'
|
|
442
443
|
});
|
|
443
444
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
445
|
+
var params = { version, tags };
|
|
446
|
+
if (!tags) {
|
|
447
|
+
delete params.tags;
|
|
448
|
+
}
|
|
449
|
+
return (yield this._axiosInstance.post(`/publish/${encodeURIComponent(fullName)}`, formData, {
|
|
450
|
+
params,
|
|
448
451
|
headers: formData.getHeaders()
|
|
449
452
|
})).data;
|
|
450
453
|
});
|
|
451
454
|
}
|
|
452
455
|
unpublish(fullName, version) {
|
|
453
456
|
return __awaiter(this, void 0, void 0, function* () {
|
|
454
|
-
yield this._axiosInstance.post(`/unpublish/${fullName}`, null, {
|
|
457
|
+
yield this._axiosInstance.post(`/unpublish/${encodeURIComponent(fullName)}`, null, {
|
|
455
458
|
params: {
|
|
456
|
-
version
|
|
459
|
+
version: encodeURIComponent(version)
|
|
457
460
|
}
|
|
458
461
|
});
|
|
459
462
|
});
|
|
460
463
|
}
|
|
461
|
-
deprecate(fullName, version,
|
|
464
|
+
deprecate(fullName, version, deprecate) {
|
|
462
465
|
return __awaiter(this, void 0, void 0, function* () {
|
|
463
|
-
yield this._axiosInstance.post(`/deprecate/${fullName}`, {
|
|
464
|
-
deprecate_note:
|
|
466
|
+
yield this._axiosInstance.post(`/deprecate/${encodeURIComponent(fullName)}`, {
|
|
467
|
+
deprecate_note: deprecate.deprecate_note
|
|
465
468
|
}, {
|
|
466
469
|
params: {
|
|
467
|
-
version
|
|
470
|
+
version: encodeURIComponent(version)
|
|
468
471
|
}
|
|
469
472
|
});
|
|
470
473
|
});
|
|
471
474
|
}
|
|
475
|
+
addDistTag(fullName, distTag) {
|
|
476
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
477
|
+
const status = (yield this._axiosInstance.put(`/package/tag/${encodeURIComponent(fullName)}`, distTag)).status;
|
|
478
|
+
if (status !== 204) {
|
|
479
|
+
throw new Error(`Cannot add tag "${distTag.tag.trim().toUpperCase()}"`);
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
rmDistTag(fullName, distTag) {
|
|
484
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
485
|
+
const status = (yield this._axiosInstance.delete(`/package/tag/${encodeURIComponent(fullName)}`, {
|
|
486
|
+
data: distTag
|
|
487
|
+
})).status;
|
|
488
|
+
if (status !== 204) {
|
|
489
|
+
throw new Error(`Cannot remove tag "${distTag.tag.trim().toLowerCase()}"`);
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
}
|
|
472
493
|
}
|
|
473
494
|
exports.RegistryV2 = RegistryV2;
|
|
@@ -165,7 +165,7 @@ class Transport {
|
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
while (aTdevc.length > 0 && !this._rootDevclass) {
|
|
168
|
-
const hierarchy = (0, commons_1.getPackageHierarchy)(aTdevc);
|
|
168
|
+
const hierarchy = (0, commons_1.getPackageHierarchy)(aTdevc, true);
|
|
169
169
|
if (aTdevc.find(o => o.devclass === hierarchy.devclass)) {
|
|
170
170
|
this._rootDevclass = hierarchy.devclass;
|
|
171
171
|
}
|
|
@@ -3,6 +3,7 @@ import { AbstractRegistry } from "../registry";
|
|
|
3
3
|
import { TrmArtifact } from "./TrmArtifact";
|
|
4
4
|
import { DEVCLASS } from "../client";
|
|
5
5
|
import { Transport } from "../transport";
|
|
6
|
+
import { Lockfile } from "../lockfile";
|
|
6
7
|
export declare class TrmPackage {
|
|
7
8
|
packageName: string;
|
|
8
9
|
registry: AbstractRegistry;
|
|
@@ -17,9 +18,11 @@ export declare class TrmPackage {
|
|
|
17
18
|
publish(data: {
|
|
18
19
|
artifact: TrmArtifact;
|
|
19
20
|
readme?: string;
|
|
21
|
+
tags?: string[];
|
|
20
22
|
}): Promise<TrmPackage>;
|
|
21
23
|
compareRegistry(registry: AbstractRegistry): boolean;
|
|
22
24
|
compareName(name: string): boolean;
|
|
25
|
+
getLockfile(systemPackages?: TrmPackage[]): Promise<Lockfile>;
|
|
23
26
|
static create(manifest: Manifest, registry: AbstractRegistry): Promise<TrmPackage>;
|
|
24
27
|
static compare(o1: TrmPackage, o2: TrmPackage): boolean;
|
|
25
28
|
}
|
|
@@ -13,6 +13,7 @@ exports.TrmPackage = void 0;
|
|
|
13
13
|
const trm_commons_1 = require("trm-commons");
|
|
14
14
|
const manifest_1 = require("../manifest");
|
|
15
15
|
const systemConnector_1 = require("../systemConnector");
|
|
16
|
+
const lockfile_1 = require("../lockfile");
|
|
16
17
|
class TrmPackage {
|
|
17
18
|
constructor(packageName, registry, manifest) {
|
|
18
19
|
this.packageName = packageName;
|
|
@@ -52,12 +53,16 @@ class TrmPackage {
|
|
|
52
53
|
const artifact = data.artifact;
|
|
53
54
|
const trmManifest = artifact.getManifest().get();
|
|
54
55
|
const packageName = trmManifest.name;
|
|
56
|
+
var tags;
|
|
55
57
|
if (packageName !== this.packageName) {
|
|
56
58
|
throw new Error(`Cannot publish package ${packageName}: expected name is ${this.packageName}`);
|
|
57
59
|
}
|
|
58
60
|
const packageVersion = trmManifest.version;
|
|
61
|
+
if (data.tags) {
|
|
62
|
+
tags = data.tags.join(',');
|
|
63
|
+
}
|
|
59
64
|
trm_commons_1.Logger.loading(`Publishing "${packageName}" ${packageVersion} to registry "${this.registry.name}"...`, false);
|
|
60
|
-
yield this.registry.publish(packageName, packageVersion, artifact, data.readme);
|
|
65
|
+
yield this.registry.publish(packageName, packageVersion, artifact, data.readme, tags);
|
|
61
66
|
this.manifest = new manifest_1.Manifest(trmManifest);
|
|
62
67
|
return this;
|
|
63
68
|
});
|
|
@@ -68,6 +73,11 @@ class TrmPackage {
|
|
|
68
73
|
compareName(name) {
|
|
69
74
|
return this.packageName.trim().toUpperCase() === name.trim().toUpperCase();
|
|
70
75
|
}
|
|
76
|
+
getLockfile(systemPackages) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
return lockfile_1.Lockfile.generate(this, systemPackages);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
71
81
|
static create(manifest, registry) {
|
|
72
82
|
return __awaiter(this, void 0, void 0, function* () {
|
|
73
83
|
return new TrmPackage(manifest.get().name, registry, manifest);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trm-core",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.1.1",
|
|
4
4
|
"description": "TRM (Transport Request Manager) Core",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"semver": "^7.5.4",
|
|
64
64
|
"semver-sort": "^1.0.0",
|
|
65
65
|
"spdx-license-ids": "^3.0.13",
|
|
66
|
-
"trm-registry-types": "^2.
|
|
66
|
+
"trm-registry-types": "^2.1.0",
|
|
67
67
|
"uuid": "^9.0.1",
|
|
68
68
|
"xml-beautify": "^1.2.3",
|
|
69
69
|
"xml-js": "^1.6.11"
|