@salesforce/packaging 4.26.5 → 4.27.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.
@@ -411,6 +411,7 @@ export type PackageVersionDependencyOptions = {
411
411
  connection: Connection;
412
412
  verbose?: boolean;
413
413
  edgeDirection?: 'root-first' | 'root-last';
414
+ installationKey?: string;
414
415
  };
415
416
  export type DependencyGraphData = {
416
417
  creator: string;
@@ -72,6 +72,7 @@ export declare class Package {
72
72
  static getDependencyGraph(packageVersionId: string, project: SfProject | undefined, connection: Connection, options?: {
73
73
  verbose?: boolean;
74
74
  edgeDirection?: 'root-first' | 'root-last';
75
+ installationKey?: string;
75
76
  }): Promise<PackageVersionDependency>;
76
77
  /**
77
78
  * Convert a 1st generation package to a 2nd generation package.
@@ -156,6 +156,7 @@ class Package {
156
156
  connection,
157
157
  verbose: options?.verbose ?? false,
158
158
  edgeDirection: options?.edgeDirection ?? 'root-first',
159
+ installationKey: options?.installationKey,
159
160
  });
160
161
  }
161
162
  /**
@@ -10,6 +10,7 @@ export declare class PackageVersionDependency extends AsyncCreatable<PackageVers
10
10
  private userPackageVersionId;
11
11
  private verbose;
12
12
  private edgeDirection;
13
+ private installationKey?;
13
14
  private resolvedPackageVersionCreateRequestId;
14
15
  private allPackageVersionId;
15
16
  constructor(options: PackageVersionDependencyOptions);
@@ -38,9 +39,10 @@ export declare class DependencyDotProducer {
38
39
  private resolvedPackageVersionId;
39
40
  private subscriberPackageVersionId;
40
41
  private connection;
42
+ private installationKey?;
41
43
  private dependencyGraphData;
42
44
  private selectedNodeIds;
43
- constructor(connection: Connection, dependencyGraphString: string, verbose: boolean, edgeDirection: 'root-first' | 'root-last', resolvedPackageVersionId: string);
45
+ constructor(connection: Connection, dependencyGraphString: string, verbose: boolean, edgeDirection: 'root-first' | 'root-last', resolvedPackageVersionId: string, installationKey?: string);
44
46
  private static throwErrorOnInvalidRecord;
45
47
  init(): Promise<void>;
46
48
  produce(): string;
@@ -19,6 +19,7 @@ exports.PackageDependencyNode = exports.DependencyDotProducer = exports.PackageV
19
19
  const node_os_1 = require("node:os");
20
20
  const core_1 = require("@salesforce/core");
21
21
  const kit_1 = require("@salesforce/kit");
22
+ const packageUtils_1 = require("../utils/packageUtils");
22
23
  const versionNumber_1 = require("./versionNumber");
23
24
  core_1.Messages.importMessagesDirectory(__dirname);
24
25
  const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version_dependency');
@@ -31,6 +32,7 @@ class PackageVersionDependency extends kit_1.AsyncCreatable {
31
32
  userPackageVersionId;
32
33
  verbose;
33
34
  edgeDirection;
35
+ installationKey;
34
36
  resolvedPackageVersionCreateRequestId;
35
37
  allPackageVersionId;
36
38
  constructor(options) {
@@ -41,6 +43,7 @@ class PackageVersionDependency extends kit_1.AsyncCreatable {
41
43
  this.userPackageVersionId = options.packageVersionId;
42
44
  this.verbose = options.verbose ?? false;
43
45
  this.edgeDirection = options.edgeDirection ?? 'root-first';
46
+ this.installationKey = options.installationKey;
44
47
  this.resolvedPackageVersionCreateRequestId = '';
45
48
  this.allPackageVersionId = '';
46
49
  }
@@ -61,7 +64,7 @@ class PackageVersionDependency extends kit_1.AsyncCreatable {
61
64
  else {
62
65
  dependencyGraphJson = await this.createFlatDependencyGraph();
63
66
  }
64
- const producer = new DependencyDotProducer(this.connection, dependencyGraphJson, this.verbose, this.edgeDirection, this.resolvedPackageVersionCreateRequestId);
67
+ const producer = new DependencyDotProducer(this.connection, dependencyGraphJson, this.verbose, this.edgeDirection, this.resolvedPackageVersionCreateRequestId, this.installationKey);
65
68
  await producer.init();
66
69
  return producer;
67
70
  }
@@ -77,7 +80,10 @@ class PackageVersionDependency extends kit_1.AsyncCreatable {
77
80
  if (!this.allPackageVersionId) {
78
81
  throw messages.createError('noDependencyGraphJsonMustProvideVersion');
79
82
  }
80
- const query = `SELECT Dependencies FROM SubscriberPackageVersion WHERE Id = '${this.allPackageVersionId}'`;
83
+ let query = `SELECT Dependencies FROM SubscriberPackageVersion WHERE Id = '${this.allPackageVersionId}'`;
84
+ if (this.installationKey) {
85
+ query += ` AND InstallationKey = '${(0, packageUtils_1.escapeInstallationKey)(this.installationKey)}'`;
86
+ }
81
87
  const result = await this.connection.tooling.query(query);
82
88
  if (result?.records?.length !== 1) {
83
89
  throw messages.createError('invalidPackageVersionIdError', [this.userPackageVersionId]);
@@ -174,14 +180,16 @@ class DependencyDotProducer {
174
180
  resolvedPackageVersionId;
175
181
  subscriberPackageVersionId;
176
182
  connection;
183
+ installationKey;
177
184
  dependencyGraphData;
178
185
  selectedNodeIds = [];
179
- constructor(connection, dependencyGraphString, verbose, edgeDirection, resolvedPackageVersionId) {
186
+ constructor(connection, dependencyGraphString, verbose, edgeDirection, resolvedPackageVersionId, installationKey) {
180
187
  this.verbose = verbose;
181
188
  this.edgeDirection = edgeDirection;
182
189
  this.resolvedPackageVersionId = resolvedPackageVersionId;
183
190
  this.connection = connection;
184
191
  this.dependencyGraphString = dependencyGraphString;
192
+ this.installationKey = installationKey;
185
193
  this.subscriberPackageVersionId = exports.VERSION_BEING_BUILT;
186
194
  }
187
195
  static throwErrorOnInvalidRecord(record) {
@@ -215,7 +223,10 @@ class DependencyDotProducer {
215
223
  }
216
224
  else if (this.subscriberPackageVersionId.startsWith('04t')) {
217
225
  selectedNodes.push(this.subscriberPackageVersionId);
218
- const query = `SELECT Dependencies FROM SubscriberPackageVersion WHERE Id = '${this.subscriberPackageVersionId}'`;
226
+ let query = `SELECT Dependencies FROM SubscriberPackageVersion WHERE Id = '${this.subscriberPackageVersionId}'`;
227
+ if (this.installationKey) {
228
+ query += ` AND InstallationKey = '${(0, packageUtils_1.escapeInstallationKey)(this.installationKey)}'`;
229
+ }
219
230
  try {
220
231
  const result = await this.connection.tooling.query(query);
221
232
  if (result.records?.length !== 1) {
@@ -51,30 +51,12 @@ async function retrievePackageVersionMetadata(project, options, connection) {
51
51
  if (!(0, packageUtils_1.isPackageDirectoryEffectivelyEmpty)(destinationPath)) {
52
52
  throw messages.createError('sourcesDownloadDirectoryNotEmpty');
53
53
  }
54
- // Get the DeveloperUsePkgZip URL from the Package2Version record
54
+ // Resolve an alias to the underlying 04t if one was passed.
55
55
  const subscriberPackageVersionId = project.getPackageIdFromAlias(options.subscriberPackageVersionId) ?? options.subscriberPackageVersionId;
56
- // Query Package2Version to get the record by SubscriberPackageVersionId
57
- const queryOptions = {
58
- whereClause: `WHERE SubscriberPackageVersionId = '${subscriberPackageVersionId}'`,
59
- };
60
- let versionInfo;
61
- try {
62
- [versionInfo] = await packageVersion_1.PackageVersion.queryPackage2Version(connection, queryOptions);
63
- }
64
- catch (e) {
65
- const msg = e instanceof Error ? e.message : String(e);
66
- if (msg.includes("No such column 'DeveloperUsePkgZip' on entity 'Package2Version'")) {
67
- throw messages.createError('developerUsePkgZipFieldUnavailable');
68
- }
69
- if (msg.includes("sObject type 'Package2Version' is not supported.")) {
70
- throw messages.createError('packagingNotEnabledOnOrg');
71
- }
72
- throw e;
73
- }
74
- if (!versionInfo?.DeveloperUsePkgZip) {
75
- throw messages.createError('developerUsePkgZipFieldUnavailable');
76
- }
77
- const responseBase64 = await connection.tooling.request(versionInfo.DeveloperUsePkgZip, {
56
+ const versionInfo = await resolvePackage2Version(connection, subscriberPackageVersionId);
57
+ // The package version exists in this Dev Hub, so now we fetch the download URL.
58
+ const developerUsePkgZipUrl = await fetchDeveloperUsePkgZipUrl(connection, subscriberPackageVersionId);
59
+ const responseBase64 = await connection.tooling.request(developerUsePkgZipUrl, {
78
60
  encoding: 'base64',
79
61
  });
80
62
  const buffer = Buffer.from(responseBase64, 'base64');
@@ -180,4 +162,84 @@ async function attemptToUpdateProjectJson(project, connection, packageId, subscr
180
162
  logger.error(`Encountered error trying to update sfdx-project.json after retrieving package version metadata: ${msg}`);
181
163
  }
182
164
  }
165
+ /**
166
+ * Query the Package2Version record for the given 04t, mapping a missing row to the right error: no
167
+ * packaging support on the org, not found anywhere, or found but not in this Dev Hub. Selects only
168
+ * columns any authenticated user can read, so the query always succeeds; selecting DeveloperUsePkgZip
169
+ * here (which requires the DownloadPackageVersionZips permission) would throw "No such column" for a
170
+ * user without that permission and mask those cases as a permission problem.
171
+ *
172
+ * Rejects a syntactically invalid 04t up front so it maps to packageVersionNotFound rather than
173
+ * leaking a raw "invalid ID field" SOQL error from the interpolated where clause.
174
+ */
175
+ async function resolvePackage2Version(connection, subscriberPackageVersionId) {
176
+ if (!(0, packageUtils_1.validateIdNoThrow)(packageUtils_1.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID, subscriberPackageVersionId)) {
177
+ throw messages.createError('packageVersionNotFound', [subscriberPackageVersionId]);
178
+ }
179
+ const queryOptions = {
180
+ whereClause: `WHERE SubscriberPackageVersionId = '${subscriberPackageVersionId}'`,
181
+ fields: ['Package2Id', 'ConvertedFromVersionId'],
182
+ };
183
+ let versionInfo;
184
+ try {
185
+ [versionInfo] = await packageVersion_1.PackageVersion.queryPackage2Version(connection, queryOptions);
186
+ }
187
+ catch (e) {
188
+ const msg = e instanceof Error ? e.message : String(e);
189
+ if (msg.includes("sObject type 'Package2Version' is not supported.")) {
190
+ throw messages.createError('packagingNotEnabledOnOrg');
191
+ }
192
+ throw e;
193
+ }
194
+ // No Package2Version row in this Dev Hub. Use SubscriberPackageVersion, a global view any
195
+ // authenticated user can query, to tell "doesn't exist anywhere" from "exists but not here".
196
+ if (!versionInfo) {
197
+ const exists = await subscriberPackageVersionExists(connection, subscriberPackageVersionId);
198
+ throw messages.createError(exists ? 'packageVersionNotInDevHub' : 'packageVersionNotFound', [
199
+ subscriberPackageVersionId,
200
+ ]);
201
+ }
202
+ return versionInfo;
203
+ }
204
+ /**
205
+ * Fetch the DeveloperUsePkgZip download URL for a Package2Version row already confirmed to exist in
206
+ * this Dev Hub. Reading this column requires the DownloadPackageVersionZips permission, so once the
207
+ * row is known to exist, both a "No such column" error and a null value reliably mean the user lacks
208
+ * that permission.
209
+ */
210
+ async function fetchDeveloperUsePkgZipUrl(connection, subscriberPackageVersionId) {
211
+ const queryOptions = {
212
+ whereClause: `WHERE SubscriberPackageVersionId = '${subscriberPackageVersionId}'`,
213
+ fields: ['DeveloperUsePkgZip'],
214
+ };
215
+ let versionInfo;
216
+ try {
217
+ [versionInfo] = await packageVersion_1.PackageVersion.queryPackage2Version(connection, queryOptions);
218
+ }
219
+ catch (e) {
220
+ const msg = e instanceof Error ? e.message : String(e);
221
+ if (msg.includes("No such column 'DeveloperUsePkgZip' on entity 'Package2Version'")) {
222
+ throw messages.createError('developerUsePkgZipFieldUnavailable');
223
+ }
224
+ throw e;
225
+ }
226
+ if (!versionInfo?.DeveloperUsePkgZip) {
227
+ throw messages.createError('developerUsePkgZipFieldUnavailable');
228
+ }
229
+ return versionInfo.DeveloperUsePkgZip;
230
+ }
231
+ /**
232
+ * True if a SubscriberPackageVersion with this 04t ID exists anywhere. That global view is
233
+ * queryable by any authenticated user, so it tells "not found" apart from "not in this Dev Hub".
234
+ */
235
+ async function subscriberPackageVersionExists(connection, subscriberPackageVersionId) {
236
+ try {
237
+ const result = await connection.tooling.query(`SELECT Id FROM SubscriberPackageVersion WHERE Id = '${subscriberPackageVersionId}' LIMIT 1`);
238
+ return (result.records?.length ?? 0) > 0;
239
+ }
240
+ catch {
241
+ // If even the existence probe fails (malformed ID, etc.), fall back to "not found".
242
+ return false;
243
+ }
244
+ }
183
245
  //# sourceMappingURL=packageVersionRetrieve.js.map
@@ -38,6 +38,14 @@ Can't retrieve package version metadata. The specified directory must be relativ
38
38
 
39
39
  Can't retrieve package metadata. To use this feature, you must first assign yourself the DownloadPackageVersionZips user permission. Then retry retrieving your package metadata.
40
40
 
41
+ # packageVersionNotFound
42
+
43
+ Can't retrieve package metadata. We can't find the package version %s. Verify that the 04t ID is correct and that the package version exists.
44
+
45
+ # packageVersionNotInDevHub
46
+
47
+ Can't retrieve package metadata. Package version %s isn't accessible from this Dev Hub org. You can only retrieve package metadata from the Dev Hub that created the package version. Verify that you specified the correct target Dev Hub.
48
+
41
49
  # downloadDeveloperPackageZipHasNoDataNative2GP
42
50
 
43
51
  Can't retrieve package metadata. The developer package zip for this native 2GP package version is unretrievable. To resolve, create a new package version with the --generate-pkg-zip flag. Then retry retrieving your package metadata.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/packaging",
3
- "version": "4.26.5",
3
+ "version": "4.27.1",
4
4
  "description": "Packaging library for the Salesforce packaging platform",
5
5
  "main": "lib/exported",
6
6
  "types": "lib/exported.d.ts",
@@ -42,7 +42,7 @@
42
42
  "!lib/**/*.map"
43
43
  ],
44
44
  "dependencies": {
45
- "@jsforce/jsforce-node": "^3.10.16",
45
+ "@jsforce/jsforce-node": "^3.10.18",
46
46
  "@salesforce/core": "^8.31.4",
47
47
  "@salesforce/kit": "^3.2.6",
48
48
  "@salesforce/schemas": "^1.10.3",
@@ -58,7 +58,7 @@
58
58
  "object-treeify": "^2"
59
59
  },
60
60
  "devDependencies": {
61
- "@salesforce/cli-plugins-testkit": "^5.3.58",
61
+ "@salesforce/cli-plugins-testkit": "^5.3.62",
62
62
  "@salesforce/dev-scripts": "^11.0.4",
63
63
  "@types/globby": "^9.1.0",
64
64
  "@types/jszip": "^3.4.1",