@simplysf/simply-package 1.11.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +200 -6
- package/README.md +62 -2
- package/lib/commands/simply/package/dependencies/install.d.ts +1 -1
- package/lib/commands/simply/package/dependencies/install.js +25 -18
- package/lib/commands/simply/package/dependencies/install.js.map +1 -1
- package/lib/commands/simply/package/dependencies/manage.d.ts +20 -0
- package/lib/commands/simply/package/dependencies/manage.js +191 -0
- package/lib/commands/simply/package/dependencies/manage.js.map +1 -0
- package/lib/commands/simply/package/version/cleanup.js +23 -11
- package/lib/commands/simply/package/version/cleanup.js.map +1 -1
- package/lib/common/packageUtils.d.ts +11 -3
- package/lib/common/packageUtils.js +13 -4
- package/lib/common/packageUtils.js.map +1 -1
- package/lib/common/packageVersionService.d.ts +22 -0
- package/lib/common/packageVersionService.js +279 -0
- package/lib/common/packageVersionService.js.map +1 -0
- package/lib/common/sfdxProjectService.d.ts +12 -0
- package/lib/common/sfdxProjectService.js +129 -0
- package/lib/common/sfdxProjectService.js.map +1 -0
- package/lib/index.js +13 -4
- package/lib/index.js.map +1 -1
- package/lib/schemas/manage/dependencyChange.d.ts +18 -0
- package/lib/schemas/manage/dependencyChange.js +17 -0
- package/lib/schemas/manage/dependencyChange.js.map +1 -0
- package/lib/schemas/manage/parsedDependency.d.ts +12 -0
- package/lib/schemas/manage/parsedDependency.js +39 -0
- package/lib/schemas/manage/parsedDependency.js.map +1 -0
- package/lib/schemas/sfdx-project/packageDirs.d.ts +19 -0
- package/lib/schemas/sfdx-project/packageDirs.js +43 -0
- package/lib/schemas/sfdx-project/packageDirs.js.map +1 -0
- package/messages/simply.package.dependencies.manage.md +86 -0
- package/npm-shrinkwrap.json +5884 -3253
- package/oclif.lock +3591 -2558
- package/oclif.manifest.json +121 -1
- package/package.json +21 -20
- package/CHANGELOG.md +0 -275
- package/lib/schemas/packageDirs.d.ts +0 -23
- package/lib/schemas/packageDirs.js +0 -8
- package/lib/schemas/packageDirs.js.map +0 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026, Clay Chipps; Copyright (c) 2026 Salesforce, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/* eslint-disable no-await-in-loop */
|
|
17
|
+
import { select } from '@inquirer/prompts';
|
|
18
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
19
|
+
import { Messages } from '@salesforce/core';
|
|
20
|
+
import { buildVersionService } from '../../../../common/packageVersionService.js';
|
|
21
|
+
import { buildProjectService } from '../../../../common/sfdxProjectService.js';
|
|
22
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
23
|
+
const messages = Messages.loadMessages('@simplysf/simply-package', 'simply.package.dependencies.manage');
|
|
24
|
+
export default class PackageDependenciesManage extends SfCommand {
|
|
25
|
+
static summary = messages.getMessage('summary');
|
|
26
|
+
static description = messages.getMessage('description');
|
|
27
|
+
static examples = messages.getMessages('examples');
|
|
28
|
+
static requiresProject = true;
|
|
29
|
+
static flags = {
|
|
30
|
+
...SfCommand.baseFlags,
|
|
31
|
+
branch: Flags.string({
|
|
32
|
+
summary: messages.getMessage('flags.branch.summary'),
|
|
33
|
+
description: messages.getMessage('flags.branch.description'),
|
|
34
|
+
char: 'b',
|
|
35
|
+
}),
|
|
36
|
+
'update-to-released': Flags.boolean({
|
|
37
|
+
summary: messages.getMessage('flags.update-to-released.summary'),
|
|
38
|
+
description: messages.getMessage('flags.update-to-released.description'),
|
|
39
|
+
default: false,
|
|
40
|
+
exclusive: ['update-to-latest'],
|
|
41
|
+
}),
|
|
42
|
+
'update-to-latest': Flags.boolean({
|
|
43
|
+
summary: messages.getMessage('flags.update-to-latest.summary'),
|
|
44
|
+
description: messages.getMessage('flags.update-to-latest.description'),
|
|
45
|
+
default: false,
|
|
46
|
+
exclusive: ['update-to-released'],
|
|
47
|
+
}),
|
|
48
|
+
'api-version': Flags.orgApiVersion(),
|
|
49
|
+
'target-dev-hub': Flags.requiredHub(),
|
|
50
|
+
};
|
|
51
|
+
// eslint-disable-next-line complexity
|
|
52
|
+
async run() {
|
|
53
|
+
const { flags } = await this.parse(PackageDependenciesManage);
|
|
54
|
+
const isInteractive = !flags['update-to-released'] && !flags['update-to-latest'];
|
|
55
|
+
const connection = flags['target-dev-hub'].getConnection(flags['api-version']);
|
|
56
|
+
this.spinner.start(messages.getMessage('info.loadingDevHubData'));
|
|
57
|
+
const versionService = await buildVersionService(connection, this.project);
|
|
58
|
+
this.spinner.stop();
|
|
59
|
+
this.spinner.start(messages.getMessage('info.analyzingDependencies'));
|
|
60
|
+
const projectService = await buildProjectService(this.project);
|
|
61
|
+
const dependenciesByDirectory = projectService.getDependenciesByDirectory();
|
|
62
|
+
const dependenciesToIgnore = projectService.getDependenciesToIgnore();
|
|
63
|
+
const branchesWithReleased = projectService.getBranchesWithReleasedVersions();
|
|
64
|
+
this.spinner.stop();
|
|
65
|
+
const changesByDirectory = new Map();
|
|
66
|
+
const results = [];
|
|
67
|
+
for (const [dirPath, dependencies] of dependenciesByDirectory) {
|
|
68
|
+
changesByDirectory.set(dirPath, []);
|
|
69
|
+
const dirResults = { packageDirectory: dirPath, changes: [] };
|
|
70
|
+
for (const rawDependency of dependencies) {
|
|
71
|
+
const dependency = versionService.enrichDependency(rawDependency);
|
|
72
|
+
const package2Id = dependency.package2Id;
|
|
73
|
+
const dependencyDisplayName = buildDisplayName(dependency, projectService.findAlias.bind(projectService));
|
|
74
|
+
this.info('');
|
|
75
|
+
if (!package2Id ||
|
|
76
|
+
(!versionService.knowsAboutPackage(package2Id) &&
|
|
77
|
+
!versionService.knowsAboutVersion(dependency.subscriberPackageVersionId ?? ''))) {
|
|
78
|
+
this.info(messages.getMessage('info.dependencyNotManagedByDevHub', [dependencyDisplayName]));
|
|
79
|
+
const oldAlias = projectService.findAlias(dependency.subscriberPackageVersionId ?? dependency.package2Id ?? '') ??
|
|
80
|
+
dependencyDisplayName;
|
|
81
|
+
changesByDirectory.get(dirPath).push({
|
|
82
|
+
oldAlias,
|
|
83
|
+
oldDependency: dependency,
|
|
84
|
+
newAlias: oldAlias,
|
|
85
|
+
newSubscriberPackageVersionId: dependency.subscriberPackageVersionId,
|
|
86
|
+
newPackage2Id: dependency.package2Id,
|
|
87
|
+
newVersionNumber: dependency.versionNumber,
|
|
88
|
+
isSameAsOld: true,
|
|
89
|
+
});
|
|
90
|
+
dirResults.changes.push({ oldAlias, newAlias: oldAlias, changed: false });
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
this.info(messages.getMessage('info.reviewingDependency', [dependencyDisplayName]));
|
|
94
|
+
const oldAlias = versionService.getVersionAlias(dependency.subscriberPackageVersionId ?? '') ??
|
|
95
|
+
projectService.findAlias(dependency.subscriberPackageVersionId ?? dependency.package2Id ?? '') ??
|
|
96
|
+
dependencyDisplayName;
|
|
97
|
+
const isIgnored = dependenciesToIgnore.includes(package2Id) ||
|
|
98
|
+
dependenciesToIgnore.includes(versionService.getPackageAlias(package2Id) ?? '');
|
|
99
|
+
let choices = [];
|
|
100
|
+
if (isIgnored) {
|
|
101
|
+
choices =
|
|
102
|
+
dependency.subscriberPackageVersionId &&
|
|
103
|
+
versionService.knowsAboutVersion(dependency.subscriberPackageVersionId)
|
|
104
|
+
? [{ name: 'Current version specified', value: dependency.subscriberPackageVersionId, short: oldAlias }]
|
|
105
|
+
: [];
|
|
106
|
+
}
|
|
107
|
+
else if (isInteractive) {
|
|
108
|
+
choices = versionService.buildInteractiveChoices(dependency, flags.branch ?? '', branchesWithReleased);
|
|
109
|
+
}
|
|
110
|
+
else if (flags['update-to-released']) {
|
|
111
|
+
choices = versionService.buildReleasedChoices(dependency, branchesWithReleased);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
choices = versionService.buildLatestChoices(dependency);
|
|
115
|
+
}
|
|
116
|
+
this.info('');
|
|
117
|
+
if (choices.length === 0) {
|
|
118
|
+
this.info(messages.getMessage('info.noAlternatesFound', [dependencyDisplayName]));
|
|
119
|
+
dirResults.changes.push({ oldAlias, newAlias: oldAlias, changed: false });
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
let selectedValue;
|
|
123
|
+
if (isInteractive && !isIgnored) {
|
|
124
|
+
const packageDisplayName = versionService.getPackageAlias(package2Id) ?? package2Id;
|
|
125
|
+
selectedValue = await this.promptForVersion(messages.getMessage('prompt.selectVersion', [packageDisplayName]), choices);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
selectedValue = choices[0].value;
|
|
129
|
+
}
|
|
130
|
+
const change = buildChange(oldAlias, dependency, selectedValue, versionService.getVersionAlias.bind(versionService), versionService.getPackage2IdForVersion.bind(versionService));
|
|
131
|
+
changesByDirectory.get(dirPath).push(change);
|
|
132
|
+
if (isIgnored) {
|
|
133
|
+
this.info(messages.getMessage('info.versionIgnored', [dependencyDisplayName]));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.info(messages.getMessage('info.versionSelected', [dependencyDisplayName, change.newAlias]));
|
|
137
|
+
}
|
|
138
|
+
dirResults.changes.push({ oldAlias, newAlias: change.newAlias, changed: !change.isSameAsOld });
|
|
139
|
+
this.info('');
|
|
140
|
+
this.info('*'.repeat(88));
|
|
141
|
+
this.info('');
|
|
142
|
+
}
|
|
143
|
+
results.push(dirResults);
|
|
144
|
+
}
|
|
145
|
+
await projectService.applyChanges(changesByDirectory);
|
|
146
|
+
return results;
|
|
147
|
+
}
|
|
148
|
+
// eslint-disable-next-line class-methods-use-this
|
|
149
|
+
async promptForVersion(message, choices) {
|
|
150
|
+
return select({ message, choices, pageSize: 8 });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function buildDisplayName(dependency, findAlias) {
|
|
154
|
+
if (dependency.subscriberPackageVersionId) {
|
|
155
|
+
const alias = findAlias(dependency.subscriberPackageVersionId);
|
|
156
|
+
return alias ? `${alias} (${dependency.subscriberPackageVersionId})` : dependency.subscriberPackageVersionId;
|
|
157
|
+
}
|
|
158
|
+
if (dependency.package2Id && dependency.versionNumber) {
|
|
159
|
+
const alias = findAlias(dependency.package2Id);
|
|
160
|
+
const base = alias ? `${alias} (${dependency.package2Id})` : dependency.package2Id;
|
|
161
|
+
return `${base} version ${dependency.versionNumber}`;
|
|
162
|
+
}
|
|
163
|
+
return '<unknown dependency>';
|
|
164
|
+
}
|
|
165
|
+
function buildChange(oldAlias, oldDependency, selectedValue, getVersionAlias, getPackage2Id) {
|
|
166
|
+
// Pinned selection: value is a SubscriberPackageVersionId (04t)
|
|
167
|
+
if (selectedValue.startsWith('04t')) {
|
|
168
|
+
const newAlias = getVersionAlias(selectedValue) ?? selectedValue;
|
|
169
|
+
const newPackage2Id = getPackage2Id(selectedValue);
|
|
170
|
+
return {
|
|
171
|
+
oldAlias,
|
|
172
|
+
oldDependency,
|
|
173
|
+
newAlias,
|
|
174
|
+
newSubscriberPackageVersionId: selectedValue,
|
|
175
|
+
newPackage2Id,
|
|
176
|
+
isSameAsOld: selectedValue === oldDependency.subscriberPackageVersionId,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Non-pinned selection: value is "package2Id|major.minor.patch.LATEST"
|
|
180
|
+
const [package2Id, versionNumber] = selectedValue.split('|');
|
|
181
|
+
const newAlias = (getVersionAlias(package2Id) ?? package2Id) + '@' + versionNumber;
|
|
182
|
+
return {
|
|
183
|
+
oldAlias,
|
|
184
|
+
oldDependency,
|
|
185
|
+
newAlias,
|
|
186
|
+
newPackage2Id: package2Id,
|
|
187
|
+
newVersionNumber: versionNumber,
|
|
188
|
+
isSameAsOld: package2Id === oldDependency.package2Id && versionNumber === oldDependency.versionNumber,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=manage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage.js","sourceRoot":"","sources":["../../../../../src/commands/simply/package/dependencies/manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the
|
|
5
|
-
*
|
|
2
|
+
* Copyright (c) 2026, Clay Chipps; Copyright (c) 2026 Salesforce, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
6
15
|
*/
|
|
7
16
|
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
8
17
|
import { Messages, Logger } from '@salesforce/core';
|
|
@@ -48,9 +57,9 @@ export default class PackageVersionCleanup extends SfCommand {
|
|
|
48
57
|
throw messages.createError('errors.matcherFormatMismatch');
|
|
49
58
|
}
|
|
50
59
|
const matcherSplit = matcher.split('.');
|
|
51
|
-
const majorMatcher = matcherSplit
|
|
52
|
-
const minorMatcher = matcherSplit
|
|
53
|
-
const patchMatcher = matcherSplit
|
|
60
|
+
const majorMatcher = matcherSplit[0];
|
|
61
|
+
const minorMatcher = matcherSplit[1];
|
|
62
|
+
const patchMatcher = matcherSplit[2];
|
|
54
63
|
log.info(`Major Matcher ${majorMatcher} Minor Matcher ${minorMatcher} Patch Matcher ${patchMatcher}`);
|
|
55
64
|
const packageVersionListOptions = {
|
|
56
65
|
concise: false,
|
|
@@ -103,10 +112,13 @@ export default class PackageVersionCleanup extends SfCommand {
|
|
|
103
112
|
}
|
|
104
113
|
displayDeletionResults(packageCleanupResults) {
|
|
105
114
|
this.styledHeader('Package Version Cleanup Results');
|
|
106
|
-
this.table(
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
115
|
+
this.table({
|
|
116
|
+
data: packageCleanupResults,
|
|
117
|
+
columns: [
|
|
118
|
+
{ key: 'SubscriberPackageVersionId', name: 'PACKAGE VERSION ID' },
|
|
119
|
+
{ key: 'Success', name: 'SUCCESS' },
|
|
120
|
+
{ key: 'Error', name: 'ERROR' },
|
|
121
|
+
],
|
|
110
122
|
});
|
|
111
123
|
}
|
|
112
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../../../src/commands/simply/package/version/cleanup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../../../src/commands/simply/package/version/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NamedPackageDir } from '@salesforce/core';
|
|
2
2
|
import { InstalledPackages, PackagingSObjects } from '@salesforce/packaging';
|
|
3
|
-
import { BasePackageDirWithDependencies } from '../schemas/packageDirs.js';
|
|
4
3
|
type PackageInstallRequest = PackagingSObjects.PackageInstallRequest;
|
|
5
4
|
export declare const PACKAGE_PREFIX_PACKAGE2 = "0Ho";
|
|
6
5
|
export declare const PACKAGE_PREFIX_PACKAGE2_VERSION = "05i";
|
|
@@ -12,5 +11,14 @@ export declare const isSubscriberPackageId: (inputToEvaluate: string) => boolean
|
|
|
12
11
|
export declare const isSubscriberPackageVersionId: (inputToEvaluate: string) => boolean;
|
|
13
12
|
export declare const isSubscriberPackageVersionInstalled: (installedPackages: InstalledPackages[], subscriberPackageVersionId: string) => boolean;
|
|
14
13
|
export declare const reducePackageInstallRequestErrors: (request: PackageInstallRequest) => string;
|
|
15
|
-
export declare const isDependenciesPackagingDirectory: (packageDir:
|
|
14
|
+
export declare const isDependenciesPackagingDirectory: (packageDir: NamedPackageDir) => packageDir is NamedPackageDir & {
|
|
15
|
+
path: string;
|
|
16
|
+
default?: boolean | undefined;
|
|
17
|
+
dependencies?: {
|
|
18
|
+
[x: string]: unknown;
|
|
19
|
+
package: string;
|
|
20
|
+
versionNumber?: string | undefined;
|
|
21
|
+
branch?: string | undefined;
|
|
22
|
+
}[] | undefined;
|
|
23
|
+
};
|
|
16
24
|
export {};
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (c)
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the
|
|
5
|
-
*
|
|
2
|
+
* Copyright (c) 2026, Clay Chipps; Copyright (c) 2026 Salesforce, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
6
15
|
*/
|
|
7
16
|
export const PACKAGE_PREFIX_PACKAGE2 = '0Ho';
|
|
8
17
|
export const PACKAGE_PREFIX_PACKAGE2_VERSION = '05i';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageUtils.js","sourceRoot":"","sources":["../../src/common/packageUtils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"packageUtils.js","sourceRoot":"","sources":["../../src/common/packageUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAC7C,MAAM,CAAC,MAAM,+BAA+B,GAAG,KAAK,CAAC;AACrD,MAAM,CAAC,MAAM,iCAAiC,GAAG,KAAK,CAAC;AACvD,MAAM,CAAC,MAAM,yCAAyC,GAAG,KAAK,CAAC;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,eAAuB,EAAW,EAAE,CAC/D,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAEhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,eAAuB,EAAW,EAAE,CACtE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAExF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,eAAuB,EAAW,EAAE,CACxE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAE1F,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,eAAuB,EAAW,EAAE,CAC/E,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAElG,MAAM,CAAC,MAAM,mCAAmC,GAAG,CACjD,iBAAsC,EACtC,0BAAkC,EACzB,EAAE,CACX,iBAAiB,CAAC,IAAI,CACpB,CAAC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,EAAE,KAAK,0BAA0B,CACpG,CAAC;AAEJ,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,OAA8B,EAAU,EAAE;IAC1F,IAAI,YAAY,GAAG,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;IACvC,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,YAAY,GAAG,uBAAuB,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,YAAY,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,UAA2B,EACqC,EAAE,CAClE,cAAc,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Connection } from '@salesforce/core';
|
|
2
|
+
import { SfProject } from '@salesforce/core';
|
|
3
|
+
import { PackageVersionListResult } from '@salesforce/packaging';
|
|
4
|
+
import { ParsedDependency } from '../schemas/manage/parsedDependency.js';
|
|
5
|
+
export type VersionChoice = {
|
|
6
|
+
name: string;
|
|
7
|
+
value: string;
|
|
8
|
+
short: string;
|
|
9
|
+
};
|
|
10
|
+
export type PackageVersionService = {
|
|
11
|
+
knowsAboutVersion(subscriberPackageVersionId: string): boolean;
|
|
12
|
+
knowsAboutPackage(package2Id: string): boolean;
|
|
13
|
+
getPackage2IdForVersion(subscriberPackageVersionId: string): string | undefined;
|
|
14
|
+
getVersionAlias(subscriberPackageVersionId: string): string | undefined;
|
|
15
|
+
getPackageAlias(package2Id: string): string | undefined;
|
|
16
|
+
enrichDependency(dependency: ParsedDependency): ParsedDependency;
|
|
17
|
+
buildInteractiveChoices(dependency: ParsedDependency, branch: string, branchesWithReleased: string[]): VersionChoice[];
|
|
18
|
+
buildReleasedChoices(dependency: ParsedDependency, branchesWithReleased: string[]): VersionChoice[];
|
|
19
|
+
buildLatestChoices(dependency: ParsedDependency): VersionChoice[];
|
|
20
|
+
findVersionById(subscriberPackageVersionId: string): PackageVersionListResult | undefined;
|
|
21
|
+
};
|
|
22
|
+
export declare function buildVersionService(connection: Connection, project: SfProject): Promise<PackageVersionService>;
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026, Clay Chipps; Copyright (c) 2026 Salesforce, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Package } from '@salesforce/packaging';
|
|
17
|
+
export async function buildVersionService(connection, project) {
|
|
18
|
+
const packages = await Package.list(connection);
|
|
19
|
+
const versions = await Package.listVersions(connection, project, {
|
|
20
|
+
concise: false,
|
|
21
|
+
createdLastDays: undefined,
|
|
22
|
+
modifiedLastDays: undefined,
|
|
23
|
+
orderBy: 'Package2Id, Branch, MajorVersion, MinorVersion, PatchVersion, BuildNumber',
|
|
24
|
+
isReleased: undefined,
|
|
25
|
+
verbose: true,
|
|
26
|
+
});
|
|
27
|
+
const versionsBySubscriberId = new Map();
|
|
28
|
+
const packageAliasById = new Map();
|
|
29
|
+
const versionsByPackageAndBranch = new Map();
|
|
30
|
+
const releasedVersionsByPackageAndBranch = new Map();
|
|
31
|
+
for (const pkg of packages) {
|
|
32
|
+
packageAliasById.set(pkg.Id, computePackageAlias(pkg));
|
|
33
|
+
}
|
|
34
|
+
for (const version of versions) {
|
|
35
|
+
versionsBySubscriberId.set(version.SubscriberPackageVersionId, version);
|
|
36
|
+
sortVersionIntoMap(versionsByPackageAndBranch, version);
|
|
37
|
+
if (version.IsReleased) {
|
|
38
|
+
sortVersionIntoMap(releasedVersionsByPackageAndBranch, version);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function computePackageAlias(pkg) {
|
|
42
|
+
return (pkg.NamespacePrefix ? pkg.NamespacePrefix + '.' : '') + pkg.Name;
|
|
43
|
+
}
|
|
44
|
+
function computeVersionAlias(v, branch) {
|
|
45
|
+
const seg = `${v.MajorVersion}.${v.MinorVersion}.${v.PatchVersion}-${v.BuildNumber}` + (branch ? '-' + branch : '');
|
|
46
|
+
const pkgAlias = packageAliasById.get(v.Package2Id) ?? v.Package2Id;
|
|
47
|
+
return pkgAlias + '@' + seg;
|
|
48
|
+
}
|
|
49
|
+
function sortVersionIntoMap(map, v) {
|
|
50
|
+
const branch = v.Branch ?? '';
|
|
51
|
+
const major = parseInt(v.MajorVersion, 10);
|
|
52
|
+
const minor = parseInt(v.MinorVersion, 10);
|
|
53
|
+
const patch = parseInt(v.PatchVersion, 10);
|
|
54
|
+
const build = parseInt(v.BuildNumber, 10);
|
|
55
|
+
if (!map.has(v.Package2Id))
|
|
56
|
+
map.set(v.Package2Id, new Map());
|
|
57
|
+
const byBranch = map.get(v.Package2Id);
|
|
58
|
+
if (!byBranch.has(branch))
|
|
59
|
+
byBranch.set(branch, new Map());
|
|
60
|
+
const byMajor = byBranch.get(branch);
|
|
61
|
+
if (!byMajor.has(major))
|
|
62
|
+
byMajor.set(major, new Map());
|
|
63
|
+
const byMinor = byMajor.get(major);
|
|
64
|
+
if (!byMinor.has(minor))
|
|
65
|
+
byMinor.set(minor, new Map());
|
|
66
|
+
const byPatch = byMinor.get(minor);
|
|
67
|
+
if (!byPatch.has(patch))
|
|
68
|
+
byPatch.set(patch, new Map());
|
|
69
|
+
const byBuild = byPatch.get(patch);
|
|
70
|
+
if (!byBuild.has(build))
|
|
71
|
+
byBuild.set(build, v);
|
|
72
|
+
}
|
|
73
|
+
// Walks a version map block to the latest (highest-key) entry at any depth
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
function findLatestFromBlock(block) {
|
|
76
|
+
const keys = [...block.keys()];
|
|
77
|
+
const maxKey = keys.reduce((max, k) => (k > max ? k : max), keys[0]);
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
79
|
+
const entry = block.get(maxKey);
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
81
|
+
return entry instanceof Map ? findLatestFromBlock(entry) : entry;
|
|
82
|
+
}
|
|
83
|
+
let ChunkLevel;
|
|
84
|
+
(function (ChunkLevel) {
|
|
85
|
+
ChunkLevel[ChunkLevel["Major"] = 1] = "Major";
|
|
86
|
+
ChunkLevel[ChunkLevel["Minor"] = 2] = "Minor";
|
|
87
|
+
ChunkLevel[ChunkLevel["Patch"] = 3] = "Patch";
|
|
88
|
+
})(ChunkLevel || (ChunkLevel = {}));
|
|
89
|
+
function findBlock(map, package2Id, branch, dependency, level
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
+
) {
|
|
92
|
+
const resolvedBranch = branch ?? '';
|
|
93
|
+
const byBranch = map.get(package2Id);
|
|
94
|
+
if (!byBranch?.has(resolvedBranch))
|
|
95
|
+
return undefined;
|
|
96
|
+
const byMajor = byBranch.get(resolvedBranch);
|
|
97
|
+
if (level === ChunkLevel.Major)
|
|
98
|
+
return byMajor;
|
|
99
|
+
const byMinor = byMajor?.get(dependency.majorVersion);
|
|
100
|
+
if (level === ChunkLevel.Minor || byMinor === undefined)
|
|
101
|
+
return byMinor;
|
|
102
|
+
return byMinor.get(dependency.minorVersion);
|
|
103
|
+
}
|
|
104
|
+
function makeVersionChoice(v, label, branch) {
|
|
105
|
+
const seg = `${v.MajorVersion}.${v.MinorVersion}.${v.PatchVersion}-${v.BuildNumber}` + (branch ? '-' + branch : '');
|
|
106
|
+
return {
|
|
107
|
+
name: `${label}: ${seg}`,
|
|
108
|
+
value: v.SubscriberPackageVersionId,
|
|
109
|
+
short: seg,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function makeLatestChoice(v, label) {
|
|
113
|
+
const seg = `${v.MajorVersion}.${v.MinorVersion}.${v.PatchVersion}.LATEST`;
|
|
114
|
+
return {
|
|
115
|
+
name: label,
|
|
116
|
+
value: `${v.Package2Id}|${seg}`,
|
|
117
|
+
short: seg,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function findLatestReleasedForBranch(package2Id, branch, dependency, seen) {
|
|
121
|
+
const block = findBlock(releasedVersionsByPackageAndBranch, package2Id, branch, dependency, ChunkLevel.Major);
|
|
122
|
+
if (!block)
|
|
123
|
+
return undefined;
|
|
124
|
+
const v = findLatestFromBlock(block);
|
|
125
|
+
if (seen.has(v.SubscriberPackageVersionId))
|
|
126
|
+
return undefined;
|
|
127
|
+
seen.add(v.SubscriberPackageVersionId);
|
|
128
|
+
const label = branch
|
|
129
|
+
? `Latest released version on build branch - ${branch}`
|
|
130
|
+
: 'Latest released version on main build branch';
|
|
131
|
+
return makeVersionChoice(v, label, branch || undefined);
|
|
132
|
+
}
|
|
133
|
+
function findLatestForBranch(package2Id, branch, dependency, level, label, seen) {
|
|
134
|
+
const block = findBlock(versionsByPackageAndBranch, package2Id, branch, dependency, level);
|
|
135
|
+
if (!block)
|
|
136
|
+
return undefined;
|
|
137
|
+
const v = findLatestFromBlock(block);
|
|
138
|
+
if (seen.has(v.SubscriberPackageVersionId))
|
|
139
|
+
return undefined;
|
|
140
|
+
seen.add(v.SubscriberPackageVersionId);
|
|
141
|
+
return makeVersionChoice(v, label, branch || undefined);
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
knowsAboutVersion(id) {
|
|
145
|
+
return versionsBySubscriberId.has(id);
|
|
146
|
+
},
|
|
147
|
+
knowsAboutPackage(package2Id) {
|
|
148
|
+
return packageAliasById.has(package2Id);
|
|
149
|
+
},
|
|
150
|
+
getPackage2IdForVersion(subscriberPackageVersionId) {
|
|
151
|
+
return versionsBySubscriberId.get(subscriberPackageVersionId)?.Package2Id;
|
|
152
|
+
},
|
|
153
|
+
getVersionAlias(subscriberPackageVersionId) {
|
|
154
|
+
const v = versionsBySubscriberId.get(subscriberPackageVersionId);
|
|
155
|
+
if (!v)
|
|
156
|
+
return undefined;
|
|
157
|
+
return computeVersionAlias(v, v.Branch || undefined);
|
|
158
|
+
},
|
|
159
|
+
getPackageAlias(package2Id) {
|
|
160
|
+
return packageAliasById.get(package2Id);
|
|
161
|
+
},
|
|
162
|
+
findVersionById(subscriberPackageVersionId) {
|
|
163
|
+
return versionsBySubscriberId.get(subscriberPackageVersionId);
|
|
164
|
+
},
|
|
165
|
+
enrichDependency(dependency) {
|
|
166
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
167
|
+
if (dependency.package2Id || !dependency.subscriberPackageVersionId)
|
|
168
|
+
return dependency;
|
|
169
|
+
const v = versionsBySubscriberId.get(dependency.subscriberPackageVersionId);
|
|
170
|
+
if (!v)
|
|
171
|
+
return dependency;
|
|
172
|
+
const parts = `${v.MajorVersion}.${v.MinorVersion}.${v.PatchVersion}.${v.BuildNumber}`.split('.');
|
|
173
|
+
return {
|
|
174
|
+
...dependency,
|
|
175
|
+
package2Id: v.Package2Id,
|
|
176
|
+
versionNumber: `${v.MajorVersion}.${v.MinorVersion}.${v.PatchVersion}.${v.BuildNumber}`,
|
|
177
|
+
majorVersion: parseInt(parts[0], 10),
|
|
178
|
+
minorVersion: parseInt(parts[1], 10),
|
|
179
|
+
patchVersion: parseInt(parts[2], 10),
|
|
180
|
+
buildVersion: parseInt(parts[3], 10),
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
// eslint-disable-next-line complexity
|
|
184
|
+
buildInteractiveChoices(dependency, branch, branchesWithReleased) {
|
|
185
|
+
const package2Id = dependency.package2Id;
|
|
186
|
+
const maj = dependency.majorVersion ?? '';
|
|
187
|
+
const min = dependency.minorVersion ?? '';
|
|
188
|
+
const pat = dependency.patchVersion ?? '';
|
|
189
|
+
const choices = [];
|
|
190
|
+
const releasedChoices = [];
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
// Latest released on null/main branch and named release branches
|
|
193
|
+
const releasedMain = findLatestReleasedForBranch(package2Id, '', dependency, seen);
|
|
194
|
+
if (releasedMain)
|
|
195
|
+
releasedChoices.push(releasedMain);
|
|
196
|
+
for (const b of branchesWithReleased ?? []) {
|
|
197
|
+
const rc = findLatestReleasedForBranch(package2Id, b, dependency, seen);
|
|
198
|
+
if (rc)
|
|
199
|
+
releasedChoices.push(rc);
|
|
200
|
+
}
|
|
201
|
+
// Latest version on the specified feature branch
|
|
202
|
+
if (branch) {
|
|
203
|
+
const c = findLatestForBranch(package2Id, branch, dependency, ChunkLevel.Patch, `Latest version on '${branch}' branch`, seen);
|
|
204
|
+
if (c)
|
|
205
|
+
choices.push(c);
|
|
206
|
+
}
|
|
207
|
+
// Latest build with same Major.Minor.Patch on main branch and release branches
|
|
208
|
+
const patchMain = findLatestForBranch(package2Id, '', dependency, ChunkLevel.Patch, `Latest ${maj}.${min}.${pat} version on main build branch`, seen);
|
|
209
|
+
if (patchMain)
|
|
210
|
+
choices.push(patchMain);
|
|
211
|
+
for (const b of branchesWithReleased ?? []) {
|
|
212
|
+
const c = findLatestForBranch(package2Id, b, dependency, ChunkLevel.Patch, `Latest ${maj}.${min}.${pat} version on build branch - ${b}`, seen);
|
|
213
|
+
if (c)
|
|
214
|
+
choices.push(c);
|
|
215
|
+
}
|
|
216
|
+
// Latest build with same Major.Minor on main branch and release branches
|
|
217
|
+
const minorMain = findLatestForBranch(package2Id, '', dependency, ChunkLevel.Minor, `Latest ${maj}.${min} version on main build branch`, seen);
|
|
218
|
+
if (minorMain)
|
|
219
|
+
choices.push(minorMain);
|
|
220
|
+
for (const b of branchesWithReleased ?? []) {
|
|
221
|
+
const c = findLatestForBranch(package2Id, b, dependency, ChunkLevel.Minor, `Latest ${maj}.${min} version on build branch - ${b}`, seen);
|
|
222
|
+
if (c)
|
|
223
|
+
choices.push(c);
|
|
224
|
+
}
|
|
225
|
+
// Latest build overall on main branch and release branches
|
|
226
|
+
const majorMain = findLatestForBranch(package2Id, '', dependency, ChunkLevel.Major, 'Latest version on main build branch', seen);
|
|
227
|
+
if (majorMain)
|
|
228
|
+
choices.push(majorMain);
|
|
229
|
+
for (const b of branchesWithReleased ?? []) {
|
|
230
|
+
const c = findLatestForBranch(package2Id, b, dependency, ChunkLevel.Major, `Latest version on build branch - ${b}`, seen);
|
|
231
|
+
if (c)
|
|
232
|
+
choices.push(c);
|
|
233
|
+
}
|
|
234
|
+
// Released choices go after so they appear clearly
|
|
235
|
+
choices.push(...releasedChoices);
|
|
236
|
+
// Non-pinned latest for current Major.Minor.Patch
|
|
237
|
+
const block = findBlock(versionsByPackageAndBranch, package2Id, branch, dependency, ChunkLevel.Patch) ??
|
|
238
|
+
findBlock(versionsByPackageAndBranch, package2Id, '', dependency, ChunkLevel.Patch) ??
|
|
239
|
+
findBlock(versionsByPackageAndBranch, package2Id, '', dependency, ChunkLevel.Minor);
|
|
240
|
+
if (block) {
|
|
241
|
+
const v = findLatestFromBlock(block);
|
|
242
|
+
choices.push(makeLatestChoice(v, `Non-pinned latest ${maj}.${min}.${pat} build`));
|
|
243
|
+
}
|
|
244
|
+
// Keep the current version as last option
|
|
245
|
+
if (dependency.subscriberPackageVersionId && versionsBySubscriberId.has(dependency.subscriberPackageVersionId)) {
|
|
246
|
+
const v = versionsBySubscriberId.get(dependency.subscriberPackageVersionId);
|
|
247
|
+
choices.push(makeVersionChoice(v, 'Current version specified', v.Branch || undefined));
|
|
248
|
+
}
|
|
249
|
+
return choices;
|
|
250
|
+
},
|
|
251
|
+
buildReleasedChoices(dependency, branchesWithReleased) {
|
|
252
|
+
const package2Id = dependency.package2Id;
|
|
253
|
+
const choices = [];
|
|
254
|
+
const seen = new Set();
|
|
255
|
+
const main = findLatestReleasedForBranch(package2Id, '', dependency, seen);
|
|
256
|
+
if (main)
|
|
257
|
+
choices.push(main);
|
|
258
|
+
for (const b of branchesWithReleased ?? []) {
|
|
259
|
+
const c = findLatestReleasedForBranch(package2Id, b, dependency, seen);
|
|
260
|
+
if (c)
|
|
261
|
+
choices.push(c);
|
|
262
|
+
}
|
|
263
|
+
return choices;
|
|
264
|
+
},
|
|
265
|
+
buildLatestChoices(dependency) {
|
|
266
|
+
const package2Id = dependency.package2Id;
|
|
267
|
+
const block = findBlock(versionsByPackageAndBranch, package2Id, '', dependency, ChunkLevel.Patch) ??
|
|
268
|
+
findBlock(versionsByPackageAndBranch, package2Id, '', dependency, ChunkLevel.Minor);
|
|
269
|
+
if (!block)
|
|
270
|
+
return [];
|
|
271
|
+
const v = findLatestFromBlock(block);
|
|
272
|
+
const maj = dependency.majorVersion ?? '';
|
|
273
|
+
const min = dependency.minorVersion ?? '';
|
|
274
|
+
const pat = dependency.patchVersion ?? '';
|
|
275
|
+
return [makeLatestChoice(v, `Non-pinned latest ${maj}.${min}.${pat} build`)];
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=packageVersionService.js.map
|