trm-core 8.0.2 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/changelog.txt +6 -2
  2. package/dist/actions/findDependencies/index.d.ts +0 -1
  3. package/dist/actions/findDependencies/index.js +0 -1
  4. package/dist/actions/install/index.d.ts +2 -0
  5. package/dist/actions/install/init.js +2 -3
  6. package/dist/actions/installDependency/findInstallRelease.js +11 -15
  7. package/dist/actions/installDependency/index.d.ts +2 -1
  8. package/dist/actions/installDependency/init.js +3 -1
  9. package/dist/actions/installDependency/installRelease.js +1 -1
  10. package/dist/actions/publish/finalizePublish.js +1 -1
  11. package/dist/actions/publish/findDependencies.js +41 -44
  12. package/dist/actions/publish/index.d.ts +5 -0
  13. package/dist/actions/publish/init.js +78 -5
  14. package/dist/actions/publish/publishToRegistry.js +5 -1
  15. package/dist/actions/publish/setManifestValues.js +2 -30
  16. package/dist/commons/getPackageHierarchy.d.ts +1 -1
  17. package/dist/commons/getPackageHierarchy.js +4 -2
  18. package/dist/commons/index.d.ts +1 -0
  19. package/dist/commons/index.js +1 -0
  20. package/dist/commons/jsonStringifyWithKeyOrder.d.ts +1 -0
  21. package/dist/commons/jsonStringifyWithKeyOrder.js +18 -0
  22. package/dist/lockfile/Lockfile.d.ts +22 -0
  23. package/dist/lockfile/Lockfile.js +103 -0
  24. package/dist/lockfile/index.d.ts +1 -0
  25. package/dist/lockfile/index.js +17 -0
  26. package/dist/manifest/Manifest.d.ts +0 -1
  27. package/dist/manifest/Manifest.js +2 -17
  28. package/dist/registry/AbstractRegistry.d.ts +14 -12
  29. package/dist/registry/FileSystem.d.ts +4 -2
  30. package/dist/registry/FileSystem.js +14 -2
  31. package/dist/registry/RegistryV2.d.ts +6 -4
  32. package/dist/registry/RegistryV2.js +37 -16
  33. package/dist/transport/Transport.js +1 -1
  34. package/dist/trmPackage/TrmPackage.d.ts +3 -0
  35. package/dist/trmPackage/TrmPackage.js +11 -1
  36. package/package.json +1 -1
package/changelog.txt CHANGED
@@ -8,9 +8,13 @@ Legend
8
8
  + : added
9
9
  - : removed
10
10
 
11
- 2025-10-30 v8.0.2
11
+ 2025-10-27 v8.1.0
12
12
  -------------------
13
- * fix no dependency detection comparison with latest release
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
14
18
 
15
19
  2025-10-24 v8.0.1
16
20
  -------------------
@@ -47,7 +47,6 @@ type WorkflowRuntime = {
47
47
  };
48
48
  };
