@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
618 lines • 63 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const BatchingTopoSort_1 = __importDefault(require("./BatchingTopoSort"));
const DependencyHelper_1 = __importDefault(require("./DependencyHelper"));
const bottleneck_1 = __importDefault(require("bottleneck"));
const PackageDiffImpl_1 = __importDefault(require("../../core/package/diff/PackageDiffImpl"));
const os_1 = require("os");
const SFPStatsSender_1 = __importDefault(require("../../core/stats/SFPStatsSender"));
const Stage_1 = require("../Stage");
const fs = __importStar(require("fs-extra"));
const ProjectConfig_1 = __importDefault(require("../../core/project/ProjectConfig"));
const BuildCollections_1 = __importDefault(require("./BuildCollections"));
const Table = require("cli-table");
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
const sfp_logger_2 = require("@flxbl-io/sfp-logger");
const sfp_logger_3 = require("@flxbl-io/sfp-logger");
const sfp_logger_4 = require("@flxbl-io/sfp-logger");
const SfpPackage_1 = require("../../core/package/SfpPackage");
const SfpPackageBuilder_1 = __importDefault(require("../../core/package/SfpPackageBuilder"));
const GetFormattedTime_1 = __importDefault(require("../../core/utils/GetFormattedTime"));
const TableConstants_1 = require("../../ui/TableConstants");
const PackageDependencyResolver_1 = __importDefault(require("../../core/package/dependencies/PackageDependencyResolver"));
const SFPOrg_1 = __importDefault(require("../../core/org/SFPOrg"));
const Git_1 = __importDefault(require("../../core/git/Git"));
const TransitiveDependencyResolver_1 = __importDefault(require("../../core/package/dependencies/TransitiveDependencyResolver"));
const GroupConsoleLogs_1 = __importDefault(require("../../ui/GroupConsoleLogs"));
const UserDefinedExternalDependency_1 = __importDefault(require("../../core/project/UserDefinedExternalDependency"));
const PackageDependencyDisplayer_1 = __importDefault(require("../../core/display/PackageDependencyDisplayer"));
const PRIORITY_UNLOCKED_PKG_WITH_DEPENDENCY = 1;
const PRIORITY_UNLOCKED_PKG_WITHOUT_DEPENDENCY = 3;
const PRIORITY_SOURCE_PKG = 5;
const PRIORITY_DATA_PKG = 5;
class BuildImpl {
constructor(props) {
this.props = props;
this.logger = new sfp_logger_1.ConsoleLogger();
this.recursiveAll = (a) => Promise.all(a).then((r) => r.length == a.length ? r : this.recursiveAll(a));
this.limiter = new bottleneck_1.default({
maxConcurrent: this.props.executorcount,
});
this.packagesBuilt = [];
this.failedPackages = [];
this.generatedPackages = [];
this.packageCreationPromises = new Array();
}
async exec() {
if (this.props.devhubAlias)
this.sfpOrg = await SFPOrg_1.default.create({
aliasOrUsername: this.props.devhubAlias,
});
let git = await Git_1.default.initiateRepo(new sfp_logger_1.ConsoleLogger());
this.repository_url = await git.getRemoteOriginUrl(this.props.repourl);
this.commit_id = this.props.impactedPackagesAsPerBranch ? this.props.ref : await git.getHeadCommit();
if (this.props.baseBranch)
this.base_branch_commit_id = await git.getBaseBranchCommit(this.props.baseBranch);
this.packagesToBeBuilt = this.getPackagesToBeBuilt(this.props.projectDirectory, this.props.includeOnlyPackages);
// Read Manifest
this.projectConfig = ProjectConfig_1.default.getSFDXProjectConfig(this.props.projectDirectory);
//Build Scratch Org Def Files Map
this.scratchOrgDefinitions = this.getMultiScratchOrgDefinitionFileMap(this.projectConfig);
//Do a diff Impl
let table;
if (this.props.isDiffCheckEnabled) {
let packagesToBeBuiltWithReasons = await this.filterPackagesToBeBuiltByChanged(this.props.projectDirectory, this.packagesToBeBuilt, this.props.impactedPackagesAsPerBranch);
table = this.createDiffPackageScheduledDisplayedAsATable(packagesToBeBuiltWithReasons);
this.packagesToBeBuilt = Array.from(packagesToBeBuiltWithReasons.keys()); //Assign it back to the instance variable
}
else {
table = this.createAllPackageScheduledDisplayedAsATable();
}
//Log Packages to be built
sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)("Packages scheduled for build"));
sfp_logger_1.default.log(table.toString());
//Fix transitive dependency gap
let groupDependencyResolutionLogs = new GroupConsoleLogs_1.default("Resolving dependencies", this.logger).begin();
this.projectConfig = await this.resolvePackageDependencies(this.projectConfig);
groupDependencyResolutionLogs.end();
let buildPackagesLogs = new GroupConsoleLogs_1.default("Building Packages", this.logger).begin();
for await (const pkg of this.packagesToBeBuilt) {
let type = this.getPriorityandTypeOfAPackage(this.projectConfig, pkg).type;
SFPStatsSender_1.default.logCount("build.scheduled.packages", {
package: pkg,
type: type,
is_diffcheck_enabled: String(this.props.isDiffCheckEnabled),
is_dependency_validated: this.props.isQuickBuild ? "false" : "true",
pr_mode: String(this.props.isBuildAllAsSourcePackages),
});
}
if (this.packagesToBeBuilt.length == 0)
return {
generatedPackages: this.generatedPackages,
failedPackages: this.failedPackages,
};
this.childs = DependencyHelper_1.default.getChildsOfAllPackages(this.props.projectDirectory, this.packagesToBeBuilt);
this.parents = DependencyHelper_1.default.getParentsOfAllPackages(this.props.projectDirectory, this.packagesToBeBuilt);
this.parentsToBeFulfilled = DependencyHelper_1.default.getParentsToBeFullFilled(this.parents, this.packagesToBeBuilt);
let sortedBatch = new BatchingTopoSort_1.default().sort(this.childs);
if (!this.props.isQuickBuild && this.sfpOrg) {
const packageDependencyResolver = new PackageDependencyResolver_1.default(this.sfpOrg.getConnection(), this.projectConfig, this.packagesToBeBuilt);
this.projectConfig =
await packageDependencyResolver.resolvePackageDependencyVersions();
}
//Do First Level Package First
let pushedPackages = [];
for (const pkg of sortedBatch[0]) {
let { priority, type } = this.getPriorityandTypeOfAPackage(this.projectConfig, pkg);
let packagePromise = this.limiter
.schedule({ id: pkg, priority: priority }, () => this.createPackage(type, pkg, this.props.isBuildAllAsSourcePackages))
.then((sfpPackage) => {
this.generatedPackages.push(sfpPackage);
SFPStatsSender_1.default.logCount("build.succeeded.packages", {
package: pkg,
type: type,
is_diffcheck_enabled: String(this.props.isDiffCheckEnabled),
is_dependency_validated: this.props.isQuickBuild
? "false"
: "true",
pr_mode: String(this.props.isBuildAllAsSourcePackages),
});
this.queueChildPackages(sfpPackage);
}, (reason) => this.handlePackageError(reason, pkg));
pushedPackages.push(pkg);
this.packageCreationPromises.push(packagePromise);
}
//Remove Pushed Packages from the packages array
this.packagesToBeBuilt = this.packagesToBeBuilt.filter((el) => {
return !pushedPackages.includes(el);
});
this.packagesInQueue = Array.from(pushedPackages);
this.printQueueDetails();
//Other packages get added when each one in the first level finishes
await this.recursiveAll(this.packageCreationPromises);
buildPackagesLogs.end();
return {
generatedPackages: this.generatedPackages,
failedPackages: this.failedPackages,
};
}
createDiffPackageScheduledDisplayedAsATable(packagesToBeBuilt) {
let tableHead = ["Package", "Reason to be built", "Last Known Tag/Commit Id"];
if (this.isMultiConfigFilesEnabled &&
this.props.currentStage == Stage_1.Stage.BUILD) {
tableHead.push("Scratch Org Config File");
}
let table = new Table({
head: tableHead,
chars: TableConstants_1.ZERO_BORDER_TABLE,
});
for (const pkg of packagesToBeBuilt.keys()) {
let item = [
pkg,
packagesToBeBuilt.get(pkg).reason,
packagesToBeBuilt.get(pkg).tag ? packagesToBeBuilt.get(pkg).tag : "",
];
if (this.isMultiConfigFilesEnabled &&
this.props.currentStage == Stage_1.Stage.BUILD) {
item.push(this.scratchOrgDefinitions[pkg]
? this.scratchOrgDefinitions[pkg]
: this.props.configFilePath);
}
table.push(item);
}
return table;
}
createAllPackageScheduledDisplayedAsATable() {
let tableHead = ["Package", "Reason to be built"];
if (this.isMultiConfigFilesEnabled &&
this.props.currentStage == Stage_1.Stage.BUILD) {
tableHead.push("Scratch Org Config File");
}
let table = new Table({
head: tableHead,
chars: TableConstants_1.ZERO_BORDER_TABLE,
});
for (const pkg of this.packagesToBeBuilt) {
let item = [pkg, "Activated as part of all package build"];
if (this.isMultiConfigFilesEnabled &&
this.props.currentStage == Stage_1.Stage.BUILD) {
item.push(this.scratchOrgDefinitions[pkg]
? this.scratchOrgDefinitions[pkg]
: this.props.configFilePath);
}
table.push(item);
}
return table;
}
async filterPackagesToBeBuiltByChanged(projectDirectory, packagesInRepoFilteredByConfig, impactedPackagesAsPerBranch) {
let packagesToBeBuilt = new Map();
let buildCollections = new BuildCollections_1.default(projectDirectory);
if (this.props.diffOptions)
this.props.diffOptions.pathToReplacementForceIgnore =
this.getPathToForceIgnoreForCurrentStage(this.projectConfig, this.props.currentStage);
for await (const pkg of packagesInRepoFilteredByConfig) {
let diffImpl = new PackageDiffImpl_1.default(new sfp_logger_1.ConsoleLogger(), pkg, this.props.projectDirectory, this.props.diffOptions);
let packageDiffCheck = await diffImpl.exec();
let isPackageImpacted = impactedPackagesAsPerBranch
? impactedPackagesAsPerBranch.get(pkg)
: false;
if (isPackageImpacted || packageDiffCheck.isToBeBuilt) {
packagesToBeBuilt.set(pkg, {
reason: isPackageImpacted ? 'Found change(s) in package' : packageDiffCheck.reason,
tag: packageDiffCheck.tag,
});
//Add Bundles
if (buildCollections.isPackageInACollection(pkg)) {
buildCollections
.listPackagesInCollection(pkg)
.forEach((packageInCollection) => {
if (!packagesToBeBuilt.has(packageInCollection)) {
packagesToBeBuilt.set(packageInCollection, {
reason: "Part of a build collection",
});
}
});
}
}
}
return packagesToBeBuilt;
}
getPackagesToBeBuilt(projectDirectory, includeOnlyPackages) {
let projectConfig = ProjectConfig_1.default.getSFDXProjectConfig(projectDirectory);
let sfdxpackages = [];
let packageDescriptors = projectConfig["packageDirectories"].filter((pkg) => {
if (pkg.ignoreOnStage?.find((stage) => {
stage = stage.toLowerCase();
return stage === this.props.currentStage;
}))
return false;
else
return true;
});
//Filter Packages
if (includeOnlyPackages) {
//Display include only packages only on stages other than validate
//Validate would have already printed it
if (this.props.currentStage != Stage_1.Stage.VALIDATE) {
printIncludeOnlyPackages();
}
packageDescriptors = packageDescriptors.filter((pkg) => {
if (includeOnlyPackages.find((includedPkg) => {
return includedPkg == pkg.package;
}))
return true;
else
return false;
});
}
// Ignore aliasfied packages on stages fix #1289
packageDescriptors = packageDescriptors.filter((pkg) => {
return !(this.props.currentStage === "prepare" &&
pkg.aliasfy &&
pkg.type !== SfpPackage_1.PackageType.Data);
});
for (const pkg of packageDescriptors) {
if (pkg.package && pkg.versionNumber)
sfdxpackages.push(pkg["package"]);
}
return sfdxpackages;
function printIncludeOnlyPackages() {
sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`Build will include the below packages release configs (domain(s))(domain)`), sfp_logger_1.LoggerLevel.INFO);
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_VALUE)(`${includeOnlyPackages.toString()}`), sfp_logger_1.LoggerLevel.INFO);
}
}
printQueueDetails() {
sfp_logger_1.default.log(`${os_1.EOL}Packages currently processed:{${this.packagesInQueue.length}} + ${this.packagesInQueue}`);
sfp_logger_1.default.log(`Awaiting Dependencies to be resolved:{${this.packagesToBeBuilt.length}} + ${this.packagesToBeBuilt}`);
}
handlePackageError(reason, pkg) {
sfp_logger_1.default.printHeaderLine('', sfp_logger_3.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO);
sfp_logger_1.default.log((0, sfp_logger_4.COLOR_ERROR)(`Package Creation Failed for ${pkg}, Here are the details:`));
try {
// Append error to log file
fs.appendFileSync(`.sfpowerscripts/logs/${pkg}`, reason.message, "utf8");
let data = fs.readFileSync(`.sfpowerscripts/logs/${pkg}`, "utf8");
const pathToMarkDownFile = `.sfpowerscripts/outputs/build-error-info.md`;
fs.mkdirpSync(".sfpowerscripts/outputs");
fs.createFileSync(pathToMarkDownFile);
fs.appendFileSync(pathToMarkDownFile, `\nPlease find the errors observed during build\n\n`);
fs.appendFileSync(pathToMarkDownFile, `## ${pkg}\n\n`);
fs.appendFileSync(pathToMarkDownFile, data);
sfp_logger_1.default.log(data);
}
catch (e) {
sfp_logger_1.default.log(`Unable to display logs for pkg ${pkg}`);
}
//Remove the package from packages To Be Built
this.packagesToBeBuilt = this.packagesToBeBuilt.filter((el) => {
if (el == pkg)
return false;
else
return true;
});
this.packagesInQueue = this.packagesInQueue.filter((pkg_name) => {
if (pkg == pkg_name)
return false;
else
return true;
});
//Remove myself and my childs
this.failedPackages.push(pkg);
SFPStatsSender_1.default.logCount("build.failed.packages", { package: pkg });
this.packagesToBeBuilt = this.packagesToBeBuilt.filter((pkgBuild) => {
if (this.childs[pkg].includes(pkgBuild)) {
SFPStatsSender_1.default.logCount("build.failed.packages", {
package: pkgBuild,
});
this.failedPackages.push(pkgBuild);
return false;
}
return true;
});
sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`${os_1.EOL}Removed all childs of ${pkg} from queue`));
sfp_logger_1.default.printHeaderLine('', sfp_logger_3.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO);
}
queueChildPackages(sfpPackage) {
this.packagesBuilt.push(sfpPackage.packageName);
this.printPackageDetails(sfpPackage);
this.packagesToBeBuilt.forEach((pkg) => {
const indexOfFulfilledParent = this.parentsToBeFulfilled[pkg]?.findIndex((parent) => parent === sfpPackage.packageName);
if (indexOfFulfilledParent !== -1 && indexOfFulfilledParent != null) {
if (!this.props.isQuickBuild)
this.resolveDependenciesOnCompletedPackage(pkg, sfpPackage);
//let all my childs know, I am done building and remove myself from
this.parentsToBeFulfilled[pkg].splice(indexOfFulfilledParent, 1);
}
});
// Do a second pass and push packages with fulfilled parents to queue
let pushedPackages = [];
this.packagesToBeBuilt.forEach((pkg) => {
if (this.parentsToBeFulfilled[pkg]?.length == 0) {
let { priority, type } = this.getPriorityandTypeOfAPackage(this.projectConfig, pkg);
let packagePromise = this.limiter
.schedule({ id: pkg, priority: priority }, () => this.createPackage(type, pkg, this.props.isBuildAllAsSourcePackages))
.then((sfpPackage) => {
SFPStatsSender_1.default.logCount("build.succeeded.packages", {
package: pkg,
type: type,
is_diffcheck_enabled: String(this.props.isDiffCheckEnabled),
is_dependency_validated: this.props.isQuickBuild
? "false"
: "true",
pr_mode: String(this.props.isBuildAllAsSourcePackages),
});
this.generatedPackages.push(sfpPackage);
this.queueChildPackages(sfpPackage);
}, (reason) => this.handlePackageError(reason, pkg));
pushedPackages.push(pkg);
this.packagesInQueue.push(pkg);
this.packageCreationPromises.push(packagePromise);
}
});
if (pushedPackages.length > 0) {
sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`${os_1.EOL}Packages being pushed to the queue:{${pushedPackages.length}} + ${pushedPackages}`));
}
//Remove Pushed Packages from the packages array
this.packagesToBeBuilt = this.packagesToBeBuilt.filter((el) => {
return !pushedPackages.includes(el);
});
this.packagesInQueue = this.packagesInQueue.filter((pkg_name) => pkg_name !== sfpPackage.packageName);
}
resolveDependenciesOnCompletedPackage(dependentPackage, completedPackage) {
const pkgDescriptor = ProjectConfig_1.default.getPackageDescriptorFromConfig(dependentPackage, this.projectConfig);
const packageBranch = this.projectConfig.packageDirectories.find((dir) => dir.package === completedPackage.packageName).branch;
const dependency = pkgDescriptor.dependencies.find((dependency) => (dependency.package === completedPackage.packageName) || (dependency.package.includes(`${completedPackage.packageName}@`)));
if (dependency.package.includes(`${completedPackage.packageName}@`)) {
if (packageBranch) {
const [packageName, version, branch] = this.extractPackageVersionAndBranch(dependency.package);
sfp_logger_1.default.log(`New branched package is created for dependency: ${packageName}, update the package version id`, sfp_logger_1.LoggerLevel.INFO);
dependency.package = `${packageName}@${completedPackage.package_version_number}-${branch}`;
this.projectConfig.packageAliases[dependency.package] = completedPackage.package_version_id;
}
}
else {
dependency.versionNumber = completedPackage.versionNumber;
}
}
getPriorityandTypeOfAPackage(projectConfig, pkg) {
let priority = 0;
let childs = DependencyHelper_1.default.getChildsOfAllPackages(this.props.projectDirectory, this.packagesToBeBuilt);
let type = ProjectConfig_1.default.getPackageType(projectConfig, pkg);
if (type === SfpPackage_1.PackageType.Unlocked) {
if (childs[pkg].length > 0)
priority = PRIORITY_UNLOCKED_PKG_WITH_DEPENDENCY;
else
priority = PRIORITY_UNLOCKED_PKG_WITHOUT_DEPENDENCY;
}
else if (type === SfpPackage_1.PackageType.Source) {
priority = PRIORITY_SOURCE_PKG;
}
else if (type === SfpPackage_1.PackageType.Data) {
priority = PRIORITY_DATA_PKG;
}
else if (type === SfpPackage_1.PackageType.Diff) {
priority = PRIORITY_SOURCE_PKG;
}
else {
throw new Error(`Unknown package type ${type}`);
}
return { priority, type };
}
printPackageDetails(sfpPackage) {
sfp_logger_1.default.log((0, sfp_logger_3.COLOR_HEADER)(`${os_1.EOL}${sfpPackage.packageName} package created in ${(0, GetFormattedTime_1.default)(sfpPackage.creation_details.creation_time)}`));
sfp_logger_1.default.log((0, sfp_logger_3.COLOR_HEADER)(`-- Package Details:--`));
const table = new Table({
chars: TableConstants_1.COLON_MIDDLE_BORDER_TABLE,
style: { "padding-left": 2 },
});
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Package Type`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.package_type),
]);
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Package Version Number`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.package_version_number),
]);
if (sfpPackage.package_type !== SfpPackage_1.PackageType.Data) {
if (sfpPackage.package_type == SfpPackage_1.PackageType.Unlocked) {
if (sfpPackage.package_version_id)
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Package Version Id`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.package_version_id),
]);
if (sfpPackage.test_coverage)
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Package Test Coverage`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.test_coverage),
]);
if (sfpPackage.has_passed_coverage_check)
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Package Coverage Check Passed`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.has_passed_coverage_check),
]);
}
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Metadata Count`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.metadataCount),
]);
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Apex In Package`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.isApexFound ? "Yes" : "No"),
]);
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Profiles In Package`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.isProfilesFound ? "Yes" : "No"),
]);
if (sfpPackage.packageType == SfpPackage_1.PackageType.Diff) {
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Source Version From`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.commitSHAFrom),
]);
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Source Version To`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.commitSHATo),
]);
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Invalidated Test Classes`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.apexTestClassses?.length),
]);
}
table.push([
(0, sfp_logger_3.COLOR_HEADER)(`Source Version`),
(0, sfp_logger_2.COLOR_KEY_MESSAGE)(sfpPackage.sourceVersion),
]);
sfp_logger_1.default.log(table.toString());
const packageDependencies = this.projectConfig.packageDirectories.find((dir) => dir.package === sfpPackage.package_name).dependencies;
if (packageDependencies &&
Array.isArray(packageDependencies) &&
packageDependencies.length > 0) {
sfp_logger_1.default.log((0, sfp_logger_3.COLOR_HEADER)(` Resolved package dependencies:`));
PackageDependencyDisplayer_1.default.printPackageDependencies(packageDependencies, this.projectConfig, new sfp_logger_1.ConsoleLogger());
}
}
}
async createPackage(packageType, sfdx_package, isValidateMode) {
sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`Package creation initiated for ${sfdx_package}`));
let configFilePath = this.props.configFilePath;
if (this.isMultiConfigFilesEnabled) {
if (this.scratchOrgDefinitions[sfdx_package]) {
configFilePath = this.scratchOrgDefinitions[sfdx_package];
sfp_logger_1.default.log((0, sfp_logger_2.COLOR_KEY_MESSAGE)(`Matched scratch org definition file found for ${sfdx_package}: ${configFilePath}`));
}
}
//Compute revision from and revision to
let revisionFrom;
let revisionTo;
//let package itself create revisions
if (packageType == SfpPackage_1.PackageType.Diff) {
revisionFrom = undefined;
revisionTo = undefined;
}
else {
revisionFrom = this.props.diffOptions
?.packagesMappedToLastKnownCommitId?.[sfdx_package]
? this.props.diffOptions?.packagesMappedToLastKnownCommitId[sfdx_package]
: undefined;
revisionTo = this.props.diffOptions?.packagesMappedToLastKnownCommitId?.[sfdx_package]
? "HEAD"
: undefined;
}
let isPackageImpacted = this.props.impactedPackagesAsPerBranch
? this.props.impactedPackagesAsPerBranch.get(sfdx_package)
: true;
return SfpPackageBuilder_1.default.buildPackageFromProjectDirectory(new sfp_logger_1.FileLogger(`.sfpowerscripts/logs/${sfdx_package}`), this.props.projectDirectory, sfdx_package, {
overridePackageTypeWith: this.props.overridePackageTypes ? this.props.overridePackageTypes[sfdx_package] : undefined,
branch: this.props.branch,
sourceVersion: isPackageImpacted ? this.commit_id : this.base_branch_commit_id,
repositoryUrl: this.repository_url,
configFilePath: configFilePath,
pathToReplacementForceIgnore: this.getPathToForceIgnoreForCurrentStage(this.projectConfig, this.props.currentStage),
revisionFrom: revisionFrom,
revisionTo: revisionTo
}, {
devHub: this.props.devhubAlias,
baselineOrg: this.props.baselineOrgAlias,
installationkeybypass: true,
installationkey: undefined,
waitTime: this.props.waitTime.toString(),
isCoverageEnabled: !this.props.isQuickBuild,
isSkipValidation: this.props.isQuickBuild,
breakBuildIfEmpty: true,
baseBranch: this.props.baseBranch,
buildNumber: this.props.buildNumber.toString(),
}, this.projectConfig);
}
/**
* Get the file path of the forceignore for current stage, from project config.
* Returns null if a forceignore path is not defined in the project config for the current stage.
*
* @param projectConfig
* @param currentStage
*/
getPathToForceIgnoreForCurrentStage(projectConfig, currentStage) {
let stageForceIgnorePath;
let ignoreFiles = projectConfig.plugins?.sfp?.ignoreFiles;
if (ignoreFiles) {
Object.keys(ignoreFiles).forEach((key) => {
if (key.toLowerCase() == currentStage) {
stageForceIgnorePath = ignoreFiles[key];
}
});
}
if (stageForceIgnorePath) {
if (fs.existsSync(stageForceIgnorePath)) {
return stageForceIgnorePath;
}
else
throw new Error(`${stageForceIgnorePath} forceignore file does not exist`);
}
else
return null;
}
getMultiScratchOrgDefinitionFileMap(projectConfig) {
this.isMultiConfigFilesEnabled =
this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles;
let configFiles;
if (this.isMultiConfigFilesEnabled) {
configFiles =
this.projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths
?.packages;
}
return configFiles;
}
async resolvePackageDependencies(projectConfig) {
let isDependencyResolverEnabled = !projectConfig?.plugins?.sfp
?.disableTransitiveDependencyResolver;
if (isDependencyResolverEnabled) {
const transitiveDependencyResolver = new TransitiveDependencyResolver_1.default(projectConfig, this.logger);
let resolvedDependencyMap = await transitiveDependencyResolver.resolveTransitiveDependencies();
projectConfig = await ProjectConfig_1.default.updateProjectConfigWithDependencies(projectConfig, resolvedDependencyMap);
projectConfig = await new UserDefinedExternalDependency_1.default().cleanupEntries(projectConfig);
return projectConfig;
}
else {
return projectConfig;
}
}
extractPackageVersionAndBranch(packageAlias) {
const parts = packageAlias.split('@');
if (parts.length === 2) {
const packageName = parts[0];
const versionAndFeature = parts[1].split('-');
if (versionAndFeature.length === 2) {
const version = versionAndFeature[0];
const branch = versionAndFeature[1];
return [packageName, version, branch];
}
}
return ['', '', ''];
}
}
exports.default = BuildImpl;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVpbGRJbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ltcGwvcGFyYWxsZWxCdWlsZGVyL0J1aWxkSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMEVBQWtEO0FBQ2xELDBFQUFrRDtBQUNsRCw0REFBb0M7QUFDcEMsOEZBRWlEO0FBQ2pELDJCQUF5QjtBQUN6QixxRkFBNkQ7QUFDN0Qsb0NBQWlDO0FBQ2pDLDZDQUErQjtBQUMvQixxRkFBNkQ7QUFDN0QsMEVBQWtEO0FBQ2xELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNuQyxtRUFNOEI7QUFDOUIscURBQXlEO0FBQ3pELHFEQUFvRDtBQUNwRCxxREFBbUQ7QUFDbkQsOERBRXVDO0FBQ3ZDLDZGQUFxRTtBQUNyRSx5RkFBaUU7QUFDakUsNERBR2lDO0FBQ2pDLDBIQUFrRztBQUNsRyxtRUFBMkM7QUFDM0MsNkRBQXFDO0FBQ3JDLGdJQUF3RztBQUN4RyxpRkFBeUQ7QUFDekQscUhBQTZGO0FBQzdGLCtHQUF1RjtBQUV2RixNQUFNLHFDQUFxQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxNQUFNLHdDQUF3QyxHQUFHLENBQUMsQ0FBQztBQUNuRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQXVCNUIsTUFBcUIsU0FBUztJQTJCN0IsWUFBMkIsS0FBaUI7UUFBakIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQVBwQyxXQUFNLEdBQUcsSUFBSSwwQkFBYSxFQUFFLENBQUM7UUFDN0IsaUJBQVksR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDekIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxD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