@salesforce/packaging 4.9.1 → 4.11.0

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.
@@ -8,6 +8,7 @@ import { ConvertResult } from '@salesforce/source-deploy-retrieve';
8
8
  import type { Package } from '@salesforce/types/metadata';
9
9
  import { PackageProfileApi } from '../package/packageProfileApi';
10
10
  import { PackageAncestryNode } from '../package/packageAncestry';
11
+ import { VersionNumber } from '../package/versionNumber';
11
12
  import { PackagingSObjects } from './packagingSObjects';
12
13
  import Package2VersionStatus = PackagingSObjects.Package2VersionStatus;
13
14
  import PackageInstallRequest = PackagingSObjects.PackageInstallRequest;
@@ -198,6 +199,7 @@ export type PackageVersionCreateRequest = {
198
199
  CalculateCodeCoverage: boolean;
199
200
  SkipValidation: boolean;
200
201
  AsyncValidation?: boolean;
202
+ CalcTransitiveDependencies?: boolean;
201
203
  };
202
204
  export type PackageVersionListOptions = {
203
205
  orderBy?: string;
@@ -399,6 +401,27 @@ export type AncestryRepresentationProducer = {
399
401
  addNode(node: AncestryRepresentationProducer): void;
400
402
  produce(): PackageAncestryNodeData | string | void;
401
403
  };
404
+ export type PackageVersionDependencyOptions = {
405
+ packageVersionId: string;
406
+ project?: SfProject;
407
+ connection: Connection;
408
+ verbose?: boolean;
409
+ edgeDirection?: 'root-first' | 'root-last';
410
+ };
411
+ export type DependencyGraphData = {
412
+ creator: string;
413
+ nodes: DependencyGraphNode[];
414
+ edges: DependencyGraphEdge[];
415
+ };
416
+ export type DependencyGraphNode = {
417
+ subscriberPackageVersionId: string;
418
+ packageName: string;
419
+ version: VersionNumber;
420
+ };
421
+ export type DependencyGraphEdge = {
422
+ source: string;
423
+ target: string;
424
+ };
402
425
  export declare const PackageEvents: {
403
426
  convert: {
404
427
  success: string;
@@ -1,6 +1,7 @@
1
1
  import { Connection, SfProject } from '@salesforce/core';
2
2
  import { ConvertPackageOptions, PackageCreateOptions, PackageOptions, PackageSaveResult, PackageType, PackageUpdateOptions, PackageVersionCreateRequestResult, PackageVersionListOptions, PackageVersionListResult, PackageVersionMetadataDownloadOptions, PackageVersionMetadataDownloadResult, PackagingSObjects } from '../interfaces';
3
3
  import { PackageAncestry } from './packageAncestry';
4
+ import { PackageVersionDependency } from './packageVersionDependency';
4
5
  export declare const Package2Fields: string[];
5
6
  /**
6
7
  * Provides the ability to list, create, update, delete, convert, and get version
@@ -60,6 +61,18 @@ export declare class Package {
60
61
  * @param connection Hub Org Connection
61
62
  */
62
63
  static getAncestry(packageId: string, project: SfProject | undefined, connection: Connection): Promise<PackageAncestry>;
64
+ /**
65
+ * create a PackageVersionDependency instance
66
+ *
67
+ * @param packageVersionId to get version information for
68
+ * @param project SfProject instance
69
+ * @param connection Hub Org Connection
70
+ * @param options flags for the command line
71
+ */
72
+ static getDependencyGraph(packageVersionId: string, project: SfProject | undefined, connection: Connection, options?: {
73
+ verbose?: boolean;
74
+ edgeDirection?: 'root-first' | 'root-last';
75
+ }): Promise<PackageVersionDependency>;
63
76
  /**
64
77
  * Convert a 1st generation package to a 2nd generation package.
65
78
  * See {@link ConvertPackageOptions} for conversion options.
@@ -9,6 +9,7 @@ const packageVersionRetrieve_1 = require("./packageVersionRetrieve");
9
9
  const packageVersionList_1 = require("./packageVersionList");
10
10
  const packageDelete_1 = require("./packageDelete");
11
11
  const packageAncestry_1 = require("./packageAncestry");
12
+ const packageVersionDependency_1 = require("./packageVersionDependency");
12
13
  const packagePrefixes = {
13
14
  PackageId: '0Ho',
14
15
  SubscriberPackageVersionId: '04t',
@@ -136,6 +137,23 @@ class Package {
136
137
  connection,
137
138
  });
138
139
  }
140
+ /**
141
+ * create a PackageVersionDependency instance
142
+ *
143
+ * @param packageVersionId to get version information for
144
+ * @param project SfProject instance
145
+ * @param connection Hub Org Connection
146
+ * @param options flags for the command line
147
+ */
148
+ static async getDependencyGraph(packageVersionId, project, connection, options) {
149
+ return packageVersionDependency_1.PackageVersionDependency.create({
150
+ packageVersionId,
151
+ project,
152
+ connection,
153
+ verbose: options?.verbose ?? false,
154
+ edgeDirection: options?.edgeDirection ?? 'root-first',
155
+ });
156
+ }
139
157
  /**
140
158
  * Convert a 1st generation package to a 2nd generation package.
141
159
  * See {@link ConvertPackageOptions} for conversion options.
@@ -26,6 +26,7 @@ export declare class PackageVersionCreate {
26
26
  private validateDependencyValues;
27
27
  private resolveBuildNumber;
28
28
  private createRequestObject;
29
+ private stripUnsupportedPropertiesBasedOnApiVersion;
29
30
  /**
30
31
  * Convert the list of command line options to a JSON object that can be used to create an Package2VersionCreateRequest entity.
31
32
  *
@@ -241,25 +241,10 @@ class PackageVersionCreate {
241
241
  CalculateCodeCoverage: this.options.codecoverage ?? false,
242
242
  SkipValidation: this.options.skipvalidation ?? false,
243
243
  AsyncValidation: this.options.asyncvalidation ?? false,
244
- // note: the createRequest's Language corresponds to the AllPackageVersion's language
245
- Language: this.options.language,
244
+ Language: this.options.language, // note: the createRequest's Language corresponds to the AllPackageVersion's language
245
+ CalcTransitiveDependencies: this.packageObject.calculateTransitiveDependencies ?? false,
246
246
  };
247
- // Ensure we only include the Language property for a connection api version
248
- // of v57.0 or higher.
249
- if (this.connection.getApiVersion() < '57.0') {
250
- if (requestObject.Language) {
251
- this.logger.warn(`The language option is only valid for API version 57.0 and higher. Ignoring ${requestObject.Language}`);
252
- }
253
- delete requestObject.Language;
254
- }
255
- // Ensure we only include the async validation property for a connection api version
256
- // of v60.0 or higher.
257
- if (this.connection.getApiVersion() <= '60.0') {
258
- if (requestObject.AsyncValidation) {
259
- this.logger.warn(`The async validation option is only valid for API version 60.0 and higher. Ignoring ${requestObject.AsyncValidation}`);
260
- }
261
- delete requestObject.AsyncValidation;
262
- }
247
+ this.stripUnsupportedPropertiesBasedOnApiVersion(requestObject);
263
248
  if (preserveFiles) {
264
249
  const message = messages.getMessage('tempFileLocation', [packageVersTmpRoot]);
265
250
  await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create['preserve-files'], {
@@ -273,6 +258,27 @@ class PackageVersionCreate {
273
258
  return node_fs_1.default.promises.rm(packageVersTmpRoot, { recursive: true, force: true }).then(() => requestObject);
274
259
  }
275
260
  }
261
+ // TODO: W-18696754 - None of the logger.warn() calls work, nothing is printed to the console when they're hit.
262
+ stripUnsupportedPropertiesBasedOnApiVersion(requestObject) {
263
+ if (this.connection.getApiVersion() < '57.0') {
264
+ if (requestObject.Language) {
265
+ this.logger.warn(`The language option is only valid for API version 57.0 and higher. Ignoring ${requestObject.Language}`);
266
+ }
267
+ delete requestObject.Language;
268
+ }
269
+ if (this.connection.getApiVersion() < '60.0') {
270
+ if (requestObject.AsyncValidation) {
271
+ this.logger.warn(`The async validation option is only valid for API version 60.0 and higher. Ignoring ${requestObject.AsyncValidation}`);
272
+ }
273
+ delete requestObject.AsyncValidation;
274
+ }
275
+ if (this.connection.getApiVersion() < '65.0') {
276
+ if (requestObject.CalcTransitiveDependencies) {
277
+ this.logger.warn(`The CalculateTransitiveDependencies option is only valid for API version 65.0 and higher. Ignoring ${requestObject.CalcTransitiveDependencies}`);
278
+ }
279
+ delete requestObject.CalcTransitiveDependencies;
280
+ }
281
+ }
276
282
  /**
277
283
  * Convert the list of command line options to a JSON object that can be used to create an Package2VersionCreateRequest entity.
278
284
  *
@@ -0,0 +1,80 @@
1
+ import { Connection } from '@salesforce/core';
2
+ import { AsyncCreatable } from '@salesforce/kit';
3
+ import { PackageVersionDependencyOptions, DependencyGraphNode } from '../interfaces';
4
+ import { VersionNumber } from './versionNumber';
5
+ export declare const VERSION_BEING_BUILT = "VERSION_BEING_BUILT";
6
+ export declare class PackageVersionDependency extends AsyncCreatable<PackageVersionDependencyOptions> {
7
+ options: PackageVersionDependencyOptions;
8
+ private connection;
9
+ private project?;
10
+ private userPackageVersionId;
11
+ private verbose;
12
+ private edgeDirection;
13
+ private resolvedPackageVersionId;
14
+ constructor(options: PackageVersionDependencyOptions);
15
+ init(): Promise<void>;
16
+ /**
17
+ * Returns a DependencyDotProducer that can be used to produce a DOT code representation of the package dependency graph.
18
+ */
19
+ getDependencyDotProducer(): Promise<DependencyDotProducer>;
20
+ /**
21
+ * Resolves id input to a 08c. User can input a 08c or 04t.
22
+ * Currently a 04t is not supported in filtering the Package2VersionCreateRequest. So a user's input of 04t will be resolved to a 05i and then a 08c.
23
+ */
24
+ private resolvePackageCreateRequestId;
25
+ private query05iFrom04t;
26
+ private query08cFrom05i;
27
+ /**
28
+ * Checks that the given Package2VersionCreateRequest ID (08c) contains a valid DependencyGraphJson to generate DOT code
29
+ */
30
+ private validatePackageVersion;
31
+ private verifyCreateRequesIdExistsOnDevHub;
32
+ private verifyTransitiveDependenciesCalculated;
33
+ }
34
+ export declare class DependencyDotProducer {
35
+ private dependencyGraphString;
36
+ private verbose;
37
+ private edgeDirection;
38
+ private resolvedPackageVersionId;
39
+ private subscriberPackageVersionId;
40
+ private connection;
41
+ private dependencyGraphData;
42
+ constructor(connection: Connection, dependencyGraphString: string, verbose: boolean, edgeDirection: 'root-first' | 'root-last', resolvedPackageVersionId: string);
43
+ private static throwErrorOnInvalidRecord;
44
+ init(): Promise<void>;
45
+ produce(): string;
46
+ private createDependencyGraphNodes;
47
+ /**
48
+ * Creates a single dependency graph node.
49
+ * All nodes in the json are 04t... or VERSION_BEING_BUILT and requires different queries to create the node
50
+ */
51
+ private createSingleDependencyGraphNode;
52
+ private createVersionBeingBuiltNode;
53
+ private createNormalDependencyNode;
54
+ private createDependencyGraphEdges;
55
+ /**
56
+ * Builds a DOT node with a label containing the package name and version
57
+ *
58
+ * @param node the node id and label
59
+ */
60
+ private buildDotNode;
61
+ /**
62
+ * Builds a DOT edge line of the form fromNode -> toNode
63
+ *
64
+ * @param edge the edge to build where the target node depends on the source node in the json
65
+ */
66
+ private buildDotEdge;
67
+ }
68
+ /**
69
+ * A class that represents a package dependency node.
70
+ * Given a PackageRequestId (08c), PackageName, SubscriberPackageVersionId (04t), and version (MajorVersion.MinorVersion.PatchVersion.BuildNumber) it will build a node of the package dependency.
71
+ */
72
+ export declare class PackageDependencyNode extends AsyncCreatable<DependencyGraphNode> {
73
+ options: DependencyGraphNode;
74
+ readonly packageName: string;
75
+ readonly subscriberPackageVersionId: string;
76
+ readonly version: VersionNumber;
77
+ constructor(options: DependencyGraphNode);
78
+ getVersion(): string;
79
+ protected init(): Promise<void>;
80
+ }
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PackageDependencyNode = exports.DependencyDotProducer = exports.PackageVersionDependency = exports.VERSION_BEING_BUILT = void 0;
4
+ /*
5
+ * Copyright (c) 2022, salesforce.com, inc.
6
+ * All rights reserved.
7
+ * Licensed under the BSD 3-Clause license.
8
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
9
+ */
10
+ const node_os_1 = require("node:os");
11
+ const core_1 = require("@salesforce/core");
12
+ const kit_1 = require("@salesforce/kit");
13
+ const versionNumber_1 = require("./versionNumber");
14
+ core_1.Messages.importMessagesDirectory(__dirname);
15
+ const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version_dependency');
16
+ exports.VERSION_BEING_BUILT = 'VERSION_BEING_BUILT';
17
+ const SELECT_PACKAGE_VERSION_DEPENDENCY = 'SELECT CalcTransitiveDependencies, DependencyGraphJson FROM Package2VersionCreateRequest';
18
+ class PackageVersionDependency extends kit_1.AsyncCreatable {
19
+ options;
20
+ connection;
21
+ project;
22
+ userPackageVersionId;
23
+ verbose;
24
+ edgeDirection;
25
+ resolvedPackageVersionId;
26
+ constructor(options) {
27
+ super(options);
28
+ this.options = options;
29
+ this.connection = options.connection;
30
+ this.project = options.project;
31
+ this.userPackageVersionId = options.packageVersionId;
32
+ this.verbose = options.verbose ?? false;
33
+ this.edgeDirection = options.edgeDirection ?? 'root-first';
34
+ this.resolvedPackageVersionId = '';
35
+ }
36
+ async init() {
37
+ await this.resolvePackageCreateRequestId();
38
+ }
39
+ /**
40
+ * Returns a DependencyDotProducer that can be used to produce a DOT code representation of the package dependency graph.
41
+ */
42
+ async getDependencyDotProducer() {
43
+ const isValid = await this.validatePackageVersion();
44
+ if (!isValid) {
45
+ throw messages.createError('invalidPackageVersionIdError', [this.userPackageVersionId]);
46
+ }
47
+ const query = `${SELECT_PACKAGE_VERSION_DEPENDENCY} WHERE Id = '${this.resolvedPackageVersionId}'`;
48
+ const result = await this.connection.tooling.query(query);
49
+ const dependencyGraphJson = result.records[0].DependencyGraphJson;
50
+ // validatePackageVersion() should have already ensured this is not null
51
+ if (!dependencyGraphJson) {
52
+ throw messages.createError('invalidDependencyGraphError');
53
+ }
54
+ const producer = new DependencyDotProducer(this.connection, dependencyGraphJson, this.verbose, this.edgeDirection, this.resolvedPackageVersionId);
55
+ await producer.init();
56
+ return producer;
57
+ }
58
+ /**
59
+ * Resolves id input to a 08c. User can input a 08c or 04t.
60
+ * Currently a 04t is not supported in filtering the Package2VersionCreateRequest. So a user's input of 04t will be resolved to a 05i and then a 08c.
61
+ */
62
+ async resolvePackageCreateRequestId() {
63
+ const versionId = this.project?.getPackageIdFromAlias(this.userPackageVersionId) ?? this.userPackageVersionId;
64
+ // User provided a Package2VersionCreateRequest ID (08c) and doesn't need to be resolved
65
+ if (versionId.startsWith('08c')) {
66
+ this.resolvedPackageVersionId = versionId;
67
+ }
68
+ // User provided a SubscriberPackageVersionId (04t) and needs to be resolved to a Package2VersionCreateRequest ID (08c)
69
+ else if (versionId.startsWith('04t')) {
70
+ const package2VersionId = await this.query05iFrom04t(versionId);
71
+ this.resolvedPackageVersionId = await this.query08cFrom05i(package2VersionId);
72
+ }
73
+ else {
74
+ throw messages.createError('invalidPackageVersionIdError', [this.userPackageVersionId]);
75
+ }
76
+ }
77
+ async query05iFrom04t(package04t) {
78
+ const query05i = `SELECT Id FROM Package2Version WHERE SubscriberPackageVersionId = '${package04t}'`;
79
+ const result05i = await this.connection.tooling.query(query05i);
80
+ if (result05i.records?.length !== 1) {
81
+ throw messages.createError('invalidPackageVersionIdError', [this.userPackageVersionId]);
82
+ }
83
+ return result05i.records[0].Id;
84
+ }
85
+ async query08cFrom05i(package05i) {
86
+ const query08c = `SELECT Id FROM Package2VersionCreateRequest WHERE Package2VersionId = '${package05i}'`;
87
+ const result08c = await this.connection.tooling.query(query08c);
88
+ if (result08c.records?.length !== 1) {
89
+ throw messages.createError('invalidPackageVersionIdError', [this.userPackageVersionId]);
90
+ }
91
+ return result08c.records[0].Id;
92
+ }
93
+ /**
94
+ * Checks that the given Package2VersionCreateRequest ID (08c) contains a valid DependencyGraphJson to generate DOT code
95
+ */
96
+ async validatePackageVersion() {
97
+ if (!this.resolvedPackageVersionId) {
98
+ throw messages.createError('invalidPackageVersionIdError', [this.userPackageVersionId]);
99
+ }
100
+ if (await this.verifyTransitiveDependenciesCalculated()) {
101
+ return true;
102
+ }
103
+ return false;
104
+ }
105
+ async verifyCreateRequesIdExistsOnDevHub() {
106
+ const query = `${SELECT_PACKAGE_VERSION_DEPENDENCY} WHERE Id = '${this.resolvedPackageVersionId}'`;
107
+ const result = await this.connection.tooling.query(query);
108
+ if (result.records?.length === 0) {
109
+ throw messages.createError('invalidPackageVersionIdError', [this.userPackageVersionId]);
110
+ }
111
+ return true;
112
+ }
113
+ async verifyTransitiveDependenciesCalculated() {
114
+ if (await this.verifyCreateRequesIdExistsOnDevHub()) {
115
+ const query = `${SELECT_PACKAGE_VERSION_DEPENDENCY} WHERE Id = '${this.resolvedPackageVersionId}'`;
116
+ const result = await this.connection.tooling.query(query);
117
+ if (result.records?.length === 1) {
118
+ const record = result.records[0];
119
+ if (record.CalcTransitiveDependencies === true) {
120
+ if (record.DependencyGraphJson != null) {
121
+ return true;
122
+ }
123
+ else {
124
+ throw messages.createError('invalidDependencyGraphError');
125
+ }
126
+ }
127
+ else {
128
+ throw messages.createError('transitiveDependenciesRequiredError');
129
+ }
130
+ }
131
+ }
132
+ return false;
133
+ }
134
+ }
135
+ exports.PackageVersionDependency = PackageVersionDependency;
136
+ class DependencyDotProducer {
137
+ dependencyGraphString;
138
+ verbose;
139
+ edgeDirection;
140
+ resolvedPackageVersionId;
141
+ subscriberPackageVersionId;
142
+ connection;
143
+ dependencyGraphData;
144
+ constructor(connection, dependencyGraphString, verbose, edgeDirection, resolvedPackageVersionId) {
145
+ this.verbose = verbose;
146
+ this.edgeDirection = edgeDirection;
147
+ this.resolvedPackageVersionId = resolvedPackageVersionId;
148
+ this.connection = connection;
149
+ this.dependencyGraphString = dependencyGraphString;
150
+ this.subscriberPackageVersionId = exports.VERSION_BEING_BUILT;
151
+ }
152
+ static throwErrorOnInvalidRecord(record) {
153
+ if (!Object.values(record).every((value) => value !== null)) {
154
+ throw messages.createError('invalidDependencyGraphError');
155
+ }
156
+ }
157
+ async init() {
158
+ const dependencyGraphJson = JSON.parse(this.dependencyGraphString);
159
+ this.dependencyGraphData = {
160
+ creator: dependencyGraphJson.creator,
161
+ nodes: await this.createDependencyGraphNodes(dependencyGraphJson.nodes),
162
+ edges: this.createDependencyGraphEdges(dependencyGraphJson.edges),
163
+ };
164
+ }
165
+ produce() {
166
+ const dotLines = [];
167
+ for (const node of this.dependencyGraphData.nodes) {
168
+ dotLines.push(this.buildDotNode(node));
169
+ }
170
+ for (const edge of this.dependencyGraphData.edges) {
171
+ dotLines.push(this.buildDotEdge(edge));
172
+ }
173
+ return `strict digraph G {${node_os_1.EOL}${dotLines.join(node_os_1.EOL)}${node_os_1.EOL}}`;
174
+ }
175
+ async createDependencyGraphNodes(jsonNodes) {
176
+ const nodePromises = jsonNodes.map(async (node) => this.createSingleDependencyGraphNode(node.id));
177
+ const resolvedNodes = await Promise.all(nodePromises);
178
+ return resolvedNodes;
179
+ }
180
+ /**
181
+ * Creates a single dependency graph node.
182
+ * All nodes in the json are 04t... or VERSION_BEING_BUILT and requires different queries to create the node
183
+ */
184
+ async createSingleDependencyGraphNode(nodeId) {
185
+ const isVersionBeingCreatedNode = nodeId === exports.VERSION_BEING_BUILT;
186
+ const isSubscriberPackageVersionId = nodeId.startsWith('04t');
187
+ if (!isVersionBeingCreatedNode && !isSubscriberPackageVersionId) {
188
+ throw messages.createError('invalidDependencyGraphError');
189
+ }
190
+ if (isVersionBeingCreatedNode) {
191
+ return this.createVersionBeingBuiltNode(nodeId);
192
+ }
193
+ return this.createNormalDependencyNode(nodeId);
194
+ }
195
+ async createVersionBeingBuiltNode(nodeId) {
196
+ let subscriberPackageVersionId = nodeId;
197
+ let MajorVersion = 0;
198
+ let MinorVersion = 0;
199
+ let PatchVersion = 0;
200
+ let BuildNumber = 0;
201
+ const nodeQuery = `SELECT Package2Version.SubscriberPackageVersionId, Package2.Name,
202
+ Package2Version.MajorVersion, Package2Version.MinorVersion,
203
+ Package2Version.PatchVersion, Package2Version.BuildNumber
204
+ FROM Package2VersionCreateRequest WHERE Id = '${this.resolvedPackageVersionId}'`;
205
+ const nodeResult = await this.connection.tooling.query(nodeQuery);
206
+ if (nodeResult.records?.length !== 1) {
207
+ throw messages.createError('invalidDependencyGraphError');
208
+ }
209
+ const record = nodeResult.records[0];
210
+ if (!record.Package2?.Name) {
211
+ throw messages.createError('invalidDependencyGraphError');
212
+ }
213
+ const packageName = record.Package2.Name;
214
+ // sets the version number correctly and version id to 04t if it exists
215
+ if (record.Package2Version?.SubscriberPackageVersionId) {
216
+ DependencyDotProducer.throwErrorOnInvalidRecord(record.Package2Version);
217
+ subscriberPackageVersionId = record.Package2Version.SubscriberPackageVersionId;
218
+ this.subscriberPackageVersionId = subscriberPackageVersionId;
219
+ MajorVersion = record.Package2Version.MajorVersion;
220
+ MinorVersion = record.Package2Version.MinorVersion;
221
+ PatchVersion = record.Package2Version.PatchVersion;
222
+ BuildNumber = record.Package2Version.BuildNumber;
223
+ }
224
+ return {
225
+ subscriberPackageVersionId,
226
+ packageName,
227
+ version: new versionNumber_1.VersionNumber(MajorVersion, MinorVersion, PatchVersion, BuildNumber),
228
+ };
229
+ }
230
+ async createNormalDependencyNode(nodeId) {
231
+ const subscriberPackageVersionId = nodeId;
232
+ const nodeQuery = `SELECT SubscriberPackageVersionId, Package2.Name, MajorVersion, MinorVersion, PatchVersion, BuildNumber
233
+ FROM Package2Version WHERE SubscriberPackageVersionId = '${nodeId}'`;
234
+ const nodeResult = await this.connection.tooling.query(nodeQuery);
235
+ if (nodeResult.records?.length !== 1) {
236
+ throw messages.createError('invalidDependencyGraphError');
237
+ }
238
+ const record = nodeResult.records[0];
239
+ DependencyDotProducer.throwErrorOnInvalidRecord(record);
240
+ return {
241
+ subscriberPackageVersionId,
242
+ packageName: record.Package2.Name,
243
+ version: new versionNumber_1.VersionNumber(record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber),
244
+ };
245
+ }
246
+ createDependencyGraphEdges(jsonEdges) {
247
+ const edges = [];
248
+ for (const edge of jsonEdges) {
249
+ let source = edge.source;
250
+ let target = edge.target;
251
+ if (!source || !target) {
252
+ throw messages.createError('invalidDependencyGraphError');
253
+ }
254
+ if (source === exports.VERSION_BEING_BUILT) {
255
+ source = this.subscriberPackageVersionId;
256
+ }
257
+ if (target === exports.VERSION_BEING_BUILT) {
258
+ target = this.subscriberPackageVersionId;
259
+ }
260
+ edges.push({ source, target });
261
+ }
262
+ return edges;
263
+ }
264
+ /**
265
+ * Builds a DOT node with a label containing the package name and version
266
+ *
267
+ * @param node the node id and label
268
+ */
269
+ buildDotNode(node) {
270
+ const nodeId = node.subscriberPackageVersionId;
271
+ let label;
272
+ // Include subscriber package version id in label based on verbose flag
273
+ if (node.subscriberPackageVersionId === exports.VERSION_BEING_BUILT) {
274
+ label = `${node.packageName}@${exports.VERSION_BEING_BUILT}`;
275
+ }
276
+ else {
277
+ label = `${node.packageName}@${node.version.toString()}`;
278
+ }
279
+ if (this.verbose) {
280
+ label += ` (${node.subscriberPackageVersionId})`;
281
+ }
282
+ return `\t node_${nodeId} [label="${label}"]`;
283
+ }
284
+ /**
285
+ * Builds a DOT edge line of the form fromNode -> toNode
286
+ *
287
+ * @param edge the edge to build where the target node depends on the source node in the json
288
+ */
289
+ buildDotEdge(edge) {
290
+ const sourceNodeId = edge.source;
291
+ const targetNodeId = edge.target;
292
+ if (!sourceNodeId || !targetNodeId) {
293
+ throw messages.createError('invalidDependencyGraphError');
294
+ }
295
+ // Handle edge direction based on the flag
296
+ if (this.edgeDirection === 'root-last') {
297
+ return `\t node_${sourceNodeId} -> node_${targetNodeId}`;
298
+ }
299
+ return `\t node_${targetNodeId} -> node_${sourceNodeId}`;
300
+ }
301
+ }
302
+ exports.DependencyDotProducer = DependencyDotProducer;
303
+ /**
304
+ * A class that represents a package dependency node.
305
+ * Given a PackageRequestId (08c), PackageName, SubscriberPackageVersionId (04t), and version (MajorVersion.MinorVersion.PatchVersion.BuildNumber) it will build a node of the package dependency.
306
+ */
307
+ class PackageDependencyNode extends kit_1.AsyncCreatable {
308
+ options;
309
+ packageName;
310
+ subscriberPackageVersionId;
311
+ version;
312
+ constructor(options) {
313
+ super(options);
314
+ this.options = options;
315
+ this.packageName = options.packageName;
316
+ this.subscriberPackageVersionId = options.subscriberPackageVersionId;
317
+ this.version = new versionNumber_1.VersionNumber(this.options.version.major, this.options.version.minor, this.options.version.patch, this.options.version.build);
318
+ }
319
+ getVersion() {
320
+ return this.version.toString();
321
+ }
322
+ // eslint-disable-next-line class-methods-use-this
323
+ init() {
324
+ return Promise.resolve();
325
+ }
326
+ }
327
+ exports.PackageDependencyNode = PackageDependencyNode;
328
+ //# sourceMappingURL=packageVersionDependency.js.map
@@ -0,0 +1,11 @@
1
+ # invalidPackageVersionIdError
2
+
3
+ Can't display package dependencies. The package version ID %s you specified is invalid. Review the package version ID and then retry this command.
4
+
5
+ # transitiveDependenciesRequiredError
6
+
7
+ Can't display package dependencies. To display package dependencies, you must first add the calculateTransitiveDependencies parameter to the sfdx-project.json file, and set the value to "true". Next, create a new package version and then run this command using the 04t ID for the new package version.
8
+
9
+ # invalidDependencyGraphError
10
+
11
+ Can't display package dependencies. There's an issue generating the dependency graph. Before retrying this command, make sure you added the calculateTransitiveDependencies parameter to the sfdx-project.json file and set the value to "true". After setting the attribute and before retrying this command, you must create a new package version.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/packaging",
3
- "version": "4.9.1",
3
+ "version": "4.11.0",
4
4
  "description": "Packaging library for the Salesforce packaging platform",
5
5
  "main": "lib/exported",
6
6
  "types": "lib/exported.d.ts",
@@ -43,7 +43,7 @@
43
43
  ],
44
44
  "dependencies": {
45
45
  "@jsforce/jsforce-node": "^3.6.5",
46
- "@salesforce/core": "^8.15.0",
46
+ "@salesforce/core": "^8.18.5",
47
47
  "@salesforce/kit": "^3.2.3",
48
48
  "@salesforce/schemas": "^1.9.1",
49
49
  "@salesforce/source-deploy-retrieve": "^12.16.9",