49
49
  export type FindDependenciesActionOutput = {
50
- abort: boolean;
51
50
  trmPackageDependencies: {
52
51
  withTrmPackage: TrmDependency[];
53
52
  withoutTrmPackage: TrmDependency[];
@@ -40,7 +40,6 @@ function findDependencies(inputData) {
40
40
  });
41
41
  trm_commons_1.Logger.log(`Workflow ${WORKFLOW_NAME} result: ${(0, util_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
42
42
  return {
43
- abort: !!result.runtime.abort,
44
43
  trmPackageDependencies: {
45
44
  withTrmPackage: result.runtime.dependencies.withTrmPackage,
46
45
  withoutTrmPackage: result.runtime.dependencies.withoutTrmPackage,
@@ -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 checksum does NOT match!`);
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 packageData = yield context.rawInput.dependencyDataPackage.registry.getPackage(context.rawInput.dependencyDataPackage.name, 'latest');
21
- const versions = packageData.versions.filter(v => (0, semver_1.satisfies)(v, context.rawInput.dependencyDataPackage.versionRange));
22
- const yanked = packageData.yanked_versions.filter(v => (0, semver_1.satisfies)(v, context.rawInput.dependencyDataPackage.versionRange));
23
- if (context.rawInput.dependencyDataPackage.integrity) {
24
- const sortedVersions = (0, semver_sort_1.desc)(versions.concat(yanked));
25
- for (const sortedVersion of sortedVersions) {
26
- if (!context.runtime.installVersion) {
27
- try {
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. Try manual install.`);
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("hex");
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,
@@ -52,55 +52,52 @@ exports.findDependencies = {
52
52
  trm_commons_1.Logger.log(`Ready to execute sub-workflow ${SUBWORKFLOW_NAME}, input data: ${(0, trm_commons_1.inspect)(inputData, { breakLength: Infinity, compact: true })}`, true);
53
53
  const result = yield (0, __1.findDependencies)(inputData);
54
54
  trm_commons_1.Logger.log(`Workflow ${SUBWORKFLOW_NAME} result: ${(0, trm_commons_1.inspect)(result, { breakLength: Infinity, compact: true })}`, true);
55
- context.rawInput.publishData.noDependenciesDetection = result.abort;
56
- if (!context.rawInput.publishData.noDependenciesDetection) {
57
- const aUnknownDependencyDevclass = (result.trmPackageDependencies.withoutTrmPackage).map(o => o.devclass);
58
- if (aUnknownDependencyDevclass.length > 0) {
59
- trm_commons_1.Logger.error(`Package "${context.rawInput.packageData.devclass}" has ${aUnknownDependencyDevclass.length} missing ${aUnknownDependencyDevclass.length === 1 ? 'dependency' : 'dependencies'}:`);
60
- aUnknownDependencyDevclass.forEach((d, i) => {
61
- trm_commons_1.Logger.error(` (${i + 1}/${aUnknownDependencyDevclass.length}) ${d}`);
62
- });
63
- throw new Error(`Resolve missing dependencies by publishing them as TRM packages.`);
55
+ const aUnknownDependencyDevclass = (result.trmPackageDependencies.withoutTrmPackage).map(o => o.devclass);
56
+ if (aUnknownDependencyDevclass.length > 0) {
57
+ trm_commons_1.Logger.error(`Package "${context.rawInput.packageData.devclass}" has ${aUnknownDependencyDevclass.length} missing ${aUnknownDependencyDevclass.length === 1 ? 'dependency' : 'dependencies'}:`);
58
+ aUnknownDependencyDevclass.forEach((d, i) => {
59
+ trm_commons_1.Logger.error(` (${i + 1}/${aUnknownDependencyDevclass.length}) ${d}`);
60
+ });
61
+ throw new Error(`Resolve missing dependencies by publishing them as TRM packages.`);
62
+ }
63
+ trm_commons_1.Logger.info(`Package "${context.rawInput.packageData.devclass}" has ${result.trmPackageDependencies.withTrmPackage.length} TRM package ${result.trmPackageDependencies.withTrmPackage.length === 1 ? 'dependency' : 'dependencies'} and ${result.objectDependencies.sapObjects.reduce((sum, obj) => sum + obj.dependencies.length, 0)} required SAP ${result.objectDependencies.sapObjects.reduce((sum, obj) => sum + obj.dependencies.length, 0) === 1 ? 'object' : 'objects'}.`);
64
+ trm_commons_1.Logger.log(`Adding TRM package dependencies to manifest`, true);
65
+ trm_commons_1.Logger.loading(`Updating manifest...`);
66
+ result.trmPackageDependencies.withTrmPackage.forEach((o, i) => {
67
+ if (o.package.registry.getRegistryType() === registry_1.RegistryType.LOCAL) {
68
+ trm_commons_1.Logger.error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) Cannot have dependency with ABAP package "${o.devclass}": TRM package was installed manually`);
64
69
  }
65
- trm_commons_1.Logger.info(`Package "${context.rawInput.packageData.devclass}" has ${result.trmPackageDependencies.withTrmPackage.length} TRM package ${result.trmPackageDependencies.withTrmPackage.length === 1 ? 'dependency' : 'dependencies'} and ${result.objectDependencies.sapObjects.reduce((sum, obj) => sum + obj.dependencies.length, 0)} required SAP ${result.objectDependencies.sapObjects.reduce((sum, obj) => sum + obj.dependencies.length, 0) === 1 ? 'object' : 'objects'}.`);
66
- trm_commons_1.Logger.log(`Adding TRM package dependencies to manifest`, true);
67
- trm_commons_1.Logger.loading(`Updating manifest...`);
68
- result.trmPackageDependencies.withTrmPackage.forEach((o, i) => {
69
- if (o.package.registry.getRegistryType() === registry_1.RegistryType.LOCAL) {
70
- trm_commons_1.Logger.error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) Cannot have dependency with ABAP package "${o.devclass}": TRM package was installed manually`);
70
+ else {
71
+ if (o.package.manifest) {
72
+ const dependencyManifest = o.package.manifest.get();
73
+ const dependencyVersionRange = `^${dependencyManifest.version}`;
74
+ const dependencyRegistry = o.package.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? undefined : o.package.registry.endpoint;
75
+ context.runtime.trmPackage.manifest.dependencies.push({
76
+ name: dependencyManifest.name,
77
+ version: dependencyVersionRange,
78
+ registry: dependencyRegistry
79
+ });
71
80
  }
72
81
  else {
73
- if (o.package.manifest) {
74
- const dependencyManifest = o.package.manifest.get();
75
- const dependencyVersionRange = `^${dependencyManifest.version}`;
76
- const dependencyRegistry = o.package.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? undefined : o.package.registry.endpoint;
77
- context.runtime.trmPackage.manifest.dependencies.push({
78
- name: dependencyManifest.name,
79
- version: dependencyVersionRange,
80
- registry: dependencyRegistry
81
- });
82
- }
83
- else {
84
- trm_commons_1.Logger.error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) Cannot find manifest of dependency in ABAP package "${o.devclass}"`);
85
- }
82
+ trm_commons_1.Logger.error(` (${i + 1}/${result.trmPackageDependencies.withTrmPackage.length}) Cannot find manifest of dependency in ABAP package "${o.devclass}"`);
86
83
  }
87
- });
88
- trm_commons_1.Logger.log(`Adding SAP objects dependencies to manifest`, true);
89
- trm_commons_1.Logger.loading(`Updating manifest...`);
90
- result.objectDependencies.sapObjects.forEach(o => {
91
- if (!context.runtime.trmPackage.manifest.sapEntries[o.table]) {
92
- context.runtime.trmPackage.manifest.sapEntries[o.table] = [];
84
+ }
85
+ });
86
+ trm_commons_1.Logger.log(`Adding SAP objects dependencies to manifest`, true);
87
+ trm_commons_1.Logger.loading(`Updating manifest...`);
88
+ result.objectDependencies.sapObjects.forEach(o => {
89
+ if (!context.runtime.trmPackage.manifest.sapEntries[o.table]) {
90
+ context.runtime.trmPackage.manifest.sapEntries[o.table] = [];
91
+ }
92
+ o.dependencies.forEach(k => {
93
+ var tableKeys = k.object;
94
+ if (o.table === 'TADIR') {
95
+ delete tableKeys['DEVCLASS'];
96
+ }
97
+ if (!context.runtime.trmPackage.manifest.sapEntries[o.table].some(o => _isObjectEqual(o, tableKeys))) {
98
+ context.runtime.trmPackage.manifest.sapEntries[o.table].push(tableKeys);
93
99
  }
94
- o.dependencies.forEach(k => {
95
- var tableKeys = k.object;
96
- if (o.table === 'TADIR') {
97
- delete tableKeys['DEVCLASS'];
98
- }
99
- if (!context.runtime.trmPackage.manifest.sapEntries[o.table].some(o => _isObjectEqual(o, tableKeys))) {
100
- context.runtime.trmPackage.manifest.sapEntries[o.table].push(tableKeys);
101
- }
102
- });
103
100
  });
104
- }
101
+ });
105
102
  })
