@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.
@@ -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
  }
@@ -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
@@ -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.16.0",
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.4",
46
- "@salesforce/core": "^8.23.0",
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.16.9",
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",