Skip to content

Commit 67ebfde

Browse files
committed
feat: display HasVpi in package version list and report commands
1 parent 780dd67 commit 67ebfde

7 files changed

Lines changed: 64 additions & 45 deletions

File tree

messages/package_version_list.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,7 @@ Language
157157
# endToEndBuildDurationInSeconds
158158

159159
End To End Build Duration In Seconds
160+
161+
# hasVpi
162+
163+
Has Version Settings

schemas/package-version-list.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@
111111
},
112112
"Language": {
113113
"type": "string"
114+
},
115+
"HasVpi": {
116+
"type": ["string", "boolean"]
114117
}
115118
},
116119
"required": [

schemas/package-version-report.json

Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@
1717
]
1818
},
1919
"HasPassedCodeCoverageCheck": {
20-
"type": [
21-
"boolean",
22-
"string"
23-
]
20+
"type": ["boolean", "string"]
2421
},
2522
"Package2": {
2623
"type": "object",
@@ -96,10 +93,7 @@
9693
]
9794
},
9895
"HasMetadataRemoved": {
99-
"type": [
100-
"boolean",
101-
"string"
102-
]
96+
"type": ["boolean", "string"]
10397
},
10498
"Id": {
10599
"type": "string"
@@ -201,32 +195,23 @@
201195
"$ref": "#/definitions/PackagingSObjects.SubscriberPackageDependencies"
202196
}
203197
},
204-
"required": [
205-
"Dependencies"
206-
],
198+
"required": ["Dependencies"],
207199
"additionalProperties": false
208200
},
209201
"Version": {
210202
"type": "string"
211203
},
212204
"AncestorVersion": {
213-
"type": [
214-
"string",
215-
"null"
216-
]
205+
"type": ["string", "null"]
217206
},
218207
"AncestorId": {
219-
"type": [
220-
"string",
221-
"null"
222-
]
208+
"type": ["string", "null"]
209+
},
210+
"HasVpi": {
211+
"type": ["boolean", "string"]
223212
}
224213
},
225-
"required": [
226-
"HasMetadataRemoved",
227-
"Package2",
228-
"Version"
229-
]
214+
"required": ["HasMetadataRemoved", "Package2", "Version"]
230215
},
231216
"CodeCoverage": {
232217
"anyOf": [
@@ -240,19 +225,14 @@
240225
"type": "number"
241226
}
242227
},
243-
"required": [
244-
"apexCodeCoveragePercentage"
245-
],
228+
"required": ["apexCodeCoveragePercentage"],
246229
"additionalProperties": false
247230
}
248231
]
249232
},
250233
"PackageType": {
251234
"type": "string",
252-
"enum": [
253-
"Managed",
254-
"Unlocked"
255-
]
235+
"enum": ["Managed", "Unlocked"]
256236
},
257237
"CodeCoveragePercentages": {
258238
"anyOf": [
@@ -274,19 +254,14 @@
274254
"type": "number"
275255
}
276256
},
277-
"required": [
278-
"className",
279-
"codeCoveragePercentage"
280-
],
257+
"required": ["className", "codeCoveragePercentage"],
281258
"additionalProperties": false
282259
},
283260
"minItems": 1,
284261
"maxItems": 1
285262
}
286263
},
287-
"required": [
288-
"codeCovPercentages"
289-
],
264+
"required": ["codeCovPercentages"],
290265
"additionalProperties": false
291266
}
292267
]
@@ -303,17 +278,13 @@
303278
"type": "string"
304279
}
305280
},
306-
"required": [
307-
"subscriberPackageVersionId"
308-
],
281+
"required": ["subscriberPackageVersionId"],
309282
"additionalProperties": false
310283
}
311284
}
312285
},
313-
"required": [
314-
"ids"
315-
],
286+
"required": ["ids"],
316287
"additionalProperties": false
317288
}
318289
}
319-
}
290+
}

src/commands/package/version/list.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export type PackageVersionListDetails = Omit<
4141
| 'BuildDurationInSeconds'
4242
| 'CodeCoverage'
4343
| 'Package2'
44+
| 'HasVpi'
4445
> & {
4546
HasMetadataRemoved: string;
4647
IsPasswordProtected: string | boolean;
@@ -57,6 +58,7 @@ export type PackageVersionListDetails = Omit<
5758
IsOrgDependent: 'N/A' | 'Yes' | 'No';
5859
CreatedBy: string;
5960
ValidatedAsync?: boolean;
61+
HasVpi?: string | boolean;
6062
};
6163

