@salesforce/packaging 2.4.21 → 3.0.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.
@@ -122,8 +122,6 @@ export type PackageDescriptorJson = Partial<NamedPackageDir> & Partial<{
122
122
  features: string[];
123
123
  orgPreferences: string[];
124
124
  snapshot: string;
125
- unpackagedMetadata: NamedPackageDir;
126
- seedMetadata: NamedPackageDir;
127
125
  apexTestAccess: {
128
126
  permissionSets: string[] | string;
129
127
  permissionSetLicenses: string[] | string;
@@ -508,12 +508,15 @@ class PackageVersion {
508
508
  const version = `${aliases[0]}@${versionResult.MajorVersion ?? 0}.${versionResult.MinorVersion ?? 0}.${versionResult.PatchVersion ?? 0}`;
509
509
  const build = versionResult.BuildNumber ? `-${versionResult.BuildNumber}` : '';
510
510
  const branch = versionResult.Branch ? `-${versionResult.Branch}` : '';
511
- // set packageAliases entry '<package>@<major>.<minor>.<patch>-<build>-<branch>: <result.subscriberPackageVersionId>'
512
- const packageAliases = this.project.getSfProjectJson().getContents().packageAliases ?? {};
513
- if (results.SubscriberPackageVersionId) {
514
- packageAliases[`${version}${build}${branch}`] = results.SubscriberPackageVersionId;
515
- }
516
- this.project.getSfProjectJson().getContents().packageAliases = packageAliases;
511
+ const originalPackageAliases = this.project.getSfProjectJson().get('packageAliases') ?? {};
512
+ const updatedPackageAliases = {
513
+ ...originalPackageAliases,
514
+ ...(results.SubscriberPackageVersionId
515
+ ? // set packageAliases entry '<package>@<major>.<minor>.<patch>-<build>-<branch>: <result.subscriberPackageVersionId>'
516
+ { [`${version}${build}${branch}`]: results.SubscriberPackageVersionId }
517
+ : {}),
518
+ };
519
+ this.project.getSfProjectJson().set('packageAliases', updatedPackageAliases);
517
520
  await this.project.getSfProjectJson().write();
518
521
  }
519
522
  }
@@ -1,5 +1,5 @@
1
1
  import { ConvertResult } from '@salesforce/source-deploy-retrieve';
2
- import { MDFolderForArtifactOptions, PackageVersionCreateOptions, PackageVersionCreateRequestResult, PackageXml } from '../interfaces';
2
+ import { MDFolderForArtifactOptions, PackageVersionCreateOptions, PackageVersionCreateRequestResult, PackageXml, PackagingSObjects } from '../interfaces';
3
3
  export declare class PackageVersionCreate {
4
4
  private options;
5
5
  private apiVersionFromPackageXml;
@@ -38,18 +38,8 @@ export declare class PackageVersionCreate {
38
38
  private getPackageDirFromId;
39
39
  private getPackageType;
40
40
  private validateOptionsForPackageType;
41
- /**
42
- * Cleans invalid attribute(s) from the packageDescriptorJSON
43
- */
44
- private cleanPackageDescriptorJson;
45
- /**
46
- * Sets default or override values for packageDescriptorJSON attribs
47
- */
48
- private setPackageDescriptorJsonValues;
49
- private validateVersionNumber;
50
41
  private validatePatchVersion;
51
42
  private getAncestorId;
52
- private validateAncestorId;
53
43
  private getAncestorIdHighestRelease;
54
44
  }
55
45
  export declare class MetadataResolver {
@@ -70,3 +60,5 @@ export declare const packageXmlStringToPackageXmlJson: (rawXml: string) => Packa
70
60
  * Converts PackageXmlJson to a string representing the Xml
71
61
  * */
72
62
  export declare const packageXmlJsonToXmlString: (packageXmlJson: PackageXml) => string;
63
+ export declare const validateAncestorId: (ancestorId: string, highestReleasedVersion: PackagingSObjects.Package2Version | null | undefined, explicitUseNoAncestor: boolean, isPatch: boolean, skipAncestorCheck: boolean, origSpecifiedAncestor: string) => string;
64
+ export declare const validateVersionNumber: (versionNumberString: string, supportedBuildNumberToken: string, supportedBuildNumberToken2?: string) => string;
@@ -6,7 +6,7 @@
6
6
  * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.packageXmlJsonToXmlString = exports.packageXmlStringToPackageXmlJson = exports.MetadataResolver = exports.PackageVersionCreate = void 0;
9
+ exports.validateVersionNumber = exports.validateAncestorId = exports.packageXmlJsonToXmlString = exports.packageXmlStringToPackageXmlJson = exports.MetadataResolver = exports.PackageVersionCreate = void 0;
10
10
  const path = require("node:path");
11
11
  const os = require("node:os");
12
12
  const fs = require("node:fs");
@@ -15,6 +15,7 @@ const source_deploy_retrieve_1 = require("@salesforce/source-deploy-retrieve");
15
15
  const scratchOrgSettingsGenerator_1 = require("@salesforce/core/lib/org/scratchOrgSettingsGenerator");
16
16
  const kit_1 = require("@salesforce/kit");
17
17
  const fast_xml_parser_1 = require("fast-xml-parser");
18
+ const ts_types_1 = require("@salesforce/ts-types");
18
19
  const pkgUtils = require("../utils/packageUtils");
19
20
  const packageUtils_1 = require("../utils/packageUtils");
20
21
  const interfaces_1 = require("../interfaces");
@@ -69,7 +70,7 @@ class PackageVersionCreate {
69
70
  // Just override dependency.packageId value to the resolved alias.
70
71
  dependency.packageId = packageIdFromAlias;
71
72
  pkgUtils.validateId(pkgUtils.BY_LABEL.PACKAGE_ID, dependency.packageId);
72
- this.validateVersionNumber(dependency.versionNumber, versionNumber_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN, versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN);
73
+ (0, exports.validateVersionNumber)(dependency.versionNumber, versionNumber_1.BuildNumberToken.LATEST_BUILD_NUMBER_TOKEN, versionNumber_1.BuildNumberToken.RELEASED_BUILD_NUMBER_TOKEN);
73
74
  await this.validatePatchVersion(dependency.versionNumber, dependency.packageId);
74
75
  // Validate that the Package2 id exists on the server
75
76
  const query = `SELECT Id FROM Package2 WHERE Id = '${dependency.packageId}'`;
@@ -294,8 +295,8 @@ class PackageVersionCreate {
294
295
  if (resultValues.length > 0) {
295
296
  packageDescriptorJson.dependencies = resultValues;
296
297
  }
297
- this.cleanPackageDescriptorJson(packageDescriptorJson);
298
- this.setPackageDescriptorJsonValues(packageDescriptorJson);
298
+ packageDescriptorJson = cleanPackageDescriptorJson(packageDescriptorJson);
299
+ packageDescriptorJson = setPackageDescriptorJsonValues(packageDescriptorJson, this.options, this.logger);
299
300
  await fs.promises.mkdir(packageVersTmpRoot, { recursive: true });
300
301
  await fs.promises.mkdir(packageVersBlobDirectory, { recursive: true });
301
302
  if (Reflect.has(packageDescriptorJson, 'ancestorVersion')) {
@@ -364,7 +365,7 @@ class PackageVersionCreate {
364
365
  profileExcludeDirs = this.project
365
366
  .getPackageDirectories()
366
367
  .map((packageDir) => packageDir.unpackagedMetadata?.path)
367
- .filter((packageDirPath) => packageDirPath);
368
+ .filter(ts_types_1.isString);
368
369
  let debugMsg = 'Searching for profiles to include from all packageDirectories';
369
370
  if (profileExcludeDirs?.length) {
370
371
  debugMsg += ` excluding these unpackagedMetadata dirs: ${profileExcludeDirs.toString()}`;
@@ -509,9 +510,8 @@ class PackageVersionCreate {
509
510
  return (await (0, packageVersionCreateRequest_1.byId)(createResult.id, this.connection))[0];
510
511
  }
511
512
  async getPackageDirFromId(pkg) {
512
- let dir;
513
513
  if (pkg.startsWith('0Ho')) {
514
- dir = (await this.project.getSfProjectJson().getPackageDirectories()).filter((p) => p.package === pkg);
514
+ const dir = (await this.project.getSfProjectJson().getPackageDirectories()).filter((p) => p.package === pkg);
515
515
  if (dir.length === 1) {
516
516
  return dir[0];
517
517
  }
@@ -540,83 +540,6 @@ class PackageVersionCreate {
540
540
  }
541
541
  }
542
542
  }
543
- /**
544
- * Cleans invalid attribute(s) from the packageDescriptorJSON
545
- */
546
- // eslint-disable-next-line class-methods-use-this
547
- cleanPackageDescriptorJson(packageDescriptorJson) {
548
- delete packageDescriptorJson.default; // for client-side use only, not needed
549
- delete packageDescriptorJson.includeProfileUserLicenses; // for client-side use only, not needed
550
- delete packageDescriptorJson.unpackagedMetadata; // for client-side use only, not needed
551
- delete packageDescriptorJson.seedMetadata; // for client-side use only, not needed
552
- delete packageDescriptorJson.branch; // for client-side use only, not needed
553
- delete packageDescriptorJson.fullPath; // for client-side use only, not needed
554
- delete packageDescriptorJson.name; // for client-side use only, not needed
555
- delete packageDescriptorJson.scopeProfiles; // for client-side use only, not needed
556
- return packageDescriptorJson;
557
- }
558
- /**
559
- * Sets default or override values for packageDescriptorJSON attribs
560
- */
561
- setPackageDescriptorJsonValues(packageDescriptorJson) {
562
- const options = this.options;
563
- if (options.versionname) {
564
- packageDescriptorJson.versionName = options.versionname;
565
- }
566
- if (options.versiondescription) {
567
- packageDescriptorJson.versionDescription = options.versiondescription;
568
- }
569
- if (options.versionnumber) {
570
- packageDescriptorJson.versionNumber = options.versionnumber;
571
- }
572
- // default versionName to versionNumber if unset, stripping .NEXT if present
573
- if (!packageDescriptorJson.versionName) {
574
- const versionNumber = packageDescriptorJson.versionNumber;
575
- packageDescriptorJson.versionName =
576
- versionNumber?.split(pkgUtils.VERSION_NUMBER_SEP)[3] === versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN
577
- ? versionNumber.substring(0, versionNumber.indexOf(pkgUtils.VERSION_NUMBER_SEP + versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN))
578
- : versionNumber;
579
- this.logger.warn(messages.getMessage('defaultVersionName', [packageDescriptorJson.versionName]));
580
- }
581
- if (options.releasenotesurl) {
582
- packageDescriptorJson.releaseNotesUrl = options.releasenotesurl;
583
- }
584
- if (packageDescriptorJson.releaseNotesUrl && !core_1.SfdcUrl.isValidUrl(packageDescriptorJson.releaseNotesUrl)) {
585
- throw messages.createError('malformedUrl', ['releaseNotesUrl', packageDescriptorJson.releaseNotesUrl]);
586
- }
587
- if (options.postinstallurl) {
588
- packageDescriptorJson.postInstallUrl = options.postinstallurl;
589
- }
590
- if (packageDescriptorJson.postInstallUrl && !core_1.SfdcUrl.isValidUrl(packageDescriptorJson.postInstallUrl)) {
591
- throw messages.createError('malformedUrl', ['postInstallUrl', packageDescriptorJson.postInstallUrl]);
592
- }
593
- if (options.postinstallscript) {
594
- packageDescriptorJson.postInstallScript = options.postinstallscript;
595
- }
596
- if (options.uninstallscript) {
597
- packageDescriptorJson.uninstallScript = options.uninstallscript;
598
- }
599
- }
600
- // eslint-disable-next-line class-methods-use-this
601
- validateVersionNumber(versionNumberString, supportedBuildNumberToken, supportedBuildNumberToken2) {
602
- const versionNumber = versionNumber_1.VersionNumber.from(versionNumberString);
603
- // build number can be a number or valid token
604
- if (Number.isNaN(parseInt(`${versionNumber.build}`, 10)) &&
605
- versionNumber.build !== supportedBuildNumberToken &&
606
- versionNumber.build !== supportedBuildNumberToken2) {
607
- if (supportedBuildNumberToken2) {
608
- throw messages.createError('errorInvalidBuildNumberForKeywords', [
609
- versionNumberString,
610
- supportedBuildNumberToken,
611
- supportedBuildNumberToken2,
612
- ]);
613
- }
614
- else {
615
- throw messages.createError('errorInvalidBuildNumber', [versionNumberString, supportedBuildNumberToken]);
616
- }
617
- }
618
- return versionNumberString;
619
- }
620
543
  async validatePatchVersion(versionNumberString, packageId) {
621
544
  const query = `SELECT ContainerOptions FROM Package2 WHERE id ='${packageId}'`;
622
545
  const queryResult = await this.connection.tooling.query(query);
@@ -715,34 +638,7 @@ class PackageVersionCreate {
715
638
  ancestorId = queriedAncestorId;
716
639
  origSpecifiedAncestor = packageDescriptorJson.ancestorVersion;
717
640
  }
718
- return this.validateAncestorId(ancestorId, highestReleasedVersion, explicitUseNoAncestor, versionNumber.patch !== '0', skipAncestorCheck, origSpecifiedAncestor);
719
- }
720
- // eslint-disable-next-line class-methods-use-this
721
- validateAncestorId(ancestorId, highestReleasedVersion, explicitUseNoAncestor, isPatch, skipAncestorCheck, origSpecifiedAncestor) {
722
- if (explicitUseNoAncestor) {
723
- if (!highestReleasedVersion) {
724
- return '';
725
- }
726
- else {
727
- // the explicitUseNoAncestor && skipAncestorCheck case is handled above
728
- throw messages.createError('errorAncestorNoneNotAllowed', [(0, packageUtils_1.getPackageVersionNumber)(highestReleasedVersion)]);
729
- }
730
- }
731
- if (!isPatch && !skipAncestorCheck) {
732
- if (highestReleasedVersion) {
733
- if (highestReleasedVersion.Id !== ancestorId) {
734
- throw messages.createError('errorAncestorNotHighest', [
735
- origSpecifiedAncestor,
736
- (0, packageUtils_1.getPackageVersionNumber)(highestReleasedVersion),
737
- ]);
738
- }
739
- }
740
- else {
741
- // looks like the initial version:create - allow
742
- ancestorId = '';
743
- }
744
- }
745
- return ancestorId;
641
+ return (0, exports.validateAncestorId)(ancestorId, highestReleasedVersion, explicitUseNoAncestor, versionNumber.patch !== '0', skipAncestorCheck, origSpecifiedAncestor);
746
642
  }
747
643
  async getAncestorIdHighestRelease(packageId, versionNumberString, explicitUseHighestRelease, skipAncestorCheck) {
748
644
  if (!packageId) {
@@ -901,4 +797,97 @@ const packageXmlJsonToXmlString = (packageXmlJson) => {
901
797
  }));
902
798
  };
903
799
  exports.packageXmlJsonToXmlString = packageXmlJsonToXmlString;
800
+ // exported for UT
801
+ const validateAncestorId = (ancestorId, highestReleasedVersion, explicitUseNoAncestor, isPatch, skipAncestorCheck, origSpecifiedAncestor) => {
802
+ if (explicitUseNoAncestor) {
803
+ if (!highestReleasedVersion) {
804
+ return '';
805
+ }
806
+ else {
807
+ // the explicitUseNoAncestor && skipAncestorCheck case is handled above
808
+ throw messages.createError('errorAncestorNoneNotAllowed', [(0, packageUtils_1.getPackageVersionNumber)(highestReleasedVersion)]);
809
+ }
810
+ }
811
+ if (!isPatch && !skipAncestorCheck) {
812
+ if (highestReleasedVersion) {
813
+ if (highestReleasedVersion.Id !== ancestorId) {
814
+ throw messages.createError('errorAncestorNotHighest', [
815
+ origSpecifiedAncestor,
816
+ (0, packageUtils_1.getPackageVersionNumber)(highestReleasedVersion),
817
+ ]);
818
+ }
819
+ }
820
+ else {
821
+ // looks like the initial version:create - allow
822
+ ancestorId = '';
823
+ }
824
+ }
825
+ return ancestorId;
826
+ };
827
+ exports.validateAncestorId = validateAncestorId;
828
+ const validateVersionNumber = (versionNumberString, supportedBuildNumberToken, supportedBuildNumberToken2) => {
829
+ const versionNumber = versionNumber_1.VersionNumber.from(versionNumberString);
830
+ // build number can be a number or valid token
831
+ if (Number.isNaN(parseInt(`${versionNumber.build}`, 10)) &&
832
+ versionNumber.build !== supportedBuildNumberToken &&
833
+ versionNumber.build !== supportedBuildNumberToken2) {
834
+ if (supportedBuildNumberToken2) {
835
+ throw messages.createError('errorInvalidBuildNumberForKeywords', [
836
+ versionNumberString,
837
+ supportedBuildNumberToken,
838
+ supportedBuildNumberToken2,
839
+ ]);
840
+ }
841
+ else {
842
+ throw messages.createError('errorInvalidBuildNumber', [versionNumberString, supportedBuildNumberToken]);
843
+ }
844
+ }
845
+ return versionNumberString;
846
+ };
847
+ exports.validateVersionNumber = validateVersionNumber;
848
+ /**
849
+ * Sets default or override values for packageDescriptorJSON attribs
850
+ */
851
+ const setPackageDescriptorJsonValues = (packageDescriptorJson, options, logger) => {
852
+ const merged = {
853
+ ...packageDescriptorJson,
854
+ ...(options.versionname ? { versionName: options.versionname } : {}),
855
+ ...(options.versiondescription ? { versionDescription: options.versiondescription } : {}),
856
+ ...(options.versionnumber ? { versionNumber: options.versionnumber } : {}),
857
+ ...(options.releasenotesurl ? { releaseNotesUrl: options.releasenotesurl } : {}),
858
+ ...(options.postinstallurl ? { postInstallUrl: options.postinstallurl } : {}),
859
+ ...(options.postinstallscript ? { postInstallScript: options.postinstallscript } : {}),
860
+ ...(options.postinstallurl ? { postInstallUrl: options.postinstallurl } : {}),
861
+ };
862
+ if (merged.postInstallUrl && !core_1.SfdcUrl.isValidUrl(merged.postInstallUrl)) {
863
+ throw messages.createError('malformedUrl', ['postInstallUrl', merged.postInstallUrl]);
864
+ }
865
+ // default versionName to versionNumber if unset, stripping .NEXT if present
866
+ if (!merged.versionName) {
867
+ const versionNumber = merged.versionNumber;
868
+ merged.versionName =
869
+ versionNumber?.split(pkgUtils.VERSION_NUMBER_SEP)[3] === versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN
870
+ ? versionNumber.substring(0, versionNumber.indexOf(pkgUtils.VERSION_NUMBER_SEP + versionNumber_1.BuildNumberToken.NEXT_BUILD_NUMBER_TOKEN))
871
+ : versionNumber;
872
+ logger.warn(messages.getMessage('defaultVersionName', [merged.versionName]));
873
+ }
874
+ return merged;
875
+ };
876
+ /**
877
+ * Cleans client-side-only attribute(s) from the packageDescriptorJSON so it can go to API
878
+ */
879
+ const cleanPackageDescriptorJson = (packageDescriptorJson) => {
880
+ // properties only used by the client side
881
+ const clientOnlyProps = [
882
+ 'default',
883
+ 'includeProfileUserLicenses',
884
+ 'unpackagedMetadata',
885
+ 'seedMetadata',
886
+ 'branch',
887
+ 'fullPath',
888
+ 'name',
889
+ 'scopeProfiles',
890
+ ];
891
+ return Object.fromEntries(Object.entries(packageDescriptorJson).filter(([key]) => !clientOnlyProps.includes(key)));
892
+ };
904
893
  //# sourceMappingURL=packageVersionCreate.js.map
@@ -139,8 +139,8 @@ async function attemptToUpdateProjectJson(project, connection, packageId, subscr
139
139
  const packageVersionVersionString = `${version.MajorVersion}.${version.MinorVersion}.${version.PatchVersion}-${version.BuildNumber}`;
140
140
  const [alias, writtenId] = await (0, packageUtils_1.generatePackageAliasEntry)(connection, project, subscriberPackageVersionId, packageVersionVersionString, 'main', pkg.getId());
141
141
  project.getSfProjectJson().addPackageAlias(alias, writtenId);
142
- if (pkgData.ContainerOptions === 'Managed' && !project.getSfProjectJson().getContents().namespace) {
143
- project.getSfProjectJson().getContents().namespace = pkgData.NamespacePrefix;
142
+ if (pkgData.ContainerOptions === 'Managed' && !project.getSfProjectJson().get('namespace')) {
143
+ project.getSfProjectJson().set('namespace', pkgData.NamespacePrefix);
144
144
  }
145
145
  await project.getSfProjectJson().write();
146
146
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/packaging",
3
- "version": "2.4.21",
3
+ "version": "3.0.1",
4
4
  "description": "Packaging library for the Salesforce packaging platform",
5
5
  "main": "lib/exported",
6
6
  "types": "lib/exported.d.ts",
@@ -8,7 +8,6 @@
8
8
  "repository": "forcedotcom/packaging",
9
9
  "scripts": {
10
10
  "build": "wireit",
11
- "ci-docs": "yarn sf-ci-docs",
12
11
  "clean": "sf-clean",
13
12
  "clean-all": "sf-clean all",
14
13
  "compile": "wireit",
@@ -32,7 +31,7 @@
32
31
  "packaging"
33
32
  ],
34
33
  "engines": {
35
- "node": ">=16.0.0"
34
+ "node": ">=18.0.0"
36
35
  },
37
36
  "files": [
38
37
  "docs",
@@ -42,10 +41,10 @@
42
41
  ],
43
42
  "dependencies": {
44
43
  "@oclif/core": "^2.15.0",
45
- "@salesforce/core": "^5.3.14",
44
+ "@salesforce/core": "^6.1.3",
46
45
  "@salesforce/kit": "^3.0.15",
47
46
  "@salesforce/schemas": "^1.6.1",
48
- "@salesforce/source-deploy-retrieve": "^9.8.5",
47
+ "@salesforce/source-deploy-retrieve": "^10.0.0",
49
48
  "@salesforce/ts-types": "^2.0.9",
50
49
  "fast-xml-parser": "^4.3.1",
51
50
  "globby": "^11",