salesforce-alm
Version:
This package contains tools, and APIs, for an improved salesforce.com developer experience.
209 lines (207 loc) • 11.3 kB
JavaScript
;
/*
* Copyright (c) 2020, salesforce.com, inc.
* All rights reserved.
* Licensed under the BSD 3-Clause license.
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
// Node
const util = require("util");
// Local
const Messages = require("../messages");
const messages = Messages();
const logger = require("../core/logApi");
const pkgUtils = require("./packageUtils");
const QUERY = 'SELECT Package2Id, SubscriberPackageVersionId, Name, Description, Tag, Branch, AncestorId, ValidationSkipped, ' +
'MajorVersion, MinorVersion, PatchVersion, BuildNumber, IsReleased, CodeCoverage, HasPassedCodeCoverageCheck, ' +
'Package2.IsOrgDependent, ReleaseVersion, BuildDurationInSeconds, HasMetadataRemoved, CreatedById ' +
'FROM Package2Version ' +
"WHERE Id = '%s' AND IsDeprecated != true " +
'ORDER BY Package2Id, Branch, MajorVersion, MinorVersion, PatchVersion, BuildNumber';
// verbose adds: Id, ConvertedFromVersionId, SubscriberPackageVersion.Dependencies
const QUERY_VERBOSE = 'SELECT Id, Package2Id, SubscriberPackageVersionId, Name, Description, Tag, Branch, AncestorId, ValidationSkipped, ' +
'MajorVersion, MinorVersion, PatchVersion, BuildNumber, IsReleased, CodeCoverage, HasPassedCodeCoverageCheck, ConvertedFromVersionId, ' +
'Package2.IsOrgDependent, ReleaseVersion, BuildDurationInSeconds, HasMetadataRemoved, SubscriberPackageVersion.Dependencies, ' +
'CreatedById ' +
'FROM Package2Version ' +
"WHERE Id = '%s' AND IsDeprecated != true " +
'ORDER BY Package2Id, Branch, MajorVersion, MinorVersion, PatchVersion, BuildNumber';
class PackageVersionReportCommand {
constructor() {
this.logger = logger.child('package:version:report');
}
execute(context) {
return this._execute(context).catch((err) => {
// TODO
// until package2 is GA, wrap perm-based errors w/ 'contact sfdc' action (REMOVE once package2 is GA'd)
throw pkgUtils.applyErrorAction(err);
});
}
async _execute(context) {
this.org = context.org;
this.force = context.org.force;
this.verbose = context.flags.verbose;
let packageVersionId = pkgUtils.getPackageIdFromAlias(context.flags.package, this.force);
// ID can be an 04t or 05i
pkgUtils.validateId([pkgUtils.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID, pkgUtils.BY_LABEL.PACKAGE_VERSION_ID], packageVersionId);
// lookup the 05i ID, if needed
packageVersionId = await pkgUtils.getPackageVersionId(packageVersionId, this.force, this.org);
return this.force
.toolingQuery(this.org, util.format(this.verbose ? QUERY_VERBOSE : QUERY, packageVersionId))
.then(async (queryResult) => {
const results = [];
const records = queryResult.records;
if (records && records.length > 0) {
const record = records[0];
record.Version = [record.MajorVersion, record.MinorVersion, record.PatchVersion, record.BuildNumber].join('.');
let ancestorVersion = null;
let dependencies = null;
const containerOptions = await pkgUtils.getContainerOptions([record.Package2Id], this.force, this.org);
const packageType = containerOptions.get(record.Package2Id);
if (record.AncestorId) {
// lookup AncestorVersion value
const ancestorVersionMap = await pkgUtils.getPackageVersionStrings([record.AncestorId], this.force, this.org);
ancestorVersion = ancestorVersionMap.get(record.AncestorId);
}
else {
// otherwise display 'N/A' if package is Unlocked Packages
if (packageType !== 'Managed') {
ancestorVersion = 'N/A';
record.AncestorId = 'N/A';
}
}
record.CodeCoverage =
record.Package2.IsOrgDependent === true || record.ValidationSkipped === true ? 'N/A' : record.CodeCoverage;
record.HasPassedCodeCoverageCheck =
record.Package2.IsOrgDependent === true || record.ValidationSkipped === true
? 'N/A'
: record.HasPassedCodeCoverageCheck;
record.Package2.IsOrgDependent =
packageType === 'Managed' ? 'N/A' : record.Package2.IsOrgDependent === true ? 'Yes' : 'No';
// set HasMetadataRemoved to N/A for Unlocked, and No when value is false or absent (pre-230)
record.HasMetadataRemoved =
packageType !== 'Managed' ? 'N/A' : record.HasMetadataRemoved === true ? 'Yes' : 'No';
if (context.flags.json) {
// add AncestorVersion to the json record
record.AncestorVersion = ancestorVersion;
}
else {
// collect the Dependency 04ts into a comma-separated list for non-json output
if (this.verbose && records[0].SubscriberPackageVersion.Dependencies != null) {
dependencies = records[0].SubscriberPackageVersion.Dependencies.ids
.map((d) => d.subscriberPackageVersionId)
.join(', ');
}
}
const retRecord = context.flags.json
? record
: [
{
key: messages.getMessage('name', [], 'package_version_list'),
value: record.Name,
},
{
key: messages.getMessage('subscriberPackageVersionId', [], 'package_version_list'),
value: record.SubscriberPackageVersionId,
},
{ key: 'Id', value: record.Id },
{
key: messages.getMessage('packageId', [], 'package_version_list'),
value: record.Package2Id,
},
{
key: messages.getMessage('version', [], 'package_version_list'),
value: record.Version,
},
{
key: messages.getMessage('description', [], 'package_version_list'),
value: record.Description,
},
{
key: messages.getMessage('packageBranch', [], 'package_version_list'),
value: record.Branch,
},
{
key: messages.getMessage('packageTag', [], 'package_version_list'),
value: record.Tag,
},
{ key: 'Released', value: record.IsReleased.toString() },
{
key: messages.getMessage('validationSkipped', [], 'package_version_list'),
value: record.ValidationSkipped,
},
{ key: 'Ancestor', value: record.AncestorId },
{ key: 'Ancestor Version', value: ancestorVersion },
{
key: messages.getMessage('codeCoverage', [], 'package_version_list'),
value: record.CodeCoverage == null
? ' '
: record.CodeCoverage['apexCodeCoveragePercentage'] !== undefined
? `${record.CodeCoverage['apexCodeCoveragePercentage']}%`
: record.CodeCoverage,
},
{
key: messages.getMessage('hasPassedCodeCoverageCheck', [], 'package_version_list'),
value: record.HasPassedCodeCoverageCheck,
},
{
key: messages.getMessage('convertedFromVersionId', [], 'package_version_list'),
value: record.ConvertedFromVersionId == null ? ' ' : record.ConvertedFromVersionId,
},
{
key: messages.getMessage('isOrgDependent', [], 'package_list'),
value: record.Package2.IsOrgDependent,
},
{
key: messages.getMessage('releaseVersion', [], 'package_version_list'),
value: record.ReleaseVersion == null ? '' : Number.parseFloat(record.ReleaseVersion).toFixed(1),
},
{
key: messages.getMessage('buildDurationInSeconds', [], 'package_version_list'),
value: record.BuildDurationInSeconds == null ? '' : record.BuildDurationInSeconds,
},
{
key: messages.getMessage('hasMetadataRemoved', [], 'package_version_list'),
value: record.HasMetadataRemoved,
},
{
key: messages.getMessage('dependencies', [], 'package_version_report'),
value: this.verbose && dependencies != null ? dependencies : ' ',
},
{
key: messages.getMessage('createdBy', [], 'package_list'),
value: record.CreatedById,
},
];
if (!this.verbose) {
// remove verbose-only fields from the non-json output (they're already absent from the json)
if (!context.flags.json) {
retRecord.splice(retRecord.map((e) => e.key).indexOf('Id'), 1);
retRecord.splice(retRecord
.map((e) => e.key)
.indexOf(messages.getMessage('convertedFromVersionId', [], 'package_version_list')), 1);
retRecord.splice(retRecord.map((e) => e.key).indexOf(messages.getMessage('dependencies', [], 'package_version_report')), 1);
}
}
return retRecord;
}
return results;
});
}
/**
* indicates that the human readable message should be tabular
*
* @returns {[{}...]}
*/
getColumnData() {
this.logger.styledHeader(this.logger.color.blue('Package Version'));
return [
{ key: 'key', label: 'Name' },
{ key: 'value', label: 'Value' },
];
}
}
PackageVersionReportCommand.QUERY = QUERY;
PackageVersionReportCommand.QUERY_VERBOSE = QUERY_VERBOSE;
module.exports = PackageVersionReportCommand;
//# sourceMappingURL=packageVersionReportCommand.js.map