6264
export type PackageVersionListCommandResult = PackageVersionListDetails[];
@@ -187,6 +189,13 @@ export class PackageVersionListCommand extends SfCommand<PackageVersionListComma
187189
const hasMetadataRemoved =
188190
containerOptionsMap.get(record.Package2Id) !== 'Managed' ? 'N/A' : record.HasMetadataRemoved ? 'Yes' : 'No';
189191

192+
const hasVpi =
193+
record.HasVpi === undefined
194+
? undefined
195+
: containerOptionsMap.get(record.Package2Id) !== 'Managed'
196+
? 'N/A'
197+
: String(record.HasVpi); // displays 'true'/'false'
198+
190199
results.push({
191200
Package2Id: record.Package2Id,
192201
Branch: record.Branch,
@@ -222,6 +231,7 @@ export class PackageVersionListCommand extends SfCommand<PackageVersionListComma
222231
HasMetadataRemoved: hasMetadataRemoved,
223232
CreatedBy: record.CreatedById,
224233
Language: record.Language,
234+
HasVpi: hasVpi,
225235
});
226236
});
227237
this.table({
@@ -287,6 +297,7 @@ const getColumnData = (
287297
{ key: 'Description', name: messages.getMessage('description') },
288298
{ key: 'CodeCoverage', name: messages.getMessage('codeCoverage') },
289299
{ key: 'HasPassedCodeCoverageCheck', name: messages.getMessage('hasPassedCodeCoverageCheck') },
300+
{ key: 'HasVpi', name: messages.getMessage('hasVpi') },
290301
{ key: 'ConvertedFromVersionId', name: messages.getMessage('convertedFromVersionId') },
291302
{ key: 'IsOrgDependent', name: messages.getMessage('isOrgDependent') },
292303
{ key: 'ReleaseVersion', name: messages.getMessage('releaseVersion') },

src/commands/package/version/report.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ const omissions = [
3939
'Package2',
4040
'HasMetadataRemoved',
4141
'DeveloperUsePkgZip',
42+
'HasVpi',
4243
] as const;
4344
type Omission = (typeof omissions)[number];
4445

@@ -48,6 +49,7 @@ export type PackageVersionReportResultModified = Omit<PackageVersionReportResult
4849
Package2: Partial<Omit<PackagingSObjects.Package2, 'IsOrgDependent'> & { IsOrgDependent: string }>;
4950
PackageType?: PackageType;
5051
HasMetadataRemoved: boolean | string;
52+
HasVpi?: boolean | string;
5153
};
5254

5355
export class PackageVersionReportCommand extends SfCommand<PackageVersionReportResultModified> {
@@ -85,6 +87,7 @@ export class PackageVersionReportCommand extends SfCommand<PackageVersionReportR
8587
return massagedResults;
8688
}
8789

90+
// eslint-disable-next-line complexity
8891
private display(record: PackageVersionReportResultModified, verbose: boolean, connection: Connection): void {
8992
if (this.jsonEnabled()) {
9093
return;
@@ -197,6 +200,12 @@ export class PackageVersionReportCommand extends SfCommand<PackageVersionReportR
197200
: '') as unknown as string,
198201
}
199202
);
203+
if (Number(connection.version) >= 67) {
204+
displayRecords.push({
205+
key: pvlMessages.getMessage('hasVpi'),
206+
value: record.HasVpi,
207+
});
208+
}
200209
}
201210
const maximumNumClasses = 15; // Number of least code covered classes displayed on the cli output for better UX.
202211
let codeCovStr = ''; // String to display when code coverage data is empty or null
@@ -298,6 +307,10 @@ export class PackageVersionReportCommand extends SfCommand<PackageVersionReportR
298307
// set HasMetadataRemoved to N/A for Unlocked, and No when value is false or absent (pre-230)
299308
record.HasMetadataRemoved = results.PackageType !== 'Managed' ? 'N/A' : results.HasMetadataRemoved ? 'Yes' : 'No';
300309

