@salesforce/packaging 4.16.0 → 4.17.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/lib/package/package.d.ts +6 -1
- package/lib/package/package.js +64 -1
- package/messages/package.md +12 -0
- package/package.json +4 -4
package/lib/package/package.d.ts
CHANGED
|
@@ -129,11 +129,16 @@ export declare class Package {
|
|
|
129
129
|
*
|
|
130
130
|
* @param options
|
|
131
131
|
*/
|
|
132
|
-
update(options: PackageUpdateOptions): Promise<PackageSaveResult>;
|
|
132
|
+
update(options: PackageUpdateOptions, skipAncestorCheck?: boolean): Promise<PackageSaveResult>;
|
|
133
133
|
/**
|
|
134
134
|
* Returns the package data for the package.
|
|
135
135
|
*
|
|
136
136
|
* @param force force a refresh of the package data
|
|
137
137
|
*/
|
|
138
138
|
getPackageData(force?: boolean): Promise<PackagingSObjects.Package2 | undefined>;
|
|
139
|
+
/**
|
|
140
|
+
*
|
|
141
|
+
* @param options
|
|
142
|
+
*/
|
|
143
|
+
private checkRecommendedVersionAncestors;
|
|
139
144
|
}
|
package/lib/package/package.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Package = exports.Package2Fields = void 0;
|
|
4
4
|
const core_1 = require("@salesforce/core");
|
|
5
|
+
const graphology_1 = require("graphology");
|
|
5
6
|
const packageUtils_1 = require("../utils/packageUtils");
|
|
6
7
|
const packageCreate_1 = require("./packageCreate");
|
|
7
8
|
const packageConvert_1 = require("./packageConvert");
|
|
@@ -18,6 +19,8 @@ const packagePrefixes = {
|
|
|
18
19
|
};
|
|
19
20
|
core_1.Messages.importMessagesDirectory(__dirname);
|
|
20
21
|
const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package');
|
|
22
|
+
const packageVersionQuery = 'SELECT SubscriberPackageVersionId, AncestorId FROM Package2Version';
|
|
23
|
+
const package2Query = 'SELECT RecommendedVersionId FROM Package2';
|
|
21
24
|
exports.Package2Fields = [
|
|
22
25
|
'Id',
|
|
23
26
|
'IsDeleted',
|
|
@@ -234,7 +237,7 @@ class Package {
|
|
|
234
237
|
*
|
|
235
238
|
* @param options
|
|
236
239
|
*/
|
|
237
|
-
async update(options) {
|
|
240
|
+
async update(options, skipAncestorCheck) {
|
|
238
241
|
try {
|
|
239
242
|
// filter out any undefined values and their keys
|
|
240
243
|
const opts = Object.fromEntries(Object.entries(options).filter(([, value]) => value !== undefined));
|
|
@@ -244,6 +247,12 @@ class Package {
|
|
|
244
247
|
if (opts.RecommendedVersionId !== undefined && this.options.connection.getApiVersion() < '66.0') {
|
|
245
248
|
throw messages.createError('recommendedVersionIdApiPriorTo66Error');
|
|
246
249
|
}
|
|
250
|
+
if (skipAncestorCheck === true && opts.RecommendedVersionId === undefined) {
|
|
251
|
+
throw messages.createError('skipAncestorCheckRequiresRecommendedVersionIdError');
|
|
252
|
+
}
|
|
253
|
+
if (skipAncestorCheck !== true && opts.RecommendedVersionId !== undefined) {
|
|
254
|
+
await this.checkRecommendedVersionAncestors(opts);
|
|
255
|
+
}
|
|
247
256
|
const result = await this.options.connection.tooling.update('Package2', opts);
|
|
248
257
|
if (!result.success) {
|
|
249
258
|
throw new core_1.SfError(result.errors.join(', '));
|
|
@@ -273,6 +282,60 @@ class Package {
|
|
|
273
282
|
}
|
|
274
283
|
return this.packageData;
|
|
275
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
*
|
|
287
|
+
* @param options
|
|
288
|
+
*/
|
|
289
|
+
async checkRecommendedVersionAncestors(opts) {
|
|
290
|
+
if (opts.RecommendedVersionId === undefined) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const queryP2 = `${package2Query} WHERE Id = '${this.packageId}'`;
|
|
294
|
+
const priorRecommendedVersionId = (await this.options.connection.tooling.query(queryP2))
|
|
295
|
+
.records[0].RecommendedVersionId;
|
|
296
|
+
if (priorRecommendedVersionId === undefined || opts.RecommendedVersionId === priorRecommendedVersionId) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const queryP2V = `${packageVersionQuery} WHERE Package2Id = '${this.packageId}'`;
|
|
300
|
+
const result = await this.options.connection.tooling.query(queryP2V);
|
|
301
|
+
if (result.totalSize === 0) {
|
|
302
|
+
throw messages.createError('noPackageVersionsForGivenPackage2FoundError');
|
|
303
|
+
}
|
|
304
|
+
else if (result.totalSize === 1) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
const graph = new graphology_1.DirectedGraph();
|
|
308
|
+
const stack = [opts.RecommendedVersionId];
|
|
309
|
+
const visited = new Set([opts.RecommendedVersionId]);
|
|
310
|
+
result.records.forEach((record) => {
|
|
311
|
+
graph.addNode(record.SubscriberPackageVersionId);
|
|
312
|
+
if (record.AncestorId) {
|
|
313
|
+
if (!graph.hasNode(record.AncestorId)) {
|
|
314
|
+
graph.addNode(record.AncestorId);
|
|
315
|
+
}
|
|
316
|
+
graph.addEdge(record.SubscriberPackageVersionId, record.AncestorId);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
if (graph.outDegree(opts.RecommendedVersionId) > 0 &&
|
|
320
|
+
result.records.some((record) => record.SubscriberPackageVersionId === priorRecommendedVersionId)) {
|
|
321
|
+
while (stack.length > 0) {
|
|
322
|
+
const node = stack.pop();
|
|
323
|
+
for (const neighbor of graph.neighbors(node)) {
|
|
324
|
+
if (neighbor === priorRecommendedVersionId) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (!visited.has(neighbor)) {
|
|
328
|
+
visited.add(neighbor);
|
|
329
|
+
stack.push(neighbor);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
else if (graph.outDegree(opts.RecommendedVersionId) === 0 && result.records.length === 1) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
throw messages.createError('recommendedVersionNotAncestorOfPriorVersionError');
|
|
338
|
+
}
|
|
276
339
|
}
|
|
277
340
|
exports.Package = Package;
|
|
278
341
|
//# sourceMappingURL=package.js.map
|
package/messages/package.md
CHANGED
|
@@ -49,3 +49,15 @@ Can't retrieve package metadata. The org you specified doesn't have the required
|
|
|
49
49
|
# recommendedVersionIdApiPriorTo66Error
|
|
50
50
|
|
|
51
51
|
To enable Recommended Version, use API version 66.0 or higher.
|
|
52
|
+
|
|
53
|
+
# skipAncestorCheckRequiresRecommendedVersionIdError
|
|
54
|
+
|
|
55
|
+
The skip ancestor check requires a recommended version ID.
|
|
56
|
+
|
|
57
|
+
# noPackageVersionsForGivenPackage2FoundError
|
|
58
|
+
|
|
59
|
+
No package versions were found for the given Package 2 ID (0Ho). At least one released package version must exist.
|
|
60
|
+
|
|
61
|
+
# recommendedVersionNotAncestorOfPriorVersionError
|
|
62
|
+
|
|
63
|
+
The new recommended version is not a descendant of the previous recommended version. To bypass this check, use the --skip-ancestor-check CLI flag.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/packaging",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.17.0",
|
|
4
4
|
"description": "Packaging library for the Salesforce packaging platform",
|
|
5
5
|
"main": "lib/exported",
|
|
6
6
|
"types": "lib/exported.d.ts",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"!lib/**/*.map"
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@jsforce/jsforce-node": "^3.10.
|
|
46
|
-
"@salesforce/core": "^8.23.
|
|
45
|
+
"@jsforce/jsforce-node": "^3.10.8",
|
|
46
|
+
"@salesforce/core": "^8.23.2",
|
|
47
47
|
"@salesforce/kit": "^3.2.3",
|
|
48
48
|
"@salesforce/schemas": "^1.10.3",
|
|
49
|
-
"@salesforce/source-deploy-retrieve": "^12.
|
|
49
|
+
"@salesforce/source-deploy-retrieve": "^12.24.0",
|
|
50
50
|
"@salesforce/ts-types": "^2.0.11",
|
|
51
51
|
"@salesforce/types": "^1.2.0",
|
|
52
52
|
"fast-xml-parser": "^4.5.0",
|