@salesforce/packaging 1.4.16 → 1.4.18

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/lib/interfaces/packagingInterfacesAndType.d.ts +37 -33
  2. package/lib/package/package.d.ts +3 -3
  3. package/lib/package/package.js +14 -8
  4. package/lib/package/packageAncestry.d.ts +24 -25
  5. package/lib/package/packageAncestry.js +159 -147
  6. package/lib/package/packageConvert.d.ts +1 -1
  7. package/lib/package/packageConvert.js +16 -22
  8. package/lib/package/packageCreate.d.ts +1 -1
  9. package/lib/package/packageCreate.js +15 -26
  10. package/lib/package/packageDelete.js +4 -1
  11. package/lib/package/packageInstall.d.ts +5 -4
  12. package/lib/package/packageInstall.js +10 -9
  13. package/lib/package/packageProfileApi.d.ts +3 -6
  14. package/lib/package/packageProfileApi.js +153 -145
  15. package/lib/package/packageUninstall.js +15 -9
  16. package/lib/package/packageVersion.d.ts +6 -5
  17. package/lib/package/packageVersion.js +77 -47
  18. package/lib/package/packageVersionCreate.d.ts +2 -2
  19. package/lib/package/packageVersionCreate.js +81 -59
  20. package/lib/package/packageVersionCreateRequest.d.ts +2 -2
  21. package/lib/package/packageVersionCreateRequest.js +8 -11
  22. package/lib/package/packageVersionCreateRequestReport.js +4 -1
  23. package/lib/package/packageVersionList.d.ts +5 -4
  24. package/lib/package/packageVersionList.js +18 -18
  25. package/lib/package/packageVersionReport.js +4 -2
  26. package/lib/package/subscriberPackageVersion.d.ts +4 -4
  27. package/lib/package/subscriberPackageVersion.js +23 -10
  28. package/lib/package/versionNumber.d.ts +8 -3
  29. package/lib/package/versionNumber.js +13 -4
  30. package/lib/package1/package1Version.js +17 -12
  31. package/lib/utils/packageUtils.d.ts +11 -7
  32. package/lib/utils/packageUtils.js +25 -12
  33. package/messages/package.md +4 -0
  34. package/messages/package1Version.md +4 -0
  35. package/messages/package_version.md +8 -0
  36. package/messages/package_version_create.md +32 -4
  37. package/messages/pkg_utils.md +1 -1
  38. package/package.json +13 -12
@@ -16,8 +16,8 @@ const scratchOrgSettingsGenerator_1 = require("@salesforce/core/lib/org/scratchO
16
16
  const xml2js = require("xml2js");
17
17
  const kit_1 = require("@salesforce/kit");
18
18
  const pkgUtils = require("../utils/packageUtils");
19
- const interfaces_1 = require("../interfaces");
20
19
  const packageUtils_1 = require("../utils/packageUtils");
20
+ const interfaces_1 = require("../interfaces");
21
21
  const packageProfileApi_1 = require("./packageProfileApi");
22
22
  const packageVersionCreateRequest_1 = require("./packageVersionCreateRequest");
23
23
  const package_1 = require("./package");
@@ -38,7 +38,10 @@ class PackageVersionCreate {
38
38
  return this.packageVersionCreate();
39
39
  }
40
40
  catch (err) {
41
- throw pkgUtils.applyErrorAction(pkgUtils.massageErrorMessage(err));
41
+ if (err instanceof Error) {
42
+ throw pkgUtils.applyErrorAction(pkgUtils.massageErrorMessage(err));
43
+ }
44
+ throw err;
42
45
  }
43
46
  }