310+
if (results.HasVpi !== undefined) {
311+
record.HasVpi = results.PackageType !== 'Managed' ? 'N/A' : results.HasVpi ? 'Yes' : 'No';
312+
}
313+
301314
record.ConvertedFromVersionId ??= ' ';
302315

303316
return record;

test/commands/package/packageVersion.nut.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,10 @@ describe('package:version:*', () => {
418418
'HasMetadataRemoved',
419419
'CreatedBy',
420420
];
421+
// HasVpi is only present at API v67+ (app version 262)
422+
if (Number((session.hubOrg as { apiVersion?: string }).apiVersion) >= 67) {
423+
keys.push('HasVpi');
424+
}
421425

422426
expect(output).to.have.length.greaterThan(0);
423427
expect(output[0]).to.have.keys(keys);

test/commands/package/versionReport.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const pkgVersionReportResultModified: PackageVersionReportResultModified = {
4646
Description: '',
4747
HasMetadataRemoved: 'N/A',
4848
HasPassedCodeCoverageCheck: false,
49+
HasVpi: 'N/A',
4950
Id: '05i3i000000Gmj6XXX',
5051
InstallKey: '',
5152
IsDeleted: false,
@@ -93,6 +94,7 @@ const pkgVersionReportResult: PackageVersionReportResult = {
9394
Description: '',
9495
HasMetadataRemoved: false,
9596
HasPassedCodeCoverageCheck: false,
97+
HasVpi: false,
9698
Id: '05i3i000000Gmj6XXX',
9799
InstallKey: '',
98100
IsDeleted: false,
@@ -189,6 +191,7 @@ describe('package:version:report - tests', () => {
189191
pvrr.PackageType = 'Managed';
190192
pvrr.CodeCoverage = { apexCodeCoveragePercentage: 33 };
191193
pvrr.HasMetadataRemoved = true;
194+
pvrr.HasVpi = true;
192195
pvrr.Description = 'test description';
193196
const pvrrm = Object.assign({} as PackageVersionReportResultModified, pvrr) as PackageVersionReportResultModified;
194197
pvrrm.Version = '0.0.6.0';
@@ -197,6 +200,7 @@ describe('package:version:report - tests', () => {
197200
pvrrm.Package2.IsOrgDependent = 'N/A';
198201
pvrrm.CodeCoverage = { apexCodeCoveragePercentage: 33 };
199202
pvrrm.HasMetadataRemoved = 'Yes';
203+
pvrrm.HasVpi = 'Yes';
200204
pvrrm.HasPassedCodeCoverageCheck = 'N/A';
201205

202206
const result = cmd['massageResultsForDisplay'](pvrr);
@@ -208,6 +212,7 @@ describe('package:version:report - tests', () => {
208212
pvrr.PackageType = undefined;
209213
pvrr.CodeCoverage = { apexCodeCoveragePercentage: 33 };
210214
pvrr.HasMetadataRemoved = true;
215+
pvrr.HasVpi = false;
211216
pvrr.Package2.IsOrgDependent = true;
212217
pvrr.ValidationSkipped = true;
213218
const pvrrm = Object.assign({} as PackageVersionReportResultModified, pvrr) as PackageVersionReportResultModified;
@@ -217,10 +222,18 @@ describe('package:version:report - tests', () => {
217222
pvrrm.Package2.IsOrgDependent = 'No';
218223
pvrrm.CodeCoverage = 'N/A';
219224
pvrrm.HasMetadataRemoved = 'N/A';
225+
pvrrm.HasVpi = 'N/A';
220226
pvrrm.HasPassedCodeCoverageCheck = 'N/A';
221227

222228
const result = cmd['massageResultsForDisplay'](pvrr);
223229
expect(result).to.deep.equal(pvrrm);
224230
});
231+
it('should not transform HasVpi when undefined (api < 67)', () => {
232+
const pvrr = Object.assign({}, pkgVersionReportResult);
233+
delete (pvrr as Partial<PackageVersionReportResult>).HasVpi;
234+
235+
const result = cmd['massageResultsForDisplay'](pvrr);
236+
expect(result.HasVpi).to.be.undefined;
237+
});
225238
});
226239
});

0 commit comments

Comments
 (0)