@salesforce/packaging 4.16.0 → 4.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,18 @@ class Package {
244
247
  if (opts.RecommendedVersionId !== undefined && this.options.connection.getApiVersion() < '66.0') {
245
248
  throw messages.createError('recommendedVersionIdApiPriorTo66Error');
246
249
  }
250
+ if (opts.RecommendedVersionId !== undefined) {
251
+ const trimmedId = opts.RecommendedVersionId.trim();
252
+ if (trimmedId === '' || !trimmedId.startsWith('04t') || (trimmedId.length !== 15 && trimmedId.length !== 18)) {
253
+ throw messages.createError('invalidRecommendedVersionError');
254
+ }
255
+ }
256
+ if (skipAncestorCheck === true && opts.RecommendedVersionId === undefined) {
257
+ throw messages.createError('skipAncestorCheckRequiresRecommendedVersionIdError');
258
+ }
259
+ if (skipAncestorCheck !== true && opts.RecommendedVersionId !== undefined) {
260
+ await this.checkRecommendedVersionAncestors(opts);
261
+ }
247
262
  const result = await this.options.connection.tooling.update('Package2', opts);
248
263
  if (!result.success) {
249
264
  throw new core_1.SfError(result.errors.join(', '));
@@ -273,6 +288,67 @@ class Package {
273
288
  }
274
289
  return this.packageData;
275
290
  }
291
+ /**
292
+ *
293
+ * @param options
294
+ */
295
+ async checkRecommendedVersionAncestors(opts) {
296
+ if (opts.RecommendedVersionId === undefined) {
297
+ return;
298
+ }
299
+ const queryP2 = `${package2Query} WHERE Id = '${this.packageId}'`;
300
+ const priorRecommendedVersionId = (await this.options.connection.tooling.query(queryP2))
301
+ .records[0].RecommendedVersionId;
302
+ if (priorRecommendedVersionId === undefined || opts.RecommendedVersionId === priorRecommendedVersionId) {
303
+ return;
304
+ }
305
+ const queryP2V = `${packageVersionQuery} WHERE Package2Id = '${this.packageId}'`;
306
+ const result = await this.options.connection.tooling.query(queryP2V);
307
+ if (result.totalSize === 0) {
308
+ throw messages.createError('noPackageVersionsForGivenPackage2FoundError');
309
+ }
310
+ else if (result.totalSize === 1) {
311
+ return;
312
+ }
313
+ const graph = new graphology_1.DirectedGraph();
314
+ const truncatedRecommendedVersionId = opts.RecommendedVersionId.substring(0, 15);
315
+ const stack = [truncatedRecommendedVersionId];
316
+ const visited = new Set([truncatedRecommendedVersionId]);
317
+ result.records.forEach((record) => {
318
+ const truncatedSubscriberId = record.SubscriberPackageVersionId.substring(0, 15);
319
+ graph.addNode(truncatedSubscriberId);
320
+ if (record.AncestorId) {
321
+ const truncatedAncestorId = record.AncestorId.substring(0, 15);
322
+ if (!graph.hasNode(truncatedAncestorId)) {
323
+ graph.addNode(truncatedAncestorId);
324
+ }
325
+ graph.addEdge(truncatedSubscriberId, truncatedAncestorId);
326
+ }
327
+ });
328
+ if (!graph.hasNode(truncatedRecommendedVersionId)) {
329
+ throw messages.createError('unassociatedRecommendedVersionError');
330
+ }
331
+ const truncatedPriorRecommendedVersionId = priorRecommendedVersionId?.substring(0, 15);
332
+ if (graph.outDegree(truncatedRecommendedVersionId) > 0 &&
333
+ result.records.some((record) => record.SubscriberPackageVersionId.substring(0, 15) === truncatedPriorRecommendedVersionId)) {
334
+ while (stack.length > 0) {
335
+ const node = stack.pop();
336
+ for (const neighbor of graph.neighbors(node)) {
337
+ if (neighbor === truncatedPriorRecommendedVersionId) {
338
+ return;
339
+ }
340
+ if (!visited.has(neighbor)) {
341
+ visited.add(neighbor);
342
+ stack.push(neighbor);
343
+ }
344
+ }
345
+ }
346
+ }
347
+ else if (graph.outDegree(truncatedRecommendedVersionId) === 0 && result.records.length === 1) {
348
+ return;
349
+ }
350
+ throw messages.createError('recommendedVersionNotAncestorOfPriorVersionError');
351
+ }
276
352
  }
277
353
  exports.Package = Package;
278
354
  //# sourceMappingURL=package.js.map
@@ -49,3 +49,23 @@ 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.
64
+
65
+ # invalidRecommendedVersionError
66
+
67
+ Provide a valid subscriber package version (04t) for the recommended version.
68
+
69
+ # unassociatedRecommendedVersionError
70
+
71
+ The provided recommended version isn't associated with this package.
@@ -92,11 +92,11 @@ Provide a valid positive number for %s. %d
92
92
 
93
93
  # errorAncestorNoneNotAllowed
94
94
 
95
- Can’t create package version because you didn’t specify a package ancestor. Set the ancestor version to %s, and try creating the package version. You can also specify --skipancestorcheck to override the ancestry requirement.
95
+ Can’t create package version because you didn’t specify a package ancestor. Set the ancestor version to %s and try creating the package version again. You can also specify --skip-ancestor-check to override the ancestry requirement.
96
96
 
97
97
  # errorAncestorNotHighest
98
98
 
99
- Can’t create package version. The ancestor version [%s] you specified isn’t the highest released package version. Set the ancestor version to %s, and try creating the package version again. You can also specify --skipancestorcheck to override the ancestry requirement.
99
+ Can’t create package version. The ancestor version [%s] you specified isn’t the highest released package version. Set the ancestor version to %s and try creating the package version again. You can also specify --skip-ancestor-check to override the ancestry requirement.
100
100
 
101
101
  # errorInvalidBuildNumberForKeywords
102
102
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/packaging",
3
- "version": "4.16.0",
3
+ "version": "4.17.1",
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",