44
47
  async validateDependencyValues(dependency) {
@@ -50,8 +53,11 @@ class PackageVersionCreate {
50
53
  if (dependency.packageId && dependency.package) {
51
54
  throw messages.createError('errorPackageAndPackageIdCollision', []);
52
55
  }
53
- const packageIdFromAlias = this.project.getPackageIdFromAlias(dependency.packageId || dependency.package) ??
54
- (dependency.packageId || dependency.package);
56
+ const idOrPackage = dependency.packageId ?? dependency.package;
57
+ if (!idOrPackage) {
58
+ throw messages.createError('errorPackageOrPackageIdMissing', []);
59
+ }
60
+ const packageIdFromAlias = this.project.getPackageIdFromAlias(idOrPackage) ?? idOrPackage;
55
61
  // If valid 04t package, just return it to be used straight away.
56
62
  if (pkgUtils.validateIdNoThrow(pkgUtils.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID, packageIdFromAlias)) {
57
63
  dependency.subscriberPackageVersionId = packageIdFromAlias;
@@ -87,10 +93,16 @@ class PackageVersionCreate {
87
93
  // if a 04t id is specified just use it.
88
94
  return dependency;
89
95
  }
96
+ if (!dependency.versionNumber) {
97
+ throw messages.createError('errorDependencyPair', [JSON.stringify(dependency)]);
98
+ }
99
+ if (!dependency.packageId) {
100
+ throw messages.createError('errorDependencyPair', [JSON.stringify(dependency)]);
101
+ }
90
102
  const versionNumber = versionNumber_1.VersionNumber.from(dependency.versionNumber);
91
103
  const buildNumber = versionNumber.build;
92
104
  // use the dependency.branch if present otherwise use the branch of the version being created
93
- const branch = dependency.branch || dependency.branch === '' ? dependency.branch : this.options.branch;
105
+ const branch = dependency.branch === '' ? dependency.branch : this.options.branch;
94
106
  const branchString = !branch || branch === '' ? 'null' : `'${branch}'`;
95
107
  // resolve a build number keyword to an actual number, if needed
96
108
  const resolvedBuildNumber = await this.resolveBuildNumber(versionNumber, dependency.packageId, branch);
@@ -145,12 +157,12 @@ class PackageVersionCreate {
145
157
  // query for the LATEST or RELEASED build number (excluding deleted versions)
146
158
  let branchCondition = '';
147
159
  let releasedCondition = '';
148
- if (versionNumber[3] === versionNumber_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN) {
160
+ if (versionNumber.build === versionNumber_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN) {
149
161
  // respect the branch when querying for LATEST
150
162
  const branchString = !branch || branch === '' ? 'null' : `'${branch}'`;
151
163
  branchCondition = `AND Branch = ${branchString}`;
152
164
  }
153
- else if (versionNumber[3] === versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
165
+ else if (versionNumber.build === versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN) {
154
166
  releasedCondition = 'AND IsReleased = true';
155
167
  }
156
168
  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}`;
@@ -176,8 +188,8 @@ class PackageVersionCreate {
176
188
  InstallKey: this.options.installationkey,
177
189
  Instance: this.options.buildinstance,
178
190
  SourceOrg: this.options.sourceorg,
179
- CalculateCodeCoverage: this.options.codecoverage || false,
180
- SkipValidation: this.options.skipvalidation || false,
191
+ CalculateCodeCoverage: this.options.codecoverage ?? false,
192
+ SkipValidation: this.options.skipvalidation ?? false,
181
193
  // note: the createRequest's Language corresponds to the AllPackageVersion's language
182
194
  Language: this.options.language,
183
195
  };
@@ -209,7 +221,7 @@ class PackageVersionCreate {
209
221
  * @private
210
222
  */
211
223
  async createPackageVersionCreateRequestFromOptions() {
212
- const preserveFiles = !!(this.options.preserve || process.env.SFDX_PACKAGE2_VERSION_CREATE_PRESERVE);
224
+ const preserveFiles = !!(this.options.preserve ?? process.env.SFDX_PACKAGE2_VERSION_CREATE_PRESERVE);
213
225
  const uniqueHash = (0, packageUtils_1.uniqid)({ template: `${this.packageId}-%s` });
214
226
  const packageVersTmpRoot = path.join(os.tmpdir(), `${uniqueHash}`);
215
227
  const packageVersMetadataFolder = path.join(packageVersTmpRoot, 'md-files');
@@ -222,17 +234,17 @@ class PackageVersionCreate {
222
234
  const seedMetadataZipFile = path.join(packageVersBlobDirectory, 'seed-metadata-package.zip');
223
235
  const settingsZipFile = path.join(packageVersBlobDirectory, 'settings.zip');
224
236
  const packageVersBlobZipFile = path.join(packageVersTmpRoot, 'package-version-info.zip');
225
- const sourceBaseDir = path.join(this.project.getPath(), this.packageObject.path ?? '');
237
+ const sourceBaseDir = path.join(this.project.getPath(), this.packageObject?.path ?? '');
226
238
  const mdOptions = {
227
239
  deploydir: packageVersMetadataFolder,
228
240
  sourceDir: sourceBaseDir,
229
- sourceApiVersion: this.project?.getSfProjectJson()?.get('sourceApiVersion'),
241
+ sourceApiVersion: this.project?.getSfProjectJson()?.get('sourceApiVersion') ?? undefined,
230
242
  };
231
243
  // Stores any additional client side info that might be needed later on in the process
232
244
  const clientSideInfo = new Map();
233
245
  await fs.promises.mkdir(packageVersBlobDirectory, { recursive: true });
234
246
  const settingsGenerator = new scratchOrgSettingsGenerator_1.default({ asDirectory: true });
235
- const packageDescriptorJson = (0, kit_1.cloneJson)(this.packageObject);
247
+ let packageDescriptorJson = (0, kit_1.cloneJson)(this.packageObject);
236
248
  const apvLanguage = packageDescriptorJson.language;
237
249
  // Copy all the metadata from the workspace to a tmp folder
238
250
  const componentSet = await this.metadataResolver.generateMDFolderForArtifact(mdOptions);
@@ -264,15 +276,7 @@ class PackageVersionCreate {
264
276
  // this is not allowed, exit with an error
265
277
  throw messages.createError('signupDuplicateSettingsSpecified');
266
278
  }
267
- // these scratch org definition file values will be applied to the build org
268
- ['country', 'language', 'edition', 'features', 'orgPreferences', 'snapshot', 'release', 'sourceOrg'].forEach((prop) => {
269
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
270
- const propValue = definitionFileJson[prop];
271
- if (propValue) {
272
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
273
- packageDescriptorJson[prop] = propValue;
274
- }
275
- });
279
+ packageDescriptorJson = (0, packageUtils_1.copyDescriptorProperties)(packageDescriptorJson, definitionFileJson);
276
280
  }
277
281
  this.resolveApexTestPermissions(packageDescriptorJson);
278
282
  // All dependencies for the packaging dir should be resolved to an 04t id to be passed to the server.
@@ -282,7 +286,11 @@ class PackageVersionCreate {
282
286
  this.options.branch = this.options.branch ?? packageDescriptorJson.branch;
283
287
  this.options.language = this.options.language ?? apvLanguage;
284
288
  const resultValues = await Promise.all(!dependencies ? [] : dependencies.map((dependency) => this.retrieveSubscriberPackageVersionId(dependency)));
285
- const ancestorId = await this.getAncestorId(packageDescriptorJson, this.options.project, this.options.versionnumber ?? packageDescriptorJson.versionNumber, this.options.skipancestorcheck);
289
+ const versionNumber = this.options.versionnumber ?? packageDescriptorJson.versionNumber;
290
+ if (!versionNumber) {
291
+ throw messages.createError('versionNumberRequired');
292
+ }
293
+ const ancestorId = await this.getAncestorId(packageDescriptorJson, this.options.project, versionNumber, !!this.options.skipancestorcheck);
286
294
  // If dependencies exist, the resultValues array will contain the dependencies populated with a resolved
287
295
  // subscriber pkg version id.
288
296
  if (resultValues.length > 0) {
@@ -301,7 +309,7 @@ class PackageVersionCreate {
301
309
  return this.createRequestObject(preserveFiles, packageVersTmpRoot, packageVersBlobZipFile);
302
310
  }
303
311
  verifyHasSource(componentSet) {
304
- if (componentSet?.converted.length === 0) {
312
+ if (componentSet?.converted?.length === 0) {
305
313
  throw messages.createError('noSourceInRootDirectory', [this.packageObject.path ?? '<unknown>']);
306
314
  }
307
315
  }
@@ -320,8 +328,6 @@ class PackageVersionCreate {
320
328
  }
321
329
  fs.mkdirSync(packageVersMetadataFolder, { recursive: true });
322
330
  fs.mkdirSync(packageVersProfileFolder, { recursive: true });
323
- // Apply any necessary exclusions to typesArr.
324
- let typesArr = packageJson.Package.types;
325
331
  this.apiVersionFromPackageXml = packageJson.Package.version;
326
332
  const sourceApiVersion = this.project?.getSfProjectJson()?.get('sourceApiVersion');
327
333
  const hasSeedMetadata = await this.metadataResolver.resolveMetadata(this.packageObject.seedMetadata?.path, seedMetadataFolder, 'seedMDDirectoryDoesNotExist', sourceApiVersion);
@@ -330,17 +336,18 @@ class PackageVersionCreate {
330
336
  if (this.options.codecoverage) {
331
337
  hasUnpackagedMetadata = await this.metadataResolver.resolveMetadata(unpackagedMetadataPath, unpackagedMetadataFolder, 'unpackagedMDDirectoryDoesNotExist', sourceApiVersion);
332
338
  }
333
- // don't package the profiles from any unpackagedMetadata dir in the project
339
+ // don't package the profiles from any un-packagedMetadata dir in the project
334
340
  const profileExcludeDirs = this.project
335
341
  .getPackageDirectories()
336
- .filter((packageDir) => packageDir.unpackagedMetadata?.path)
337
- .map((packageDir) => packageDir.unpackagedMetadata.path);
338
- typesArr = this.options.profileApi.filterAndGenerateProfilesForManifest(typesArr, profileExcludeDirs);
342
+ .map((packageDir) => packageDir.unpackagedMetadata?.path)
343
+ .filter((packageDirPath) => packageDirPath);
344
+ const typesArr = this.options?.profileApi?.filterAndGenerateProfilesForManifest(packageJson.Package.types, profileExcludeDirs) ??
345
+ packageJson.Package.types;
339
346
  // Next generate profiles and retrieve any profiles that were excluded because they had no matching nodes.
340
- const excludedProfiles = this.options.profileApi.generateProfiles(packageVersProfileFolder, {
347
+ const excludedProfiles = this.options?.profileApi?.generateProfiles(packageVersProfileFolder, {
341
348
  Package: typesArr,
342
349
  }, profileExcludeDirs);
343
- if (excludedProfiles.length > 0) {
350
+ if (excludedProfiles?.length) {
344
351
  const profileIdx = typesArr.findIndex((e) => e.name[0] === 'Profile');
345
352
  typesArr[profileIdx].members = typesArr[profileIdx].members.filter((e) => !excludedProfiles.includes(e));
346
353
  }
@@ -351,7 +358,7 @@ class PackageVersionCreate {
351
358
  });
352
359
  const xml = xmlBuilder.buildObject(packageJson);
353
360
  // Log information about the profiles being packaged up
354
- const profiles = this.options.profileApi.getProfileInformation();
361
+ const profiles = this.options?.profileApi?.getProfileInformation() ?? [];
355
362
  profiles.forEach((profile) => {
356
363
  if (this.logger.shouldLog(core_1.LoggerLevel.DEBUG)) {
357
364
  this.logger.debug(profile.logDebug());
@@ -419,6 +426,7 @@ class PackageVersionCreate {
419
426
  }
420
427
  // establish the package Id (0ho) and load the package directory
421
428
  let packageName;
429
+ let packageObject;
422
430
  if (this.options.packageId) {
423
431
  const pkg = this.options.packageId;
424
432
  // for backward compatibility allow for a packageDirectory package property to be an id (0Ho) instead of an alias.
@@ -428,23 +436,29 @@ class PackageVersionCreate {
428
436
  if (!packageName)
429
437
  throw messages.createError('errorMissingPackage', [this.options.packageId]);
430
438
  }
431
- this.packageObject = this.project.findPackage((namedPackageDir) => namedPackageDir.package === packageName || namedPackageDir.name === packageName);
439
+ packageObject = this.project.findPackage((namedPackageDir) => namedPackageDir.package === packageName || namedPackageDir.name === packageName);
432
440
  }
433
441
  else {
434
442
  // We'll either have a package ID or alias, or a directory path
435
- this.packageObject = this.project.getPackageFromPath(this.options.path);
436
- packageName = this.packageObject?.package;
443
+ if (!this.options.path) {
444
+ throw messages.createError('errorMissingPackagePath', [JSON.stringify(this.options)]);
445
+ }
446
+ packageObject = this.project.getPackageFromPath(this.options.path);
447
+ packageName = packageObject?.package;
437
448
  if (!packageName)
438
449
  throw messages.createError('errorCouldNotFindPackageUsingPath', [this.options.path]);
439
450
  }
440
- if (!this.packageObject) {
451
+ if (!packageObject) {
441
452
  throw messages.createError('errorCouldNotFindPackageDir', [
442
453
  this.options.packageId ? 'packageId or alias' : 'path',
443
- this.options.packageId || this.options.path,
454
+ this.options.packageId ?? this.options.path,
444
455
  ]);
445
456
  }
457
+ else {
458
+ this.packageObject = packageObject;
459
+ }
446
460
  this.packageId = this.project.getPackageIdFromAlias(packageName) ?? packageName;
447
- this.options.profileApi = await this.resolveUserLicenses(this.packageObject.includeProfileUserLicenses);
461
+ this.options.profileApi = await this.resolveUserLicenses(!!this.packageObject.includeProfileUserLicenses);
448
462
  // At this point, the packageIdFromAlias should have been resolved to an Id. Now, we
449
463
  // need to validate that the Id is correct.
450
464
  pkgUtils.validateId(pkgUtils.BY_LABEL.PACKAGE_ID, this.packageId);
@@ -452,21 +466,20 @@ class PackageVersionCreate {
452
466
  await this.validateOptionsForPackageType();
453
467
  }
454
468
  catch (error) {
455
- const err = error;
456
- if (err.name === 'NOT_FOUND') {
457
- // this means the 0Ho package was not found in the org. throw a better error.
458
- throw messages.createError('errorNoIdInHub', [this.packageId]);
469
+ if (error instanceof Error) {
470
+ if (error.name === 'NOT_FOUND') {
471
+ // this means the 0Ho package was not found in the org. throw a better error.
472
+ throw messages.createError('errorNoIdInHub', [this.packageId]);
473
+ }
459
474
  }
460
- throw err;
475
+ throw error;
461
476
  }
462
477
  const request = await this.createPackageVersionCreateRequestFromOptions();
463
478
  const createResult = await this.connection.tooling.create('Package2VersionCreateRequest', request);
464
479
  if (!createResult.success) {
465
480
  const errStr = createResult.errors?.join(', ') ?? createResult.errors;
466
- throw messages.createError('failedToCreatePVCRequest', [
467
- createResult.id ? ` [${createResult.id}]` : '',
468
- errStr.toString(),
469
- ]);
481
+ const id = createResult.id ?? '';
482
+ throw messages.createError('failedToCreatePVCRequest', [id === '' ? '' : ` [${id}]`, errStr.toString()]);
470
483
  }
471
484
  return (await (0, packageVersionCreateRequest_1.byId)(createResult.id, this.connection))[0];
472
485
  }
@@ -478,7 +491,6 @@ class PackageVersionCreate {
478
491
  return dir[0];
479
492
  }
480
493
  }
481
- return;
482
494
  }
483
495
  async getPackageType() {
484
496
  // this.packageId should be an 0Ho package Id at this point
@@ -543,7 +555,7 @@ class PackageVersionCreate {
543
555
  if (!packageDescriptorJson.versionName) {
544
556
  const versionNumber = packageDescriptorJson.versionNumber;
545
557
  packageDescriptorJson.versionName =
546
- versionNumber.split(pkgUtils.VERSION_NUMBER_SEP)[3] === versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN
558
+ versionNumber?.split(pkgUtils.VERSION_NUMBER_SEP)[3] === versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN
547
559
  ? versionNumber.substring(0, versionNumber.indexOf(pkgUtils.VERSION_NUMBER_SEP + versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN))
548
560
  : versionNumber;
549
561
  this.logger.warn(messages.getMessage('defaultVersionName', [packageDescriptorJson.versionName]));
@@ -605,7 +617,7 @@ class PackageVersionCreate {
605
617
  async getAncestorId(packageDescriptorJson, project, versionNumberString, skipAncestorCheck) {
606
618
  // If an id property is present, use it. Otherwise, look up the package id from the package property.
607
619
  const packageId = packageDescriptorJson.id ??
608
- project.getPackageIdFromAlias(packageDescriptorJson.package) ??
620
+ project.getPackageIdFromAlias(packageDescriptorJson.package ?? '') ??
609
621
  packageDescriptorJson.package;
610
622
  // No need to proceed if Unlocked
611
623
  if ((await this.getPackageType()) === 'Unlocked') {
@@ -615,7 +627,7 @@ class PackageVersionCreate {
615
627
  // ancestorID can be alias, 05i, or 04t;
616
628
  // validate and convert to 05i, as needed
617
629
  const versionNumber = versionNumber_1.VersionNumber.from(versionNumberString);
618
- let origSpecifiedAncestor = packageDescriptorJson.ancestorId;
630
+ let origSpecifiedAncestor = packageDescriptorJson.ancestorId ?? '';
619
631
  let highestReleasedVersion = null;
620
632
  const explicitUseHighestRelease = packageDescriptorJson.ancestorId === versionNumber_1.BuildNumberToken.HIGHEST_VERSION_NUMBER_TOKEN ||
621
633
  packageDescriptorJson.ancestorVersion === versionNumber_1.BuildNumberToken.HIGHEST_VERSION_NUMBER_TOKEN;
@@ -647,7 +659,7 @@ class PackageVersionCreate {
647
659
  if (!explicitUseNoAncestor && packageDescriptorJson.ancestorId) {
648
660
  ancestorId = project.getPackageIdFromAlias(packageDescriptorJson.ancestorId) ?? packageDescriptorJson.ancestorId;
649
661
  (0, packageUtils_1.validateId)([packageUtils_1.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID, packageUtils_1.BY_LABEL.PACKAGE_VERSION_ID], ancestorId);
650
- ancestorId = await (0, packageUtils_1.getPackageVersionId)(ancestorId, this.connection);
662
+ ancestorId = (await (0, packageUtils_1.getPackageVersionId)(ancestorId, this.connection)) ?? '';
651
663
  }
652
664
  if (!explicitUseNoAncestor && packageDescriptorJson.ancestorVersion) {
653
665
  const regNumbers = new RegExp('^[0-9]+$');
@@ -663,7 +675,7 @@ class PackageVersionCreate {
663
675
  `WHERE Package2Id = '${packageId}' AND MajorVersion = ${versionNumberSplit[0]} AND MinorVersion = ${versionNumberSplit[1]} AND PatchVersion = ${versionNumberSplit[2]}`;
664
676
  let queriedAncestorId;
665
677
  const ancestorVersionResult = await this.connection.tooling.query(query);
666
- if (!ancestorVersionResult || !ancestorVersionResult.totalSize) {
678
+ if (!ancestorVersionResult.totalSize) {
667
679
  throw messages.createError('errorNoMatchingAncestor', [packageDescriptorJson.ancestorVersion, packageId]);
668
680
  }
669
681
  else {
@@ -715,6 +727,9 @@ class PackageVersionCreate {
715
727
  return ancestorId;
716
728
  }
717
729
  async getAncestorIdHighestRelease(packageId, versionNumberString, explicitUseHighestRelease, skipAncestorCheck) {
730
+ if (!packageId) {
731
+ throw messages.createError('packageIdCannotBeUndefined');
732
+ }
718
733
  const versionNumber = versionNumberString.split(packageUtils_1.VERSION_NUMBER_SEP);
719
734
  const isPatch = versionNumber[2] !== '0';
720
735
  const result = {
@@ -733,7 +748,7 @@ class PackageVersionCreate {
733
748
  const majorMinorVersionResult = await this.connection.tooling.query(query);
734
749
  const majorMinorVersionRecords = majorMinorVersionResult.records;
735
750
  if (majorMinorVersionRecords && majorMinorVersionRecords?.length === 1 && majorMinorVersionRecords[0]) {
736
- result.finalAncestorId = majorMinorVersionRecords[0].Id;
751
+ result.finalAncestorId = majorMinorVersionRecords[0].Id ?? null;
737
752
  }
738
753
  else {
739
754
  const majorMinorNotFound = `${versionNumber[0]}.${versionNumber[1]}.0`;
@@ -781,17 +796,24 @@ class MetadataResolver {
781
796
  }
782
797
  // convert source to mdapi format and copy to tmp dir packaging up
783
798
  async generateMDFolderForArtifact(options) {
784
- const sourcepath = options.sourcePaths ?? [options.sourceDir];
785
- const componentSet = await source_deploy_retrieve_1.ComponentSetBuilder.build({
799
+ const sourcePaths = (0, kit_1.ensureArray)(options.sourcePaths ?? options.sourceDir ? options.sourceDir : undefined).filter((srcPath) => srcPath);
800
+ const componentSetOptions = {
786
801
  sourceapiversion: options.sourceApiVersion,
787
- sourcepath,
788
- });
802
+ ...(sourcePaths.length > 0 ? { sourcepath: sourcePaths } : {}),
803
+ };
804
+ if (!options.deploydir) {
805
+ throw messages.createError('deploydirCannotBeUndefined', [JSON.stringify(options)]);
806
+ }
807
+ const componentSet = await source_deploy_retrieve_1.ComponentSetBuilder.build(componentSetOptions);
789
808
  const packageName = options.packageName;
790
809
  const outputDirectory = path.resolve(options.deploydir);
791
810
  const convertResult = await this.convertMetadata(componentSet, outputDirectory, packageName);
792
811
  if (packageName) {
793
812
  // SDR will build an output path like /output/directory/packageName/package.xml
794
813
  // this was breaking from toolbelt, so to revert it we copy the directory up a level and delete the original
814
+ if (!convertResult.packagePath) {
815
+ throw messages.createError('packagePathCannotBeUndefined');
816
+ }
795
817
  (0, packageUtils_1.copyDir)(convertResult.packagePath, outputDirectory);
796
818
  try {
797
819
  fs.rmSync(convertResult.packagePath, { recursive: true });
@@ -1,4 +1,4 @@
1
1
  import { Connection } from '@salesforce/core';
2
- import { PackageVersionCreateRequestResult, PackageVersionCreateRequestQueryOptions } from '../interfaces';
3
- export declare function list(options?: PackageVersionCreateRequestQueryOptions): Promise<PackageVersionCreateRequestResult[]>;
2
+ import { PackageVersionCreateRequestQueryOptions, PackageVersionCreateRequestResult } from '../interfaces';
3
+ export declare function list(connection: Connection, options?: PackageVersionCreateRequestQueryOptions): Promise<PackageVersionCreateRequestResult[]>;
4
4
  export declare function byId(packageVersionCreateRequestId: string, connection: Connection): Promise<PackageVersionCreateRequestResult[]>;
@@ -22,13 +22,16 @@ function formatDate(date) {
22
22
  const pad = (num) => (num < 10 ? `0${num}` : `${num}`);
23
23
  return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
24
24
  }
25
- async function list(options) {
25
+ async function list(connection, options) {
26
26
  try {
27
27
  const whereClause = constructWhere(options);
28
- return await query(util.format(QUERY, whereClause), options.connection);
28
+ return await query(util.format(QUERY, whereClause), connection);
29
29
  }
30
30
  catch (err) {
31
- throw (0, packageUtils_1.applyErrorAction)((0, packageUtils_1.massageErrorMessage)(err));
31
+ if (err instanceof Error) {
32
+ throw (0, packageUtils_1.applyErrorAction)((0, packageUtils_1.massageErrorMessage)(err));
33
+ }
34
+ throw err;
32
35
  }
33
36
  }
34
37
  exports.list = list;
@@ -58,14 +61,8 @@ async function query(query, connection) {
58
61
  }));
59
62
  }
60
63
  async function queryForErrors(packageVersionCreateRequestId, connection) {
61
- const errorResults = [];
62
- const queryResult = await connection.tooling.query(util.format("SELECT Message FROM Package2VersionCreateRequestError WHERE ParentRequest.Id = '%s'", packageVersionCreateRequestId));
63
- if (queryResult.records) {
64
- queryResult.records.forEach((record) => {
65
- errorResults.push(record.Message);
66
- });
67
- }
68
- return errorResults;
64
+ const queryResult = await connection.tooling.query(`SELECT Message FROM Package2VersionCreateRequestError WHERE ParentRequest.Id = '${packageVersionCreateRequestId}'`);
65
+ return queryResult.records ? queryResult.records.map((record) => record.Message) : [];
69
66
  }
70
67
  function constructWhere(options) {
71
68
  const where = [];
@@ -17,7 +17,10 @@ async function getCreatePackageVersionCreateRequestReport(options) {
17
17
  return results[0];
18
18
  }
19
19
  catch (err) {
20
- throw (0, packageUtils_1.applyErrorAction)((0, packageUtils_1.massageErrorMessage)(err));
20
+ if (err instanceof Error) {
21
+ throw (0, packageUtils_1.applyErrorAction)((0, packageUtils_1.massageErrorMessage)(err));
22
+ }
23
+ throw err;
21
24
  }
22
25
  }
23
26
  exports.getCreatePackageVersionCreateRequestReport = getCreatePackageVersionCreateRequestReport;
@@ -1,7 +1,8 @@
1
+ import { Connection } from '@salesforce/core';
1
2
  import { QueryResult } from 'jsforce';
2
- import { PackageVersionListResult, ListPackageVersionOptions } from '../interfaces';
3
+ import { PackageVersionListOptions, PackageVersionListResult } from '../interfaces';
3
4
  export declare const DEFAULT_ORDER_BY_FIELDS = "Package2Id, Branch, MajorVersion, MinorVersion, PatchVersion, BuildNumber";
4
- export declare function listPackageVersions(options: ListPackageVersionOptions): Promise<QueryResult<PackageVersionListResult>>;
5
+ export declare function listPackageVersions(connection: Connection, options?: PackageVersionListOptions): Promise<QueryResult<PackageVersionListResult>>;
5
6
  export declare function assembleQueryParts(select: string, where: string[], orderBy?: string): string;
6
- export declare function constructWhere(packageIds: string[], createdLastDays: number, lastModLastDays: number, isReleased: boolean): string[];
7
- export declare function validateDays(paramName: string, lastDays: number): number;
7
+ export declare function constructWhere(options?: PackageVersionListOptions): string[];
8
+ export declare function validateDays(paramName: string, lastDays?: number): number;
@@ -52,24 +52,24 @@ const getLogger = () => {
52
52
  }
53
53
  return logger;
54
54
  };
55
- async function listPackageVersions(options) {
56
- return options.connection.autoFetchQuery(constructQuery(options), {
55
+ async function listPackageVersions(connection, options) {
56
+ return connection.autoFetchQuery(constructQuery(Number(connection.version), options), {
57
57
  tooling: true,
58
58
  });
59
59
  }
60
60
  exports.listPackageVersions = listPackageVersions;
61
- function constructQuery(options) {
61
+ function constructQuery(connectionVersion, options) {
62
62
  // construct custom WHERE clause, if applicable
63
- const where = constructWhere(options.packages, options.createdLastDays, options.modifiedLastDays, options.isReleased);
63
+ const where = constructWhere(options);
64
64
  let queryFields = defaultFields;
65
- if (options.verbose) {
65
+ if (options?.verbose) {
66
66
  queryFields = [...queryFields, ...verboseFields];
67
- if (Number(options.connection.version) >= 57) {
67
+ if (connectionVersion >= 57) {
68
68
  queryFields = [...queryFields, ...verbose57Fields];
69
69
  }
70
70
  }
71
71
  const query = `SELECT ${queryFields.toString()} FROM Package2Version`;
72
- return assembleQueryParts(query, where, options.orderBy);
72
+ return assembleQueryParts(query, where, options?.orderBy);
73
73
  }
74
74
  function assembleQueryParts(select, where, orderBy) {
75
75
  // construct ORDER BY clause
@@ -81,12 +81,12 @@ function assembleQueryParts(select, where, orderBy) {
81
81
  }
82
82
  exports.assembleQueryParts = assembleQueryParts;
83
83
  // construct custom WHERE clause parts
84
- function constructWhere(packageIds, createdLastDays, lastModLastDays, isReleased) {
84
+ function constructWhere(options) {
85
85
  const where = [];
86
86
  // filter on given package ids
87
- if (packageIds?.length > 0) {
87
+ if (options?.packages?.length) {
88
88
  // remove dups
89
- const uniquePackageIds = [...new Set(packageIds)];
89
+ const uniquePackageIds = [...new Set(options?.packages)];
90
90
  // validate ids
91
91
  uniquePackageIds.forEach((packageId) => {
92
92
  (0, packageUtils_1.validateId)(packageUtils_1.BY_LABEL.PACKAGE_ID, packageId);
@@ -95,16 +95,16 @@ function constructWhere(packageIds, createdLastDays, lastModLastDays, isReleased
95
95
  where.push(`Package2Id IN ('${uniquePackageIds.join("','")}')`);
96
96
  }
97
97
  // filter on created date, days ago: 0 for today, etc
98
- if ((0, ts_types_1.isNumber)(createdLastDays)) {
99
- createdLastDays = validateDays('createdlastdays', createdLastDays);
98
+ if ((0, ts_types_1.isNumber)(options?.createdLastDays)) {
99
+ const createdLastDays = validateDays('createdlastdays', options?.createdLastDays);
100
100
  where.push(`CreatedDate = LAST_N_DAYS:${createdLastDays}`);
101
101
  }
102
102
  // filter on last mod date, days ago: 0 for today, etc
103
- if ((0, ts_types_1.isNumber)(lastModLastDays)) {
104
- lastModLastDays = validateDays('modifiedlastdays', lastModLastDays);
105
- where.push(`LastModifiedDate = LAST_N_DAYS:${lastModLastDays}`);
103
+ if ((0, ts_types_1.isNumber)(options?.modifiedLastDays)) {
104
+ const modifiedLastDays = validateDays('modifiedlastdays', options?.modifiedLastDays);
105
+ where.push(`LastModifiedDate = LAST_N_DAYS:${modifiedLastDays}`);
106
106
  }
107
- if (isReleased) {
107
+ if (options?.isReleased) {
108
108
  where.push('IsReleased = true');
109
109
  }
110
110
  // exclude deleted
@@ -112,9 +112,9 @@ function constructWhere(packageIds, createdLastDays, lastModLastDays, isReleased
112
112
  return where;
113
113
  }
114
114
  exports.constructWhere = constructWhere;
115
- function validateDays(paramName, lastDays) {
115
+ function validateDays(paramName, lastDays = -1) {
116
116
  if (lastDays < 0) {
117
- throw messages.createError('invalidDaysNumber', [paramName, `${lastDays}`]);
117
+ throw messages.createError('invalidDaysNumber', [paramName, lastDays]);
118
118
  }
119
119
  return lastDays;
120
120
  }
@@ -40,8 +40,10 @@ async function getPackageVersionReport(options) {
40
40
  if (records?.length > 0) {
41
41
  const record = records[0];
42
42
  record.Version = [record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber].join('.');
43
- const containerOptions = await pkgUtils.getContainerOptions([record.Package2Id], options.connection);
44
- record.PackageType = containerOptions.get(record.Package2Id);
43
+ const containerOptions = await pkgUtils.getContainerOptions(record.Package2Id, options.connection);
44
+ if (containerOptions.size > 0 && record.Package2Id) {
45
+ record.PackageType = containerOptions.get(record.Package2Id);
46
+ }
45
47
  record.AncestorVersion = null;
46
48
  if (record.AncestorId) {
47
49
  // lookup AncestorVersion value
@@ -1,6 +1,6 @@
1
1
  import { Connection } from '@salesforce/core';
2
2
  import { Duration } from '@salesforce/kit';
3
- import { Optional } from '@salesforce/ts-types';
3
+ import { Nullable, Optional } from '@salesforce/ts-types';
4
4
  import { InstalledPackages, PackageInstallCreateRequest, PackageInstallOptions, PackageType, PackagingSObjects, SubscriberPackageVersionOptions } from '../interfaces';
5
5
  import { VersionNumber } from './versionNumber';
6
6
  export declare const SubscriberPackageVersionFields: string[];
@@ -23,7 +23,7 @@ export declare class SubscriberPackageVersion {
23
23
  private readonly password;
24
24
  private readonly connection;
25
25
  private readonly id;
26
- private data;
26
+ private data?;
27
27
  constructor(options: SubscriberPackageVersionOptions);
28
28
  /**
29
29
  * Fetches the status of a package version install request and will wait for the install to complete, if requested
@@ -35,7 +35,7 @@ export declare class SubscriberPackageVersion {
35
35
  * @param installationKey
36
36
  * @param options
37
37
  */
38
- static installStatus(connection: Connection, packageInstallRequestOrId: string | PackagingSObjects.PackageInstallRequest, installationKey?: string, options?: PackageInstallOptions): Promise<PackagingSObjects.PackageInstallRequest>;
38
+ static installStatus(connection: Connection, packageInstallRequestOrId: string | PackagingSObjects.PackageInstallRequest, installationKey?: string | undefined | Nullable<string>, options?: PackageInstallOptions): Promise<PackagingSObjects.PackageInstallRequest>;
39
39
  /**
40
40
  * list the packages installed in the org
41
41
  *
@@ -135,7 +135,7 @@ export declare class SubscriberPackageVersion {
135
135
  getData(options?: {
136
136
  force?: boolean;
137
137
  includeHighCostFields?: boolean;
138
- }): Promise<PackagingSObjects.SubscriberPackageVersion>;
138
+ }): Promise<PackagingSObjects.SubscriberPackageVersion | undefined>;
139
139
  /**
140
140
  * Wait for the subscriber package version to be replicated across instances and available to be queried against
141
141
  *