UNPKG

@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
"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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