@salesforce/packaging 0.0.35 → 0.0.37

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 (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/lib/interfaces/packagingInterfacesAndType.d.ts +31 -1
  3. package/lib/interfaces/packagingInterfacesAndType.js +31 -1
  4. package/lib/package/package.d.ts +1 -1
  5. package/lib/package/package.js +3 -2
  6. package/lib/package/packageAncestry.d.ts +1 -1
  7. package/lib/package/packageAncestry.js +5 -5
  8. package/lib/package/packageConvert.d.ts +1 -0
  9. package/lib/package/packageConvert.js +122 -4
  10. package/lib/package/packageCreate.d.ts +3 -3
  11. package/lib/package/packageCreate.js +12 -11
  12. package/lib/package/packageInstall.d.ts +3 -2
  13. package/lib/package/packageInstall.js +50 -17
  14. package/lib/package/packageProfileApi.js +1 -1
  15. package/lib/package/packageUninstall.js +5 -3
  16. package/lib/package/packageVersion.d.ts +7 -0
  17. package/lib/package/packageVersion.js +34 -7
  18. package/lib/package/packageVersionCreate.d.ts +6 -0
  19. package/lib/package/packageVersionCreate.js +227 -21
  20. package/lib/package/packageVersionCreateRequest.js +8 -3
  21. package/lib/package/packageVersionList.js +1 -1
  22. package/lib/package/packageVersionReport.js +28 -2
  23. package/lib/package1/package1VersionCreate.js +3 -2
  24. package/lib/utils/packageUtils.d.ts +1 -37
  25. package/lib/utils/packageUtils.js +6 -397
  26. package/lib/utils/versionNumber.js +1 -1
  27. package/messages/package1_version_create.md +8 -0
  28. package/messages/package_ancestry.md +19 -0
  29. package/messages/package_create.md +3 -0
  30. package/messages/{package-install.md → package_install.md} +2 -2
  31. package/messages/package_uninstall.md +3 -0
  32. package/messages/package_version.md +3 -0
  33. package/messages/{packageVersionCreate.md → package_version_create.md} +35 -6
  34. package/messages/pkg_utils.md +93 -0
  35. package/messages/{profile-api.md → profile_api.md} +0 -0
  36. package/messages/version_number.md +15 -0
  37. package/package.json +2 -2
  38. package/messages/messages.md +0 -285
@@ -10,8 +10,10 @@ exports.uninstallPackage = void 0;
10
10
  const os = require("os");
11
11
  const core_1 = require("@salesforce/core");
12
12
  const kit_1 = require("@salesforce/kit");
13
+ const interfaces_1 = require("../interfaces");
13
14
  core_1.Messages.importMessagesDirectory(__dirname);
14
- const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'messages');
15
+ const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_uninstall');
16
+ const pkgMessages = core_1.Messages.loadMessages('@salesforce/packaging', 'package');
15
17
  async function poll(id, conn) {
16
18
  const uninstallRequest = await conn.tooling.sobject('SubscriberPackageVersionUninstallRequest').retrieve(id);
17
19
  switch (uninstallRequest.Status) {
@@ -20,13 +22,13 @@ async function poll(id, conn) {
20
22
  }
21
23
  case 'InProgress':
22
24
  case 'Queued': {
23
- core_1.Lifecycle.getInstance().emit('packageUninstall', {
25
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageEvents.uninstall, {
24
26
  ...uninstallRequest,
25
27
  });
26
28
  return { completed: false, payload: uninstallRequest };
27
29
  }
28
30
  default: {
29
- const err = messages.getMessage('defaultErrorMessage', [id, uninstallRequest.Id]);
31
+ const err = pkgMessages.getMessage('defaultErrorMessage', [id, uninstallRequest.Id]);
30
32
  const errorQueryResult = await conn.tooling.query(`"SELECT Message FROM PackageVersionUninstallRequestError WHERE ParentRequest.Id = '${id}' ORDER BY Message"`);
31
33
  const errors = [];
32
34
  if (errorQueryResult.records.length) {
@@ -63,4 +63,11 @@ export declare class PackageVersion {
63
63
  update(id: string, options: PackageVersionUpdateOptions): Promise<PackageSaveResult>;
64
64
  private updateDeprecation;
65
65
  private updateProjectWithPackageVersion;
66
+ /**
67
+ * Given a package version ID (05i) or subscriber package version ID (04t), return the subscriber package version ID (04t)
68
+ *
69
+ * @param versionId The suscriber package version ID
70
+ * @param connection For tooling query
71
+ */
72
+ private getSubscriberPackageVersionId;
66
73
  }
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.PackageVersion = void 0;
10
10
  const core_1 = require("@salesforce/core");
11
11
  const kit_1 = require("@salesforce/kit");
12
+ const interfaces_1 = require("../interfaces");
12
13
  const utils_1 = require("../utils");
13
14
  const packageVersionCreate_1 = require("./packageVersionCreate");
14
15
  const packageVersionReport_1 = require("./packageVersionReport");
@@ -16,6 +17,7 @@ const packageVersionCreateRequestReport_1 = require("./packageVersionCreateReque
16
17
  const packageVersionList_1 = require("./packageVersionList");
17
18
  const packageVersionCreateRequest_1 = require("./packageVersionCreateRequest");
18
19
  core_1.Messages.importMessagesDirectory(__dirname);
20
+ const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version');
19
21
  class PackageVersion {
20
22
  constructor(options) {
21
23
  this.options = options;
@@ -114,7 +116,7 @@ class PackageVersion {
114
116
  report = await this.getCreateVersionReport(createPackageVersionRequestId);
115
117
  switch (report.Status) {
116
118
  case 'Queued':
117
- await core_1.Lifecycle.getInstance().emit('enqueued', { ...report, remainingWaitTime });
119
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.enqueued, { ...report, remainingWaitTime });
118
120
  remainingWaitTime = kit_1.Duration.seconds(remainingWaitTime.seconds - polling.frequency.seconds);
119
121
  return {
120
122
  completed: false,
@@ -126,18 +128,21 @@ class PackageVersion {
126
128
  case 'VerifyingDependencies':
127
129
  case 'VerifyingMetadata':
128
130
  case 'FinalizingPackageVersion':
129
- await core_1.Lifecycle.getInstance().emit('in-progress', { ...report, remainingWaitTime });
131
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.progress, {
132
+ ...report,
133
+ remainingWaitTime,
134
+ });
130
135
  remainingWaitTime = kit_1.Duration.seconds(remainingWaitTime.seconds - polling.frequency.seconds);
131
136
  return {
132
137
  completed: false,
133
138
  payload: report,
134
139
  };
135
140
  case 'Success':
136
- await core_1.Lifecycle.getInstance().emit('success', report);
141
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.success, report);
137
142
  await this.updateProjectWithPackageVersion(this.project, report);
138
143
  return { completed: true, payload: report };
139
144
  case 'Error':
140
- await core_1.Lifecycle.getInstance().emit('error', report);
145
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.error, report);
141
146
  return { completed: true, payload: report };
142
147
  }
143
148
  },
@@ -148,7 +153,7 @@ class PackageVersion {
148
153
  return pollingClient.subscribe();
149
154
  }
150
155
  catch (err) {
151
- await core_1.Lifecycle.getInstance().emit('timed-out', report);
156
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create['timed-out'], report);
152
157
  throw (0, utils_1.applyErrorAction)(err);
153
158
  }
154
159
  }
@@ -191,7 +196,7 @@ class PackageVersion {
191
196
  throw new Error(result.errors.join(', '));
192
197
  }
193
198
  // Use the 04t ID for the success message
194
- result.id = await (0, utils_1.getSubscriberPackageVersionId)(id, this.connection);
199
+ result.id = await this.getSubscriberPackageVersionId(id);
195
200
  return result;
196
201
  }
197
202
  async updateDeprecation(idOrAlias, IsDeprecated) {
@@ -209,7 +214,7 @@ class PackageVersion {
209
214
  if (!updateResult.success) {
210
215
  throw (0, utils_1.combineSaveErrors)('Package2', 'update', updateResult.errors);
211
216
  }
212
- updateResult.id = await (0, utils_1.getSubscriberPackageVersionId)(packageVersionId, this.connection);
217
+ updateResult.id = await this.getSubscriberPackageVersionId(packageVersionId);
213
218
  return updateResult;
214
219
  }
215
220
  async updateProjectWithPackageVersion(withProject, results) {
@@ -225,6 +230,28 @@ class PackageVersion {
225
230
  await this.project.getSfProjectJson().write();
226
231
  }
227
232
  }
233
+ /**
234
+ * Given a package version ID (05i) or subscriber package version ID (04t), return the subscriber package version ID (04t)
235
+ *
236
+ * @param versionId The suscriber package version ID
237
+ * @param connection For tooling query
238
+ */
239
+ async getSubscriberPackageVersionId(versionId) {
240
+ // if it's already a 04t return it, otherwise query for it
241
+ if (!versionId || versionId.startsWith(utils_1.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID.prefix)) {
242
+ return versionId;
243
+ }
244
+ const query = `SELECT SubscriberPackageVersionId FROM Package2Version WHERE Id = '${versionId}'`;
245
+ const queryResult = await this.connection.tooling.query(query);
246
+ if (!queryResult || !queryResult.totalSize) {
247
+ throw messages.createError('errorInvalidIdNoMatchingVersionId', [
248
+ utils_1.BY_LABEL.PACKAGE_VERSION_ID.label,
249
+ versionId,
250
+ utils_1.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID.label,
251
+ ]);
252
+ }
253
+ return queryResult.records[0].SubscriberPackageVersionId;
254
+ }
228
255
  }
229
256
  exports.PackageVersion = PackageVersion;
230
257
  //# sourceMappingURL=packageVersion.js.map
@@ -44,4 +44,10 @@ export declare class PackageVersionCreate {
44
44
  * Sets default or override values for packageDescriptorJSON attribs
45
45
  */
46
46
  private setPackageDescriptorJsonValues;
47
+ private validateVersionNumber;
48
+ private validatePatchVersion;
49
+ private massageErrorMessage;
50
+ private getAncestorId;
51
+ private validateAncestorId;
52
+ private getAncestorIdHighestRelease;
47
53
  }
@@ -16,12 +16,13 @@ const scratchOrgSettingsGenerator_1 = require("@salesforce/core/lib/org/scratchO
16
16
  const xml2js = require("xml2js");
17
17
  const uniqid_1 = require("../utils/uniqid");
18
18
  const pkgUtils = require("../utils/packageUtils");
19
- const versionNumber_1 = require("../utils/versionNumber");
20
19
  const utils_1 = require("../utils");
20
+ const interfaces_1 = require("../interfaces");
21
+ const utils_2 = require("../utils");
21
22
  const packageProfileApi_1 = require("./packageProfileApi");
22
23
  const packageVersionCreateRequest_1 = require("./packageVersionCreateRequest");
23
24
  core_1.Messages.importMessagesDirectory(__dirname);
24
- const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'packageVersionCreate');
25
+ const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version_create');
25
26
  const logger = core_1.Logger.childFromRoot('packageVersionCreate');
26
27
  const DESCRIPTOR_FILE = 'package2-descriptor.json';
27
28
  class PackageVersionCreate {
@@ -35,7 +36,7 @@ class PackageVersionCreate {
35
36
  return this.packageVersionCreate();
36
37
  }
37
38
  catch (err) {
38
- throw pkgUtils.applyErrorAction(pkgUtils.massageErrorMessage(err));
39
+ throw pkgUtils.applyErrorAction(this.massageErrorMessage(err));
39
40
  }
40
41
  }
41
42
  // convert source to mdapi format and copy to tmp dir packaging up
@@ -57,7 +58,7 @@ class PackageVersionCreate {
57
58
  if (packageName) {
58
59
  // SDR will build an output path like /output/directory/packageName/package.xml
59
60
  // this was breaking from toolbelt, so to revert it we copy the directory up a level and delete the original
60
- (0, utils_1.copyDir)(convertResult.packagePath, outputDirectory);
61
+ (0, utils_2.copyDir)(convertResult.packagePath, outputDirectory);
61
62
  try {
62
63
  fs.rmSync(convertResult.packagePath, { recursive: true });
63
64
  }
@@ -91,7 +92,8 @@ class PackageVersionCreate {
91
92
  // Just override dependency.packageId value to the resolved alias.
92
93
  dependency.packageId = packageIdFromAlias;
93
94
  pkgUtils.validateId(pkgUtils.BY_LABEL.PACKAGE_ID, dependency.packageId);
94
- pkgUtils.validateVersionNumber(dependency.versionNumber, versionNumber_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN, versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN);
95
+ this.validateVersionNumber(dependency.versionNumber, utils_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN, utils_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN);
96
+ await this.validatePatchVersion(dependency.versionNumber, dependency.packageId);
95
97
  // Validate that the Package2 id exists on the server
96
98
  const query = `SELECT Id FROM Package2 WHERE Id = '${dependency.packageId}'`;
97
99
  const result = await this.connection.tooling.query(query);
@@ -114,7 +116,7 @@ class PackageVersionCreate {
114
116
  // if a 04t id is specified just use it.
115
117
  return dependency;
116
118
  }
117
- const versionNumber = versionNumber_1.VersionNumber.from(dependency.versionNumber);
119
+ const versionNumber = utils_1.VersionNumber.from(dependency.versionNumber);
118
120
  const buildNumber = versionNumber.build;
119
121
  // use the dependency.branch if present otherwise use the branch of the version being created
120
122
  const branch = dependency.branch || dependency.branch === '' ? dependency.branch : this.options.branch;
@@ -124,7 +126,7 @@ class PackageVersionCreate {
124
126
  // now that we have a full build number, query for the associated 04t.
125
127
  // because the build number may not be unique across versions, add in conditionals for
126
128
  // the branch or the RELEASED token (if used)
127
- const branchOrReleasedCondition = buildNumber === versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN
129
+ const branchOrReleasedCondition = buildNumber === utils_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN
128
130
  ? 'AND IsReleased = true'
129
131
  : `AND Branch = ${branchString}`;
130
132
  const query = `SELECT SubscriberPackageVersionId FROM Package2Version WHERE Package2Id = '${dependency.packageId}' AND MajorVersion = ${versionNumber.major} AND MinorVersion = ${versionNumber.minor} AND PatchVersion = ${versionNumber.patch} AND BuildNumber = ${resolvedBuildNumber} ${branchOrReleasedCondition}`;
@@ -142,7 +144,7 @@ class PackageVersionCreate {
142
144
  // warn user of the resolved build number when LATEST and RELEASED keywords are used
143
145
  if (versionNumber.isbuildKeyword()) {
144
146
  versionNumber.build = resolvedBuildNumber;
145
- if (buildNumber === versionNumber_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN) {
147
+ if (buildNumber === utils_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN) {
146
148
  logger.info(messages.getMessage('buildNumberResolvedForLatest', [
147
149
  dependency.package,
148
150
  versionNumber.toString(),
@@ -150,7 +152,7 @@ class PackageVersionCreate {
150
152
  dependency.subscriberPackageVersionId,
151
153
  ]));
152
154
  }
153
- else if (buildNumber === versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
155
+ else if (buildNumber === utils_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
154
156
  logger.info(messages.getMessage('buildNumberResolvedForReleased', [
155
157
  dependency.package,
156
158
  versionNumber.toString(),
@@ -172,18 +174,18 @@ class PackageVersionCreate {
172
174
  // query for the LATEST or RELEASED build number (excluding deleted versions)
173
175
  let branchCondition = '';
174
176
  let releasedCondition = '';
175
- if (versionNumber[3] === versionNumber_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN) {
177
+ if (versionNumber[3] === utils_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN) {
176
178
  // respect the branch when querying for LATEST
177
179
  const branchString = !branch || branch === '' ? 'null' : `'${branch}'`;
178
180
  branchCondition = `AND Branch = ${branchString}`;
179
181
  }
180
- else if (versionNumber[3] === versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
182
+ else if (versionNumber[3] === utils_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
181
183
  releasedCondition = 'AND IsReleased = true';
182
184
  }
183
185
  const query = `SELECT MAX(BuildNumber) FROM Package2Version WHERE Package2Id = '${packageId}' AND IsDeprecated != true AND MajorVersion = ${versionNumber.major} AND MinorVersion = ${versionNumber.minor} AND PatchVersion = ${versionNumber.patch} ${branchCondition} ${releasedCondition}`;
184
186
  const results = await this.connection.tooling.query(query);
185
187
  if (results.records?.length === 0 || results.records[0].expr0 == null) {
186
- if (versionNumber.build === versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
188
+ if (versionNumber.build === utils_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
187
189
  throw messages.createError('noReleaseVersionFound', [packageId, versionNumber.toString()]);
188
190
  }
189
191
  else {
@@ -208,7 +210,7 @@ class PackageVersionCreate {
208
210
  };
209
211
  if (preserveFiles) {
210
212
  const message = messages.getMessage('tempFileLocation', [packageVersTmpRoot]);
211
- await core_1.Lifecycle.getInstance().emit('packageVersionCreate:preserveFiles', {
213
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create['preserve-files'], {
212
214
  location: packageVersTmpRoot,
213
215
  message,
214
216
  });
@@ -285,7 +287,7 @@ class PackageVersionCreate {
285
287
  // branch can be set via options or descriptor; option takes precedence
286
288
  this.options.branch = this.options.branch ?? packageDescriptorJson.branch;
287
289
  const resultValues = await Promise.all(!dependencies ? [] : dependencies.map((dependency) => this.retrieveSubscriberPackageVersionId(dependency)));
288
- const ancestorId = await (0, utils_1.getAncestorId)(packageDescriptorJson, this.options.project, this.options.connection, this.options.versionnumber ?? packageDescriptorJson.versionNumber, this.options.skipancestorcheck);
290
+ const ancestorId = await this.getAncestorId(packageDescriptorJson, this.options.project, this.options.versionnumber ?? packageDescriptorJson.versionNumber, this.options.skipancestorcheck);
289
291
  // If dependencies exist, the resultValues array will contain the dependencies populated with a resolved
290
292
  // subscriber pkg version id.
291
293
  if (resultValues.length > 0) {
@@ -351,19 +353,19 @@ class PackageVersionCreate {
351
353
  });
352
354
  await fs.promises.writeFile(path.join(packageVersMetadataFolder, 'package.xml'), xml, 'utf-8');
353
355
  // Zip the packageVersMetadataFolder folder and put the zip in {packageVersBlobDirectory}/package.zip
354
- await (0, utils_1.zipDir)(packageVersMetadataFolder, metadataZipFile);
356
+ await (0, utils_2.zipDir)(packageVersMetadataFolder, metadataZipFile);
355
357
  if (hasUnpackagedMetadata) {
356
358
  // Zip the unpackagedMetadataFolder folder and put the zip in {packageVersBlobDirectory}/{unpackagedMetadataZipFile}
357
- await (0, utils_1.zipDir)(unpackagedMetadataFolder, unpackagedMetadataZipFile);
359
+ await (0, utils_2.zipDir)(unpackagedMetadataFolder, unpackagedMetadataZipFile);
358
360
  }
359
361
  // Zip up the expanded settings (if present)
360
362
  if (settingsGenerator.hasSettings()) {
361
363
  await settingsGenerator.createDeploy();
362
364
  await settingsGenerator.createDeployPackageContents(this.apiVersionFromPackageXml);
363
- await (0, utils_1.zipDir)(`${settingsGenerator.getDestinationPath()}${path.sep}${settingsGenerator.getShapeDirName()}`, settingsZipFile);
365
+ await (0, utils_2.zipDir)(`${settingsGenerator.getDestinationPath()}${path.sep}${settingsGenerator.getShapeDirName()}`, settingsZipFile);
364
366
  }
365
367
  // Zip the Version Info and package.zip files into another zip
366
- await (0, utils_1.zipDir)(packageVersBlobDirectory, packageVersBlobZipFile);
368
+ await (0, utils_2.zipDir)(packageVersBlobDirectory, packageVersBlobZipFile);
367
369
  }
368
370
  resolveApexTestPermissions(packageDescriptorJson) {
369
371
  // Process permissionSet and permissionSetLicenses that should be enabled when running Apex tests
@@ -418,7 +420,7 @@ class PackageVersionCreate {
418
420
  throw messages.createError('errorEmptyPackageDirs');
419
421
  }
420
422
  // from the packageDirectories in sfdx-project.json, find the correct package entry either by finding a matching package (name) or path
421
- this.packageAlias = (0, utils_1.getPackageAliasesFromId)(this.options.packageId, this.options.project).join();
423
+ this.packageAlias = (0, utils_2.getPackageAliasesFromId)(this.options.packageId, this.options.project).join();
422
424
  this.packageId = this.options.packageId;
423
425
  // set on the class, so we can access them in other methods without redoing this logic
424
426
  this.packageObject = this.project
@@ -491,8 +493,8 @@ class PackageVersionCreate {
491
493
  if (!packageDescriptorJson.versionName) {
492
494
  const versionNumber = packageDescriptorJson.versionNumber;
493
495
  packageDescriptorJson.versionName =
494
- versionNumber.split(pkgUtils.VERSION_NUMBER_SEP)[3] === versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN
495
- ? versionNumber.substring(0, versionNumber.indexOf(pkgUtils.VERSION_NUMBER_SEP + versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN))
496
+ versionNumber.split(pkgUtils.VERSION_NUMBER_SEP)[3] === utils_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN
497
+ ? versionNumber.substring(0, versionNumber.indexOf(pkgUtils.VERSION_NUMBER_SEP + utils_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN))
496
498
  : versionNumber;
497
499
  logger.warn(options, messages.getMessage('defaultVersionName', [packageDescriptorJson.versionName]));
498
500
  }
@@ -515,6 +517,210 @@ class PackageVersionCreate {
515
517
  packageDescriptorJson.uninstallScript = options.uninstallscript;
516
518
  }
517
519
  }
520
+ validateVersionNumber(versionNumberString, supportedBuildNumberToken, supportedBuildNumberToken2) {
521
+ const versionNumber = utils_1.VersionNumber.from(versionNumberString);
522
+ // build number can be a number or valid token
523
+ if (Number.isNaN(parseInt(`${versionNumber.build}`, 10)) &&
524
+ versionNumber.build !== supportedBuildNumberToken &&
525
+ versionNumber.build !== supportedBuildNumberToken2) {
526
+ if (supportedBuildNumberToken2) {
527
+ throw messages.createError('errorInvalidBuildNumberForKeywords', [
528
+ versionNumberString,
529
+ supportedBuildNumberToken,
530
+ supportedBuildNumberToken2,
531
+ ]);
532
+ }
533
+ else {
534
+ throw messages.createError('errorInvalidBuildNumber', [versionNumberString, supportedBuildNumberToken]);
535
+ }
536
+ }
537
+ return versionNumberString;
538
+ }
539
+ async validatePatchVersion(versionNumberString, packageId) {
540
+ const query = `SELECT ContainerOptions FROM Package2 WHERE id ='${packageId}'`;
541
+ const queryResult = await this.connection.tooling.query(query);
542
+ if (queryResult.records === null || queryResult.records.length === 0) {
543
+ throw messages.createError('errorInvalidPackageId', [packageId]);
544
+ }
545
+ // Enforce a patch version of zero (0) for Locked packages only
546
+ if (queryResult.records[0].ContainerOptions === 'Locked') {
547
+ const versionNumber = utils_1.VersionNumber.from(versionNumberString);
548
+ if (versionNumber.patch !== '0') {
549
+ throw messages.createError('errorInvalidPatchNumber', [versionNumberString]);
550
+ }
551
+ }
552
+ }
553
+ massageErrorMessage(err) {
554
+ if (err.name === 'INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST') {
555
+ err['message'] = messages.getMessage('invalidPackageTypeMessage');
556
+ }
557
+ if (err.name === 'MALFORMED_ID' &&
558
+ (err.message.includes('Version ID') || err.message.includes('Version Definition ID'))) {
559
+ err['message'] = messages.getMessage('malformedPackageVersionIdMessage');
560
+ }
561
+ if (err.name === 'MALFORMED_ID' && err.message.includes('Package2 ID')) {
562
+ err['message'] = messages.getMessage('malformedPackageIdMessage');
563
+ }
564
+ // remove references to Second Generation
565
+ if (err.message.includes('Second Generation ')) {
566
+ err['message'] = err.message.replace('Second Generation ', '');
567
+ }
568
+ return err;
569
+ }
570
+ // eslint-disable-next-line complexity
571
+ async getAncestorId(packageDescriptorJson, project, versionNumberString, skipAncestorCheck) {
572
+ // If an id property is present, use it. Otherwise, look up the package id from the package property.
573
+ const packageId = packageDescriptorJson.id ?? (0, utils_2.getPackageIdFromAlias)(packageDescriptorJson.package, project);
574
+ // No need to proceed if Unlocked
575
+ const packageType = await (0, utils_2.getPackageType)(packageId, this.connection);
576
+ if (packageType === 'Unlocked') {
577
+ return '';
578
+ }
579
+ let ancestorId = '';
580
+ // ancestorID can be alias, 05i, or 04t;
581
+ // validate and convert to 05i, as needed
582
+ const versionNumber = utils_1.VersionNumber.from(versionNumberString);
583
+ let origSpecifiedAncestor = packageDescriptorJson.ancestorId;
584
+ let highestReleasedVersion = null;
585
+ const explicitUseHighestRelease = packageDescriptorJson.ancestorId === utils_1.BuildNumberToken.HIGHEST_VERSION_NUMBER_TOKEN ||
586
+ packageDescriptorJson.ancestorVersion === utils_1.BuildNumberToken.HIGHEST_VERSION_NUMBER_TOKEN;
587
+ const explicitUseNoAncestor = packageDescriptorJson.ancestorId === utils_1.BuildNumberToken.NONE_VERSION_NUMBER_TOKEN ||
588
+ packageDescriptorJson.ancestorVersion === utils_1.BuildNumberToken.NONE_VERSION_NUMBER_TOKEN;
589
+ if ((explicitUseHighestRelease || explicitUseNoAncestor) &&
590
+ packageDescriptorJson.ancestorId &&
591
+ packageDescriptorJson.ancestorVersion) {
592
+ if (packageDescriptorJson.ancestorId !== packageDescriptorJson.ancestorVersion) {
593
+ // both ancestorId and ancestorVersion specified, HIGHEST and/or NONE are used, the values disagree
594
+ throw messages.createError('errorAncestorIdVersionHighestOrNoneMismatch', [
595
+ packageDescriptorJson.ancestorId,
596
+ packageDescriptorJson.ancestorVersion,
597
+ ]);
598
+ }
599
+ }
600
+ if (explicitUseNoAncestor && skipAncestorCheck) {
601
+ return '';
602
+ }
603
+ else {
604
+ const result = await this.getAncestorIdHighestRelease(packageId, versionNumberString, explicitUseHighestRelease, skipAncestorCheck);
605
+ if (result.finalAncestorId) {
606
+ return result.finalAncestorId;
607
+ }
608
+ highestReleasedVersion = result.highestReleasedVersion;
609
+ }
610
+ // at this point if explicitUseHighestRelease=true, we have returned the ancestorId or thrown an error
611
+ // highestReleasedVersion should be null only if skipAncestorCheck or if there is no existing released package version
612
+ if (!explicitUseNoAncestor && packageDescriptorJson.ancestorId) {
613
+ ancestorId = (0, utils_2.getPackageIdFromAlias)(packageDescriptorJson.ancestorId, project);
614
+ (0, utils_2.validateId)([utils_2.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID, utils_2.BY_LABEL.PACKAGE_VERSION_ID], ancestorId);
615
+ ancestorId = await (0, utils_2.getPackageVersionId)(ancestorId, this.connection);
616
+ }
617
+ if (!explicitUseNoAncestor && packageDescriptorJson.ancestorVersion) {
618
+ const regNumbers = new RegExp('^[0-9]+$');
619
+ const versionNumber = packageDescriptorJson.ancestorVersion.split(utils_2.VERSION_NUMBER_SEP);
620
+ if (versionNumber.length < 3 ||
621
+ versionNumber.length > 4 ||
622
+ !versionNumber[0].match(regNumbers) ||
623
+ !versionNumber[1].match(regNumbers) ||
624
+ !versionNumber[2].match(regNumbers)) {
625
+ throw new Error(messages.getMessage('errorInvalidAncestorVersionFormat', [packageDescriptorJson.ancestorVersion]));
626
+ }
627
+ const query = 'SELECT Id, IsReleased FROM Package2Version ' +
628
+ `WHERE Package2Id = '${packageId}' AND MajorVersion = ${versionNumber[0]} AND MinorVersion = ${versionNumber[1]} AND PatchVersion = ${versionNumber[2]}`;
629
+ let queriedAncestorId;
630
+ const ancestorVersionResult = await this.connection.tooling.query(query);
631
+ if (!ancestorVersionResult || !ancestorVersionResult.totalSize) {
632
+ throw messages.createError('errorNoMatchingAncestor', [packageDescriptorJson.ancestorVersion, packageId]);
633
+ }
634
+ else {
635
+ const releasedAncestor = ancestorVersionResult.records.find((rec) => rec.IsReleased === true);
636
+ if (!releasedAncestor) {
637
+ throw messages.createError('errorAncestorNotReleased', [packageDescriptorJson.ancestorVersion]);
638
+ }
639
+ else {
640
+ queriedAncestorId = releasedAncestor.Id;
641
+ }
642
+ }
643
+ // check for discrepancy between queried ancestorId and descriptor's ancestorId
644
+ if (packageDescriptorJson?.ancestorId && ancestorId !== queriedAncestorId) {
645
+ throw messages.createError('errorAncestorIdVersionMismatch', [
646
+ packageDescriptorJson.ancestorVersion,
647
+ packageDescriptorJson.ancestorId,
648
+ ]);
649
+ }
650
+ ancestorId = queriedAncestorId;
651
+ origSpecifiedAncestor = packageDescriptorJson.ancestorVersion;
652
+ }
653
+ return this.validateAncestorId(ancestorId, highestReleasedVersion, explicitUseNoAncestor, versionNumber.patch !== '0', skipAncestorCheck, origSpecifiedAncestor);
654
+ }
655
+ validateAncestorId(ancestorId, highestReleasedVersion, explicitUseNoAncestor, isPatch, skipAncestorCheck, origSpecifiedAncestor) {
656
+ if (explicitUseNoAncestor) {
657
+ if (!highestReleasedVersion) {
658
+ return '';
659
+ }
660
+ else {
661
+ // the explicitUseNoAncestor && skipAncestorCheck case is handled above
662
+ throw messages.createError('errorAncestorNoneNotAllowed', [(0, utils_2.getPackageVersionNumber)(highestReleasedVersion)]);
663
+ }
664
+ }
665
+ if (!isPatch && !skipAncestorCheck) {
666
+ if (highestReleasedVersion) {
667
+ if (highestReleasedVersion.Id !== ancestorId) {
668
+ throw messages.createError('errorAncestorNotHighest', [
669
+ origSpecifiedAncestor,
670
+ (0, utils_2.getPackageVersionNumber)(highestReleasedVersion),
671
+ ]);
672
+ }
673
+ }
674
+ else {
675
+ // looks like the initial version:create - allow
676
+ ancestorId = '';
677
+ }
678
+ }
679
+ return ancestorId;
680
+ }
681
+ async getAncestorIdHighestRelease(packageId, versionNumberString, explicitUseHighestRelease, skipAncestorCheck) {
682
+ const versionNumber = versionNumberString.split(utils_2.VERSION_NUMBER_SEP);
683
+ const isPatch = versionNumber[2] !== '0';
684
+ const result = { finalAncestorId: null, highestReleasedVersion: null };
685
+ if (isPatch && explicitUseHighestRelease) {
686
+ // based on server-side validation, whatever ancestor is specified for a patch is
687
+ // tightly controlled; therefore we only need concern ourselves if explicitUseHighestRelease == true;
688
+ // equally applies when skipAncestorCheck == true
689
+ // gather appropriate matching major.minor.0
690
+ const query = `SELECT Id FROM Package2Version WHERE Package2Id = '${packageId}' ` +
691
+ 'AND IsReleased = True AND IsDeprecated = False AND PatchVersion = 0 ' +
692
+ `AND MajorVersion = ${versionNumber[0]} AND MinorVersion = ${versionNumber[1]} ` +
693
+ 'ORDER BY MajorVersion Desc, MinorVersion Desc, PatchVersion Desc, BuildNumber Desc LIMIT 1';
694
+ const majorMinorVersionResult = await this.connection.tooling.query(query);
695
+ const majorMinorVersionRecords = majorMinorVersionResult.records;
696
+ if (majorMinorVersionRecords && majorMinorVersionRecords?.length === 1 && majorMinorVersionRecords[0]) {
697
+ result.finalAncestorId = majorMinorVersionRecords[0].Id;
698
+ }
699
+ else {
700
+ const majorMinorNotFound = `${versionNumber[0]}.${versionNumber[1]}.0`;
701
+ throw messages.createError('errorNoMatchingMajorMinorForPatch', [majorMinorNotFound]);
702
+ }
703
+ }
704
+ else if (!isPatch && (explicitUseHighestRelease || !skipAncestorCheck)) {
705
+ // ancestor must be set to latest released major.minor version
706
+ const query = 'SELECT Id, SubscriberPackageVersionId, MajorVersion, MinorVersion, PatchVersion FROM Package2Version ' +
707
+ `WHERE Package2Id = '${packageId}' AND IsReleased = True AND IsDeprecated = False AND PatchVersion = 0 ` +
708
+ 'ORDER BY MajorVersion Desc, MinorVersion Desc, PatchVersion Desc, BuildNumber Desc LIMIT 1';
709
+ const highestVersionResult = await this.connection.tooling.query(query);
710
+ const highestVersionRecords = highestVersionResult.records;
711
+ if (highestVersionRecords && highestVersionRecords[0]) {
712
+ result.highestReleasedVersion = highestVersionRecords[0];
713
+ if (explicitUseHighestRelease) {
714
+ result.finalAncestorId = result.highestReleasedVersion.Id;
715
+ }
716
+ }
717
+ else if (explicitUseHighestRelease) {
718
+ // there is no eligible ancestor version
719
+ throw messages.createError('errorNoMatchingAncestor', [versionNumberString, packageId]);
720
+ }
721
+ }
722
+ return result;
723
+ }
518
724
  }
519
725
  exports.PackageVersionCreate = PackageVersionCreate;
520
726
  //# sourceMappingURL=packageVersionCreate.js.map
@@ -9,9 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.byId = exports.list = void 0;
10
10
  const util = require("util");
11
11
  const core_1 = require("@salesforce/core");
12
- const packageUtils = require("../utils/packageUtils");
13
12
  core_1.Messages.importMessagesDirectory(__dirname);
14
- const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'messages');
13
+ const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version_create');
15
14
  const STATUS_ERROR = 'Error';
16
15
  const QUERY = 'SELECT Id, Status, Package2Id, Package2VersionId, Package2Version.SubscriberPackageVersionId, Tag, Branch, ' +
17
16
  'CreatedDate, Package2Version.HasMetadataRemoved, CreatedById ' +
@@ -19,6 +18,12 @@ const QUERY = 'SELECT Id, Status, Package2Id, Package2VersionId, Package2Version
19
18
  '%s' + // WHERE, if applicable
20
19
  'ORDER BY CreatedDate';
21
20
  const ERROR_QUERY = "SELECT Message FROM Package2VersionCreateRequestError WHERE ParentRequest.Id = '%s'";
21
+ function formatDate(date) {
22
+ const pad = (num) => {
23
+ return num < 10 ? `0${num}` : `${num}`;
24
+ };
25
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
26
+ }
22
27
  async function list(options) {
23
28
  const whereClause = _constructWhere(options);
24
29
  return _query(util.format(QUERY, whereClause), options.connection);
@@ -43,7 +48,7 @@ async function _query(query, connection) {
43
48
  Tag: record.Tag,
44
49
  Branch: record.Branch,
45
50
  Error: [],
46
- CreatedDate: packageUtils.formatDate(new Date(record.CreatedDate)),
51
+ CreatedDate: formatDate(new Date(record.CreatedDate)),
47
52
  HasMetadataRemoved: record.Package2Version != null ? record.Package2Version.HasMetadataRemoved : null,
48
53
  CreatedBy: record.CreatedById,
49
54
  }));
@@ -11,7 +11,7 @@ const core_1 = require("@salesforce/core");
11
11
  const ts_types_1 = require("@salesforce/ts-types");
12
12
  const utils_1 = require("../utils");
13
13
  core_1.Messages.importMessagesDirectory(__dirname);
14
- const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'messages');
14
+ const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version_create');
15
15
  // Stripping CodeCoverage, HasPassedCodeCoverageCheck as they are causing a perf issue in 47.0+ W-6997762
16
16
  const DEFAULT_SELECT = 'SELECT Id, Package2Id, SubscriberPackageVersionId, Name, Package2.Name, Package2.NamespacePrefix, Package2.IsOrgDependent, ' +
17
17
  'Description, Tag, Branch, MajorVersion, MinorVersion, PatchVersion, BuildNumber, IsReleased, ' +
@@ -27,6 +27,32 @@ const QUERY_VERBOSE = 'SELECT Id, Package2Id, SubscriberPackageVersionId, Name,
27
27
  "WHERE Id = '%s' AND IsDeprecated != true " +
28
28
  'ORDER BY Package2Id, Branch, MajorVersion, MinorVersion, PatchVersion, BuildNumber';
29
29
  const logger = core_1.Logger.childFromRoot('getPackageVersionReport');
30
+ /**
31
+ * Given a list of subscriber package version IDs (04t), return the associated version strings (e.g., Major.Minor.Patch.Build)
32
+ *
33
+ * @return Map of subscriberPackageVersionId to versionString
34
+ * @param subscriberPackageVersionIds
35
+ * @param connection For tooling query
36
+ */
37
+ async function getPackageVersionStrings(subscriberPackageVersionIds, connection) {
38
+ let results = new Map();
39
+ if (!subscriberPackageVersionIds || subscriberPackageVersionIds.length === 0) {
40
+ return results;
41
+ }
42
+ // remove any duplicate Ids
43
+ const ids = [...new Set(subscriberPackageVersionIds)];
44
+ const query = `SELECT SubscriberPackageVersionId, MajorVersion, MinorVersion, PatchVersion, BuildNumber FROM Package2Version WHERE SubscriberPackageVersionId IN (${ids
45
+ .map((id) => `'${id}'`)
46
+ .join(',')})`;
47
+ const records = await pkgUtils.queryWithInConditionChunking(query, ids, '%IDS%', connection);
48
+ if (records && records.length > 0) {
49
+ results = new Map(records.map((record) => {
50
+ const version = pkgUtils.concatVersion(record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber);
51
+ return [record.SubscriberPackageVersionId, version];
52
+ }));
53
+ }
54
+ return results;
55
+ }
30
56
  async function getPackageVersionReport(options) {
31
57
  logger.debug(`entering getPackageVersionReport(${util.inspect(options, { depth: null })})`);
32
58
  let packageVersionId = pkgUtils.getPackageIdFromAlias(options.idOrAlias, options.project);
@@ -36,7 +62,7 @@ async function getPackageVersionReport(options) {
36
62
  packageVersionId = await pkgUtils.getPackageVersionId(packageVersionId, options.connection);
37
63
  const queryResult = await options.connection.tooling.query(util.format(options.verbose ? QUERY_VERBOSE : QUERY, packageVersionId));
38
64
  const records = queryResult.records;
39
- if (records && records.length > 0) {
65
+ if (records?.length > 0) {
40
66
  const record = records[0];
41
67
  record.Version = [record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber].join('.');
42
68
  const containerOptions = await pkgUtils.getContainerOptions([record.Package2Id], options.connection);
@@ -44,7 +70,7 @@ async function getPackageVersionReport(options) {
44
70
  record.AncestorVersion = null;
45
71
  if (record.AncestorId) {
46
72
  // lookup AncestorVersion value
47
- const ancestorVersionMap = await pkgUtils.getPackageVersionStrings([record.AncestorId], options.connection);
73
+ const ancestorVersionMap = await getPackageVersionStrings([record.AncestorId], options.connection);
48
74
  record.AncestorVersion = ancestorVersionMap.get(record.AncestorId);
49
75
  }
50
76
  else {
@@ -10,8 +10,9 @@ exports.package1VersionCreate = void 0;
10
10
  const os = require("os");
11
11
  const core_1 = require("@salesforce/core");
12
12
  const kit_1 = require("@salesforce/kit");
13
+ const interfaces_1 = require("../interfaces");
13
14
  core_1.Messages.importMessagesDirectory(__dirname);
14
- const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'messages');
15
+ const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package1_version_create');
15
16
  const packageUploadRequestStatus = async (id, connection, timeout, frequency) => {
16
17
  const pollingResult = await connection.tooling.sobject('PackageUploadRequest').retrieve(id);
17
18
  switch (pollingResult.Status) {
@@ -20,7 +21,7 @@ const packageUploadRequestStatus = async (id, connection, timeout, frequency) =>
20
21
  case 'IN_PROGRESS':
21
22
  case 'QUEUED':
22
23
  timeout -= frequency;
23
- await core_1.Lifecycle.getInstance().emit('package1VersionCreate:progress', { timeout, pollingResult });
24
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.Package1VersionEvents.create.progress, { timeout, pollingResult });
24
25
  return { completed: false, payload: pollingResult };
25
26
  default: {
26
27
  if (pollingResult?.Errors?.errors?.length > 0) {