106
103
  };
@@ -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: typeof (context.rawInput.publishData.private) === 'undefined' ? (latestReleaseManifest ? latestReleaseManifest.private : undefined) : context.rawInput.publishData.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',
@@ -95,11 +93,10 @@ exports.setManifestValues = {
95
93
  }
96
94
  });
97
95
  if (missingDependencies.length > 0) {
98
- trm_commons_1.Logger.warning(`Latest version of the package had the ${missingDependencies.length} dependencies that are now missing`);
99
96
  if (!context.rawInput.contextData.noInquirer) {
100
97
  const inq = yield trm_commons_1.Inquirer.prompt({
101
98
  type: 'select',
102
- message: `Include dependencies (if still relevant)`,
99
+ message: `Dependency`,
103
100
  name: 'dependencies',
104
101
  choices: missingDependencies.map(o => {
105
102
  var name;
@@ -118,6 +115,7 @@ exports.setManifestValues = {
118
115
  context.runtime.trmPackage.manifest.dependencies = (context.runtime.trmPackage.manifest.dependencies || []).concat((inq.dependencies || []));
119
116
  }
120
117
  else {
118
+ trm_commons_1.Logger.warning(`Latest version of the package had the following dependencies:`);
121
119
  missingDependencies.forEach(o => {
122
120
  if (o.registry) {
123
121
  trm_commons_1.Logger.warning(` ${o.name} (${o.registry})`);
@@ -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
- throw new Error(`Multiple roots found in package hierarchy.`);
27
+ if (!ignoreMultiples) {
28
+ throw new Error(`Multiple roots found in package hierarchy.`);
29
+ }
28
30
  }
29
31
  return roots[0];
30
32
  }
@@ -14,3 +14,4 @@ export * from "./getNodePackage";
14
14
  export * from "./getCoreTrmDependencies";
15
15
  export * from "./checkCoreTrmDependencies";
16
16
  export * from "./TrmServerUpgradeService";
17
+ export * from "./jsonStringifyWithKeyOrder";
@@ -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 this.jsonStringifyWithKeyOrder(obj, KEYS_ORDER, 2);
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, reason: string) => Promise<void>;
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, reason: string): Promise<void>;
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
- latest: version,
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, reason) {
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?: string): Promise<void>;
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, reason: string): Promise<void>;
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
- return (yield this._axiosInstance.post(`/publish/${fullName}`, formData, {
445
- params: {
446
- version
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, reason) {
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: reason
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.0.2",
3
+ "version": "8.1.0",
4
4
  "description": "TRM (Transport Request Manager) Core",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",